我有这个makefile:
ALL = ../lib/Mo.pm \
../lib/Mo/builder.pm \
../lib/Mo/default.pm \
../lib/Mo/has.pm \
all: $(ALL)
$(ALL): Mo.pm compress.pl Makefile
perl compress.pl $(@:../lib/%=%) > $@
它的意图是这样的:
$ make -n
perl compress.pl Mo.pm > ../lib/Mo.pm
perl compress.pl Mo/builder.pm > ../lib/Mo/builder.pm
perl compress.pl Mo/default.pm > ../lib/Mo/default.pm
perl compress.pl Mo/has.pm > ../lib/Mo/has.pm
然而,在Windows上使用dmake会发生这种情况:
d:\mo-pm\src>dmake -n
perl compress.pl ..\lib\Mo.pm > ..\lib\Mo.pm
perl compress.pl ..\lib\Mo\builder.pm > ..\lib\Mo\builder.pm
perl compress.pl ..\lib\Mo\default.pm > ..\lib\Mo\default.pm
perl compress.pl ..\lib\Mo\has.pm > ..\lib\Mo\has.pm
我一直在尝试使用s /// subst的各种组合使其在dmake中工作,并发现它希望路径具有\ s,这意味着对路径的两个变体进行双重替换( ../lib/和.. \ lib)可以工作,但我无法弄清楚如何使它适用于两种变体。
有任何想法或其他方法吗?
答案 0 :(得分:3)
不仅两个版本的dir分隔符字符不同,而且dmake语法似乎是故意设计为与GNU make不兼容。实际兼容的语法的唯一部分是模式替换,所以这是要走的路:
all: $(ALL)
$(ALL) : Makefile compress.pl
../lib/%.pm : %.pm
perl compress.pl $< > $@
dmake实际上在这里用/替换目录分隔符字符。我已经用echo测试了这个Makefile,它写入了正确的目录。
说明:pattern rules定义了与正则表达式(../lib/%.pm
部分)匹配时要重新生成的特定文件的规则,并找到了类似名称的先决条件({{1} }})。先决条件中的%由目标中%的匹配部分替换。需要使用Makefile和compress.pl的额外规则,因为dmake不喜欢模式规则中的额外先决条件。像往常一样,%.pm
和$<
是源和目标文件的make特殊变量。
因此,核心区别在于您的原始规则说“此列表中指定的文件可以使用以下规则制作”,而模式规则则说“任何看起来像../lib/%.pm的文件都可以由当前目录中的匹配文件制作“然后提供$@
a list of pm files to make.
Pattern rules are actually quite powerful, useful to know. Unfortunately, some makes don't know them, only the older suffix rules.
Further details of what's going on can be obtained by running