Сделайте неудачу в подкаканере, не останавливаясь на сборку
-
20-09-2019 - |
Вопрос
У меня есть настройка, где Make проходит через кучу подкаталогов и изготовление в этих каталогах. Я бы хотел, чтобы это немедленно остановило сборку с провала. Приведенный ниже фрагмент кода иллюстрирует это. Может ли кто -нибудь указать мне правильное направление на то, как следует настроить Makefil или какую -то документацию о строительстве с верхнего уровня вниз через подкатарии?
SUBDIRS = \
test1 \
test2
all clean check :
@for dir in $(SUBDIRS); do \
if [ -d $$dir ]; then (cd $$dir; $(MAKE) $@) fi \
done
Решение
Я нахожусь в (очевидном) меньшинстве, которое не согласен с «рекурсивным, считается вредным». Я написал рекурсивные системы создания для больших, грязных кодовых баз, и они работают довольно хорошо.
Вот как это сделать:
all: $(SUBDIRS)
$(SUBDIRS): force
@ $(MAKE) -s -C $@
.PHONY: force
force :;
(Я добавил -s, чтобы сделать вещи тише.)
РЕДАКТИРОВАТЬ: Чтобы передать цель вплоть до подводных материалов (я должен был сделать это раньше):
.PHONY: all check clean
all check clean: $(SUBDIRS)
all: TARGET=all
check: TARGET=check
clean: TARGET=clean
# No, you can't do TARGET=$@, or at least I don't know how to.
# recursive call to make
$(SUBDIRS): force
@ $(MAKE) -s -C $@ $(TARGET)
.PHONY: force
force :;
Другие советы
Я бы призвал вас отказаться от рекурсивного подхода к созданию. Это может привести к бесконечному количеству трудностей позже по мере роста ваших макияж. Смотрите бумагу Рекурсивное делает вредным Для очень хорошего объяснения того, почему вызывание призывов рекурсивно - плохая идея.
Непосредственное преимущество, которое вы реализуете от перехода на не-рекурсивную марку, заключается в том, что эта проблема, которую вы испытываете прямо сейчас, будет просто испариваться. Анкет У вас не будет этой проблемы с нерекурсивным Makefil.
Кроме того, не стесняйтесь проверить это Cowerplate нерекурсивный макияж что я создал. Это требует, чтобы GNU сделал 3.81, но действительно прост в использовании. По крайней мере, это может служить хорошим примером нерекурсивного файла make-файла, если вы хотите создать свой собственный.