リロケータブル perl の実現性

少し前に node に触ってみようと 公式サイトから バイナリをダウンロードし $HOME/node に入れたところ、すぐに使えて感動した。

perl もこのようになっていてほしい。つまり

  • 最新バージョンの pre compile 済みのバイナリが手軽にダウンロードでき、
  • 好きなディレクトリに展開すれば使える

という環境を整えるベキだと思う。

pre compile 済みのものを用意するのは難しくないだろう。

問題は 好きなディレクトリに展開すれば使える である。 実は -Duserelocatableinc を指定してコンパイルすれば @INC はリロケータブルになるらしい。 (cf: モダンPerlの世界へようこそ, perl5100delta)

試しに -Duserelocatableincコンパイルして、ディレクトリを移動してみたところ確かに モジュールはディレクトリを移動してもしっかりと読み込まれた。しかし、

  1. すでにインストール済の実行スクリプト (json_pp, cpanp など) の shebang line が元のディレクトリの perl を指していて動かない
  2. 新たにモジュールをインストールするとき、ExtUtils::MakeMaker が元のディレクトリの perlshebang をつけようとする

という問題があった。(1) については下記のように shebang を変更しておけがリロケータブルに対応できそうだ。( これは node (npm?) のやり方と wikipedia をまねた。)

#!/bin/sh
exec `dirname "$0"`/perl -x "$0" "$@"
#!perl
...

(2) については ExtUtils::MakeMaker が対応してくれさえすればいい (cf: https://rt.cpan.org/Ticket/Display.html?id=72104 )。ただし、ExtUtils::MakeMaker は $Config{startperl} に置き換えているだけなので perl core の方を直すべきかもしれない。

まとめ

  • perl で 「最新バージョンの pre compile 済みのバイナリが手軽にダウンロードでき、 好きなディレクトリに展開すれば使える」環境を整えたい。
  • ExtUtils::MakeMaker にすこし修正を加えれば上記は実現可能と思われる。