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

标签 linux perl makefile

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

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

perl Makefile.PL PREFIX='/YOUR/DIRECTORY'
make
make test
make install

ExtUtils::MakeMaker 通过PREFIX 变量解决modules/scritps 安装目录不规范时的问题。

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

use lib '/YOUR/DIRECTORY';

我想用这样的模板替换它:

use lib '%%PREFIX%%';

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

感谢您的回答!!

最佳答案

要使用的是 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 本身,这样您就不需要窗口检查;但是,在我上面的示例中,我发现 perl 不在 exec 中的实例path 和/usr 的现有 PREFIX 路径已经没问题了...如果需要,您可以直接在普通的 WriteMakefile 参数列表中定义 PM_FILTER。

关于linux - 使用 ExtUtils::MakeMaker 时如何更改脚本/模块中的变量字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5419164/

相关文章:

linux - 如何使用 ls 和 AWK 打印文件/目录详细信息?

C 编程 - Stat 系统调用 - 错误

makefile - make -j 的最佳值(value)是什么

windows - Windows 上的 KiokuDB

c - 在 Makefile 中设置变量的规则未按预期工作

c++ - Makefile: (.text+0x20): 对 `main' 的 undefined reference collect2: 错误: ld 返回 1 退出状态

linux - UNIX 中的可选命令

java - 多个Java进程可以同时读取同一个文件吗?

perl - 换美元!在 Perl 中

linux - 从 txt 文件中搜索并替换许多文件?