パッケージ作成 - 5. コンパイラ
Fink は,Apple Developer Connection によってアップルコンピュータから提供される gcc コンパイラを使用しています. バージョンはいくつかあり, Mac OS X システムでも通常は複数のバージョンが存在します.
より詳しい解説がメーリングリスト中にあります.
5.1 コンパイラバージョン
GCC の発展に伴い,fink は "ディストリビューション" をつくって変化に対応してきました.
各 Fink ディストリビューションには,ソースからコンパイルするユーザー全員がもっていると想定されている
既定の gcc と g++ コンパイラがあります.
パッケージ中で直接 "gcc" や "g++" を使用すると,この既定値が使われます.
これと違う値を使用する必要がある場合,(例えば,ディストリビューションの移行中に) パッケージ .info ファイルは
Apple 提供の特定バージョンのバイナリを指定しなければなりません.
どのように指定するかは,ソフトウェアのビルドシステムによりますが,多くの場合
SetCC
と SetCXX
のフィールドを使用します.
例えば,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 です.)