基于this paper,我试图将我的构建系统的一个子集重做为非递归。它实际上工作得很好。默认情况下,我通过模板将所有相关目录的部分makefile include
:
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))))
那些includes
会建立一个像TGT_BIN
这样的变量,一篇论文,一切都有效。
$ make # does the right thing
但是,我想让用户能够制作这些目录的子集。我知道我可以像DIRECTORIES
那样定义:
DIRECTORIES ?= dirA ...
那样:
$ make DIRECTORIES="dirB dirF"
的工作原理。但有没有办法编写我的makefile:
$ make -j12 dirB dirF
会做同样的事情吗?
答案 0 :(得分:1)
假设您有要构建的目标的每个目录变量(例如TGT_dirB
,TGT_dirF
等),那么执行您想要的操作应该像添加一样简单:
$(eval $(DIR): $(TGT_$(DIR)))
到这样的foreach
循环:
$(eval $(call import_template,$(DIR)))$(eval $(DIR): $(TGT_$(DIR)))
将所有每个目录的目标添加为目录目标的先决条件。
并添加
.PHONY: $(DIRECTORIES)
在makefile中的某个位置,以确保make意识到这些是虚假目标,并且实际上并不意味着目录本身。
答案 1 :(得分:0)
我建议您使用非递归prorab构建系统。
它允许您在每个目录中拥有独立的 makefile
,同时拥有所有内容的主makefile。因此,您只能通过cd
建立项目树的一部分,并在正确的子网站中调用make
。