Заставьте отказ в подкаталоге сделать не останавливающуюся сборку

У меня есть установка, где делают, проходит набор подкаталогов и делает в тех каталогах. Я хотел бы, чтобы это остановило сборку при отказе сразу. Фрагмент кода ниже иллюстрирует это. Кто-то может указать на меня в правильном направлении о том, как make-файл должен быть настроен или некоторая документация о создании от верхнего уровня вниз через подкаталоги?

SUBDIRS = \
test1 \
test2 

all clean check :
    @for dir in $(SUBDIRS); do \
        if [ -d $$dir ]; then (cd $$dir; $(MAKE) $@) fi \
    done
6
задан Stephen Burke 17 March 2010 в 15:07
поделиться

2 ответа

Я в том (явном) меньшинстве, которое не согласно с "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 :;
9
ответ дан 9 December 2019 в 22:32
поделиться

Я бы настоятельно рекомендовал вам отказаться от рекурсивного подхода make. Это может вызвать бесконечные трудности в дальнейшем, когда ваши Make-файлы будут расти. Смотрите статью Recursive Make Considered Considered Harmful для очень хорошего объяснения того, почему вызывать make рекурсивно - плохая идея.

Непосредственным преимуществом перехода на нерекурсивный make является то, что проблема, с которой вы сейчас столкнулись, просто испарится. У вас не будет этой проблемы с нерекурсивным Makefile.

Также, не стесняйтесь проверить этот шаблон нерекурсивного Makefile, который я создал. Он требует GNU Make 3.81, но очень прост в использовании. По крайней мере, он может служить хорошим примером нерекурсивного Makefile, если вы захотите создать свой собственный.

2
ответ дан 9 December 2019 в 22:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: