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

时间:2014-10-01 15:46:41

标签: makefile command-line-arguments build-system

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

foo:foo.c
    $(CC) $(CFLAGS) $(ARGS) -c foo.c -o foo

现在,ARGS是我在命令行上传递的内容:

$ make ARGS:=-DX=1 foo

所以,我需要绕过make的聪明之处,因为foo目标不仅取决于哪些文件已更改,还取决于ARGS的值。

有什么东西要做吗?我的黑客(见答案)似乎并不是最优雅的,但它确实有效。还有什么更好的吗?

2 个答案:

答案 0 :(得分:3)

以下是您特定问题的一般解决方案。

您希望能够依赖变量作为先决条件。也就是说,您可以将它作为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

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

答案 1 :(得分:0)

我的解决方案是创建一个假的虚假目标:

.PHONY:dummy
dummy:
    @:

如果foo非空,则dummy取决于ARGS

foo:foo.c $(patsubst %,dummy,$(ARGS))