2014-07-25 117 views
0

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

回答

1

正如链接故障单答案中包含的文档片段所示。 MAKEFILE_LIST的值按照原样更新。列表中的最新条目是当前的makefile,它使列表中倒数第二个条目成为最近包含的makefile。如果你愿意断言主要的project/Makefile.reg只会被包含在子目录makefile中,那么它可以简单地检查MAKEFILE_LIST中的条目。

或者,您可以简单地在主要的Makefile中定义canned recipe,并在每个项目的makefile中调用它以定义合适的目标。

不幸的是,使得倒数第二个条目比令人愉快的要难一些。但下面应该工作:

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

灵感以上来自于chop函数从梦幻般的GMSL

+0

这个问题基本上归结为如何从MAKEFILE_LIST而不是最后一个条目中获取'last-1'条目。 – Suedocode

+0

@Aggieboy我意识到你可能没有看到我编辑了我的答案,包括一种方法来获取你需要的单词。如果是这样,对此感到抱歉。 –

+0

啊有趣!我正在做'reverse = $(如果$(1),$(调用reverse,$(wordlist 2,$(words $(1)),$(1))))$(firstword $(1))'和然后'$(patsubst%/,%,$(dir $(word 2,$(call reverse,$(MAKEFILE_LIST)))))',但是你的解决方案可能会更快。让我在接受之前尝试一下。 – Suedocode