如何通过globbing子目录自动生成make目标列表



我想使用一个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 '$^'.

另请参阅:模式规则、自动变量。

最新更新