还有一种仅使用 gmake 命令列出子目录的方法,而不使用任何 shell 命令:
test:
@echo $(filter %/, $(wildcard lib/*/))
这将列出所有带有尾随的子目录'/'
。要删除它,您可以使用替换模式:
subdirs = $(filter %/, $(wildcard lib/*/))
test:
@echo $(subdirs:%/=%)
然后,要在每个子目录中实际创建执行 makefile 的规则,您可以使用一个小技巧 - 一个不存在的目录中的虚假目标。我认为在这种情况下,一个例子比任何解释都更能说明问题:
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”为了执行 rule 'all'
,尝试将每个先决条件与现有目标匹配。在这种情况下,目标是'make-rule/%:'
,它用于'$*'
在之后提取字符串'make-rule/'
并将其用作配方中的参数。例如,第一个先决条件将像这样匹配和扩展:
make-rule/lib/folder1:
cd lib/folder1 && $(MAKE)