Linux 使用ExtUtils::MakeMaker时如何更改脚本/模块中的变量字符串
我在用perl编写的应用程序中有一些模块和脚本。对于它的发行版,我使用的是Linux 使用ExtUtils::MakeMaker时如何更改脚本/模块中的变量字符串,linux,perl,makefile,Linux,Perl,Makefile,我在用perl编写的应用程序中有一些模块和脚本。对于它的发行版,我使用的是ExtUtils::MakeMaker 模块和脚本的目标操作系统是Linux。问题是,最终用户可能会将模块/脚本安装在非标准目录中,也可能安装在他们自己的目录中,然后像这样安装: perl Makefile.PL PREFIX='/YOUR/DIRECTORY' make make test make install ExtUtils::MakeMaker解决了当模块/scritps安装目录不是标准目录时,通过前缀变量解
ExtUtils::MakeMaker
模块和脚本的目标操作系统是Linux。问题是,最终用户可能会将模块/脚本安装在非标准目录中,也可能安装在他们自己的目录中,然后像这样安装:
perl Makefile.PL PREFIX='/YOUR/DIRECTORY'
make
make test
make install
ExtUtils::MakeMaker
解决了当模块/scritps安装目录不是标准目录时,通过前缀
变量解决的问题
如何将前缀
字符串”值复制或替换到脚本中?例如,代替硬代码:
use lib '/YOUR/DIRECTORY';
我想将其替换为以下模板:
use lib '%%PREFIX%%';
其中,%%PREFIX%%
在“编译”时被替换,并且没有设置环境变量($ENV{'PREFIX'}
)
谢谢你的回答 要使用的是PM_过滤器:
if (!($^O eq 'MSWin32' || $Config{'ccflags'} =~ /-D_?WIN32_?/)) {
# doesn't work on windows: no sed
$opts{'PM_FILTER'} = 'sed -e "s|/usr/share|$(PREFIX)/share|"';
}
它可以在linux和几乎所有的东西上工作,除了windows(正如您在评论中看到的)
[更新以包含更多使用细节:
use ExtUtils::MakeMaker;
%opts = (
'NAME' => 'myModulesAndScripts',
# ...
);
if (!($^O eq 'MSWin32' || $Config{'ccflags'} =~ /-D_?WIN32_?/)) {
# doesn't work on windows: no sed
$opts{'PM_FILTER'} = 'sed -e "s|/usr/share|$(PREFIX)/share|"';
}
WriteMakefile(%opts);
(正如注释所指出的,您可以尝试在PM_筛选器中调用perl本身,这样就不需要windows检查;但是,在我上面的示例中,我发现perl不在exec路径中,并且/usr的现有前缀路径已经可以了……如果您需要,可以直接在普通WriteMakefile参数列表中定义PM_筛选器想要更大的可移植性:
'perl-pe“s |/usr/share |$(前缀)/share |“'
谢谢@Wes,我不太明白...PM|u过滤器是从?对不起。你可以直接放在WriteMakefile选项中。我会更新一下。