Fink

移植 - 1. 基本

1.1 Darwin はどこから来たのか

Darwin は Unix ライクなオペレーティングシステムとして, NeXTStep / OpenStep から派生してきました. これはまた, 4.4BSD Lite から分岐してきたとも言われています. BSD の遺産もあり,実際 Darwin は近年 FreeBSD と NetBSD のコードによって近代化されてきました.

Darwin のカーネルは,Mach 3.0 ,BSD,オブジェクト指向ドライバレイヤ IOKit などの商用機能などの混合です. Mac は元々マイクロカーネルとして設計されていましたが,この上にある BSD カーネルはモノリシックであり,両者は今では相互に依存し,一つのカーネルとして見ることができます.

Darwin にあるユーザー空間のツールやライブラリはほとんど BSD 由来のもので,Linux のような GNU ツールではありません. Apple は他の BSD のように厳密ではなく,有益な妥協もしています. たとえば, Apple は BSD make と GNU make の両方を付けて, GNU make をデフォルトとしています.

1.2 コンパイラとツール

短い説明: コンパイラは gcc の派生物ですが, cc としてインストールされます. Makefile にパッチを当てる必要があるでしょう. ほとんどのパッケージは共有ライブラリ をビルドしません. マクロに関係するエラーが出た時は,-no-cpp-precomp オプションを使用してください.

長い説明: Mac OS X Developer Tools にあるコンパイラツールチェーンは不思議な生き物です. コンパイラは gcc 2.95.2 スイートをもとに, Objective C 言語やいくつかの Darwin 特有なことをサポートする変更がなされています. プリプロセサー (cpp) は二つのバージョンがあります. ひとつは通常の(gcc 2.95.2 からの) プリコンパイラで,もう一つは Apple による,コンパイル済みヘッダをサポートする特別なプリコンパイラです. こちらの方が高速で,デフォルトになっています. しかし,コードによっては Apple のプリコンパイラではコンパイルできません. この場合,-no-cpp-precomp オプションを使い,通常のプリコンパイラでコンパイルします. (注記: 以前は -traditional-cpp オプションを勧めていました. このオプションの意味が GCC 3 で少し変わったため,これを使うパッケージのほとんどを破壊してしまいました. -no-cpp-precomp は現在の Developer Tools と 将来の GCC 3 ベースのコンパイラの双方に要求通りのことをしてくれます.)

アッセンブラは gas 1.38 ベースだと言いますが,リンカは GNU ツールではありません. これは 共有ライブラリ をビルドする際に問題となります. GNU libtool とこれが生成する configure スクリプトは Apple のリンカの扱い方を知らないためです.

1.3 ホスト種別

短い説明: configure が 'Can't determine host type' と言って異常終了した場合,config.guess と config.sub を /usr/share/libtool (OS バージョン 10.2 以前では /usr/libexec) から現在のディレクトリにコピーしてください.

長い説明: GNU の世界では,システムの種類を特定するために基準形式を採用しています. これには3つのパートがあります: CPU 種別,メーカー,オペレーティングシステム. 4つ目のパートがつくこともあります. 全て小文字で表記され,ダッシュでつながれます. 例: i586-pc-linux-gnu, hppa1.1-hp-hpux10.20, sparc-sun-solaris2.6. Mac OS X 10.0 のホスト種別は powerpc-apple-darwin1.3 です.

autoconf を使うパッケージは多くの場合,コンパイル環境のシステム種別を知りたがります. (注記: クロスコンパイルと移植のサポートのため,3つの種別 - ホスト種別,ビルド種別,ターゲット種別があります. 通常は全て同一です.) ホスト種別は configure スクリプトに渡すことも,自動推測してもらうこともできます.

configure スクリプトは二つの付属スクリプトでホスト種別を決定します. config.guess がホスト種別の推測を試み,config.sub で検証・正規化をします. 両スクリプトは別々にメンテナンスされていますが,全てのパッケージに含まれます. 最近までこのスクリプトは Darwin も Mac OS X も知りませんでした. もし Darwin を認識しないパッケージがあった場合, configu.guess と config.sub を置き換える必要があります. 功にも, Apple が動作するバージョンのものを /usr/share/libtool (10.2 以前の OS では /usr/libexec) に置いていますので,そこからコピーしてください.

1.4 ライブラリ

短い説明: -lm を削除しても問題ありませんが,する必要もありません.

長い説明: Mac OS X は libc, libm, libcurses, libpthread などのライブラリを分割して持っていません. 代わりに,これらは全てシステムライブラリ libSystem の一部となっています. (以前のバージョンではこれは System のフレームワークでした.) しかし, Apple は適切にシンボリックリンクを /usr/lib に置いていますので,-lm でリンクすれば動作します. 唯一の例外は -lutil です. 他のシステムでは,libutil は疑似ターミナルや,ログイン監査などの関数を含んでいます. これらの関数は libSystem にはなく, libutil.dylib へのシンボリックリンクもありません.

1.5 他の情報源

ポーティングに関する他の情報源としては,MetaPkg Wiki があります.

Apple Technical Note TN2071: "Porting Command Line Unix Tools to Mac OS X" も読むとよいでしょう.

次: 2. 共有コード