背景
我有一个(大)项目A和一个(大)项目B,这样A取决于B。
我希望有两个独立的makefile - 一个用于项目A,一个用于项目B - 用于性能和可维护性。
基于comments到an earlier question,我决定完全重写B的makefile,使得A的makefile可以include
。这将避免递归make的弊端:允许并行性,不必要地重新制作,提高性能等。
当前解决方案
我可以通过包含在顶部(在任何其他包含之前)找到当前正在执行的makefile的目录。
TOP := $(dir $(lastword $(MAKEFILE_LIST)))
我正在将每个目标写为
$(TOP)/some-target: $(TOP)/some-src
并对任何必要的shell命令进行更改,例如find dir
至find $(TOP)/dir
。
虽然这解决了问题但它有一些缺点:
目标和规则更长,可读性更低。 (这可能是不可避免的。模块化有代价)。
使用gcc -M
自动生成依赖关系需要进行后处理才能在任何地方添加$(TOP)
。
这是编写其他人可以include
d的makefile的常用方法吗?
答案 0 :(得分:0)
如果通常"通常"你的意思是,"最常见的",然后答案是" no"。人们做的最常见的事情是即兴发生对包含内容的一些更改,以便名称不会与包含者发生冲突。
然而,你所做的是"良好的设计"。
事实上,我的设计更进一步。
我计算了一堆目录,如果包含是递归的,则需要在解析makefile树时将当前目录保留在堆栈中。 $D
是当前目录 - 人们输入的时间比$(TOP)/
更短,
我使用$D/
在includee中添加所有,所以你有变量:
$D/FOOBAR :=
和虚假目标:
$D/phony: