RRDtool は今までにも何度かインストールしたことはあったけれど、いつも結構手間取っていた。それに今回は初めて Mac OS X という曲者に入れようとするのだから、すんなり行かないのは知れていた。そしたらやっぱり、というかそれ想定以上に手間取ってしまったので、ここに記すことにした。
すんなり行けなかったのは、しかし、本質的なところでの問題ではなかった。確かに RRDtool は面倒ではあったけれど、終わってみればドキュメントのとおりの流れで十分だった。ただ一点、じぶんの特有の環境設定が邪魔をしていたことを除けば。
そのところを先に述べておくと、躓いた所は Perl バインディングのビルド。
RRDtool を入れようと思いたつ動機でもあり、かつ、そこから始まる長いインストール作業の、最後の最後の段階でもあった。その目的物であるモジュール RRDs.pm 、それをコンパイルできて完了だと思った矢先に、実行時エラーに遭遇してしまった。
それからといもの、ない知恵を方々尽くし苦闘に苦辛を嘗めつつも、到頭それを静まらせる事ができなかった。さすがに嫌になった。と諦めかけたけれども、いまはもうわかった。できた。
原因の一端は Snow Leopard の 64bit 化に依る問題であった。しかし通常は、その問題には遭遇しないだろう。なぜならばじぶんの環境では、 /usr/bin/perl が Perl 5.8.9 になるように設定してある。あまりそういう物好きはいないだろうから。
けれどもまさにそのことこそが諸悪の原因であって、 /usr/bin/perl が OS 提供のデフォルトのまま Perl 5.10.0 であったならば、二日も苦悩せずに済んだに違いなかった。
なぜ 5.8.9 ではいけなかったのか。またそれと 64 bit 化にどのように依るのか。
──あるエラーを見ては少ないセンテンスを拾い上げて情報を探し、そこで新たな疑問を得ては芋づる式にあちこち探しまわり、へとへとになったあげくに辿り着いたのは、一見 RRDTool にも Perl にも関係ないページ。
超訳と標された核心部分をここに引用すると「問題は標準の OS 10.6 の dynamic libraries は 64 bit で動作していて 32 bit コードにリンクが張られないことです。」。この一文に留まったとき、石火のごとく閃きが走った。
じぶんが RRDtool にバインドしようとしている /usr/bin/perl は Perl 5.8.9 。これは、じつは 64 bit アーキテクチャに対応するようにコンパイルされていないのだ。
それが意味する事即ち、いくらあがいても目的物のビルドはできない。いままでの苦闘はまったく負け戦に違いなかったのだった。
$ file /usr/bin/perl5.8.9 /usr/bin/perl5.8.9: Mach-O universal binary with 2 architectures /usr/bin/perl5.8.9 (for architecture i386): Mach-O executable i386 /usr/bin/perl5.8.9 (for architecture ppc7400): Mach-O executable ppc $ $ file /usr/bin/perl5.10.0 /usr/bin/perl5.10.0: Mach-O universal binary with 3 architectures /usr/bin/perl5.10.0 (for architecture x86_64): Mach-O 64-bit executable x86_64 /usr/bin/perl5.10.0 (for architecture i386): Mach-O executable i386 /usr/bin/perl5.10.0 (for architecture ppc7400): Mach-O executable ppc $
(いつものように)前置きが長くなったけれど、これこそがじぶんの失敗の始まりであって、終わりでもあった。
このことさえなかったらば、先にも述べたとおり、インストールは RRDtool のドキュメントのとおりの流れで十分だったので、これから以下に述べようとしている手順はそれを繰り返すだけで殆ど実がない、のだけれども、そんな中でもほかにも幾つか躓いた点もあったので、そこに注目してやっぱり記しておく事にする。ただ基本は、 RRDtool のドキュメントで十分だということは、繰り返し述べておこう。
前準備
まずは作業場を定めておくことから。今回の例ではホームの下にしたけれど実際には /usr/local や $HOME/usr/local などにするかしら。
決めたら、インストール先のディレクトリと、ビルドする作業ディレクトリをそれぞれ変数にセットして、後の便宜を図ることにする。
$ cd $HOME $ INSTALL_DIR=$HOME/RRDtool $ BUILD_DIR=$HOME/RRDtool/src $ mkdir -p $BUILD_DIR $
変数名もドキュメントからのコピ&ペに融通が利くようにしておこう。
ドキュメントからのコピ&ペに融通を利かせるつもりならば、ついでにエイリアスを次のように作っておくとよかった。( Mac OS X には wget が入っていないために。)
$ alias wget='curl -OL' $
まずは目的の rrdtool のソースを取得する。──卵が先か鶏が先か、参考にするドキュメントが入っているので、展開して開いておこう。
$ cd $BUILD_DIR $ wget http://oss.oetiker.ch/rrdtool/pub/rrdtool-1.4.2.tar.gz $ tar xzf rrdtool-1.4.2.tar.gz $ cd rrdtool-1.4.2 $ $ open doc/rrdbuild.html $
展開しなくとも、配布元のウェブサイトに載っている。
ドキュメントではまずいちど、何も考えずにビルドを試みているけれど、それで出来上がらない事はわかっているので、次へ進む。 RRDtool のドキュメントでは、 "BUILDING DEPENDENCIES" のセクションへ。
そしてその冒頭にこうある。
$ PKG_CONFIG_PATH=$INSTALL_DIR/lib/pkgconfig $ PATH=$INSTALL_DIR/bin:$PATH $ export PKG_CONFIG_PATH PATH
これを実行し、以下各ライブラリの手順へ進んでいくことになる。
Building pkgconfig
$ wget http://pkgconfig.freedesktop.org/releases/pkg-config-0.23.tar.gz $ tar xzf pkg-config-0.23.tar.gz $ cd pkg-config-0.23 $ ./configure --prefix=$INSTALL_DIR $ make $ make install $ $ export PKG_CONFIG=$INSTALL_DIR/bin/pkg-config $
Building zlib
$ cd $BUILD_DIR $ wget http://oss.oetiker.ch/rrdtool/pub/libs/zlib-1.2.3.tar.gz $ tar xzf zlib-1.2.3.tar.gz $ cd zlib-1.2.3 $ ./configure --prefix=$INSTALL_DIR --shared $ make $ make install $
Building libpng
$ cd $BUILD_DIR $ wget http://oss.oetiker.ch/rrdtool/pub/libs/libpng-1.2.18.tar.gz $ tar xzf libpng-1.2.18.tar.gz $ cd libpng-1.2.18 $ ./configure --prefix=$INSTALL_DIR $ make $ make install $
Building freetype
$ cd $BUILD_DIR $ wget http://oss.oetiker.ch/rrdtool/pub/libs/freetype-2.3.5.tar.gz $ tar xzf freetype-2.3.5.tar.gz $ cd freetype-2.3.5 $ ./configure --prefix=$INSTALL_DIR $ make $ make install $
Building LibXML2
$ cd $BUILD_DIR $ wget http://oss.oetiker.ch/rrdtool/pub/libs/libxml2-2.6.32.tar.gz $ tar xzf libxml2-2.6.32.tar.gz $ cd libxml2-2.6.32 $ ./configure --prefix=$INSTALL_DIR $ make $ make install $
Building fontconfig
$ cd $BUILD_DIR $ wget http://oss.oetiker.ch/rrdtool/pub/libs/fontconfig-2.4.2.tar.gz $ tar xzf fontconfig-2.4.2.tar.gz $ cd fontconfig-2.4.2 $ ./configure --prefix=$INSTALL_DIR --with-freetype-config=$INSTALL_DIR/bin/freetype-config $ make $ make install $
Building Pixman
$ cd $BUILD_DIR $ wget http://oss.oetiker.ch/rrdtool/pub/libs/pixman-0.10.0.tar.gz $ tar xzf pixman-0.10.0.tar.gz $ cd pixman-0.10.0 $ ./configure --prefix=$INSTALL_DIR $ make $ make install $
Building Cairo
$ cd $BUILD_DIR $ wget http://oss.oetiker.ch/rrdtool/pub/libs/cairo-1.6.4.tar.gz $ tar xzf cairo-1.6.4.tar.gz $ cd cairo-1.6.4 $ ./configure --prefix=$INSTALL_DIR --enable-xlib=no --enable-xlib-render=no --enable-win32=no $ make ... ... cairo-quartz-font.c: In function 'cairo_quartz_font_face_create_for_atsu_font_id': cairo-quartz-font.c:781: error: implicit declaration of function 'FMGetATSFontRefFromFont' cairo-quartz-font.c:781: warning: nested extern declaration of 'FMGetATSFontRefFromFont' cairo-quartz-font.c:782: warning: 'CGFontCreateWithPlatformFont' is deprecated (declared at /System/Library/Frameworks/ApplicationServices.framework/Frameworks/CoreGraphics.framework/Headers/CGFont.h:60) make[2]: *** [libcairo_la-cairo-quartz-font.lo] Error 1 make[1]: *** [all-recursive] Error 1 make: *** [all] Error 2 $
エラーが出て make が失敗した。とはいえ、これについては error 行のメッセージを Google に入力して探してみたらば、すぐにパッチが見つかった。
このバグレポートの下段 "fixed in" とあるところのリンク先に、次のパッチファイルがある。
ダウンロードして "$BUILD_DIR/cairo-1.6.4.patch" として保存したら、 patch コマンドでパッチする。こうしてパッチを適用したらばそれだけで先へ進む事ができた。
このところの問題は、 Cairo の次のバージョンではなくなっているだろう。
$ curl -o $BUILD_DIR/cairo-1.6.4.patch -L http://cgit.freedesktop.org/cairo/patch/?id=13b56c42bfdb9ad36f9b1bd22f83d7ef3a074ddc $ cd src $ patch < ../../cairo-1.6.4.patch patching file cairo-quartz-font.c Hunk #1 succeeded at 757 (offset 8 lines). Hunk #2 succeeded at 792 (offset 3 lines). patching file cairo-quartz.h $ $ make $ make install $
Building Glib
$ cd $BUILD_DIR $ wget http://oss.oetiker.ch/rrdtool/pub/libs/glib-2.15.4.tar.gz $ tar xzf glib-2.15.4.tar.gz $ cd glib-2.15.4 $ ./configure --prefix=$INSTALL_DIR ... ... configure: error: *** You must have either have gettext support in your C library, or use the *** GNU gettext library. (http://www.gnu.org/software/gettext/gettext.html $
親切なメッセージを残して configure でエラー。 gettext が使える状態でないといけないとの事で、 Glib は一旦保留にして、先に gettext をインストールすることにする。
$ cd $BUILD_DIR $ wget http://ftp.gnu.org/pub/gnu/gettext/gettext-0.17.tar.gz $ tar xzf gettext-0.17.tar.gz $ cd gettext-0.17 $ ./configure --prefix=$INSTALL_DIR $ make $ make install $
そらから libiconv も必要だった。
$ cd $BUILD_DIR $ wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.1.tar.gz $ tar xzf libiconv-1.13.1.tar.gz $ cd libiconv-1.13.1 $ ./configure --prefix=$INSTALL_DIR $ make $ make install $
Glib に戻って、やり直し。
$ cd $BUILD_DIR/glib-2.15.4 $ ./configure --prefix=$INSTALL_DIR \ LDFLAGS="-L$INSTALL_DIR/lib" CPPFLAGS="-I$INSTALL_DIR/include" $ make $ make install $
Building Pango
$ cd $BUILD_DIR $ wget http://oss.oetiker.ch/rrdtool/pub/libs/pango-1.21.1.tar.bz2 $ tar xzf pango-1.21.1.tar.bz2 $ cd pango-1.21.1 $ ./configure --prefix=$INSTALL_DIR --without-x $ make $ make install $
Building rrdtool
こうして、漸く、やっと、本丸に攻め入る準備が整った。
と、そのまえに、忘れてはいけない。じぶんの場合は Perl の環境を元に戻しておかなければいけない。
$ VERSIONER_PERL_VERSION=5.10.0 $ export VERSIONER_PERL_VERSION $ which perl /usr/bin/perl $ perl -v | grep -i built This is perl, v5.10.0 built for darwin-thread-multi-2level $
$ cd $BUILD_DIR/rrdtool-1.4.2 $ ./configure --prefix=$INSTALL_DIR --disable-tcl --disable-python $ make $ make install
お誂えの代物をテストしてみる。どうやらうまくいったようだ。
$ cd bindings/perl-shared/ Yenji:perl-shared hiroaki$ make test PERL_DL_NONLAZY=1 /usr/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(0, 'blib/lib', 'blib/arch')" t/*.t t/base....ok All tests successful. Files=1, Tests=7, 1 wallclock secs ( 0.55 cusr + 0.16 csys = 0.71 CPU) $
──ところでもしこのとき、 Snow Leopard の Perl が 5.8.9 であったらば、テストは次のような感じになる(なった)。
$ unset VERSIONER_PERL_VERSION $ make test PERL_DL_NONLAZY=1 /usr/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(0, 'blib/lib', 'blib/arch')" t/*.t t/base....Can't load '$BUILD_DIR/rrdtool-1.4.2/bindings/perl-shared/blib/arch/auto/RRDs/RRDs.bundle' for module RRDs: dlopen($BUILD_DIR/rrdtool-1.4.2/bindings/perl-shared/blib/arch/auto/RRDs/RRDs.bundle, 2): Symbol not found: _Perl_Icurpad_ptr Referenced from: $BUILD_DIR/rrdtool-1.4.2/bindings/perl-shared/blib/arch/auto/RRDs/RRDs.bundle Expected in: flat namespace in $BUILD_DIR/rrdtool-1.4.2/bindings/perl-shared/blib/arch/auto/RRDs/RRDs.bundle at /System/Library/Perl/5.8.9/darwin-thread-multi-2level/DynaLoader.pm line 230. at t/base.t line 20 Compilation failed in require at t/base.t line 20. BEGIN failed--compilation aborted at t/base.t line 20. t/base....dubious Test returned status 2 (wstat 512, 0x200) DIED. FAILED tests 1-7 Failed 7/7 tests, 0.00% okay Failed Test Stat Wstat Total Fail List of Failed ------------------------------------------------------------------------------- t/base.t 2 512 7 13 1-7 Failed 1/1 test scripts. 7/7 subtests failed. Files=1, Tests=7, 0 wallclock secs ( 0.02 cusr + 0.01 csys = 0.03 CPU) Failed 1/1 test programs. 7/7 subtests failed. make: *** [test_dynamic] Error 2 $
原因が分ったいま繰り返してみても、目眩がしそう。このように長い道のりをなんとか乗り切って、さて最後の最後の段階を make も通って喜びも束の間、肝心な実行できないという、まったくなんという悪夢だったろう。

コメントする