重新分配Makefile参数

时间:2014-08-04 19:15:58

标签: makefile gnu-make

在当前系统中,有一个犹太人区域黑客可以启动系统的并行构建。例如,要调用并行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

1 个答案:

答案 0 :(得分:1)

在GNU make中,您可以修改Makefile中的make标志。为什么不尝试这样的事情:

ifdef JOBS
MAKEFLAGS+=-j$(JOBS)
endif