我可以使用基于 ExtUtils::MakeMaker 的构建系统“树外”构建 Perl 模块吗?

Posted

技术标签:

【中文标题】我可以使用基于 ExtUtils::MakeMaker 的构建系统“树外”构建 Perl 模块吗?【英文标题】:Can I build Perl modules with ExtUtils::MakeMaker-based build system "out of tree"? 【发布时间】:2011-08-11 21:15:37 【问题描述】:

我不想在解压 Perl 模块的源代码的目录中添加或修改文件,而是想在一个单独的目录中构建所有内容。这是否可以通过使用ExtUtils::MakeMaker 的相当标准的Makefile.PL 轻松实现? (简单来说,我的意思是一个或几个命令行参数。)如果没有,其他构建系统是否支持这个?

更新/原因: Perl 模块绑定到一个库,其构建系统是基于autoconf/automake/libtool。 Perl 模块与这个库一起提供,在顶层目录中调用make 最终也会构建 Perl 库。我有兴趣在单独的构建树中构建整个项目。目前我做了一些类似于 runrig 建议的事情,只使用符号链接。 (cp -sru $(srcdir)/. $(builddir)/.)。到目前为止,这已经奏效,但如果有更优雅的解决方案,我想了解一下。

【问题讨论】:

为什么要这样做?你在解决什么问题?我问是因为答案是“是的,但是设置和维护会很痛苦”。 我已经更新了我的问题。仍然对痛苦的解决方案感兴趣。 :-) 【参考方案1】:

MakeMaker 已经复制了源代码并将它们构建在一个单独的目录中(这就是 blib/ 的含义)。您可以使用INST_*WriteMakefile() 的参数集来控制构建位置。此示例将位置从 blib/ 更改为 foo/

INST_ARCHLIB        => "foo/arch",
INST_LIB            => "foo/lib",
INST_BIN            => "foo/bin",
INST_SCRIPT         => "foo/script",
INST_MAN1DIR        => 'foo/man1',
INST_MAN3DIR        => 'foo/man3',

此外,您必须告诉 MakeMaker 清理新的构建目录。

clean       => 
    FILES           => 'foo'
,

有关更多信息,请参阅 ExtUtils::MakeMaker 文档中的 "Determination of Perl Library and Installation Locations"。

【讨论】:

【参考方案2】:
cp -R Module-Directory-0.01 Module-Directory-0.01.copy
cd Module-Directory-0.01.copy
perl Makefile.PL
make
make test
...etc.

【讨论】:

如果我复制所有内容,使用 Makefile 的所有优势都会消失。 时间戳搞砸了,我用符号链接代替(请参阅问题更新)。【参考方案3】:

我最终使用了符号链接:

Perl 模块提供绑定的库使用 基于autoconf/automake/libtool 的构建系统。 Makefile.PL 是 从Makefile.PL.inconfigure 生成。 Makefile.PL 生成Makefile-plMakefile 已经被 autoconf/automake)。

这是Makefile.am的相关部分:

all: Makefile-pl src_deps
    $(MAKE) -f Makefile-pl

Makefile-pl: Makefile.PL
    perl Makefile.PL INSTALLDIRS=$(INSTALLDIRS) PREFIX=$(prefix)

我把第二个目标改成:

Makefile-pl: Makefile.PL
    -[ $(srcdir) != $(builddir) ] && cp -rsu $(abs_srcdir)/. $(builddir)/.
    perl Makefile.PL INSTALLDIRS=$(INSTALLDIRS) PREFIX=$(prefix)

只要构建或安装 Perl 模块,这应该可以工作 不会导致任何文件被就地修改。

【讨论】:

以上是关于我可以使用基于 ExtUtils::MakeMaker 的构建系统“树外”构建 Perl 模块吗?的主要内容,如果未能解决你的问题,请参考以下文章

我可以使用桥接头在基于 Swift 的项目中导入 Objective-C++ 类吗?

我可以在前端使用基于令牌 jwt 系统的用户数据保存

有人知道我可以使用的基于 Python 的优秀网络爬虫吗?

是否可以使用 iOS AutoLayout 创建基于动态网格的布局?

我可以使用基于范围的 for 循环轻松迭代地图的值吗?

我可以使用基于 ExtUtils::MakeMaker 的构建系统“树外”构建 Perl 模块吗?