我可以使用 ExtUtils::MakeMaker-based build system "out of tree" 来构建 Perl 模块吗?



我不想在Perl模块源代码解包的目录中添加或修改文件,而是想在单独的目录中构建所有内容。对于使用ExtUtils::MakeMaker的相当标准的Makefile.PL,这是否容易实现?(这里的简单是指一个或几个命令行参数。)如果不支持,其他构建系统支持这个吗?

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

MakeMaker已经复制了源代码并将它们构建在一个单独的目录中(这就是blib/)。您可以使用WriteMakefile()INST_*参数集来控制构建位置。本例将位置从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文档中的"确定Perl库和安装位置"获取更多信息。

cp -R Module-Directory-0.01 Module-Directory-0.01.copy
cd Module-Directory-0.01.copy
perl Makefile.PL
make
make test
...etc.

我最终使用了symlinks:

Perl模块提供绑定的库使用基于autoconf/automake/libtool的构建系统。Makefile.PL是由configureMakefile.PL.in生成。Makefile.PL生成Makefile-pl (Makefile已被占用)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模块,这应该就可以工作不会导致任何文件被就地修改。

最新更新