Рекурсивный маркер в подкаталогах - PullRequest
16 голосов
/ 12 февраля 2012

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

Ответы [ 4 ]

17 голосов
/ 12 февраля 2012
  1. Чтение Рекурсивное использование Make глава GNU Make, руководство.
  2. Изучите статью Питера Миллера Рекурсивное создание, считающееся вредным статья.
  3. ...
  4. PROFIT !!!

P.S. Фрагмент кода из мой ответ на другой, но связанный с этим вопрос может быть использован в качестве приблизительного приближения.

7 голосов
/ 30 марта 2012

@ eldar-abusalimov, первая ссылка, которую вы разместили, предполагает, что make-файл знает , что такое подпапки.Это не всегда так, и я думаю, вот что @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 голосов
/ 21 июля 2017

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

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

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

SUBDIRS = $(shell ls -d */)
all:
    for dir in $(SUBDIRS) ; do \
        make -C  $$dir ; \
    done
1 голос
/ 27 марта 2019

Приведенные выше ответы хорошо работают, когда во всех подкаталогах есть Makefile.Не так сложно запустить 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
...