2 makefile
在制作手册上说:
在第一阶段,它读取所有 makefile、包含的 makefile 等,并将所有变量及其值、隐式和显式规则内化,并构建所有目标及其先决条件的依赖关系图。
我不明白依赖图是如何构建的?考虑以下 makefile:
%.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
Run Code Online (Sandbox Code Playgroud)
make命令后
echo This is customized implicit rule
This is customized implicit rule
Run Code Online (Sandbox Code Playgroud)
显示,但我预计
echo This is overriden implicit rule
This is overriden implicit rule
Run Code Online (Sandbox Code Playgroud)
将会是,因为在 make 规则中,仅当目标和先决条件模式匹配时才会覆盖。在这种情况下,我认为%.o: %.z隐式规则已经与模式匹配。
在过去一年左右的时间里,我在一个非常非常大的代码库中使用 Makefile 做了很多工作。我已经厌倦了 make(1s)!
一般来说,答案是“最后的声明获胜”。您还必须应对默认的 make 后缀规则(在 Solaris 上,这些规则位于 /usr/share/lib/make/make.rules 中)。
因此,如果您希望覆盖的隐式规则有效,请将其放在 Makefile 层次结构的最后。如果您想刷新后缀列表,您可以执行以下任一操作或同时执行这两项操作
到你的 Makefile 中,
在 MAKEFLAGS (env var) 中或在 make 调用命令行上。
[此外,您可以在命令开头添加“@”以仅查看其输出,而不是
echo [此处输出]
以及实际情况
[输出在此处]
您还可以通过使用 make(1s) 允许的调试选项之一来收集见解。在 Solaris 上,即 -d、-dd、-D 或 -DD。对于 GNU Make,它是 -d 或 --debug。但请注意,请将命令的输出转储到文件中,因为输出量很大。
您可能想阅读http://freecode.com/articles/what-is-wrong-with-make,作为侧面照明的一部分。