我正在研究从编译器课程项目中获得的Makefile . 只有一部分粘贴在这里 .
# Retain intermediate bitcode files
.PRECIOUS: %.bc
# The default target builds the plugin
plugin:
make -C lib/p1
# create .bc from source
%.bc: %.c
clang -emit-llvm -O0 -c $*.c -o $*.bc
# run printCode on a .bc file
%.printCode: %.bc plugin
opt -load Debug/lib/P1.so -printCode $*.bc
如你所见,目标'插件'没有依赖关系,如果我理解正确,应该意味着它的配方永远不会运行(除非它被声明为虚假目标,这不是这里的情况)
但是,当我输入'make printCode'时,(printCode是列表中的最后一个目标)插件目标会执行 . 这怎么可能?是否存在一些隐含规则,指出Makefile的第一个目标被视为虚假目标,例如“all”?
1 回答
你的东西有点落后了 .
像
plugin
规则这样的规则可以运行 . 您可以通过执行'make plugin'或'make'来运行它,如果它是默认目标(在这种情况下由于是第一个),或者它是必须构建的另一个目标的先决条件 .我不确定当你'make printCode'时会发生什么,因为你只向我们展示了makefile的一部分,并且没有适合的规则,但是根据这个规则来判断:
我猜
printCode
规则取决于plugin
或依赖于plugin
的foo.printCode
之类的东西 . 所以Make看到plugin
是先决条件,看到没有这样的文件,因此确定必须构建plugin
. 然后它查找构建plugin
的规则,找到并运行它 .