【问题标题】:GNU make - reference targets in another makefileGNU make - 在另一个 makefile 中引用目标
【发布时间】:2016-12-19 19:52:19
【问题描述】:

前言:

是的,我的 makefile 写得不好。
不,我/我们没有写它们;我们从另一家公司继承了这个代码库。
我想知道是否可以在不重写的情况下解决我的问题。

问题

有没有办法从另一个 makefile 中引用目标并将其用作先决条件?

假设你有:

all: libs binary

binary: # I need to add prereqs here
    blah
    blah2
    blah3

对于binary,我需要将其他 makefile 中的目标作为先决条件。
我不能只 include 那些 makefile 以及那些目标,因为这些 makefile 定义了相同的变量但具有不同的值。

是否可以这样做:

binary: C:/mk1:foo C:/mk2:bar
    blah
    blah2
    blah3

更新

如果不清楚,makefilesC:/mk1C:/mk2 是同一个makefile 项目的一部分,该项目通过带有make --jobs=X 的一些顶级makefile 执行,因此理论上所有makefile 都可以并行制作。

【问题讨论】:

  • 简短回答:不。长答案:是的,但是您可能会不必要地重建目标。这可以接受吗?
  • @Beta 是的。主要目标是对 makefile 的最小修改,因此显然会有妥协。请继续。

标签: makefile gnu-make


【解决方案1】:

有时 Recursive Make [duhn-duhn-duhnnnn!] 是适合这项工作的工具:

binary: foo bar
    blah
    blah2
    blah3

.PHONY: foo bar

foo:
    $(MAKE) -f mk1 $@

bar:
    $(MAKE) -f mk2 $@

PHONY 强制 Make 执行这些规则并调用其他 makefile 以(可能)重建 foobar,即使它们已经存在(因为这个 makefile 不知道它们可能具有哪些先决条件)。

【讨论】:

  • 竞争条件怎么样:如果在这个makefile中foo的配方被执行,同时另一个makemake-ing foo在文件mk1中,会发生什么?
  • @Adrian:尝试并行化递归 Make 是不明智的。
  • 我不关注。你的意思是不要使用--jobs
【解决方案2】:

如何使用include makefile(或sinclude)机制来合并继承的makefile?只要您自己的目标具有不同的名称,这应该可以工作。

您还可以通过指定多个-f makefile 选项来连接makefile。它们按顺序连接。

【讨论】:

  • 但是我有大约 40 个 makefile,它们具有相同的变量但它们的值不同,所以当我 include 他们时,我将拥有:“变量声明”\n“目标”\n“相同的变量重新装修" \n "可能与上面同名的目标"
  • 后面的变量重新声明不会覆盖前面的吗?而且我会得到彻底的错误,因为其中许多 makefile 具有相同的目标名称,例如 all
  • @Adrian 好吧,使用相同的变量,显然无法同时或并行调用原始 make 过程来一次性创建所有内容。那你也不应该尝试。由于您不想重写它们,因此您必须按设计使用它们。也许您可以编写一个脚本并将调用该脚本作为配方中的命令?从极简主义的角度来看,这可能并不完美,但可能比复杂的制作黑客更容易。
  • 有误会。如果变量和目标名称位于不同的文件中,则变量和目标名称是否相同无关紧要。
  • 但是如果你将它们都包含在同一个 makefile 中,那么你就有问题了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-13
  • 1970-01-01
  • 2014-07-08
相关资源
最近更新 更多