Сделать ошибку в подкаталоге сделать не остановить сборку - PullRequest
6 голосов
/ 17 марта 2010

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

SUBDIRS = \
test1 \
test2 

all clean check :
    @for dir in $(SUBDIRS); do \
        if [ -d $$dir ]; then (cd $$dir; $(MAKE) $@) fi \
    done

Ответы [ 2 ]

9 голосов
/ 17 марта 2010

Я нахожусь в (явном) меньшинстве, которое не согласно с «Рекурсивным делать считается вредным» Я написал рекурсивные системы 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 :;
2 голосов
/ 17 марта 2010

Я бы призвал вас отказаться от рекурсивного подхода. Это может вызвать бесконечное количество трудностей позже, когда ваши Makefile растут. См. Статью Рекурсивное создание, считающееся вредным для очень хорошего объяснения того, почему рекурсивное использование make является плохой идеей.

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

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

...