我可以使用基于 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.in
由configure
生成。 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 模块,这应该可以工作 不会导致任何文件被就地修改。
【讨论】:
以上是关于我可以使用基于 ExtUtils::MakeMaker 的构建系统“树外”构建 Perl 模块吗?的主要内容,如果未能解决你的问题,请参考以下文章
我可以使用桥接头在基于 Swift 的项目中导入 Objective-C++ 类吗?