Makefile 如何进行文件解析

Makefile 如何进行文件解析,makefile,Makefile,在make手册上说: 在第一阶段,它读取所有的makefile,包括makefile, 等等,并将所有变量及其值内部化,隐式和 显式规则,并构造所有目标的依赖关系图 以及他们的先决条件 我不明白依赖关系图是如何构造的?考虑下面的Mag文件: %.o: %.z echo This is overriden implicit rule default: foo.o clean: rm -f fmake test_second %.o: %.c echo This is cu

在make手册上说:

在第一阶段,它读取所有的makefile,包括makefile, 等等,并将所有变量及其值内部化,隐式和 显式规则,并构造所有目标的依赖关系图 以及他们的先决条件

我不明白依赖关系图是如何构造的?考虑下面的Mag文件:

%.o: %.z
    echo This is overriden implicit rule
default: foo.o

clean:
    rm -f fmake test_second
%.o: %.c
    echo This is customized implicit rule
make
命令之后

echo This is customized implicit rule
This is customized implicit rule
是显示的,但我很抱歉

echo This is overriden implicit rule
This is overriden implicit rule

将是,因为在make规则中,只有目标模式和先决条件模式匹配时才会覆盖。在本例中,我认为
%.o:%.z
隐式规则已经与模式匹配。

在过去的一年左右,我一直在非常非常大的代码库中对Makefiles进行大量的工作。我对make(1s)感到非常厌烦

一般来说,答案是“最后一次申报获胜”。你也必须抗争 使用默认的make后缀规则(在Solaris上,可以在/usr/share/lib/make/make.rules中找到这些规则)

因此,如果您希望覆盖的隐式规则保持不变,请将其最后放置在 生成文件层次结构。如果要刷新后缀列表,可以执行以下任一操作 或者两者都有

1.添加后缀: 行到您的Makefile

2用-r呼叫make 在MAKEFLAGS(env var)中或在make调用命令行上

[此外,您还可以在命令开头加上“@”以查看输出 是的,而不是

echo[输出到这里]

以及实际情况

[输出在这里]

您还可以使用以下调试选项之一收集见解: make(1s)允许。在Solaris上,这是-d、-dd、-d或-dd。对于GNU make,它是 -d或--debug.不过,请注意,将命令的输出转储到文件中, 因为有很多


你可能想阅读,作为一个侧面照明。

让我猜猜:
foo.c
存在,但
foo.z
不存在。我说得对吗?@Beta foo.z存在我们无法根据这个描述告诉你发生了什么。这一切都取决于存在什么文件等。你要做的最简单的事情就是用运行makeode>-d选项和make将准确地打印出以下步骤。如果此处确实存在
foo.z
文件,则在给定makefile的情况下,您看到的行为不应发生。因此,实际设置中的某些内容与您在此处描述的不同。