В 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"
Это полный файл make-файла верхнего уровня, который нужно просто делегировать в make-файлы подкаталога? –
Это не должно запускать рецепт 'common' дважды. Добавляет ли 'touch $ @' в рецепт исправить эту проблему? –
Если кто-то вызывает «очистить все», то ... что вы хотите сделать? – Beta