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