【问题标题】:Makefile: get prerequisites of target prerequisitesMakefile:获取目标先决条件的先决条件
【发布时间】: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}/$@

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

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

【问题讨论】:

  • 你是什么意思“...的目标先决条件”?我明白“目标的先决条件”是什么意思,但不是“获得目标先决条件的先决条件”。

标签: makefile gnu-make


【解决方案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。那不一样了,对吧?
猜你喜欢
  • 2023-03-23
  • 1970-01-01
  • 2016-08-18
  • 1970-01-01
  • 1970-01-01
  • 2020-01-08
  • 2014-03-08
  • 2013-04-22
  • 2014-05-05
相关资源
最近更新 更多