Makefile:获取目标先决条件的先决条件

Posted

技术标签:

【中文标题】Makefile:获取目标先决条件的先决条件【英文标题】:Makefile: get prerequisites of target prerequisites 【发布时间】:2014-06-27 10:00:02 【问题描述】:

是否有任何本地 makefile(GNU make 等)方法来获取目标先决条件的先决条件?这些问题不是关于编译器(例如 g++ -MM)对源文件的依赖性检查。

找不到有关主题的任何内容。正如我所看到的,这种情况没有特殊的变量。

为了说明问题,这是我对从 C++ 源代码到对象的编译配方的定义,虽然很标准:

##### UNIVERSAL COMPILE #####
%.o: %.cpp %.hpp
   $CC $CFLAGS -c $< -o $@

然后我需要构建非常大的依赖链:

a: a.o
b: b.o a.o
c: c.o b.o a.o
d: d.o c.o b.o a.o
etc, up to N times...

这是必要的,因为这个链接配方:

##### UNIVERSAL LINK #####
%: %.o
   $LN $LNFLAGS $^ -o $@

如您所见,recipe 需要所有提供的依赖项,但需要获取所有提供的依赖项的所有依赖项

整个程序链接没有问题,就像在配方中一样:

##### PROGRAM LINK ######
$BIN: $OBJ
   $LN $LNFLAGS $OBJ -o $BINDIR/$@

但是我需要进行单元测试,并且单元相互依赖,并且子系统的测试层次结构写成硬编码的依赖链非常累人。

也许我做错了?也许这个链接配方有替代品?谢谢!

【问题讨论】:

你是什么意思“...的目标先决条件”?我明白“目标的先决条件”是什么意思,但不是“获得目标先决条件的先决条件”。 【参考方案1】:

你做错了。为什么您要声明每次a.o 更改时都必须重新编译b.o(这是您指定先决条件pf b.o : a.o 时的含义之一)?这不是需要发生的事情,而且没有意义。

您需要列出所有个目标文件作为单个可执行文件的先决条件,例如:

exe: a.o b.o c.o d.o ...

就是这样。

【讨论】:

对不起,我写的不是那个意思,改变了问题,特别是反映链接配方的依赖链。 我认为他可能要问的是我希望 make 现在可以做的事情,即支持一种获取身体先决条件的先决条件的方法目标(其他一些自动变量或其他)。我有时需要它来创建“源”文件的压缩包并一起构建/修改结果文件。 @EtanReisner 但他没有列出b.o: b.o a.o;他说b: b.o a.o。那不一样了,对吧?

以上是关于Makefile:获取目标先决条件的先决条件的主要内容,如果未能解决你的问题,请参考以下文章

makefile:隐式规则:相同的目标不同的先决条件

Makefile:带空格的先决条件

如何确保将 Makefile 变量设置为先决条件?

操作系统的 Makefile.PL meta.json 先决条件,因此模块不会安装在 Windows 上

在 Makefile 中有几乎重复的目标规则的后果是啥?

如何在目标依赖于多个 linux 构建的地方布局 Makefile