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

关于Makefile 二次扩展,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23214115/

10-11 19:00