移植 - 3. GNU libtool
ライブラリをビルドする GNU パッケージは,ライブラリをビルド・インストールする際のプラットフォーム依存の手続きを隠すため GNU libtool を使います.
3.1 状況
粗く言って,4つの libtool の流派があります:
-
libtool 1.3: 最も一般的な流派. この流派の最新のリリースは 1.3.5. Darwin には非対応で,静的ライブラリのみをビルドする. ソースツリーに
ltconfig
とltmain.sh
があることで判定できる. -
libtool 1.4: 長らく開発途中で,最近新しい安定版がリリースされた. このブランチは改良された autoconf との統合がされている. 残念ながら, 1.3 からのパッケージの統合を難しくしている. Darwin 1.3 / Mac OS X 10.0 に対応し,小さいパッチを当てることで Mac OS X 10.1 にも対応する.
ltconfig
がないことで判定できる. 1.3b や 1.3d などのバージョンがついたものも, 1.4 の開発スナップショットであり,扱いには注意が必要である. -
多言語版: MLB (multi-language-branch) ともいい,このバージョンは C++ や (gcj を通して) Java へのサポートを追加した平行開発ブランチである. 現在は主開発ブランチに統合されている. 最新版は Darwin 1.3 と Mac OS X 10.0 に対応している. MLB は
ltcf-c.sh
,ltcf-cxx.sh
,ltcf-gcj.sh
などのファイルで判定できる. -
現在の開発ブランチ: いずれ libtool 1.5 としてリリースされる開発バージョン. 1.4 と MLB を統合してできた. C, C++, (gcj を通して) Java に対応. 残念ながら, 1.4 との違いは簡単にはわからない.
ltmain.sh
の中のバージョン番号を確認する必要がある.
結論として,libtool 1.3.x とこれを使うパッケージ (libtool を使うパッケージの主流) は, Darwin で共有ライブラリをビルドするにはパッチが必要になります. Apple は libtool 1.3.5 のパッチが当たったバージョンを Mac OS X に組み込んでいますが,ほとんどの場合うまく行きません. Christoph Pfisterer がこのパッチを改良し,正しいパスのハードコーディングと完全なバージョニングを行うようになりました. この変更は上流の libtool リリースと 1.4 で始まる開発バージョンに統合されました. Fink チームのメンバーはこれからも改良を続け, libtool メンテナに送っていきます. バージョン番号のスキームは全ての libtool バージョンで一致しています.
注記: 全てのバージョンの libtool に関して,付属の libltdl ライブラリは dlcompat がインストールされている場合に限り Darwin 上で動作します. 10.3以降の OSX には付属されています. これ以前のバージョンでは,"dlcompat" 関連のパッケージをインストールします.
3.2 1.3.5 パッチ
libtool 1.3.5 を自分でビルドする場合, このパッチ [updated 2002-06-09] をソースにあて,ltconfig と ltmain.sh というファイルを削除します. (これらのファイルは,configure と make をすることで .in ファイルにより再生成されます.) Fink パッケージの libtool 1.3.5 では自動的に行われます.
ここまででやっと半分です - libtool を使うパッケージはそれぞれ独自の ltconfig と ltmain.sh を持っています. 共有ライブラリとしてビルドする全てのパッケージについて,これらのファイルを置き換える必要があります. これは configure スクリプトを実行する前に行う必要があります. 両ファイルは以下から取得することができます: ltconfig (98K) と ltmain.sh (110K) [both updated 2002-06-09].
3.3 1.4.x を修正
現在,よく使われている libtool 1.4.x には3つのバージョンがあります (1.4.1, 1.4.2, 最新開発スナップショット). いずれも Darwin ではいくつかの問題があり,修正方法も異なります. Fink で提供している libtool14 は全てのパッチを含んでいます. しかし,これによって影響されるパッケージの ltmain.sh/configure ファイルを修正する必要があります.
- flat_namespace バグ:
この問題は, Mac OS X 10.1 上で libtool を使用する際に発生します.
何が起こるかというと,libtool は未定義シンボルを許可するために
-undefined suppress
を使おうとするが,これに伴う-flat_namespace
を指定しません. 10.1 からは,これでは動作しません. パッチは以下のようになります:diff -Naur gdk-pixbuf-0.16.0.old/configure gdk-pixbuf-0.16.0.new/configure --- gdk-pixbuf-0.16.0.old/configure Wed Jan 23 10:11:48 2002 +++ gdk-pixbuf-0.16.0.new/configure Thu Jan 31 03:19:54 2002 @@ -3334,7 +3334,7 @@ ;; darwin* | rhapsody*) - allow_undefined_flag='-undefined suppress' + allow_undefined_flag='-flat_namespace -undefined suppress' # FIXME: Relying on posixy $() will cause problems for # cross-compilation, but unfortunately the echo tests do not # yet detect zsh echo's removal of \ escapes.
- ローダブル・モジュールのバグ:
このバグは,zsh (10.0 と 10.1 のデフォルトシェル; 10.2 では bash に変更される見込み) の非標準的な挙動によります.
zsh の非標準的なクォートの挙動により,ローダブル・モジュールが正しくビルドされず,(Linux と異なり,Darwin では本質的に別ものな) 共有ライブラリになります.
修正方法の例 (の一部なので,そのままでは使えません):
diff -Naur gnome-core-1.4.0.6.old/configure gnome-core-1.4.0.6.new/configure --- gnome-core-1.4.0.6.old/configure Sun Jan 27 08:19:48 2002 +++ gnome-core-1.4.0.6.new/configure Fri Feb 8 01:10:21 2002 @@ -4020,7 +4020,7 @@ # FIXME: Relying on posixy $() will cause problems for # cross-compilation, but unfortunately the echo tests do not # yet detect zsh echo's removal of \ escapes. - archive_cmds='$nonopt $(test "x$module" = xyes && echo -bundle || echo -dynamiclib) ...' + archive_cmds='$nonopt $(test x$module = xyes && echo -bundle || echo -dynamiclib) ...' # We need to add '_' to the symbols in $export_symbols first #archive_expsym_cmds="$archive_cmds"' && strip -s $export_symbols' hardcode_direct=yes
この問題は 1.4.2 以降のバージョンでは修正されました.
- convenience ライブラリのバグ:
条件によっては,libtool は convinience ライブラリをリンクすることができず, "multiple definitions" エラーを出します.
これは libtool の本質的な問題によるようです.
現在のところ回避策として (原因ではなく症状を治すだけでですが,成功します),この修正を行います (Dave Vasilevsky に感謝):
--- ltmain.sh.old 2002-04-27 00:01:23.000000000 -0400 +++ ltmain.sh 2002-04-27 00:01:45.000000000 -0400 @@ -2894,7 +2894,18 @@ if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval cmds=\"$archive_expsym_cmds\" else + save_deplibs="$deplibs" + for conv in $convenience; do + tmp_deplibs= + for test_deplib in $deplibs; do + if test "$test_deplib" != "$conv"; then + tmp_deplibs="$tmp_deplibs $test_deplib" + fi + done + deplibs="$tmp_deplibs" + done eval cmds=\"$archive_cmds\" + deplibs="$save_deplibs" fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do
- DESTDIR バグ:
DESTDIR を設定し, libtool 1.4.2 を使用するパッケージのなかで,再リンクに問題がある場合があります.
この問題は,以下のメールで議論されました:
http://mail.gnu.org/archive/html/libtool/2002-04/msg00019.html
http://mail.gnu.org/archive/html/libtool/2002-04/msg00021.html
http://mail.gnu.org/archive/html/libtool/2002-04/msg00025.html,
パッチに関する議論は:
http://mail.gnu.org/archive/html/libtool/2002-04/msg00043.html.
3.4 さらなる注記
libtool 自体と,libtool が何をするかについての詳細は libtool ホームページを参照.
注記:
Apple の Developer Tools には libtool というプログラムがはいっていて,コンパイラドライバが共有ライブラリをビルドする際に使われます.
しかし,これは GNU の libtool とは全く関係がありません.
Apple の提供する GNU libtool は glibtool
としてインストールされています.
これは, GNU libtool を--program-transform-name=s/libtool/glibtool/
と configure することで得られます.
次: 4. 10.2 に向けて