假设我有一个构建目标foo:
foo:foo.c
$(CC) $(CFLAGS) $(ARGS) -c foo.c -o foo
现在,ARGS
是我在命令行上传递的内容:
$ make ARGS:=-DX=1 foo
所以,我需要绕过make的聪明之处,因为foo
目标不仅取决于哪些文件已更改,还取决于ARGS
的值。
有什么东西要做吗?我的黑客(见答案)似乎并不是最优雅的,但它确实有效。还有什么更好的吗?
答案 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))