【问题标题】:Overriding explicit rules in Makefiles覆盖 Makefile 中的显式规则
【发布时间】:2014-01-11 13:10:04
【问题描述】:

我有一个 Makefile 系统,它可以动态生成规则来为不同平台构建文件列表。由于各种原因,不能使用隐式规则,因为没有可应用的通用模式,而是各种函数在文件列表上的输出。

现在我正在尝试以一种仅针对需要构建的目标触发的方式添加自动依赖生成。执行此操作的常规方法是定义生成依赖项的隐式规则,然后包含或定义需要这些依赖项作为同一目标的先决条件的显式规则(参见http://mad-scientist.net/make/autodep.html 示例)。这是可行的,因为 make 会自动使用相同规则的显式版本覆盖隐式规则而不会抱怨。

但是,由于我没有使用隐式规则的选项,我正试图找出一种方法来做到这一点。我只看到两种方法:

  1. 动态重写显式规则并为每个规则获取“警告:覆盖目标命令”。
  2. 想办法让 Make 删除现有的规则定义,以便我提供新的规则定义。

由于 AFAIK 无法执行第二个选项,有人知道我如何抑制“目标的覆盖命令”警告吗?关于覆盖显式规则并使用新的先决条件再次评估它们的任何其他建议?

【问题讨论】:

  • 一个 makefile 可以按预期工作,只有显式规则,没有隐式规则。你能提供一个简单的例子来说明你正在尝试做什么吗?
  • 例如,这个但没有模式规则:mad-scientist.net/make/autodep.html#norule 不一定使用 makedepend,而是任何方式为相同目标生成具有正确依赖关系的新规则。在此示例中,这是通过以下包含完成的。
  • 虽然您的构建系统很可能需要复杂的自动依赖机制,就像您提供的链接所描述的那样,但您可能不需要——我个人看到了很多非常糟糕的解决方案make 的感知缺陷和跨平台问题——即“便携”——在过去 35 年左右(Imake,有人吗?)。您能否提供一个或两个显式目标依赖规则片段示例来演示您需要做什么?此外,是否所有构建都在 Unix/Linux/Mac OS X 上执行,或者是否有其他构建平台使用 make,但没有完整的 Unix 工具集?

标签: makefile


【解决方案1】:

简短的回答是否定的,如果没有收到该消息,就无法替换显式规则(当然,由于 GNU make 是开源的,您可以修改代码并构建自己的版本)。

更长的答案是我认为您最初的假设是不正确的。我不明白你的意思 这行得通,因为 make 会自动用相同规则的显式版本覆盖隐式规则而不会抱怨

您似乎想到的是没有配方的先决条件语句,例如:

%.o : %.c
        $(CC) ...

foo.o: foo.c foo.h bar.h
foo.o: biz.h baz.h

等等。 GNU make 中的规则是,对于任何给定的目标(无论如何都是单冒号目标),只能有一个规则定义配方。可以有尽可能多的规则,只定义先决条件关系,而不定义配方,只要你喜欢。当看到这些仅限先决条件的规则时,它们只是将其他先决条件追加到当前先决条件列表中。

而且,这里的隐式规则和显式规则没有区别;比如上面的例子可以写成:

foo.o : foo.c
        $(CC) ...

foo.o: foo.c foo.h bar.h
foo.o: biz.h baz.h

这是完全合法的,不会给你任何警告。

您的 makefile 中似乎存在问题,并且您已经对问题所在做了一些跳跃性的结论,然后您没有描述问题本身,而是询问如何解决该结论。如果您备份并向我们展示您看到生成的警告的 makefile 示例(并展示您如何调用 make 以及您收到的警告),我们可能会更好地为您提供帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多