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

时间:2014-02-17 10:30:22

标签: configuration makefile

我希望在配置更改时重新执行某些目标。

考虑这个例子:

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

CONF:=...

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

conf.hpp:
    buildConfHeader $(CONF)

现在,当然,如果配置变量发生更改,我想重建此标头,否则标头将不会反映新配置。但是如何用make跟踪这个?配置变量不依赖于文件,因为它可以从环境变量中读取。

有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:1)

如果配置通过宏或环境变量更改,make无法知道要重建的内容。

但是,您可以使用仅更新conf.hpp时间戳的目标,这将迫使它始终重建:

conf.hpp: confupdate
    buildConfHeader $(CONF)

confupdate:
    @touch conf.hpp

然而,正如我所说,conf.hpp将永远建立,这意味着任何依赖它的目标都需要重建。一个更友好的解决方案是生成makefile本身。 CMake或GNU Autotools对此有好处,除了你牺牲了对makefile的大量控制权。你也可以使用一个构建脚本来创建makefile,但我建议不要这样做,因为有一些工具可以让你更轻松地构建一个。

答案 1 :(得分:0)

我已经弄清楚了。希望这可以帮助任何有同样问题的人:

我从配置本身构建一个文件名,所以如果我们有

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。标题将被更新。正是我想要的:))