【问题标题】:How does (GNU) Make handle multiple matching targets?(GNU) Make 如何处理多个匹配目标?
【发布时间】:2020-11-28 04:13:37
【问题描述】:

我一直无法弄清楚为什么我的 Makefile 没有重新编译一些 C 目标文件,即使在我编辑了作为这些目标文件的先决条件的头文件之后也是如此。

我怀疑我不明白如何处理多个匹配目标的情况。例如,我可以想出三个粗略的情况,按照复杂度递增的顺序,会出现这种混淆。

案例 1:琐碎

.PHONY: blah

blah:
    [code to do something]

blah:
    [code to do something else]

案例 2:一个目标规则比另一个更具体

a.out: source.o

source.o: source.c
    [commands to build source.o]

%.o: %.c
    [something else entirely]

# And does the order of these prerequisites matter?

案例 3:包含的 Makefile 具有多余的目标名称

现在,这是我目前遇到的问题。我的 Makefile 包括自动生成的 Makefile,每个 Makefile 都包含目标文件的先决条件。具体来说,它的结构如下:

DEPS = [list of prerequisite Makefiles to be auto-generated]
OBJS = [all the object files from other source files besides a.c]

a.out: a.o $(DEPS) $(OBJS)
    [compile the .out from the .o files]

$(BUILD_DIR)/%.d: $(SRC_DIR)/%.c
    [build the .d Makefile using gcc -MM]

$(BUILD_DIR)/%.o: $(SRC_DIR)/%.c
    [compile the target]

include $(DEPS)

这里,每个DEPS 都有一个$(BUILD_DIR)/%.o 形式的目标。因此,尽管 .d 文件中的目标除了$(SRC_DIR)/%.c 之外可能还有其他先决条件,但这个目标对于上面的目标文件来说是多余的。

Make 选择要处理的目标的政策是什么?这是否可以解释为什么我的 a.out 的目标文件没有被编译,即使我刚刚写入了作为目标文件(在其中一个包含的 Makefile 中)的先决条件的头文件,并且这个目标文件是a.out的前提条件?

【问题讨论】:

  • this 回答你的问题了吗?
  • 问题很可能是您没有有多个匹配目标,因此您的先决条件不正确。但是,我们需要确定的所有信息都隐藏在您问题中的变量后面。在不知道DEPS 文件的结构和OBJS 变量的内容的情况下,我们无法真正帮助您解决问题。如需有关自动生成先决条件的帮助,您可能还想查看make.mad-scientist.net/papers/…
  • 是的,雷诺回答了这个问题。你是对的,MadScientist。

标签: makefile gnu-make


【解决方案1】:

经过一些调试,我发现这个问题有点愚蠢,因为我没有生成正确的依赖文件(目标在文件路径上没有前缀 $(BUILD_DIR))。但是,我也弄清楚了原来的问题。

  1. 根据Renaud's link on multiple rules for one target,如果在多个规则中指定了一个目标,则 Make 将所有指定该目标的规则的所有先决条件合并,并将其用作先决条件。然后,选择并执行最后指定的配方(带有警告消息)。
  2. 如果一个目标规则是问题中的隐式/模式规则,则无论顺序如何,常规规则和配方都具有优先权。显式优先于隐式。
  3. 对于include 案例,包含的规则和配方被视为与原始 Makefile 中的相同。就我而言,问题是别的。

【讨论】:

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