リロケータブル perl の実現性
少し前に node に触ってみようと 公式サイトから バイナリをダウンロードし $HOME/node に入れたところ、すぐに使えて感動した。
perl もこのようになっていてほしい。つまり
- 最新バージョンの pre compile 済みのバイナリが手軽にダウンロードでき、
- 好きなディレクトリに展開すれば使える
という環境を整えるベキだと思う。
pre compile 済みのものを用意するのは難しくないだろう。
問題は 好きなディレクトリに展開すれば使える である。
実は -Duserelocatableinc
を指定してコンパイルすれば @INC はリロケータブルになるらしい。
(cf: モダンPerlの世界へようこそ, perl5100delta)
試しに -Duserelocatableinc
でコンパイルして、ディレクトリを移動してみたところ確かに
モジュールはディレクトリを移動してもしっかりと読み込まれた。しかし、
- すでにインストール済の実行スクリプト (json_pp, cpanp など) の shebang line が元のディレクトリの perl を指していて動かない
- 新たにモジュールをインストールするとき、ExtUtils::MakeMaker が元のディレクトリの perl の shebang をつけようとする
という問題があった。(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 にすこし修正を加えれば上記は実現可能と思われる。