make gnu - запускать цели параллельно - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть makefile, и я хочу запускать обе цели параллельно , автоматически, просто для запуска make, а не make -j... Я использую makeflages и NPROCS для каждой ОС внутри makeфайл (здесь его для Дарвина) это возможно?

all: module1 module2

NPROCS = $(shell sysctl hw.ncpu  | grep -o '[0-9]\+')
MAKEFLAGS += -j$(NPROCS)

.PHONY: module1
module1:
    @echo "run module 1"
    @echo $(DIR)

.PHONY: module2
module2:
    @echo "run module2”

1 Ответ

0 голосов
/ 21 февраля 2019

Да, это возможно, и ваш make-файл будет делать то, что вы хотите, если NPROCS > 1 и ваша платформа поддерживает параллельное создание.См., Например, GNU make manual :

Переменная MAKEFLAGS также может быть полезна, если вы хотите иметь определенные параметры, такие как -k (см. Сводка поОпции), устанавливайте каждый раз, когда вы запускаете make.Вы просто указываете значение MAKEFLAGS в своей среде.Вы также можете установить MAKEFLAGS в make-файле, чтобы указать дополнительные флаги, которые также должны действовать для этого make-файла.

И вы также можете проверить это самостоятельно, если хотите.Следующее доказывает, что make работает в параллельном режиме с NPROCS+1 рецептами.Каждый рецепт печатает первое сообщение, спит в течение 2 секунд и печатает второе сообщение.

Если make работает в параллельном режиме, вы должны увидеть NPROCS run moduleX with NPROCS=Y напечатанных сообщений и через 2 секунды NPROCS done moduleX Сообщения.Затем вы должны увидеть одно последнее сообщение run moduleX with NPROCS=Y, а через 2 секунды - последнее сообщение done moduleX.

Иначе, если оно не работает в параллельном режиме, вы увидите чередование сообщений run moduleX with NPROCS=Yи done moduleX сообщения.

Демонстрация:

$ cat Makefile
SHELL       := bash
NPROCS      := $(shell sysctl hw.ncpu  | grep -o '[0-9]\+')
MAKEFLAGS   += -j$(NPROCS)
MODULES     := $(shell for (( i = 1; i <= $(NPROCS) + 1; i++ )); do printf 'module%d ' "$$i"; done)

.PHONY: all $(MODULES)

all: $(MODULES)

$(MODULES):
    @echo "run $@ with NPROCS=$(NPROCS)"; sleep 2; echo "done $@"

$ make
run module1 with NPROCS=8
run module2 with NPROCS=8
run module3 with NPROCS=8
run module4 with NPROCS=8
run module5 with NPROCS=8
run module6 with NPROCS=8
run module7 with NPROCS=8
run module8 with NPROCS=8
done module2
done module3
done module6
done module8
done module1
done module7
done module4
done module5
run module9 with NPROCS=8
done module9
...