前: Module loaders for libltdl, 上: Using libltdl


10.6 パッケージとともにlibltdlを配布する方法

libltdlはlibtoolとともにインストールされるのですが,libtoolやlibltdlを インストールしていないパッケージユーザの利便性のため,パッケージの配布 物にlibltdlを含めたいと思うかもしれません.この場合,手動でパッケージ に加えるltdlオブジェクト,または,使用したいlibltdlの特色を決定 する必要があります.それは,コンビニエンスライブラリやインストール可能 なlibtoolライブラリです.

libltdlをッケージに加える最も簡単な方法は,ソースファイルの ltdl.cltdl.hをパッケージのソースディレクトリにコピーし, ソースの残りと一緒にリンクすることです.これの手助けをするため, autoconfのm4マクロがltdl.m4で利用可能です.autoconfを実行する前 に,それらがaclocal.m4で利用可能かどうかを確かめる必要がありま す – automakeを使用している場合はltdl.m4の内容を acinclude.m4に加え,そうでない場合はaclocal.m4に加えます. マクロを利用可能にした後,ltdl.oを正しくビルドするために必要な コンフィグレーション時の調査を実行するため,`AC_LIB_LTDL'マクロの 呼び出しを,パッケージのconfigure.inに加える必要があります.イ ンストールされているlibltdl やlibltdlに依存しているライブラリと,パケー ジのバイナリをリンクしようとする場合,この手法には問題があります.シン ボルの二重定義の問題があるかもしれません.

コンビニエンスライブラリの利点の一つは,インストールされていないという ことなので,libtoolを使用するという事実はユーザにとって明白ではなく, ユーザが以前にインストールしているlibtoolのバージョンを上書きしません. 一方,(例えば,バグフィックスといった)理由があって,libltdlをアップグ レードしたい場合,インストールされているバージョンのlibtoolを置き換え る代わりに,パッケージを再コンパイルする必要があります.しかし,プログ ラムやライブラリが以前にインストールされているバージョンのlibltdlを使 用しているライブラリとリンクする場合,リンカエラーが発生し実行時にクラッ シュするかもしれません.もう一つの問題は,一つ以上のlibtoolライブラリ へコンビニエンスライブラリをリンクできないことで,複製されたシンボルを 得る可能性があるので,そのときは,これらのライブラリを用いた単一のプロ グラムとリンクしてください.一般的に,libtoolを使用している他のライブ ラリに依存しないプログラムでは,コンビニエンスライブラリを問題なく使用 可能です.libltdlのこの特徴を利用可能にするため, `AC_LIBLTDL_CONVENIENCE'行をconfigure.inに, `AC_PROG_LIBTOOL'の前に加えた方が良いでしょう.

インストール可能なバージョンのlibltdlを選択するために,マクロ `AC_LIBLTDL_INSTALLABLE'の呼び出しをconfigure.inに, `AC_PROG_LIBTOOL'の前に加えた方が良いでしょう.このマクロ は,libltdlが既にインストールされているかどうか調査し,そうでない場合, ビルドしインストールされるパッケージlibltdlを埋め込むことを要求します. しかし,バージョン調査は実行されないことに注意してください.ユーザは, コンフィグレーションスイッチ`--enable-ltdl-install'を使用すること で,他のバージョンの存在に関係なく,テストを優先し,埋め込まれた libtoolをインストールする必要があるか決定することができます.

libtoolをパッケージに埋め込むため,libtoolizeコマンドラインに `--ltdl'のみ加えてください.それで,パッケージのサブディレクトリ `libltdl'にlibtoolのソースをコピーします.どちらのマクロも, `libltdl'ディレクトリの位置を指定する追加の引数を受け入れます.デ フォルトで,どちらのマクロも`${top_srcdir}/libltdl'を仮定します.

どのマクロを使用しても,configure.inは`AC_CONFIG_SUBDIRS' を使用して,libltdlをコンフィグレーションし,Makefileが,例えば, automakeのSUBDIRSを使用して,libtoolのディレクトリでサブmakeを開 始することを確実にするのはあなたです.どちらのマクロも,libltdlでリン クするために使用するリンクフラグのシェル変数LIBLTDLと, ltdl.hをインクルードするプログラムをコンパイルするために使用す るプリプロセッサフラグLTDLINCLを定義します.この変数が Makefileで利用可能にすることを確実にするため`AC_SUBST'を使 用したり,デフォルトで`AC_SUBST'される,LIBSCPPFLAGSのような変数に加えるのはあなた次第です.

コンビニエンスlibltdlを使用している場合,LIBLTDLはコンビニエンス libltdlのバージョンに対するパス名で,LTDLINCLはlibltdlを含むディ レクトリが続く`-I'になり,どちらも`${top_builddir}/',また は,`${top_srcdir}/'で,それぞれ始まります.

インストールされているlibltdlのバージョンを要求し,それが見つかった場 合1LIBLTDLは `-lltdl'に,LTDLINCLは空に設定されます(それは,libltdlがラ イブラリパスにある場合,ltdl.hがインクルードパスのどこかにある という,暗黙の仮定です).インストール可能なlibltdlのバージョンをビルド する必要がある場合,`${top_builddir}/'で始まるそのパス名は, LIBLTDLに保存され,LTDLINCLはコンビニエンスライブラリの場 合と同様に設定されます.

そのため,libltdlとプログラムをリンクしたいときは,それをインストール された,またはインストール可能なコンビニエンスライブラリにし,すなわち, libtoolを使用して,LTDLINCLを用いてコンパイルし, `$(LIBLTDL)'を用いてリンクしてください.

おそらく`AC_LIBTOOL_DLOPEN'もconfigure.inに, `AC_PROG_LIBTOOL'の前に加えた方が良く,そうしない場合は, libtoolはdlopenメカニズムがサポートされていないと仮定し,おそらく希望 していないdlpreopenに逆戻りします.

libltdlとプログラムをリンクするとき,-static-all-staticスイッチの使用を避けてください.dlopen関数はスタティッ クリンクに対して利用可能でない可能性があるので,これはすべてのプラット フォームで動作するわけではありません.

以下の例は,パッケージにコンビニエンスlibltdlを埋め込む方法を示します. インストール可能な形態を使用するために,`AC_LIBLTDL_CONVENIENCE' を`AC_LIBLTDL_INSTALLABLE'で置換してください.我々は,libltdlが `libtoolize --ltdl'を使用して埋め込まれていると仮定しています.

configure.inは以下のようになります.

     ...
     dnl Enable building of the convenience library
     dnl and set LIBLTDL accordingly
     AC_LIBLTDL_CONVENIENCE
     dnl Substitute LTDLINCL and LIBLTDL in the Makefiles
     AC_SUBST(LTDLINCL)
     AC_SUBST(LIBLTDL)
     dnl Check for dlopen support
     AC_LIBTOOL_DLOPEN
     dnl Configure libtool
     AC_PROG_LIBTOOL
     dnl Configure libltdl
     AC_CONFIG_SUBDIRS(libltdl)
     ...

Makefile.amは以下のようになります.

     ...
     SUBDIRS = libltdl
     
     INCLUDES = $(LTDLINCL)
     
     myprog_LDFLAGS = -export-dynamic
     # The quotes around -dlopen below fool automake <= 1.4 into accepting it
     myprog_LDADD = $(LIBLTDL) "-dlopen" self "-dlopen" foo1.la
     myprog_DEPENDENCIES = $(LIBLTDL) foo1.la
     ...

脚注

[1] たとえ,libltdlがインストールされていても,libltdlがCライ ブラリ以外のライブラリが提供するシンボルに依存する場合, `AC_LIBLTDL_INSTALLABLE'は検出に失敗する可能性があります.この場 合,libltdlのビルドとインストールは不必要です.