【问题标题】:Makefile rule with multiple targets for single invocation具有多个目标的 Makefile 规则,用于单次调用
【发布时间】:2020-02-09 22:09:34
【问题描述】:

根据gnu make documentation,如果规则通过单次调用生成多个目标(例如,配方执行具有多个输出文件的工具),您可以使用“&:”规则语法来告诉 make。 使用此语法时,我收到关于目标“&”的警告,但是,当多个规则中有多个(但唯一)目标时。好像将 & 符号弄错了目标名称,而不是作为目标先决条件分隔符的一部分。

在我的原始项目中,我有两个具有多个目标的规则和一个从单个语句/工具生成这些目标的配方。两个规则中的每一个的目标都是唯一的。我创建了以下简单示例来演示 make 生成的警告:

all: file_abbc

.PHONY: all clean

clean:
    del /Q file_*

file_abbc: file_ab file_bc
    copy file_ab+file_bc file_abbc

file_ab file_bc &: file_a file_b file_c
    copy file_a+file_b file_ab
    copy file_b+file_c file_bc

file_a file_b file_c &: content
    copy content file_a
    copy content file_b
    copy content file_c

在上面的 Windows 上运行 make 的警告:

Makefile:17:警告:覆盖目标“&”的配方

Makefile:13:警告:忽略目标“&”的旧配方

为什么 make 抱怨目标 '&' ?

【问题讨论】:

  • 您使用的是不理解 &: 规则的旧版本 GNU make,因此只需将 & 视为文件名。使用make --version 查看您正在运行的版本,如果它比 4.3 旧则升级
  • @ChrisDodd 这很有用。我尝试了 3.81 和 4.2.90 并且得到了相同的结果。事实上,我想知道为什么 make 文档没有说明每个功能的最低版本,但我现在看到我链接到的文档是 4.3。不过,默认情况下,似乎许多系统的版本较低。
  • 好吧,不幸的是,我在 2 周前发现了 '&:' 功能,该功能在 3 周前刚刚在 make 4.3 中发布。难怪我已经使用的 make 版本不支持它有。
  • 如果此示例遵循您的真实 Makefile,则不需要 &:。这些中的每一个都可以在单独的规则中生成,因为没有一条语句可以生成多个文件。
  • @raspy true。我真正的 Makefile 使用了几个工具,它们从一个配方语句生成多个目标,我试图在我的问题的第一句话中说出来。我将进行编辑以使其更清晰。

标签: makefile target


【解决方案1】:

您使用的是不理解 &: 规则的旧版本 GNU make,因此只需将 & 视为文件名。使用make --version 查看您正在运行的版本,如果它比 4.3 旧则升级

【讨论】:

  • 谢谢!我遇到了同样的问题,这解决了它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多