笠原です。こんにちは。 * From: matz / netlab.co.jp (Yukihiro Matsumoto) * Date: Mon, 7 Dec 1998 16:23:05 +0900 > これは事実ですね.で,今回問題なのは個別のマシンにライブラリ > やヘッダファイルがどこにインストールされているか知る一般的な > 方法がないことですよね.まあ,標準的な場所なら探しようがあり > ますが,一般論としてはなんらかの方法で外部から教えてやらなけ > れば実現できません. > > で,現状では外部から指定する方法が存在しないので,しょうがな > いからextconf.rbを直接編集する方法を選んでいるわけですね.私 > はautomakeについてあまり調べてないんですが,やはりなんらかの > オプションで指定しているようですね. automake にはこの機能はなくて autoconf に任せます。 configure に --with-dbm-* のようなオプションを用意することになります。 たとえば次のような。 AC_ARG_WITH(dbm-includes, [ --with-dbm-includes=DIR dbm include files are in DIR], [dbm_includedir="${withval}"], [dbm_includedir='']) ですから、mkmf.rb にしても automake にしても、やるとしたらここまでは手 順は一緒です。この --with-dbm-* オプションで渡されたディレクトリ情報を dbm をコンパイルするときまでに渡さないといけないのですが、それには大き く分けて 2 つの方法があります。 1. ext/dbm/extconf.rb.in を用意しておいてそこに $CFLAGS = "-I@DBM_INCLUDEDIR@" と書いておく。configure.in に AC_OUTPUT(..... ext/dbm/extconf.rb) として ext/dbm/extconf.rb を生成すると、先ほどの $CFLAGS は $CFLAGS = "-I/foo/bar/include" と置き換わるようになる。 2. mkmf.rb に --with-dbm-* オプションを渡すと mkmf.rb がこのオプショ ンを認識するようにする。たとえば extconf.rb に $CFLAGS = "-I" + arg_with("dbm-includes") のようなコードコードを書いておくと、良きに計らってくれる。 ところで、実際に mkmf.rb の代わりに automake, libtool を使って拡張モジュー ルを作ってみたらどうなるのか、やってみました。実は問題がありました。 * デフォルトでは、shared ライブラリと static ライブラリの両方を作っ てインストールしてしまう。 * さらに、libtool 管理用の *.la ファイルもインストールしてしまう。 * automake, libtool ともに、ライブラリ名が `lib*.*' (例: libjpeg.so) になっていることを想定している。 これはけっこう痛いです。libtool にはパッチを当てて回避しました。 automake は文句を言うものの、一応 Makefile.in を最後まで生成して くれるので、automake のエラーメッセージは無視しました。(^^;) とまぁ、「理想は automake」などと言っていたわりに、実はけっこう大変な のでした (_o_)。が、利点もありました。 * autoconf と親和性が高いので、autoconf との併用が前提なら柔軟性が ある。 automake は autoconf 用の Makefile.in を生成するので、@VARIABLE@ の置換なども行えます。 * 機能が豊富である。 make uninstall や make dist (ソースコードの `*.tar.gz' distribution を作ってくれます、これは非常に便利)、make check (ストスイートの実 行の補助) があります。サブディレクトリを作ることも可能です。 * (Ruby 本体の場合) 複雑な ext/extmk.rb が要らなくなると思われる。 ただし、その代わり configure.in のコード量がある程度増えますが。 といったところです。 # automake, libtool を使って実際に何を作ったのかは、別のメールにて。 ______________________________________________________________________ 笠原 基之(かさはら もとゆき)