Have Your Own Perl!B!

こんにちは、dankogaiです。Encode.pmのメンテナーとかしています。なのでEncodeのことでも書こうかと思ったのですが、すでにEncodeでラクラク日本語処理をxaicronに書かれちゃいました。

それじゃ何書く?と思ったら、残ってましたよ。最も大事なものが。

Perlハッカーに最も必要なもの

ここでなぞなぞです。Perlハッカーにとって最も必要なのは何でしょうか?

Perlそのもの、ですよね。

そうなんです。どんなすばらしいPerlモジュールも、Perl本体がなければ動きません。Perlはモジュールがなくてもなんとか動きますが、その逆は真ではないのです。

自分専用Perlを持つべき理由

あまりに当たり前のこの事実ですが、その一方、およそ Windows を除けばPerlは主要OSにははじめから組み込まれているのでそのことになかなか気がつきません。Perlがそこにあること、それは非Perlプログラマーにとってさえ空気がそこにあるがごとき前提条件となっています。

だから、Perlがそこにあることを前提にしてPerlハックにいそしみたいところですが、ちょっと待って下さい。Perlはあなた自身でビルドできますし、Perlを本格的に使いたかったらそうするべきなのです。理由は以下のとおりです。

あなたのOSがPerlを必要としている

なぜ主要OSにはPerlが付属しているのか。OSが必要としているからです。ということは、もしOS付属のPerlに何かあった場合、OSの挙動がおかしくなる可能性があるということです。実際、LWPをインストールするとMac OS Xの/usr/bin/headがHEADコマンドに置き換えられてしまうということもかつてありました。

OS付属のPerlとは独立したPerlを持てば、こうした可能性はほとんどゼロになります。

バンドル版Perlは最新とは限らない

OSのリリーススケジュールとPerlのリリーススケジュールは異なります。ですから最新のOSが、最新のPerlをバンドルしているとは限りません。例えば Mac OS X v10.6 = Snow Leopard が発売されたのは今年の9月ですが、付属しているのは Perl 5.10.0 で、最新版のPerl 5.10.1とはバージョンにずれがあります。

FreeBSDに至ってはさらに保守的で、OSの最小構成にはPerlを載せていない上に、Ports/Packageがデフォルトでインストールするのは Perl 5.8.9 です。

最新のPerlを使いたかったら、やはり自分でビルドするしかないのです。

スーパーユーザー権限がない

レンタルサーバーなどでPerlを利用する際には、上の条件に加えてさらにこの条件が加わります。最新のPerlどころかモジュールをインストールするにも支障をきたすのです。

local::libなどを使ってこの制限を乗り越える方法は確かにありますが、実は自分用のPerlをホームディレクトリにインストールしてそれを使う方が簡単だったりもします。

DIYの実際

というわけであなたは自分のPerlを持つことに決めたのですが、一体どうしたらよいのでしょう。

大まかな流れでいくと、以下のとおりとなります。

% curl -O http://www.cpan.org/src/perl-5.10.1.tar.bz2
% tar jxvf perl-5.10.1.tar.bz2
% cd perl-5.10.1
% sh Configure -des
% make
% sudo make install

最初の curl -O は Mac OS X の場合ですが、ここは fetch なり wget なり各OSの流儀にあわせてください。なんならWebブラウザーでダウンロードしても構いません。

これで自分用のPerlは出来ることは出来るのですが、自分用であっても「おしきせ」のPerlしか出来ません。自分用というからには Configure の指定をもっと細かくする必要があります。

Configure の実際

何のオプションも付けないで Configure した場合、Perlのデフォルトがそのまま使われますが、OSベンダーでさえそんなことはしていません。実際に各OSにバンドルされているPerlが、どのように Configure されているのかを確認してみることにしましょう。ちなみに確認するためには

/path/to/perl -MConfigure -le 'print $Config{config_args}'

とします。

Mac OS X v10.6.2

v5.10.0

-ds -e -Dprefix=/usr -Dccflags=-g  -pipe  -Dldflags= -Dman3ext=3pm -Duseithreads -Duseshrplib -Dinc_version_list=none -Dcc=gcc-4.2

Ubuntu 9.10

v5.10.0

-Dusethreads -Duselargefiles -Dccflags=-DDEBIAN -Dcccdlflags=-fPIC -Darchname=i486-linux-gnu -Dprefix=/usr -Dprivlib=/usr/share/perl/5.10 -Darchlib=/usr/lib/perl/5.10 -Dvendorprefix=/usr -Dvendorlib=/usr/share/perl5 -Dvendorarch=/usr/lib/perl5 -Dsiteprefix=/usr/local -Dsitelib=/usr/local/share/perl/5.10.0 -Dsitearch=/usr/local/lib/perl/5.10.0 -Dman1dir=/usr/share/man/man1 -Dman3dir=/usr/share/man/man3 -Dsiteman1dir=/usr/local/man/man1 -Dsiteman3dir=/usr/local/man/man3 -Dman1ext=1 -Dman3ext=3perl -Dpager=/usr/bin/sensible-pager -Uafs -Ud_csh -Ud_ualarm -Uusesfio -Uusenm -DDEBUGGING=-g -Doptimize=-O2 -Duseshrplib -Dlibperl=libperl.so.5.10.0 -Dd_dosuid -des

FreeBSD 8-STABLE

v5.8.9

-sde -Dprefix=/usr/local -Darchlib=/usr/local/lib/perl5/5.8.9/mach -Dprivlib=/usr/local/lib/perl5/5.8.9 -Dman3dir=/usr/local/lib/perl5/5.8.9/perl/man/man3 -Dman1dir=/usr/local/man/man1 -Dsitearch=/usr/local/lib/perl5/site_perl/5.8.9/mach -Dsitelib=/usr/local/lib/perl5/site_perl/5.8.9 -Dscriptdir=/usr/local/bin -Dsiteman3dir=/usr/local/lib/perl5/5.8.9/man/man3 -Dsiteman1dir=/usr/local/man/man1 -Ui_malloc -Ui_iconv -Uinstallusrbinperl -Dcc=cc -Duseshrplib -Dinc_version_list=none -Dccflags=-DAPPLLIB_EXP="/usr/local/lib/perl5/5.8.9/BSDPAN" -Doptimize=-O2 -pipe -fno-strict-aliasing -Ud_dosuid -Ui_gdbm -Dusethreads=n -Dusemymalloc=y -Duse64bitint

なんか目のつぶれそうなほど長いオプションをいずれも付けていますが、自分用のPerlを作るときにはこれほど長いものは必要ありません。ちなみに私が Mac OS X で日常的に使っている Perl は、以下のように Configure してあります。

% sh Configure \
 -DDEBUGGING \
 -Doptimize='-g -pipe -Os' \
 -Dusethreads \
 -Dusemultiplicity \
 -Duse64bitall \
 -Dprefix=/usr/local \
 -des

それでは、一つ一つ解説していきましょう。

-DDEBUGGING Perl自体のデバッグ機能を有効に
-Doptimize='-g -pipe -Os' 最適化オプション。-DDEBUGGINGを指定する際には必ず-gを含めます
-Dusethreads スレッドサポートを有効に
-Dusemultiplicity 組み込み(mod_perlなど)のサポートを有効に
-Duse64bitall 64bitフルサポートを有効に
-Dprefix=/usr/local Perlのインストール先を/usr/localに
-des すぐにmakeできるよう準備を整えるおまじない。ほぼどんな場合でも指定しておきます

これで"My Perl Ultimate Edition"がビルドできます。

-Dprefix

この中でも、おそらく最重要なのは -Dprefix オプションなので、少し解説しておきます。例えばここに/usrを指定した場合、

実行ファイル /usr/bin/perl
ライブラリ /usr/lib/perl5/5.10.1
マニュアル /usr/share/man

といった具合にインストールされるわけですが、これを$HOMEにすれば、自分のホームディレクトリ直下にPerlをインストールすることが出来るので、スーパーユーザー権限が不要になるというわけです。もちろんその場合、OS付属のPerlより your perl が優先されるよう、$HOME/binを$PATHに加えるのは言うまでもありません。

くわしくは

INSTALL および README.os を参照してください。ここでosは各OSの名前。例えば Mac OS X なら README.macosx です。

で、明日は...誰が書くんだろ?

Dan the Contributing Perl Monger