也有上市的子目录用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
然后“制作”,为了执行规则'all'
,尝试将每个前提与现有的目标相匹配。在这种情况下,目标是'make-rule/%:'
,它使用'$*'
在'make-rule/'
之后提取字符串,并将其用作配方中的参数。例如,第一个先决条件将被匹配,这样的扩展:
make-rule/lib/folder1:
cd lib/folder1 && $(MAKE)
哇,谢谢。奇迹般有效! – Zed 2009-12-19 15:04:47
为什么你没有定义'$(clean_LIBS)'为虚假?例如。 '.PHONY:$(LIBS)$(clean_LIBS)',那么我认为你不需要'force'。 – 2010-06-22 15:51:01
@dma_k:你说得很好。我没有测试过你的建议,但你的推理听起来对我来说很合适。实际上,这听起来很像GNU Make手册在这里所建议的内容(请参阅关于subdirs的内容):http://www.gnu.org/software/make/manual/make.html#Phony-Targets – mrkj 2010-06-24 15:04:34