【发布时间】:2014-08-05 08:14:50
【问题描述】:
在当前系统中,存在用于启动系统并行构建的 ghetto hack。例如,调用并行 make 需要 make JOBS=8 而不是 make -j8。我已经修复了 makefile,但是之前在调用 make 的脚本中对 JOBS 标志有很多依赖。我希望递归调用 make 作为一种解决方法:
ifdef JOBS
%:
$(MAKE) $(MAKECMDGOALS) JOBS= -j$(JOBS)
endif
这有一些奇怪的行为。它应该首先调用make JOBS= -j8,但在此规则完成后,它似乎继续并再次重建$(MAKECMDGOALS) 中的所有内容。
#Example
TARGETS = lib0 lib1 lib2
ifdef JOBS
%:
$(MAKE) $(MAKECMDGOALS) -j$(JOBS) JOBS=
endif
all: $(TARGETS)
lib%:
@echo g++ $@
命令:make JOBS=8.
这对于大多数规则来说都很好,但是它一直在浪费时间重建 PHONY 规则,所以应该修复这个问题。有没有办法将make JOBS=N 命令完全重新路由到make -j$(JOBS),而无需在任一范围内冗余地执行任何其他规则? (意味着除了make JOBS=N 中的子make 之外什么都不执行,并且子make 只调用一次所有$(MAKECMDGOALS) 一次。)
编辑:我还想避免使用大的ifdef; else; endif 语句,最多在文件顶部放置一个自包含的语句。我开始认为解决方案可能需要类似的东西:
TARGETS = lib0 lib1 lib2
ifdef JOBS
%: unique_make
@echo $@ built > /dev/null
.PHONY: unique_make
unique_make:
$(MAKE) $(MAKECMDGOALS) -j$(JOBS) JOBS=
else
all: $(TARGETS)
lib%:
@echo g++ $@
endif
【问题讨论】: