我想使用一个Makefile在数百个子目录中生成目标。每个子目录都是一个日期/时间戳,如下所示:20120119_153957
,它与以下模式????????_??????
相匹配。没有其他子目录与此模式匹配。
我想要生成的一个目标叫做????????_??????/graph.pdf
。我有一个名为make_graph
的脚本,它将使图具有子目录名称。但我不知道如何编写一个Makefile,它将自动全局化所有子目录并以编程方式生成这些目标。
例如,代码SUBDIRS:=????????_??????
似乎正确地对所有子目录进行了glob。我可以用这个规则检查:
.PHONY: print
print:
echo $(SUBDIRS)
然而,这个变量分配
TARGETS:=$(SUBDIRS:%=%/graph.pdf)
似乎没有达到我的预期,分配了很多目标。相反,下面的规则只打印一个目标。
.PHONY: print
print:
echo $(TARGETS)
SUBDIRS
应该有正确的子目录,但TARGET
只有一个文件,这是非常令人困惑的。
在您的示例中,glob匹配是由shell执行的。
GNUMake有内置的wildcard
函数,您可以如下使用:
SUBDIRS := $(wildcard ????????_??????)
现在你可以使用这个变量来构建一个目标列表:
.PHONY : all
all : $(SUBDIRS:%=%/graph.pdf)
%/graph.pdf : # list prerequisites here.
# recipe to make '$@' in directory '$(@D)' from '$^'.
另请参阅:模式规则、自动变量。