并行make:指定先决条件之间的顺序

时间:2015-03-06 09:38:24

标签: makefile

我有以下Makefile:

resources: rsrcsubdirs

rsrcsubdirs: rsrcadd $(RSRCSUBDIRS)

$(RSRCSUBDIRS):
        @$(MAKE) -C $@ $(MAKECMDGOALS)

resclean:  $(RSRCSUBDIRS)
        @$(RM) -rf $(BUILD)/resources/

$(RSRCSUBDIRS)是文件夹列表。  在为所有人执行make之前," rsrcadd"应该创建可执行文件。它由规则rsrcadd创建。

问题是,当并行运行Make时,似乎无法告诉它,rsrcsubdirs依赖于rsrcadd,但rsrcadd应该在$(RSRCSUBDIRS)之前执行。它总是试图并行执行所有先决条件

仅限订单的先决条件:

rsrcsubdirs: $(RSRCSUBDIRS) | rsrcadd

不要做我想做的事:

甚至多级目标:

resources: rsrcadd rsrcsubdirs

rsrcsubdirs: rsrcadd rsrcsubdirs1      

rsrcsubdirs1: $(RSRCSUBDIRS)

不要做我想做的事。

没有像

那样的东西
rsrcsubdirs: $(DO_IT_AFTER(rsrcadd)) 

唯一有效的是:

$(RSRCSUBDIRS): rsrcadd
        @$(MAKE) -C $@ $(MAKECMDGOALS)

告诉$(RSRCSUBDIRS)依赖于rsrcadd。 但这打破了清洁规则。 make resclean会在清理文件之前调用rsrcadd。

看起来我错过了一些东西。是否有优雅的方式来做我想要的事情?

1 个答案:

答案 0 :(得分:0)

必须$(RSRCSUBDIRS)目标添加仅限订单的先决条件,因为这些是需要它的目标。将其添加到rsrcsubdirs目标无济于事,因为所有内容都是在构建rsrcsubdirs目标之前,rsrcadd必须完整。你看到的还不够。

一种方法是检查您正在构建的目标,如果是clean,则不添加仅限订单的先决条件。例如:

ifeq (clean,$(filter clean,$(MAKECMDGOALS)))
    PREREQ :=
else
    PREREQ := rsrcadd
endif

  ...

$(RSRCSUBDIRS): $(PREREQ)
        @$(MAKE) -C $@ $(MAKECMDGOALS)

现在,当您运行make clean时,$(PREREQ)将为空,否则将为rsrcadd