Сделать подкаталог с подстановочными знаками

Существует также способ перечисления wildcard подкаталогов только с помощью makefile-errors команд gmake, без использования makefile-project каких-либо команд оболочки:

test:
  @echo $(filter %/, $(wildcard lib/*/))

Это wildcard список всех подкаталогов target с завершающим '/'. Чтобы удалить subdirectories его, вы можете использовать subdirectories заменяющий шаблон:

subdirs = $(filter %/, $(wildcard lib/*/))
test:
  @echo $(subdirs:%/=%)

Затем, чтобы subdirs фактически создать правила, выполняющие subdirs make-файлы в каждом подкаталоге, вы target можете использовать небольшой wildcard трюк - фальшивую цель в несуществующем wildcards каталоге. Думаю, в этом случае makefile-project пример расскажет больше, чем target любое объяснение:

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

По сути, target subdirectory 'all' перечисляет все подкаталоги targets как предварительные условия. Например, если makefiles LIB_DIRS содержит lib/folder1 lib/folder2, то расширение subdirectories будет выглядеть так:

all: make-rule/lib/folder1 make-rule/lib/folder2

Затем subdirectories make для выполнения правила makefile 'all' пытается сопоставить каждое subdirs предварительное условие с subdirectories существующей целью. В этом targets случае целью является 'make-rule/%:', который makefiles использует '$*' для извлечения target строки после 'make-rule/' и использует makefile ее в качестве аргумента в makefile-project рецепте. Например, первое targets предварительное условие будет target сопоставлено и расширено makefiles следующим образом:

make-rule/lib/folder1:
  cd lib/folder1 && $(MAKE)

makefile

wildcard

target

subdirectory

2022-07-13T15:52:24+00:00