Fink

移植 - 3. GNU libtool

ライブラリをビルドする GNU パッケージは,ライブラリをビルド・インストールする際のプラットフォーム依存の手続きを隠すため GNU libtool を使います.

3.1 状況

粗く言って,4つの libtool の流派があります:

結論として,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 ファイルを修正する必要があります.

  1. 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.
    
  2. ローダブル・モジュールのバグ: このバグは,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 以降のバージョンでは修正されました.

  3. 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
    
  4. 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 に向けて