Makefile目标具有相同的文件前缀,多个文件扩展名

时间:2015-05-13 16:02:42

标签: makefile

我正在编写一个makefile,作为其操作的一部分,下载并提取包含ESRI shapefile的zipfile。 Shapefile是用词不当,因为shapefile实际上是一个包含名为shape的文件的目录。[shp,dbf,prj,shp.html,shp.xml,sbn,sbx]

有没有办法定义扩展列表以追加到make目标中的公共文件前缀?类似的东西:

shape.[mylistofexts] : shape.zip
    unzip stuff...

我发现this question似乎是反向的,因为它们有一个目标,其中包含多个需要处理的源。我的新手直觉是,这应该是一个更简单的案例。

1 个答案:

答案 0 :(得分:1)

您想要的功能是单个目标中的多个模式。

从GNU make makefile的Pattern Rule Examples部分:

  

此模式规则有两个目标:

%.tab.c %.tab.h: %.y
        bison -d $<
     

这说明食谱'bison -d x.y'将同时生成x.tab.cx.tab.h。如果文件foo取决于文件parse.tab.oscan.o,文件scan.o取决于文件parse.tab.h,则更改parse.y时,配方'bison -d parse.y'将只执行一次,并且parse.tab.oscan.o的先决条件将得到满足。 (据推测文件parse.tab.o将从parse.tab.c重新编译,文件scan.o将从scan.c重新编译,而foo则从parse.tab.o scan.o链接1}},以及它的其他先决条件,它将永远幸福地执行。)

所以你想写:

%.shp, %.dbf %.prj %.shp.html %.shp.xml %.sbn %.sbx: %.zip
        @unzip ...

可以缩短(技术上):

$(addprefix %.,dbf prj shp.html shp.xml sbn sbx): %.zip
        @unzip ...