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

时间:2012-01-20 06:19:35

标签: makefile gnu-make

我想使用单个Makefile在数百个子目录中生成目标。每个子目录都是这样的日期/时间戳:20120119_153957,它与以下模式????????_??????匹配。没有其他子目录符合此模式。

我想要生成的一个目标称为????????_??????/graph.pdf。我有一个名为make_graph的脚本,它将使图形具有子目录名称。但我不确定如何编写一个Makefile,它将自动为所有子目录添加并以编程方式生成这些目标。

例如,代码SUBDIRS:=????????_??????似乎正确地遍历所有子目录。我可以查看这条规则:

.PHONY: print
print:
        echo $(SUBDIRS)

然而这个变量赋值

TARGETS:=$(SUBDIRS:%=%/graph.pdf)

似乎没有达到我的预期,并分配了很多很多目标。相反,以下规则只打印一个目标。

.PHONY: print
print:
        echo $(TARGETS)

SUBDIRS应该有正确的子目录,但TARGET只有一个文件,这是非常令人困惑的。

1 个答案:

答案 0 :(得分:17)

在您的示例中,由shell执行glob匹配。

GNU Make有内置的wildcard function,您可以按如下方式使用:

SUBDIRS := $(wildcard ????????_??????)

现在您可以使用此变量构建目标列表:

.PHONY : all
all : $(SUBDIRS:%=%/graph.pdf)

%/graph.pdf : # list prerequisites here.
    # recipe to make '$@' in directory '$(@D)' from '$^'.

另请参阅:pattern rulesautomatic variables