我想在顶级Makefile
可以包含的文件中描述每个submake的依赖项。这是为了允许递归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
中包含目录路径发现,而不是在每个子映像Makefile.reg
中添加新行?换句话说,包含的makefile可以推导出父makefile的目录吗?我看到MAKEFILE_LIST
变量的一些不同解析的潜力。
答案 0 :(得分:1)
由于您链接的故障单上的答案中包含的文档片段显示。 MAKEFILE_LIST
的值会随着make的更新而更新。列表中的最新条目是当前的makefile,它使列表中的倒数第二个条目成为之前最近包含的makefile。如果您愿意断言主project/Makefile.reg
只会从子目录makefile中包含,那么它可以简单地检查MAKEFILE_LIST
中的条目。
或者,您只需在主Makefile
中定义canned recipe,并在每个项目的makefile中调用它来定义适当的目标。
不幸的是,make确实让倒数第二个条目变得比令人愉快的更难。但以下情况应该有效:
FOO=a b c d e f g
BAR=h i j k l m n
BAZ=o p q r s t u
QUX=v w x y z 1 2
penultimateword = $(wordlist $(words $1),$(words $1), x $1)
REG=FOO
$(REG)_DIR= $(call penultimateword,$($(REG)))
$(info REG_DIR=$($(REG)_DIR))
REG=BAR
$(REG)_DIR= $(call penultimateword,$($(REG)))
$(info REG_DIR=$($(REG)_DIR))
REG=BAZ
$(REG)_DIR= $(call penultimateword,$($(REG)))
$(info REG_DIR=$($(REG)_DIR))
REG=QUX
$(REG)_DIR= $(call penultimateword,$($(REG)))
$(info REG_DIR=$($(REG)_DIR))
all: ;
对上述内容的启示来自梦幻般GMSL的chop
函数。