CentOS5系のsystem Perlでlocal::lib環境を作る方法

今更感がありすぎる古いネタでもブログに上げてしまおうキャンペーン実施中。今ならperlbrewを使うのが圧倒的にお勧めなのですが、system Perl(OSに標準で付いてくるPerl)の出番も完全に無くなるわけでもないかなーと。

例えば先日、CloudForecastをperlbrew環境で使おうと思ったらRRDtoolやらSNMPPerlバインディングのインストールが面倒で、system Perl + local::libでセットアップしたりしました。むしろperlbrew環境でサクサク入れる方法が知りたい。

それはさておき、x86_64なCentOS5系(多分どれも変わらないんじゃないかな)でOSインストール直後の状態からlocal::libをセットアップ時に自分がやってる手順をご紹介。繰り返しますが、明確な理由が無い限りはperlbrewを使うのがお勧めです。

以下、ユーザ名はryo、グループ名はadmin、CPANモジュールのインストール先は/usr/local/CPAN/を例に書いていますので適宜読み替えてください。



まずはインストール先のディレクトリを作っておく。

$ sudo install -o ryo -g admin -m 775 -d /usr/local/CPAN


次にlocal::libを入れたいけど、CentOS標準のPerl環境は古いので、まずは依存モジュールを入れてやる必要がある。要なモジュールは以下の通り。数値付きの物はそれ以降のバージョンが必要。

  • ExtUtils::MakeMaker 6.31
  • ExtUtils::Install 1.43
  • ExtUtils::CBuilder
  • ExtUtils::ParseXS
  • Module::Build 0.28
  • CPAN 1.80

上記をsystem Perl環境にインストールしてやる。

$ sudo cpan CPAN ExtUtils::MakeMaker ExtUtils::Install ExtUtils::CBuilder ExtUtils::ParseXS Module::Build

これを実行すると、~/.cpan/以下がroot所有になって具合が悪いので、一旦サクっと消してしまう。

$ sudo rm -rf ~/.cpan

cpanコマンドの設定は~/.cpan/CPAN/MyConfig.pmに入っていて、最初にcpanコマンドを起動したときに設問に答えていくとcpanコマンドがファイルを作ってくれる。けど、いちいち回答していくのはダルいのであらかじめ作っておいたファイルを直接配置する。

先ほど~/.cpanを消しているのでディレクトリも作らないといけない。ふつうに作ってもいいし、一度cpanコマンドを起動してCTRL+cで止めるとかでもよい。

で、~/.cpan/CPAN/MyConfig.pmは以下のようにする。

$CPAN::Config = {
  'auto_commit' => q[0],
  'build_cache' => q[10],
  'build_dir' => q[/home/ryo/.cpan/build],
  'build_requires_install_policy' => q[ask/yes],
  'cache_metadata' => q[1],
  'check_sigs' => q[0],
  'commandnumber_in_prompt' => q[1],
  'connect_to_internet_ok' => q[0],
  'cpan_home' => q[/home/ryo/.cpan],
  'ftp' => q[/usr/bin/ftp],
  'ftp_passive' => q[1],
  'ftp_proxy' => q[],
  'getcwd' => q[cwd],
  'gpg' => q[/usr/bin/gpg],
  'gzip' => q[/bin/gzip],
  'halt_on_failure' => q[0],
  'histfile' => q[/home/ryo/.cpan/histfile],
  'histsize' => q[100],
  'http_proxy' => q[],
  'inactivity_timeout' => q[0],
  'index_expire' => q[1],
  'inhibit_startup_message' => q[0],
  'keep_source_where' => q[/home/ryo/.cpan/sources],
  'load_module_verbosity' => q[v],
  'make' => q[/usr/bin/make],
  'make_arg' => q[],
  'make_install_arg' => q[],
  'make_install_make_command' => q[/usr/bin/make],
  'makepl_arg' => q[],
  'mbuild_arg' => q[],
  'mbuild_install_arg' => q[],
  'mbuild_install_build_command' => q[./Build],
  'mbuildpl_arg' => q[],
  'ncftp' => q[],
  'ncftpget' => q[],
  'no_proxy' => q[],
  'pager' => q[less],
  'perl5lib_verbosity' => q[v],
  'prefer_installer' => q[MB],
  'prerequisites_policy' => q[follow],
  'scan_cache' => q[atstart],
  'shell' => q[bash],
  'show_upload_date' => q[0],
  'tar' => q[/bin/tar],
  'tar_verbosity' => q[v],
  'term_is_latin' => q[1],
  'term_ornaments' => q[1],
  'trust_test_report_history' => q[0],
  'unzip' => q[/usr/bin/unzip],
  'urllist' => [q[ftp://ftp.riken.jp/lang/CPAN/], q[ftp://ftp.kddilabs.jp/CPAN/]],
  'use_sqlite' => q[0],
  'wget' => q[/usr/bin/wget],
  'yaml_load_code' => q[0],
};
1;
__END__

「'prerequisites_policy' => q[ask],」にすれば依存モジュールを勝手にインストールせず、都度確認を取るようになります。面倒なので自動で入れる設定にしているけど、気になる人は確認してもいいかも知れません。


これで準備は出来たので、いよいよlocal::libを入れる。http://search.cpan.org/からlocal::libを検索して、モジュール名じゃなくて「local-lib-1.008001」とかバージョンが表示されてる方のリンクをたどるとDownloadのリンクがあるページに直接行ける。

tar.gzをダウンロードしてきたら適当なディレクトリで展開して、cdして、インストールする。2011/02/11現在だとこんな感じ。

$ wget http://search.cpan.org/CPAN/authors/id/A/AP/APEIRON/local-lib-1.008001.tar.gz
$ tar zxf local-lib-1.008001.tar.gz
$ cd local-lib-1.008001
$ perl Makefile.PL --bootstrap=/usr/local/CPAN
$ make test && make install

気を付けるのはperl Makefile.PLする時に--bootstrapでディレクトリを指定することぐらいですね。cpanコマンドとかでモジュールを入れると、/usr/local/CPAN/以下にインストールされます。


セットアップしたlocal::libを使うには、

$ perl -I/usr/local/CPAN/lib/perl5 -Mlocal::lib=/usr/local/CPAN

を実行して得られる以下の出力を、.bashrcなり.zshrcなりに追加する。

export MODULEBUILDRC="/usr/local/CPAN/.modulebuildrc"
export PERL_MM_OPT="INSTALL_BASE=/usr/local/CPAN"
export PERL5LIB="/usr/local/CPAN/lib/perl5:/usr/local/CPAN/lib/perl5/x86_64-linux-thread-multi"
export PATH="/usr/local/CPAN/bin:$PATH"

これでセットアップは完了。


mod_perlで動いている既存のシステムから、このlocal::lib環境を使う場合はhttpd.confに以下のように書く。

PerlSwitches -I/usr/local/CPAN/lib/perl5 -I/usr/local/CPAN/lib/perl5/x86_64-linux-thread-multi

VirtualHostを使っている場合は、グローバルなPerlSwitchesを読んでくれないので、内にこう。

PerlOptions +Parent
PerlSwitches -I/usr/local/CPAN/lib/perl5 -I/usr/local/CPAN/lib/perl5/x86_64-linux-thread-multi