В текущей системе был взломан гетто, чтобы инициировать параллельную сборку для системы. Например, для вызова параллельного make необходимо make JOBS=8
вместо make -j8
. С тех пор я исправил make-файл, однако есть много предыдущих зависимостей от фреймов JOBS
в сценариях, которые вызывают make. Я надеялся рекурсивно назвать make как обходной путь как таковой:Переназначение параметров Makefile
ifdef JOBS
%:
$(MAKE) $(MAKECMDGOALS) JOBS= -j$(JOBS)
endif
У этого есть странное поведение. Сначала он вызовет make JOBS= -j8
, но по завершении этого правила он, похоже, продолжит и снова восстановит все, что находится в $(MAKECMDGOALS)
.
#Example
TARGETS = lib0 lib1 lib2
ifdef JOBS
%:
$(MAKE) $(MAKECMDGOALS) -j$(JOBS) JOBS=
endif
all: $(TARGETS)
lib%:
@echo g++ [email protected]
Код: make JOBS=8
.
Это нормально для большинства правил, однако оно продолжает тратить время на восстановление правил PHONY, поэтому это должно быть исправлено. Есть ли способ полностью перенаправить команду make JOBS=N
на make -j$(JOBS)
без лишних лишних правил в любой области? (Не означает ничего выполняет кроме submake в make JOBS=N
и submake вызывается только один раз со всеми $(MAKECMDGOALS)
сразу.)
EDIT: Я хотел бы также, чтобы избежать больших ifdef; else; endif
заявления, в крайнем случае положить автономный один в в верхней части файла. Я начинаю думать, что решение может потребовать что-то вроде этого:
TARGETS = lib0 lib1 lib2
ifdef JOBS
%: unique_make
@echo [email protected] built > /dev/null
.PHONY: unique_make
unique_make:
$(MAKE) $(MAKECMDGOALS) -j$(JOBS) JOBS=
else
all: $(TARGETS)
lib%:
@echo g++ [email protected]
endif
Степень моих дерпов даже не может быть выражена словами. Спасибо, сэр. – Suedocode
Обратите внимание, что это позволит включить параллелизм в текущем экземпляре make, если вы используете GNU make 4.0 или выше, я думаю. – MadScientist
Я протестировал его с помощью GNU Make 3,81, и он работает там. – laindir