我如何让外星人使用现有的 tarball 而不是下载?

How do I make Alien use an existing tarball instead of downloading?

我的发行版不再提供任何 <2.6 的 gsl。

鉴于:

我如何强制它编译 gsl 而不是从 GNU FTP 2.6 版下载,反正我已经在系统上了 but is not delectable to Math::GSL 0.40

我尝试失败:

这是一个一次性项目。我可以接受手动安装说明和修补工具链代码。

ikegami found the decisive hint:

It looks like you can set protocol of local to use a local file


测试了分步说明,以及一些额外的解决方法;在我看来,这两个模块的构建系统似乎已经过 buggy/insufficiently 测试:

cpanm --look Alien::GSL

补丁Build.PL

diff --git a/Build.PL b/Build.PL
index 32f3057..6537138 100644
--- a/Build.PL
+++ b/Build.PL
@@ -20,10 +20,9 @@ my $builder = Alien::Base::ModuleBuild->new(
   alien_name => 'gsl',
   alien_repository => [
     {
-      protocol => 'ftp',
-      host     => 'ftp.gnu.org',
-      location => '/gnu/gsl',
-      pattern  => qr/^gsl-([\d\.]+)\.tar\.gz$/,
+      protocol => 'local',
+      location => '/tmp',
+      pattern  => 'gsl-2.5.tar.gz',
     },
   ],
   meta_merge => {
-- 
2.23.0
perl Build.PL
./Build

注意这里生成的configure/libtool命令,它们匹配Perl配置。没有这些不同选项的手动安装不能保证兼容或可用。 (这不是迷信:历史上在系统 httpd 上从源安装 mod_perl2 和 libapreq2 时会出现类似的问题;perl 需要先编译,然后 httpd 才能匹配,然后是其他包,否则不会工作。)这显示了通过 Alien 安装的价值,因为它委托给 M::B,将找出正确的选项。从头开始准确创建它们超出了我的知识水平。

./Build test

gsl-config 在 blib 现在错误地包含构建路径,而不是安装路径,修复:

perl -MConfig -i -lpe'
    s|/.*(/auto/share/dist/Alien-GSL)|$Config{installsitelib}|
' blib/lib/auto/share/dist/Alien-GSL/bin/gsl-config
./Build install
exit # cpanm

cpanm --look Math::GSL
# let it pick up gsl-config on PATH
export PATH=$PATH:$(perl -mAlien::GSL -e'print Alien::GSL->bin_dir')
perl Build.PL
./Build
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$(gsl-config --libs | perl -lne'/-L(\S+) / && print ')
./Build test
./Build install
exit # cpanm

最后,只要你想使用 Math::GSL,就重新导出变量。