DOS/FreeDOS/build/kernel(2041)
FreeDOS のカーネルビルド法(OpenWatcom 編)。
想定しているカーネルのバージョンは 2041 です。
ちなみに以前のやつはカーネル 2035a 想定。
想定されているビルド環境
FreeDOS カーネルのビルド環境として、とりあえず以下のものが想定されているようです。
- DOS
- Windows (32bit)
- Linux (x86 32/64bit)
正直、64bit Windows より Linux 上の方がビルドは楽なんじゃないかな…。
必要なもの
FreeDOS カーネルのソース
- これ書いてる時点(2014-08)での最新リリースは 2041 - sourceforge でも ibiblio でもええねんで…。
- 開発版的なやつが www.fdos.org にある→github のソースリポジトリ
リリース版の zip に入ってるソースは改行コードが CR+LF なので、Linux 上でビルドする場合は多少注意が必要かも。展開時に unzip の -aa オプションで全部テキストファイルとみなしてしまう(改行コードを変換しつつ展開してくれる)のが楽かも。
コンパイラ
ここでは OpenWatcom C/C++ を使うことにする。理由はほかのコンパイラよりバイナリサイズが小さくできるから。
(それ以外のものを使う場合に関しては以前のやつを適当にどうぞ)
ちなみに OpenWatcom の Linux 版インストーラは、16bit ターゲットのコンパイラやライブラリをデフォルトではインストールしない。手動でチェックを入れる必要がある。
また Linux 上でビルドする場合は gcc も必要なので、事前に開発環境をインストールしておく。
UPX
カーネルイメージ圧縮に使う。ビルドに必須ではないことになっているが、現状の makefile では使わないように設定できない気がする。makefile 中にある XUPX=... の設定を消去するかコメントアウトし、upx を使うかどうかは config.bat (config.mak) に任せるほうがいいと思う。(ほかにも exeflat には微妙なバグがあり、FAT16 カーネルが正しく展開できないことがあるため、utils/exeflat.c だけ開発版のソースに置き換えたほうがいいと思われ)
Ubuntu あたりだと apt-get で何も考えずにインストールできるが、これは ucl ライブラリを使った「オープンソース版」であり圧縮率が劣る(圧縮後のカーネルサイズが 1K バイト以上異なる)。公式サイトから落としたバイナリを使ったほうがいい。
その他ツール
-
unzip カーネルソースの展開に使う。
まあ zip がほどけるツールなら何だっていいんですが、コマンドライン版の unzip って意外と便利なんですよ…オプション -aa (treat all files as text) を使うと改行コードを変換しながら展開してくれる。つまり Windows 用の unzip だと LF → CRLF になるし(元から CRLF だったらそのまま)、Unix 版だと CRLF → LF になるのです… - make (GNU make) Linux 上でビルドする場合は必須。
ビルド (Windows)
おおまかな手順はこんな感じ(この項、以前とほぼ同じ…)。
- コンパイラやツールを(正しく)インストールしておく
- copy config.b config.bat
- config.bat を手持ちの環境にあわせて修正
- build.bat 実行
実際にビルドを行う前に、バッチファイルの改行コードを確認しておいたほうがいいと思う。CR+LF でないバッチファイルは動かない可能性がある。
現状では、ビルド中に 16bit DOS プログラム(exeflat)がビルド、実行されることに注意。
これには以下のような問題(といっていいと思う)がある。
- 64bit 環境でのビルドが保証されない。
- フォルダ(ディレクトリ)の制限。16bit DOS アプリで正しくアクセスできない場所にソースが展開されているとビルドが失敗する。
- DOS プログラム実行時にコンソールが英語モードになってしまう(一応、chcp 932 すれば元の日本語コンソールに戻せるけど、ねえ…)。
(開発版のソースだと Linux とほぼ同様の手順で 16bit 非依存のビルドができるようになっている…はず)
config.bat
環境変数をいろいろ設定しているので、使用ツールや作成したいカーネルの種別にあわせて各自で修正する。
- XNASM
- nasm のパス名。 デフォルトだと 16bit 版 nasm が指定されているので書きかえる。
- COMPILER
- デフォルトコンパイラの指定。
無指定時は WATCOM が選ばれる(が、config.b では TC2 が設定されている)。 Turbo C 2.0, Turbo C++ 1.01, Visual C++ 1.52, OpenWatcom の場合は build 時の引数でコンパイラを指定できるのであえて設定しなくてもいい。 その他のコンパイラ(Turbo C++ 3.0, Borland C++ 5.0)を使う場合は指定が必要。 - TC2_BASE, TP1_BASE, TC3_BASE, BC5_BASE, MS_BASE
- コンパイラがインストールされているベースディレクトリの指定。
- XUPX
- UPX のパス名(と実行時オプション)。
UPX を使わない場合は set XUPX= と設定する(と config.b に書いてある)。 - XLINK
- カーネルリンク時に使うリンカのパス名。
ふつうはコンパイラ付属のリンカを使うので、指定しなくてもいいと思う。 - MAKE
- ビルド時に使う make のパス名。
COMPILER に WATCOM が指定されているときはデフォルトで wmake が使われるので、特に指定しなくてもよい。
ちなみに Visual C++ 1.52 を使ったとき、付属の nmake だとうまくビルドできなかった。 Borland C++ 5.51 の make を指定して回避した。 - XCPU, XFAT
- ビルドするカーネルの種類。
build 実行時にオプションで指定することも可能。 - ALLCFLAGS
- コンパイラに対する追加フラグ。 詳細は config.b のコメントと config.bat で。
- NASMFLAGS
- アセンブラに対する追加フラグ。 詳細は config.b のコメントと config.bat で。
Windows 3.1 サポート用のマクロ定義 -DWIN31SUPPORT は ALLCFLAGS と NASMFLAGS の両方に入れる必要がある。
ビルド (Linux)
おおまかな手順…まあ、Windows のときとほぼ同じというか、気分的にはむしろ楽?
- コンパイラやツールを(正しく)インストールしておく
- cp config.m config.mak
- config.mak を手持ちの環境にあわせて修正
- make clobber && make all
config.mak
OpenWatcom によるクロスビルドしか考慮されていないので、(使用するツールのフルパス名を変更したい場合を除いて)特に変更の必要もないと思う。
- WATCOM
- OpenWatcom C/C++ がインストールされているベースディレクトリの指定。
自分で設定する場合は $WATCOM/binl にパスを通しておく必要がある。 - XUPX
- UPX のパス名(と実行時オプション)。
UPX を使わない場合は(config.m に書いてある通りに)unexport XUPX を指定する。 - XCPU, XFAT
- ビルドするカーネルの種類。
make 時に引数指定して上書きすることも可能。 - ALLCFLAGS
- コンパイラに対する追加フラグ。 詳細は上記の config.bat の説明参照。
- NASMFLAGS
- アセンブラに対する追加フラグ。 詳細は上記の config.bat の説明参照。
おまけ:最近の開発版のビルド (Linux/Windows)
github にある開発版ソースツリーではいちおう Windows でも Linux とほぼ同様の手順でビルドできるようになっている(はず)。 mingw 版の GNU make(mingw32-make。x64 環境ならたぶん mimgw64-make も使える)が必要。
主に Watcom コンパイラのパス名/オプション指定の都合により cygwin や msys 環境ではまともにビルドできないので、ふつうのコマンドプロンプトから make を行う。