Makefile 非递归生成压缩目标
基于,我正试图将构建系统的一个子集修改为非递归的。它实际上运行得很好。默认情况下,我有一部分makefileMakefile 非递归生成压缩目标,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
通过模板包含所有相关目录:
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
目标?