Makefile 非递归生成压缩目标

Makefile 非递归生成压缩目标,makefile,Makefile,基于,我正试图将构建系统的一个子集修改为非递归的。它实际上运行得很好。默认情况下,我有一部分makefile通过模板包含所有相关目录: DIRECTORIES = dirA dirB ... etc ... define import_template dir := $(1) include $(1)/Rules.mk include Rules.mk endef $(foreach DIR,$(DIRECTORIES), \ $(eval $(call import_templat

基于,我正试图将构建系统的一个子集修改为非递归的。它实际上运行得很好。默认情况下,我有一部分makefile
通过模板包含所有相关目录:

DIRECTORIES = dirA dirB ... etc ...

define import_template
dir := $(1)
include $(1)/Rules.mk
include Rules.mk
endef

$(foreach DIR,$(DIRECTORIES), \
    $(eval $(call import_template,$(DIR)))) 
这些
包括
建立一个变量,如
TGT_BIN
,一个在论文中都有效的变量

$ make # does the right thing
但是,我想让用户能够创建这些目录的子集。我知道我可以定义
目录
如下:

DIRECTORIES ?= dirA ...
以便:

$ make DIRECTORIES="dirB dirF"
工作。但是有没有一种方法可以编写我的makefile,以便:

$ make -j12 dirB dirF

将做同样的事情吗?

假设您有要构建的目标的每个目录变量(例如,
TGT\u dirB
TGT\u dirF
,等等),那么做您想做的事情应该简单到添加:

$(eval $(DIR): $(TGT_$(DIR)))
foreach
循环,如下所示:

$(eval $(call import_template,$(DIR)))$(eval $(DIR): $(TGT_$(DIR)))
添加所有每个目录目标作为目录目标的先决条件

及加入

.PHONY: $(DIRECTORIES)

在makefile中的某个地方,以确保这些都是虚假的目标,实际上并不意味着目录本身。

我建议您使用非递归构建系统


它允许您在每个目录中拥有独立的
makefile
,同时为所有内容提供一个主makefile。因此,您可以通过将
cd
'放到右子目录并调用
make

来只构建项目树的一部分,而无需
?=
就可以像
make DIRECTORIES=
那样进行命令行分配。命令行赋值优先。您需要
?=
来防止环境变量被过度写入。
.PHONY:$(目录)
行是否等同于
。模板中的PHONY:$1$(TGT\u$1)
。模板中的PHONY:$1
,是的。我几乎做到了,但这一行更清楚地解释了我的想法。我无法让
$1:$(TGT_$1)
工作。我认为
TGT\u$1
中的
$1
没有立即展开?什么意思是不能让它工作?会发生什么?你从make那里得到一个错误吗?如果将其粘贴到模板中,
$(信息测试:$1:$(TGT_$1))
会输出什么?您在其中一个目标的
make-qp
输出中看到了什么?我得到了
Test:dirA:
Test:dirB:
。但是,如果我
$(信息测试:$1:$(TGT_dirA))
,我会从dirA中获得
Test:dirA:
Test:dirB:一些目标。这也很奇怪,我想我会在两个地方都找到
dirA
目标?