如果设置了变量,如何强制重建目标?

bit*_*ask 8 makefile build-system command-line-arguments

假设我有一个构建目标 foo:

foo:foo.c
    $(CC) $(CFLAGS) $(ARGS) -c foo.c -o foo
Run Code Online (Sandbox Code Playgroud)

现在,ARGS我在命令行上传递了一些内容:

$ make ARGS:=-DX=1 foo
Run Code Online (Sandbox Code Playgroud)

所以,我需要绕过 make 的聪明才智,因为foo目标不仅取决于哪些文件发生了更改,还取决于ARGS.

make 中有什么东西可以做到这一点吗?我的黑客(参见答案)似乎不是最优雅的,但它有效。还有更好的吗?

Mar*_*eck 6

这是针对您的具体问题的通用解决方案。

您希望能够依赖变量作为先决条件。也就是说,您可以将其作为 makefile 中任何目标的先决条件,并且当变量的值发生更改时,您可以重建这些目标。

这是一个执行此操作的函数,您使用此函数来声明一个变量是可靠的,然后您可以将其用作先决条件。

请注意,如果该变量未在命令行中使用,则仍然意味着该变量仍然有值,即空字符串。

define DEPENDABLE_VAR

.PHONY: phony
$1: phony
    @if [[ `cat $1 2>&1` != '$($1)' ]]; then \
        echo -n $($1) > $1 ; \
    fi

endef

#declare ARGS to be dependable
$(eval $(call DEPENDABLE_VAR,ARGS))


foo:foo.c ARGS
    $(CC) $(CFLAGS) $(ARGS) -c foo.c -o foo
Run Code Online (Sandbox Code Playgroud)

事实上,我们可以省略“声明”的需要,只编写一个类似的函数,使所有变量默认可靠。但我不喜欢这样。我更喜欢修改我编写的 makefile 的用户明确声明他们的意图。这对他们有好处:)