包含Makefile的父目录

时间:2014-07-25 16:11:45

标签: makefile gnu-make

我想在顶级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变量的一些不同解析的潜力。

1 个答案:

答案 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: ;

对上述内容的启示来自梦幻般GMSLchop函数。