起動するまでの長い道のり D言語編(4) 標準ライブラリ格闘の巻(2)
色々あったがようやく再開……。
さて前回で大量のリンク・エラーという壁にぶち当たった。そして、標準ライブラリを移植する必要があると分かった。
今回は、ビルドを通すためにどこをどう移植したかを説明する。はっきりいって不毛なので、読み飛ばしてソースコードだけ取得した方がいいかもしれない……。
標準ライブラリのソースはどこにあるか。
まずは移植元のソースがないと始まらない。CygwinでGDCをインストールした人の場合は、include/d/X.X.Xの配下にあるだろう(Xは数字)。私のようにちゃんとGCCも含めてソースコードからビルドした偉い人なら、GCCのソースディレクトリのgcc/d/phobos内にもある。
必要なソースを見極める。
前回で、標準ライブラリのうち動的型情報を含む最小限の部分だけ実装すると決めた。ではその最小限の部分って具体的にどこなのか。リンク・エラーが発生した関数を調べた。標準ライブラリ内部で使用されている関数はなぜかC言語の関数になっているので、リンカのエラーメッセージからどの関数が無いか分かるのだ。ありがたい。
で、必要だったソースコードは以下の通り。
object.d(internal/object.d)
超基本的なオブジェクトクラスとかクラス情報クラスの定義。object.dは宣言だけで実装はinternal/object.dにあった。面倒なので移植の際に一まとめにした。
型情報で配列の連結とか例外送出とかやっているところがあったが、コメントアウト。
std/aApply.d
文字列とかをforeach(巡回)する時に使われる関数がある。D言語にはchar・wchar・dcharと3種類も文字(列)型がある。それぞれUTF8・UTF16・UTF32に対応する。で、UTF8の配列をUTF32の文字として取り出しながら巡回する時とかに変換処理が必要になる。それをやる関数がここにある。
動的バッファを用意するような奴はコメントアウト……。wcharとかdcharなんてあんまり使わないからいいだろう。
std/arraycast.d
名前が示すとおり配列をキャストするための関数がある。例外を投げているところがあったのでコメントアウト。
std/cast.d
ダウンキャストとかの実装。特に変更なし?
std/deh.d
例外処理関連のコード。例外処理は使わないので、エラーになる関数だけ空の定義を書いておいた。
std/gc.d
newとかdeleteの実装。動的メモリ確保は使わないので関数の中身を全部空にした。
std/math.d
たしかTypeInfoで必要になったような……。各種定数とisnanだけ実装。
std/stdint.d
サイズがしっかり定義されている整数型。これはそのままで大丈夫だと思う。
std/stream.d
ストリーム入出力関連の定義。インターフェイスだけ定義するように修正した。まだ使わない。
std/string.d
文字列操作関数。動的メモリ確保とか例外とか使わない奴だけ残した。
std/unwind.d
例外処理用のコード。これもリンク・エラーになるものの宣言と空の定義だけにした。
std/utf.d
Unicode関連関数。動的メモリ確保とか例外とか使わない奴だけ残した。
std/c/process.d
なぜかabort関数が使われているらしい。空のものを定義。
std/typeinfo内の全部
ほとんどは修正無しで大丈夫だったような気がする。数が多いが(汗)。
ビルド
以上のソースコードを移植して、修正を全部やってMakefileに指定を追加すれば、一応ビルドは通る。そして実行すれば、以前と同じ表示がシリアル・コンソールにされるはずだ。
どこをどう変えたのかとかの詳細も書こうと思ったけどやめた。
ライセンスについて
PhobosのライセンスはZlibライセンスに近いみたいだ。詳しくはphoboslicense.txtに書いてある。改変コードをオリジナルと偽って発表しなければOK? あとModified by Foo Barとか書いておけ! とあるので書いておいた。
次回予告
これ以上あんまり凝ってもまだ不毛なので、標準ライブラリ回りの解説はこれで終りにする……。
次回はいきなりページングにでも進んでしまおうかな。