Существует также способ перечисления подкаталогов только с командами gmake, без использования команд оболочки:
test:
@echo $(filter %/, $(wildcard lib/*/))
В этом списке будут перечислены все подкаталоги с конечным символом '/'
. Чтобы удалить его, вы можете использовать шаблон замены:
subdirs = $(filter %/, $(wildcard lib/*/))
test:
@echo $(subdirs:%/=%)
Затем для создания правил, выполняющих make-файлы в каждом подкаталоге, вы можете использовать небольшую хитрость - фальшивую цель в несуществующем каталоге. Я думаю, что в этом случае пример скажет больше, чем любое объяснение:
FULL_DIRS =$(filter %/, $(wildcard lib/*/))
LIB_DIRS =$(FULL_DIRS:%/=%)
DIRS_CMD =$(foreach subdir, $(LIB_DIRS), make-rule/$(subdir))
make-rule/%:
cd $* && $(MAKE)
all: DIRS_CMD
В основном, цель 'all'
перечисляет все подкаталоги как предварительные условия. Например, если LIB_DIRS
содержит lib/folder1 lib/folder2
, то расширение будет выглядеть так:
all: make-rule/lib/folder1 make-rule/lib/folder2
Затем «make», чтобы выполнить правило 'all'
, пытается сопоставить каждую предпосылку с существующей целью. В этом случае целью является 'make-rule/%:'
, который использует '$*'
для извлечения строки после 'make-rule/'
и использует ее в качестве аргумента в рецепте. Например, первое условие должно быть сопоставлено и расширено следующим образом:
make-rule/lib/folder1:
cd lib/folder1 && $(MAKE)