Fink

パッケージ作成 - 5. コンパイラ

Fink は,Apple Developer Connection によってアップルコンピュータから提供される gcc コンパイラを使用しています. バージョンはいくつかあり, Mac OS X システムでも通常は複数のバージョンが存在します.

より詳しい解説がメーリングリスト中にあります.

5.1 コンパイラバージョン

GCC の発展に伴い,fink は "ディストリビューション" をつくって変化に対応してきました.

各 Fink ディストリビューションには,ソースからコンパイルするユーザー全員がもっていると想定されている 既定の gcc と g++ コンパイラがあります. パッケージ中で直接 "gcc" や "g++" を使用すると,この既定値が使われます. これと違う値を使用する必要がある場合,(例えば,ディストリビューションの移行中に) パッケージ .info ファイルは Apple 提供の特定バージョンのバイナリを指定しなければなりません. どのように指定するかは,ソフトウェアのビルドシステムによりますが,多くの場合 SetCCSetCXX のフィールドを使用します. 例えば,g++コンパイラのバージョンを 3.3 にするには,SetCXX: g++-3.3 とします. 正しいコンパイラが使われているか,ビルド時の出力を確認してください.

10.1 ディストリビューションは,コンパイラに 2.95 の使用を前提とします. 10.2 ディストリビューションは,コンパイラに 3.1 の使用を前提とします. 10.2-gcc と 10.3 ディストリビューションは,コンパイラに 3.3 の使用を前提とします. 10.4-transitional ディストリビューションは複雑で,これは g++-3.3 と gcc-4.0 を使用しています. 10.4 と 10.5 ディストリビューションでは,gcc-4.0 と g++-4.0 を使用しています. 10.6 ディストリビューションでは,gcc-4.2 を使用しています. 10.7 から 10.9 ディストリビューションでは,clang と clang++ をデフォルトコンパイラとして使用しています. 10.9 では、さらに、libstdc++ から libc++ へ統合という変化があります。

正しい g++ コンパイラが使用されるよう新手法が 10.4-transitional ディストリビューションから採用されました. コンパイル時に,/opt/sw/var/lib/fink/path-prefix-g++-XXX (XXX はバージョン番号) ディレクトリが PATH に追加されます. このディレクトリには正しいコンパイラと正しいバージョンの g++ が使われるようなシェルスクリプトが入っています.

5.2 g++ ABI

OS X の歴史の中で,g++ ABI は3度変わってきました: ABI は バージョン 2.95, 3.1, 3.3, 4.0 で異なります. ABI の相違は互換性がなく,C++ コードを用いたライブラリにリンクする場合は,同じ ABI でコンパイルしなければなりません.

Fink では,g++ ABI は GCC フィールドで扱っています. g++ あるいは c++ コンパイラを呼び出すパッケージは,GCC フィールドを定義しなければなりません (逆に,呼び出さないパッケージには定義してはいけません). ABI が更新された場合,パッケージ依存性に GCC フィールドも確認しなければいけません. 依存するパッケージ全てがアップグレードされて,始めてそのパッケージもアップグレードすることができます. ユーザーがパッケージをビルドするより前に正しく更新された依存性を持つためには,依存パッケージのバージョンを変える必要があります.

ある範囲内でのみ依存されているパッケージは,アップグレードの準備ができない場合, ディストリビューション変更時に旧バージョンの ABI を使用することもできます. アップグレードされる場合は,範囲内の全てのパッケージを同時に正しいバージョンにアップグレードする必要があります. このため,ほとんどのパッケージにとって,アップグレードはディストリビューションの変更時にするのがよいでしょう.

Fink は GCC フィールドを使って,ユーザーが正しいコンパイラを使うよう確認します. GCC フィールドがパッケージによって定義されている場合, その値が OS X バージョンにあっているか確認します。 (10.2 と 10.3 での正しい値は 3.3 で, 10.4 から 10.9 までの正しい値は 4.0 です.)

次: 6. リファレンスマニュアル