Makefile二次扩展

标签 makefile gnu expansion

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.1foo.2从第一和第二 目标规则foo合并起来,就占了最初的 foo.2 foo.1 的输出。此外,$$<将第二条规则扩展到第一条 先决条件foo.1 上一个规则的结果,或最终的foo.1 的输出。

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

相关文章:

build-process - Makefile 生成器 : premake vs bakefile?

c - 为 make 中的所有文件定义一个预处理器变量

c - 了解低级文件例程

c - 使用 ## 运算符扩展宏

html - Bootstrap 3 'Fixed Navbar' 仅扩展了屏幕高度的大约 55-60%

makefile - 如何阻止 GNU make 干扰包含美元符号的文件名?

makefile - 检查 Makefile 中的程序是否存在,否则运行命令

c++ - 输出二维字符串数组时出现段错误

linux - 查找名称中出现 1 次到无限次字符的文件

bash - 遍历数组,防止通配符扩展 (*)