2014-08-04 6 views
2

В текущей системе был взломан гетто, чтобы инициировать параллельную сборку для системы. Например, для вызова параллельного 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 

ответ

1

В GNU make вы можете изменить флаги make в Makefile. Почему бы не попробовать что-то вроде этого:

ifdef JOBS 
MAKEFLAGS+=-j$(JOBS) 
endif 
+0

Степень моих дерпов даже не может быть выражена словами. Спасибо, сэр. – Suedocode

+0

Обратите внимание, что это позволит включить параллелизм в текущем экземпляре make, если вы используете GNU make 4.0 или выше, я думаю. – MadScientist

+0

Я протестировал его с помощью GNU Make 3,81, и он работает там. – laindir

Смежные вопросы