Не уверенный, если это возможно в одном единственном Make-файле, но я надеялся записать Make-файл, в некотором роде таким образом, что попытка создать любую цель в файле автоволшебно обнаруживает количество процессоров на существующей системе и создает цель параллельно для количества процессоров.
Что-то как ниже примеров "псевдокода", но намного более чистый?
all:
@make -j$(NUM_PROCESSORS) all
Или:
all: .inparallel
... build all here ...
.inparallel:
@make -j$(NUM_PROCESSORS) $(ORIGINAL_TARGET)
В обоих случаях все, что необходимо было бы ввести:
% make all
Надо надеяться, это имеет смысл.
ОБНОВЛЕНИЕ: Все еще надеясь на Make-файл в качестве примера для вышеупомянутого. Едва ли заинтересованный нахождением количества процессов, но заинтересованный тем, как записать make-файл для создания параллельно без-j параметра командной строки.
Немного покопавшись в главе 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-файла вместо одного, он все еще довольно удобен и полезен.
Часть обнаружения будет зависеть от ОС . Вот фрагмент, который будет работать в Linux и Mac OS X:
NPROCS:=1
OS:=$(shell uname -s)
ifeq($(OS),Linux)
NPROCS:=$(shell grep -c ^processor /proc/cpuinfo)
endif
ifeq($(OS),Darwin) # Assume Mac OS X
NPROCS:=$(shell system_profiler | awk '/Number Of CPUs/{print $4}{next;}')
endif
Чтобы заставить его работать, вам, вероятно, придется повторно вызвать make. Тогда ваша проблема заключается в предотвращении бесконечной рекурсии. Вы могли бы справиться с этим, имея два make-файла (первый только сбрасывает значение -j
), но, вероятно, это возможно улучшить.