gnu手册第3.8节说:
“在显式规则的二次扩展期间,$$@
和$$%
分别评估目标的文件名,当目标是归档成员时,目标成员名称。 $$<
变量将计算此目标的第一个规则中的第一个先决条件。$$^
和$$+
计算已为同一目标显示的规则的所有先决条件列表({{ 1}}重复,$$+
没有。)以下示例将有助于说明这些行为:
$$^
在第一个先决条件列表中,所有三个变量($$&lt;,$$ ^和$$ +)展开为空 字符串“
我的问题:为什么.SECONDEXPANSION:
foo: foo.1 bar.1 $$< $$^ $$+ # line #1
foo: foo.2 bar.2 $$< $$^ $$+ # line #2
foo: foo.3 bar.3 $$< $$^ $$+ # line #3
会扩展为空字符串?上面的段落说它应该评估该目标的第一个规则的第一个必要条件。那不是foo.1吗?
答案 0 :(得分:5)
该手册具有误导性,可能是由于拼写错误。这两句话中的第一句:
$$&lt;变量计算为此目标的第一个规则中的第一个先决条件。 $$ ^和$$ +评估已经出现的规则的所有先决条件的列表 对于相同的目标($$ +重复,$$ ^没有)。
应该是合格的,如第二个,通过附加单词:“已经出现”。
您可以通过运行两个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
输出。