移植 - 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. 共有コード