2015-05-19 3 views
2

В gnu make, есть ли способ получить исходную цель, которая инициировала целую цепочку и привести исполнение к текущему рецепту?GNU Сделать родительское целевое имя

.PHONY : all clean common 
all: common 
clean: common 

common: 
    @echo [email protected] 
    @echo $(MAKECMDGOALS) 
    @for a in $$(ls); do \ 
     if [ -d $$a ]; then \ 
      echo -C $$a $(MAKECMDGOALS); \ 
      #$(MAKE) -C $$a $(MAKECMDGOALS); \ 
     fi; \ 
    done; 
    @echo "Done!" 

Как и в приведенном выше примере, когда я запустить «сделать все» или «сделать чистым», я могу использовать $ (MAKECMDGOALS), чтобы сказать, какая цель была передана сделать из командной строки. Однако, если кто-то называет его «очищать все», тогда «общий» вызывается один раз, и мы получаем «make: ничего не делать для« чистого ».».

Итак, есть ли способ вызвать «общий» для каждого обращения к нему в качестве предпосылки для цели, а также для разработки искомого имени цели, чтобы его можно было передать в следующий make? Хотя «общий» - цель PHONY, она называется только один раз, и я не знаю, почему.

У меня ниже альтернатив, но и я думаю, что первые из них является опрятным

Makefile 1

just_a_func = @echo "just_a_func from " $(1) 

.PHONY : all clean 
all: 
    @echo [email protected] " enter" 
    $(call just_a_func, [email protected]) 

clean: 
    @echo [email protected] " enter" 
    $(call just_a_func, [email protected]) 

Makefile 2

.PHONY : all clean common 
all: 
    @echo [email protected] " enter" 
    $(MAKE) -f makefile common 

clean: 
    @echo [email protected] " enter" 
    $(MAKE) -f makefile common 

common: 
    @echo [email protected] " enter" 
+0

Это полный файл make-файла верхнего уровня, который нужно просто делегировать в make-файлы подкаталога? –

+0

Это не должно запускать рецепт 'common' дважды. Добавляет ли 'touch $ @' в рецепт исправить эту проблему? –

+0

Если кто-то вызывает «очистить все», то ... что вы хотите сделать? – Beta

ответ

0

Она поражает меня есть два вопроса здесь, название в названии, а другое - при разработке проблемы.

В ответ на вопрос в заголовке: захват цели, которая приводит к изменению, используйте remake.

Например, с помощью Makefile вы предоставили:

$ remake -X -f Makefile 
GNU Make 4.1+dbg0.91 
... 
Reading makefiles... 
Updating makefiles.... 
Updating goal targets.... 
File 'PHONY' does not exist. 
    File 'all' does not exist. 
-> (/tmp/Makefile:5) 
common: 
remake<0> T 
=>#0 common at /tmp/Makefile:5 
    #1 all at /tmp/Makefile:2 
    #2 PHONY at /tmp/Makefile:1 
remake<1> quit 

$ remake -X -f Makefile clean 
GNU Make 4.1+dbg0.91 
... 
Reading makefiles... 
Updating makefiles.... 
Updating goal targets.... 
File 'clean' does not exist. 
-> (/tmp/Makefile:5) 
common: 
remake<0> T 
=>#0 common at /tmp/Makefile:5 
    #1 clean at /tmp/Makefile:3 
remake<1> 

Выше мы так случилось, чтобы начать на цель, мы хотим, чтобы проверить. Если это не так, вы можете использовать команду «breakpoint», чтобы установить точку останова и «продолжить», пока вы не нажмете на нее.

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