Да, это возможно, и ваш 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