У меня есть установка, где делают, проходит набор подкаталогов и делает в тех каталогах. Я хотел бы, чтобы это остановило сборку при отказе сразу. Фрагмент кода ниже иллюстрирует это. Кто-то может указать на меня в правильном направлении о том, как make-файл должен быть настроен или некоторая документация о создании от верхнего уровня вниз через подкаталоги?
SUBDIRS = \
test1 \
test2
all clean check :
@for dir in $(SUBDIRS); do \
if [ -d $$dir ]; then (cd $$dir; $(MAKE) $@) fi \
done
Я в том (явном) меньшинстве, которое не согласно с "Recursive Make Considered Harmful". Я писал рекурсивные системы Make для больших, беспорядочных кодовых баз, и они работают довольно хорошо.
Вот как это делается:
all: $(SUBDIRS)
$(SUBDIRS): force
@ $(MAKE) -s -C $@
.PHONY: force
force :;
(Я добавил -s, чтобы было спокойнее)
EDIT: Чтобы передать цель сабмейкам (я должен был сделать это раньше):
.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 :;
Я бы настоятельно рекомендовал вам отказаться от рекурсивного подхода make. Это может вызвать бесконечные трудности в дальнейшем, когда ваши Make-файлы будут расти. Смотрите статью Recursive Make Considered Considered Harmful для очень хорошего объяснения того, почему вызывать make рекурсивно - плохая идея.
Непосредственным преимуществом перехода на нерекурсивный make является то, что проблема, с которой вы сейчас столкнулись, просто испарится. У вас не будет этой проблемы с нерекурсивным Makefile.
Также, не стесняйтесь проверить этот шаблон нерекурсивного Makefile, который я создал. Он требует GNU Make 3.81, но очень прост в использовании. По крайней мере, он может служить хорошим примером нерекурсивного Makefile, если вы захотите создать свой собственный.