Configuration Make:如果配置更改,则重做一些目标

Configuration Make:如果配置更改,则重做一些目标,configuration,makefile,Configuration,Makefile,我想在配置更改时重新执行一些目标 考虑这个例子: 我有一个配置变量(从环境变量或config.local文件中读取): 基于这个变量CONF,我组装了一个头文件CONF.hpp,如下所示: conf.hpp: buildConfHeader $(CONF) 现在,当然,如果配置变量发生变化,我想重建这个头,因为否则头将不会反映新的配置。但是我怎么能用make跟踪呢?配置变量没有绑定到文件,因为它可以从环境变量中读取 有什么方法可以实现这一点吗?如果配置通过宏或环境变量更改,则make无

我想在配置更改时重新执行一些目标

考虑这个例子:

我有一个配置变量(从环境变量或config.local文件中读取):

基于这个变量CONF,我组装了一个头文件CONF.hpp,如下所示:

conf.hpp:
    buildConfHeader $(CONF)
现在,当然,如果配置变量发生变化,我想重建这个头,因为否则头将不会反映新的配置。但是我怎么能用make跟踪呢?配置变量没有绑定到文件,因为它可以从环境变量中读取


有什么方法可以实现这一点吗?

如果配置通过宏或环境变量更改,则
make
无法知道要重建什么

但是,您可以使用一个目标来简单地更新
conf.hpp
的时间戳,这将强制始终重建它:

conf.hpp: confupdate
    buildConfHeader $(CONF)

confupdate:
    @touch conf.hpp

然而,正如我所说,
conf.hpp
将始终被构建,这意味着依赖它的任何目标也将需要重建。一个更友好的解决方案是生成makefile本身。CMake或GNU自动工具在这方面很好,除非您牺牲了对makefile的大量控制。您也可以使用创建makefile的构建脚本,但我建议不要这样做,因为有一些工具可以让您更轻松地构建一个makefile。

我已经找到了答案。希望这能帮助任何有同样问题的人:

我从配置本身构建了一个文件名,因此如果

CONF:=a b c d e
然后通过用下划线替换空格来创建配置标识符,即

null:=
space:= $(null) #
CONFID:= $(subst $(space),_,$(strip $(CONF))).conf
这将导致
CONFID=a_b_c_d_e.conf

现在,我使用这个
$(CONFID)
作为
conf.hpp
目标的依赖项。此外,我为
$(CONFID)
添加了一条规则,以删除旧的
.conf
文件并创建一个新文件:

$(CONFID):
    rm *.conf #remove old .conf files
    touch $(CONFID) #create a new file with the right name

conf.hpp: $(CONFID)
    buildConfHeader $(CONF)

现在一切正常。名为
$(CONFID)
的文件跟踪用于生成当前
conf.hpp
的配置。如果配置发生更改,则
$(CONFID)
将指向不存在的
.conf
文件。因此,将执行第一条规则,删除旧的conf并创建新的conf。标题将被更新。正是我想要的:)

我在一个项目中使用了这个,在这个项目中,我不允许从make更改为CMake或其他任何东西,但谢谢你的想法。
$(CONFID):
    rm *.conf #remove old .conf files
    touch $(CONFID) #create a new file with the right name

conf.hpp: $(CONFID)
    buildConfHeader $(CONF)