非递归性限制目标

时间:2015-06-17 16:47:59

标签: makefile

基于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

会做同样的事情吗?

2 个答案:

答案 0 :(得分:1)

假设您有要构建的目标的每个目录变量(例如TGT_dirBTGT_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