Как я могу заказать команду make
в Makefile для выполнения рекурсивно во всех командах подкаталогов make
(определенных в Makefile в подкаталогах)?
Рекурсивный make в подкаталогах
Ответ 1
- Прочитайте Рекурсивное использование Make глава руководства GNU.
- Учите Питера Миллера Рекурсивная статья считается вредной.
- ...
- PROFIT!!!
P.S. В качестве грубого приближения можно использовать фрагмент кода из моего ответа на другой, но связанный с ним вопрос.
Ответ 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