在当前系统中,有一个犹太人区域黑客可以启动系统的并行构建。例如,要调用并行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++ $@
Cmd:make JOBS=8
。
这适用于大多数规则,但它不断浪费时间重建PHONY规则,因此应该修复。有没有办法将make JOBS=N
命令完全重新路由到make -j$(JOBS)
而不在任一范围内冗余地执行任何其他规则? (意味着除了make JOBS=N
中的子制作外没有任何内容执行,并且子制作只会一次调用所有$(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
答案 0 :(得分:1)
在GNU make中,您可以修改Makefile中的make标志。为什么不尝试这样的事情:
ifdef JOBS
MAKEFLAGS+=-j$(JOBS)
endif