Немного покопавшись в главе 2 LDD3 и прочитав ответ dmckee, я придумал этот не очень хороший ответ, используя два make-файла (я бы предпочел только один).
$ cat Makefile
MAKEFLAGS += -rR --no-print-directory
NPROCS := 1
OS := $(shell uname)
export NPROCS
ifeq ($J,)
ifeq ($(OS),Linux)
NPROCS := $(shell grep -c ^processor /proc/cpuinfo)
else ifeq ($(OS),Darwin)
NPROCS := $(shell system_profiler | awk '/Number of CPUs/ {print $$4}{next;}')
endif # $(OS)
else
NPROCS := $J
endif # $J
all:
@echo "running $(NPROCS) jobs..."
@$(MAKE) -j$(NPROCS) -f Makefile.goals $@
%:
@echo "building in $(NPROCS) jobs..."
@$(MAKE) -j$(NPROCS) -f Makefile.goals $@
$ cat Makefile.goals
MAKEFLAGS += -rR --no-print-directory
NPROCS ?= 1
all: subgoal
@echo "$(MAKELEVEL) nprocs = $(NPROCS)"
subgoal:
@echo "$(MAKELEVEL) subgoal"
Что вы думаете об этом решении?
Я вижу преимущества в том, что люди все еще набирают make
, чтобы построить. Так что не существует какого-либо скрипта-драйвера, который бы выполнял работу NPROCS
и make -j$(NPROCS)
, которую люди должны будут знать вместо того, чтобы набирать make.
Недостатком является то, что вам придется явно использовать make -f Makefile.goals
для создания последовательной сборки. И я не уверен, как решить эту проблему ...
ОБНОВЛЕНО: добавлено $ J к вышеуказанному фрагменту кода. Кажется, работа работает довольно хорошо. Несмотря на то, что он имеет два make-файла вместо одного, он все еще довольно прост и полезен.