Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Makefile 并行生成:指定先决条件之间的顺序_Makefile - Fatal编程技术网

Makefile 并行生成:指定先决条件之间的顺序

Makefile 并行生成:指定先决条件之间的顺序,makefile,Makefile,我有以下生成文件: resources: rsrcsubdirs rsrcsubdirs: rsrcadd $(RSRCSUBDIRS) $(RSRCSUBDIRS): @$(MAKE) -C $@ $(MAKECMDGOALS) resclean: $(RSRCSUBDIRS) @$(RM) -rf $(BUILD)/resources/ $(RSRCSUBDIRS)是文件夹列表。 在为所有这些文件执行make之前,应创建“rsrcadd”可执行文件。

我有以下生成文件:

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

看来我遗漏了什么。有没有优雅的方法来完成我想要的任务?

您必须将仅订单的先决条件添加到
$(RSRCSUBDIRS)
目标,因为这些目标需要它。将它添加到
rsrcsubdirs
target没有任何帮助,因为上面说的是,在构建
rsrcsubdirs
target本身之前,
rsrcadd
必须完成。如你所见,这还不够

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

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

  ...

$(RSRCSUBDIRS): $(PREREQ)
        @$(MAKE) -C $@ $(MAKECMDGOALS)
现在,当您运行
makeclean
时,
$(PREREQ)
将为空,否则它将为
rsrcadd