如何在使用ExtUtils :: MakeMaker时更改脚本/模块中的变量字符串

时间:2011-03-24 12:34:30

标签: linux perl makefile

我在用perl编写的应用程序中有一些模块和脚本。对于它的分发我使用ExtUtils::MakeMaker

模块和脚本的目标操作系统是Linux。关键是我希望最终用户将模块/脚本安装在非标准目录中,也可能在他们自己的目录中,然后安装如下:

perl Makefile.PL PREFIX='/YOUR/DIRECTORY'
make
make test
make install
当模块/ scritps安装目录不是标准目录并且ExtUtils::MakeMaker变量时,

PREFIX解决了这个问题。

如何将PREFIX字符串'值复制或替换为脚本?例如,而不是硬代码:

use lib '/YOUR/DIRECTORY';

我想将其替换为以下模板:

use lib '%%PREFIX%%';

其中%%PREFIX%%在“编译”时间内被替换,并且没有设置环境变量($ENV{'PREFIX'}

感谢您的回答!!

1 个答案:

答案 0 :(得分:2)

要使用的是PM_FILTER:

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_FILTER中调用perl本身,因此您不需要Windows检查;但是,在上面的示例中,我发现了perl不在exec中的实例路径和/ usr的现有PREFIX路径已经正常...如果需要,可以直接在普通的WriteMakefile参数列表中定义PM_FILTER。