GNU 手册第 3.8 节说:
“在显式规则的二次扩展期间,$$@
和 $$%
分别计算目标的文件名,当目标是归档成员时,计算目标成员名称。$$<
变量计算为第一个先决条件此目标的第一条规则。$$^
和 $$+
评估已针对同一目标出现的规则的所有先决条件的列表($$+
有重复,$$^
没有重复)。以下示例将帮助说明这些行为:
.SECONDEXPANSION:
foo: foo.1 bar.1 $$< $$^ $$+ # line #1
foo: foo.2 bar.2 $$< $$^ $$+ # line #2
foo: foo.3 bar.3 $$< $$^ $$+ # line #3
在第一个先决条件列表中,所有三个变量($$<、$$^ 和 $$+)都扩展为空 字符串。”
我的问题:为什么 $$<
会扩展为空字符串?上面的段落表示,它应该评估该目标的第一条规则的第一个必要条件。那不是 foo.1 吗?
最佳答案
该手册具有误导性,可能是由于拼写错误造成的。两句话中的第一句话:
The $$< variable evaluates to the first prerequisite in the first rule for this target. $$^ and $$+ evaluate to the list of all prerequisites of rules that have already appeared for the same target ($$+ with repetitions and $$^ without).
应该像第二个一样,通过附加以下文字进行限定:“已经出现”。
您可以通过运行两个 makefile 来验证这是否正确描述了行为:
制作 1
.SECONDEXPANSION:
foo: foo.1 $$<
@echo $+
输出为:
foo.1
表明$$<
已扩展为空字符串。然后:
制作2
.SECONDEXPANSION:
foo: foo.1
foo: foo.2 $$<
@echo $+
现在的输出是:
foo.2 foo.1 foo.1
这里,明确的先决条件foo.1
和foo.2
从第一和第二
目标规则foo
合并起来,就占了最初的 foo.2 foo.1
的输出。此外,$$<
将第二条规则扩展到第一条
先决条件foo.1
上一个规则的结果,或最终的foo.1
的输出。
关于Makefile二次扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23214115/