来自docs:
目标特定变量还有一个特殊功能:当您定义特定于目标的变量时,变量值对此目标的所有先决条件及其所有先决条件等都有效(除非这些先决条件覆盖了该变量)变量具有自己的特定于目标的变量值。)
所以,给定一个makefile:
$(shell rm -rf x D)
$(shell mkdir D)
$(shell touch D/x)
VPATH = D
all: x ;
x ::
@echo 'foo is: $(foo)'
.SILENT : D/x
all : foo = bar
跑步,我明白了:
foo is:
我想,我在上面定义了:foo = bar
!
或者,是吗?
答案 0 :(得分:1)
事实上,您与VPATH,Double-Colon Rules,Target-specific Variable Values和Special Built-in Target Names混合使用。
您的Makefile
可以解释为:
all
是第一个目标all
有一个先决条件:x
VPATH
为D
,all
还有间接先决条件:D/x
D/x
目标是无声的all
所有这些先决条件都有一个目标特定变量foo
等于bar
对于特定目标用户,似乎没有考虑间接先决条件D/x
。
有趣的测试: 在x : foo = bar
的末尾添加Makefile
,make
进程将被卡住......
<强>变通方法强>:
.SILENT
行(我在经过一些测试后发现了这一点,它也解决了上述问题......)D/x : foo = bar
的末尾添加Makefile
,以明确添加foo
目标的D/x
变量