Подтвердить что ты не робот

Запустить make в каждом подкаталоге

У меня есть каталог (root_dir), который содержит несколько подкаталогов (subdir1, subdir2, ...).

Я хочу запустить make в каждом каталоге в root_dir, используя Makefile, помещенный в него. (Очевидно, предполагается, что каждый из subdir... имеет внутри собственного Makefile).

Итак, есть два вопроса:

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

Как я знаю, чтобы запустить make в определенном каталоге, я прислушался сделать следующее:

$(MAKE) -C subdir
4b9b3361

Ответ 1

Существуют различные проблемы с выполнением sub-make внутри цикла for в одном рецепте. Лучший способ сделать несколько подкаталогов:

SUBDIRS := $(wildcard */.)

all: $(SUBDIRS)
$(SUBDIRS):
        $(MAKE) -C [email protected]

.PHONY: all $(SUBDIRS)

(Только для того, чтобы указать, что это спецификация GNU, вы не указали никаких ограничений на версию, которую вы используете).

ETA Здесь версия, которая поддерживает несколько целей верхнего уровня.

TOPTARGETS := all clean

SUBDIRS := $(wildcard */.)

$(TOPTARGETS): $(SUBDIRS)
$(SUBDIRS):
        $(MAKE) -C [email protected] $(MAKECMDGOALS)

.PHONY: $(TOPTARGETS) $(SUBDIRS)

Ответ 2

Попробуйте следующее:

SUBDIRS = foo bar baz

subdirs:
    for dir in $(SUBDIRS); do \
        $(MAKE) -C $$dir; \
    done

Это может помочь вам ссылка

Изменить: вы также можете сделать:

Самый простой способ:

CODE_DIR = code

.PHONY: project_code

project_code:
       $(MAKE) -C $(CODE_DIR)

Правило .PHONY означает, что project_code не является файлом, который должен быть и флаг -C указывает на изменение в каталоге (что эквивалентно запуск кода cd перед вызовом make). Вы можете использовать тот же подход для вызова других целей в файле Makefile кода.

Например:

clean:
   $(MAKE) -C $(CODE_DIR) clean

Источник

Ответ 3

Существует библиотека с именем prorab для GNU make, которая поддерживает включение автономных make файлов в подкаталоги.

Некоторая информация о github: https://github.com/igagis/prorab/blob/master/wiki/HomePage.md

В принципе, при использовании prorab вызова всех make файлов в подкаталогах выглядит так:

include prorab.mk

$(eval $(prorab-build-subdirs))