【发布时间】:2014-07-25 16:11:45
【问题描述】:
我想在顶级Makefile 可以包含的文件中描述每个子制作的依赖关系。这是为了允许递归 make 设置(具有实例变量和相对路径的所有功能),但所有依赖项都在顶级 make 中描述,以提高编译速度和并行度。
例如,假设我们有一个如下所示的目录树:
project/
|-- lib1
| |-- Makefile
| `-- Makefile.reg
|-- lib2
| |-- Makefile
| `-- Makefile.reg
|-- Makefile
`-- Makefile.reg
project/lib1/Makefile.reg 文件的文件可能如下所示:
REG := lib1
include ../Makefile.reg
project/lib2/Makefile.reg 文件的文件可能如下所示:
REG := lib2
DEP := lib1
include ../Makefile.reg
文件project/Makefile.reg 将如下所示:
$(REG)_DIR = ????
$(REG): $(DEP)
$(MAKE) -C $($@_DIR)
最后,顶级project/Makefile 如下所示:
include $(shell find . -name "Makefile.reg")
现在,顶级 Makefile 拥有每个目标的所有依赖关系信息,并且可以智能地调用递归 make 并利用完全并行性,同时保持依赖关系树完好无损。
问题是我不确定如何让project/Makefile.reg 知道当前子制作的Makefile.reg 的路径是什么。 make 将始终从顶级目录调用,因此 $(shell pwd) 将始终报告 project/。一种解决方案是包含来自this SO 答案的行,但是我希望每个Makefile.reg 只指定一个目标和一个可选的依赖项列表。
有没有办法将目录路径发现包含在常见的project/Makefile.reg 中,而不是在每个子make Makefile.reg 中添加一个新行?换句话说,一个包含的makefile可以推断出父makefile的目录吗?我看到了 MAKEFILE_LIST 变量的一些不同解析的潜力。
【问题讨论】: