gpt4 book ai didi

makefile - 如何以适用于 make AND dmake 的方式替换 makefile 中的文本?

转载 作者:行者123 更新时间:2023-12-04 06:12:56 26 4
gpt4 key购买 nike

我有这个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) 可以工作,但我不知道如何使它适用于两个 make 变体。

任何想法或其他方法来做到这一点?

最佳答案

不仅两个版本的 dir 分隔符字符不同,而且 dmake 语法似乎是故意设计为与 GNU make 不兼容的。语法中唯一真正兼容的部分是模式替换,所以这是要走的路:

 all: $(ALL)

$(ALL) : Makefile compress.pl
../lib/%.pm : %.pm
perl compress.pl $< > $@

dmake 实际上在这里用/代替了目录分隔符。我已经用 echo 测试了这个 Makefile,它会写入正确的目录。

说明: pattern rules为特定文件定义规则,当它匹配正则表达式( ../lib/%.pm 部分)并且找到类似名称的先决条件( %.pm)时要重新制作。先决条件中的 % 被目标中 % 的匹配部分替换。需要使用 Makefile 和 compress.pl 的额外规则,因为 dmake 不喜欢模式规则中的额外先决条件。像往常一样, $<$@是 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



make -rdn

关于makefile - 如何以适用于 make AND dmake 的方式替换 makefile 中的文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7553770/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com