Сделайте неудачу в подкаканере, не останавливаясь на сборку

StackOverflow https://stackoverflow.com/questions/2463356

Вопрос

У меня есть настройка, где 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-файла, если вы хотите создать свой собственный.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top