编写Makefile以供其他Makefile包含

时间:2014-05-18 22:37:42

标签: makefile gnu-make

背景

我有一个(大)项目A和一个(大)项目B,这样A取决于B。

我希望有两个独立的makefile - 一个用于项目A,一个用于项目B - 用于性能和可维护性。

基于commentsan earlier question,我决定完全重写B的makefile,使得A的makefile可以include。这将避免递归make的弊端:允许并行性,不必要地重新制作,提高性能等。


当前解决方案

我可以通过包含在顶部(在任何其他包含之前)找到当前正在执行的makefile的目录。

TOP := $(dir $(lastword $(MAKEFILE_LIST)))

我正在将每个目标写为

$(TOP)/some-target: $(TOP)/some-src

并对任何必要的shell命令进行更改,例如find dirfind $(TOP)/dir

虽然这解决了问题但它有一些缺点:

  1. 目标和规则更长,可读性更低。 (这可能是不可避免的。模块化有代价)。

  2. 使用gcc -M自动生成依赖关系需要进行后处理才能在任何地方添加$(TOP)

  3. 这是编写其他人可以include d的makefile的常用方法吗?

1 个答案:

答案 0 :(得分:0)

如果通常"通常"你的意思是,"最常见的",然后答案是" no"。人们做的最常见的事情是即兴发生对包含内容的一些更改,以便名称不会与包含者发生冲突。

然而,你所做的是"良好的设计"。

事实上,我的设计更进一步。

我计算了一堆目录,如果包含是递归的,则需要在解析makefile树时将当前目录保留在堆栈中。 $D是当前目录 - 人们输入的时间比$(TOP)/更短,

我使用$D/在includee中添加所有,所以你有变量:

$D/FOOBAR := 

和虚假目标:

$D/phony: