Рекурсивный make в подкаталогах

Как я могу заказать команду make в Makefile для выполнения рекурсивно во всех командах подкаталогов make (определенных в Makefile в подкаталогах)?

Ответ 2

@eldar-abusalimov, первая связанная вами ссылка предполагает, что makefile знает, что такое подпапки. Это не всегда так, и я думаю, это то, что хотел бы знать @tyranitar. В таком случае такое решение может сделать работу: (взял меня на некоторое время, но я тоже нуждался)

SHELL=/bin/bash

all:
    @for a in $$(ls); do \
        if [ -d $$a ]; then \
            echo "processing folder $$a"; \
            $(MAKE) -C $$a; \
        fi; \
    done;
    @echo "Done!"

Ответ 3

Я напишу здесь свое конкретное решение. Предположим, у нас есть каталог со многими подкаталогами, все из которых имеют собственный make файл:

root-dir\
    +----subdir1
    +----subdir2
    ...
    +----subdirn

тогда просто скопируйте в корневой каталог этот Makefile:

SUBDIRS = $(shell ls -d */)
all:
    for dir in $(SUBDIRS) ; do \
        make -C  $$dir ; \
    done

Ответ 4

Приведенные выше ответы хорошо работают, когда все подкаталоги имеют Makefiles. Не так сложно запустить make только в каталогах, содержащих Makefile, и при этом трудно ограничить количество уровней для рекурсии. В моем примере кода я ограничиваю поиск make файлов подкаталогами, расположенными непосредственно под родительским каталогом. Оператор filter-out (строка 2) предотвращает включение этого Makefile в рекурсивные make.

MAKEFILES = $(shell find . -maxdepth 2 -type f -name Makefile)
SUBDIRS   = $(filter-out ./,$(dir $(MAKEFILES)))

all:
    for dir in $(SUBDIRS); do \
        make -C $$dir all; \
    done