Запустить make в каждом подкаталоге
У меня есть каталог (root_dir
), который содержит несколько подкаталогов (subdir1, subdir2, ...
).
Я хочу запустить make
в каждом каталоге в root_dir
, используя Makefile, помещенный в него.
(Очевидно, предполагается, что каждый из subdir...
имеет внутри собственного Makefile).
Итак, есть два вопроса:
- Как получить список каталогов в Makefile (автоматически)?
- Как запустить make для каждой из каталогов внутри файла make?
Как я знаю, чтобы запустить make в определенном каталоге, я прислушался сделать следующее:
$(MAKE) -C subdir
Ответы
Ответ 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))