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 吗? 最佳答案
该手册具有误导性,可能是由于打字错误。两句中的第一句:
应该像第二个一样通过附加词来限定:“已经出现了”。
您可以通过运行两个 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/