重新分配Makefile参数

重新分配Makefile参数,makefile,gnu-make,Makefile,Gnu Make,在当前的系统中,有一个犹太人区黑客发起了系统的并行构建。例如,调用并行make需要make JOBS=8,而不是make-j8。我已经修复了makefile,但是在调用make的脚本中,以前有很多依赖于JOBS标志。我希望递归调用make作为解决方法: ifdef JOBS %: $(MAKE) $(MAKECMDGOALS) JOBS= -j$(JOBS) endif 但这有一些奇怪的行为。它将首先调用make JOBS=-j8,但在完成此规则后,它似乎会继续并再次重建$(MAKECMD

在当前的系统中,有一个犹太人区黑客发起了系统的并行构建。例如,调用并行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

这对于大多数规则来说都是好的,但是重建虚假规则会浪费时间,所以这应该是固定的。是否有一种方法可以完全将
make JOBS=N
命令重新路由到
make-j$(JOBS)
,而不在任何一个范围内重复执行任何其他规则?(这意味着除了在
make JOBS=N
中执行子make外,不会执行任何操作,并且子make只会使用所有
$(MAKECMDGOALS)
一次调用一次。)

编辑:我也希望避免使用大型
ifdef;其他的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

在GNU make中,您可以修改make文件中的make标志。为什么不试试这样的东西:

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

我的derps的程度甚至无法用语言表达。谢谢,先生。请注意,如果您使用的是GNU make 4.0或更高版本,我认为这只会在make的当前实例上启用并行性。