制定目标取决于变量

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.

grw*_*wlf 8

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扩展.


Rei*_*eek 6

您可以使用空文件通过使用以下内容记录变量的最后一个值:

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.

您可以使用此方法添加更多变量,并使用模式规则使其更复杂 - 但此示例为您提供了它的要点.