tiw*_*iwo 7 variables makefile
我希望(GNU)make在变量变化时重建.我怎样才能做到这一点?
例如,
$ make project
[...]
$ make project
make: `project' is up to date.
Run Code Online (Sandbox Code Playgroud)
......喜欢它,但我更喜欢
$ make project IMPORTANTVARIABLE=foobar
make: `project' is up to date.
Run Code Online (Sandbox Code Playgroud)
重建部分或全部project.
Make并非旨在引用可变内容,但Reinier的方法向我们展示了变通方法.不幸的是,使用变量值作为文件名既不安全又容易出错.希望Unix工具可以帮助我们正确编码值.所以
IMPORTANTVARIABLE = a trouble
# GUARD is a function which calculates md5 sum for its
# argument variable name. Note, that both cut and md5sum are
# members of coreutils package so they should be available on
# nearly all systems.
GUARD = $(1)_GUARD_$(shell echo $($(1)) | md5sum | cut -d ' ' -f 1)
foo: bar $(call GUARD,IMPORTANTVARIABLE)
@echo "Rebuilding foo with $(IMPORTANTVARIABLE)"
@touch $@
$(call GUARD,IMPORTANTVARIABLE):
rm -rf IMPORTANTVARIABLE*
touch $@
Run Code Online (Sandbox Code Playgroud)
在这里,您实际上将目标依赖于名为$(NAME)GUARD $(VALUEMD5)的特殊文件,该文件可以安全地引用并且与变量的值具有(几乎)一对一的对应关系.请注意,'call'和'shell'是GNU Make扩展.
您可以使用空文件通过使用以下内容记录变量的最后一个值:
someTarget: IMPORTANTVARIABLE.$(IMPORTANTVARIABLE)
@echo Remaking $@ because IMPORTANTVARIABLE has changed
touch $@
IMPORTANTVARIABLE.$(IMPORTANTVARIABLE):
@rm -f IMPORTANTVARIABLE.*
touch $@
Run Code Online (Sandbox Code Playgroud)
你以后make跑,都会有你的目录,其名称开头的空文件IMPORTANTVARIABLE.,对你的变量附加的价值.这基本上包含有关变量的最后一个值的信息IMPORTANTVARIABLE.
您可以使用此方法添加更多变量,并使用模式规则使其更复杂 - 但此示例为您提供了它的要点.