我有以下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。
看起来我错过了一些东西。是否有优雅的方式来做我想要的事情?
答案 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
。