Как я могу записать, что make-файл, чтобы автоматически обнаружить и параллелизировать сборку с GNU Делает?

Не уверенный, если это возможно в одном единственном 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 параметра командной строки.

28
задан dlamotte 28 March 2010 в 14:59
поделиться

2 ответа

Немного покопавшись в главе 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-файла вместо одного, он все еще довольно удобен и полезен.

6
ответ дан 28 November 2019 в 03:15
поделиться

Часть обнаружения будет зависеть от ОС . Вот фрагмент, который будет работать в 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 ), но, вероятно, это возможно улучшить.

23
ответ дан 28 November 2019 в 03:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: