我正在编写一个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似乎是反向的,因为它们有一个目标,其中包含多个需要处理的源。我的新手直觉是,这应该是一个更简单的案例。
答案 0 :(得分:1)
您想要的功能是单个目标中的多个模式。
从GNU make makefile的Pattern Rule Examples部分:
此模式规则有两个目标:
%.tab.c %.tab.h: %.y bison -d $<
这说明食谱'bison -d x.y'将同时生成
x.tab.c
和x.tab.h
。如果文件foo
取决于文件parse.tab.o
和scan.o
,文件scan.o
取决于文件parse.tab.h
,则更改parse.y
时,配方'bison -d parse.y'将只执行一次,并且parse.tab.o
和scan.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 ...