Mac OS X 10.5 Leopard (レオパルト) にて。
Noon フレームワークを動かすべく作業中。
はまっている最中。

現在の環境:
Intel Mac mini (Core 2 Duo)
Mac OS X 10.5.2
Apache2.2.8 + mod_perl2.0.3
シェルは csh
エディタは vim
僕は BSD ユーザー

(000) gmakeがない。

開発環境が標準で入っていない。
インストールディスク2 にある Xcode をまず入れる。

(00) Intel Mac mini は Core 2 Duo

なのでアーキテクチャを環境変数で設定。
% setenv ARCHFLAGS "-arch x86_64"
% setenv CFLAGS "-arch x86_64"
~/.cshrc に書いとけばいい。

(0) 標準で apache2.2.6 + mod_perl2.0.2 が入っていた

Leopard (レオパルト)には X も標準で入っている。いたれりつくせり。

apache2 は 2.2.6 がもともと入っていた。
ソフトウェアアップデートしたので 2.2.8 になった。

mod_perl2 ももともと 2.0.2 が入っていた。
/System/Library/Perl/Extras/5.8.8/darwin-thread-multi-2level/mod_perl2.pm
が存在する。

DBI ももともと 1.52 が入っていた。
/System/Library/Perl/Extras/5.8.8/darwin-thread-multi-2level/DBI.pm
が存在する。

DBD::Pg はもともと入っていなかった。

ソフトウェアアップデートは mod_perl2 とか DBI までアップデートしてくれるのかどうかいまいちよくわからない。してくれるとうれしいんだけど。

mod_perl2.0.3 をソースから入れた。
それは
/Library/Perl/5.8.8/darwin-thread-multi-2level/
に入る。
CPAN で DBI 1.604 を入れた。
それも
/Library/Perl/5.8.8/darwin-thread-multi-2level/
に入る。
CPAN で DBD::Pg 2.5.1を入れた。
それも
/Library/Perl/5.8.8/darwin-thread-multi-2level/
に入る。

モジュールの違うバージョンがいろんな場所にインストールされてる場合、 問題になるのは @INC の内容。
/System/Library/Perl/Extras/5.8.8/darwin-thread-multi-2level/
より
/Library/Perl/5.8.8/darwin-thread-multi-2level/
が先になっているから大丈夫。

(1) use base Foo; でこける。

こける use base を use Foo; push our @ISA, qw(Foo); と書き換えれば回避できる。
その置換のための Perl スクリプトを書いた。
しかしなぜ use base がこけるのか原因不明。 こけない use base もあるの。 Perl モジュール書くとき use base やめて push our @ISA 使うよう心がけるのが無難かも。

(2) libapreq2

Apache2::Request
Apache2::Cookie
は libapreq2 に含まれる。 ソースから libapreq2 を入れる。
Perlモジュールを入れたいんだから perl Makefile.PL する。
make のときExtUtils/XSBuilder/ParseSource.pm がいるのでCPANで入れる。

そのまえに CPAN.pm をいじる。 MyConfig.pm で LWP も Net::FTP も無いって設定してるのに いちいち LWP とか Net::FTP とか使おうとするから。 CPAN.pm を直接いじって封じる。

/System/Library/Perl/5.8.8/CPAN.pm

package CPAN;
$VERSION = '1.76_02';
sub has_usable {
    my($self,$mod,$message) = @_;
    return 1 if $HAS_USABLE->{$mod};
    my $has_inst = $self->has_inst($mod,$message);
    return unless $has_inst;

    if ($mod =~ /LWP/ or $mod =~ /Net::FTP/) {
        return $HAS_USABLE->{$mod} = 0;
    }

という if 文を追加。
で、
% cpan -m 'ExtUtils::XSBuilder::ParseSource'
% cd ~/.cpan/build/ExtUtils-XSBuilder-0.28
% sudo make install
libapreq2のソースを展開したディレクトリへ行く。
% cd ~/src/libapreq2
システムのapxsはapache2のものなのでそれを使う。
% perl Makefile.PL --with-apache2-apxs=/usr/sbin/apxs
% make
% sudo make install

(3) sudo cpan -i 'Foo' はいろんな意味でやめたほうがいい。

sudo perl -MCPAN -e 'install Foo'とか
sudo cpan -i 'Foo'とかはやめたほうがいい。
cpan -m 'Foo'
cd ~/.cpan/build/Foo
sudo make install
がいいと思う。

topic: perl
first posted: 2008-04-11 21:31:51
last modified: 2009-09-16 23:59:37