首页 文章

Makefile中的第一个目标是一个隐含的虚假目标吗?

提问于
浏览
0

我正在研究从编译器课程项目中获得的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 回答

  • 1

    你的东西有点落后了 .

    plugin 规则这样的规则可以运行 . 您可以通过执行'make plugin'或'make'来运行它,如果它是默认目标(在这种情况下由于是第一个),或者它是必须构建的另一个目标的先决条件 .

    我不确定当你'make printCode'时会发生什么,因为你只向我们展示了makefile的一部分,并且没有适合的规则,但是根据这个规则来判断:

    %.printCode: %.bc plugin
        opt -load Debug/lib/P1.so -printCode $*.bc
    

    我猜 printCode 规则取决于 plugin 或依赖于 pluginfoo.printCode 之类的东西 . 所以Make看到 plugin 是先决条件,看到没有这样的文件,因此确定必须构建 plugin . 然后它查找构建 plugin 的规则,找到并运行它 .

相关问题