我想描述顶级Makefile
可包含的文件中的每个子制作的依赖关系。这是为了允许递归make设置(具有实例化变量和相对路径的所有功能),但是具有在顶层make中描述的所有依赖性,以提高编译速度和并行性。包含Makefile的父目录
举例来说,假设我们有一个看起来像这样的目录树:
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 $([email protected]_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
中包含目录路径发现,而不是在每个子代码Makefile.reg
中添加新行?换句话说,包含的makefile是否可以推导父Makefile的目录?我发现在MAKEFILE_LIST
变量的一些不同解析中有潜力。
这个问题基本上归结为如何从MAKEFILE_LIST而不是最后一个条目中获取'last-1'条目。 – Suedocode
@Aggieboy我意识到你可能没有看到我编辑了我的答案,包括一种方法来获取你需要的单词。如果是这样,对此感到抱歉。 –
啊有趣!我正在做'reverse = $(如果$(1),$(调用reverse,$(wordlist 2,$(words $(1)),$(1))))$(firstword $(1))'和然后'$(patsubst%/,%,$(dir $(word 2,$(call reverse,$(MAKEFILE_LIST)))))',但是你的解决方案可能会更快。让我在接受之前尝试一下。 – Suedocode