Makefile辅助扩展

时间:2014-04-22 08:16:11

标签: makefile gnu expansion

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吗?

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.1foo.2 目标foo的规则合并在一起,占最初的foo.2 foo.1 的输出。此外,第二条规则中的$$<扩展为第一条规则 上一个规则的先决条件foo.1,该帐户或最终foo.1 输出。