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 中有什么东西可以做到这一点吗?我的黑客(参见答案)似乎不是最优雅的,但它有效。还有更好的吗?
这是针对您的具体问题的通用解决方案。
您希望能够依赖变量作为先决条件。也就是说,您可以将其作为 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 的用户明确声明他们的意图。这对他们有好处:)