我希望在配置更改时重新执行某些目标。
考虑这个例子:
我有一个配置变量(可以从环境变量或config.local文件中读取):
CONF:=...
基于这个变量CONF,我组装了一个头文件conf.hpp,如下所示:
conf.hpp:
buildConfHeader $(CONF)
现在,当然,如果配置变量发生更改,我想重建此标头,否则标头将不会反映新配置。但是如何用make跟踪这个?配置变量不依赖于文件,因为它可以从环境变量中读取。
有没有办法实现这个目标?
答案 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。标题将被更新。正是我想要的:))