8

Assume I have a build-target foo:

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

Now, ARGS is something that I pass on the command line:

$ make ARGS:=-DX=1 foo

So, I need to bypass make's cleverness, because the foo target does not only depend on which files have changed, but also on the value of ARGS.

Is there something in make to do this? My hack (see answer) doesn't seem to be the most elegant but it works. Anything better?

4

2 回答 2

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

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

于 2014-10-01T18:13:24.613 回答
0

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

.PHONY:dummy
dummy:
    @:

并且foo依赖于dummy是否ARGS为非空:

foo:foo.c $(patsubst %,dummy,$(ARGS))
于 2014-10-01T15:46:40.837 回答