DOS/FreeDOS/build/kernel(2041)

DOS/FreeDOS/build/kernel

FreeDOS のカーネルビルド法(OpenWatcom 編)。

想定しているカーネルのバージョンは 2041 です。
ちなみに以前のやつはカーネル 2035a 想定。

想定されているビルド環境

FreeDOS カーネルのビルド環境として、とりあえず以下のものが想定されているようです。

  • DOS
  • Windows (32bit)
  • Linux (x86 32/64bit)

正直、64bit Windows より Linux 上の方がビルドは楽なんじゃないかな…。

必要なもの

FreeDOS カーネルのソース

リリース版の zip に入ってるソースは改行コードが CR+LF なので、Linux 上でビルドする場合は多少注意が必要かも。展開時に unzip の -aa オプションで全部テキストファイルとみなしてしまう(改行コードを変換しつつ展開してくれる)のが楽かも。

コンパイラ

ここでは OpenWatcom C/C++ を使うことにする。理由はほかのコンパイラよりバイナリサイズが小さくできるから。
(それ以外のものを使う場合に関しては以前のやつを適当にどうぞ)

ちなみに OpenWatcom の Linux 版インストーラは、16bit ターゲットのコンパイラやライブラリをデフォルトではインストールしない。手動でチェックを入れる必要がある。

また Linux 上でビルドする場合は gcc も必要なので、事前に開発環境をインストールしておく。

アセンブラ

とりあえず最新版でいいんじゃないかと。
Linux なら apt-get とか yum とか使って普通に。

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)

おおまかな手順はこんな感じ(この項、以前とほぼ同じ…)。

  1. コンパイラやツールを(正しく)インストールしておく
  2. copy config.b config.bat
  3. config.bat を手持ちの環境にあわせて修正
  4. 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 の両方に入れる必要がある。

build.bat

ビルド時に実行するファイル。 実行時のオプションは build.bat の先頭付近に記述されている。

用例:

build fat16 tcpp 86
  • コンパイラ : Turbo C++ 1.01
  • カーネル : FAT16, 8086 用
build -r fat32 wc 386
  • 以前のビルド時に作成したファイルをまず消去
  • コンパイラ : OpenWatcom
  • カーネル : FAT32, 386 必須

オプションを変更して再構築するときは -r をつける。

ビルド (Linux)

おおまかな手順…まあ、Windows のときとほぼ同じというか、気分的にはむしろ楽?

  1. コンパイラやツールを(正しく)インストールしておく
  2. cp config.m config.mak
  3. config.mak を手持ちの環境にあわせて修正
  4. 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 の説明参照。

make

用例:

make clobber && make XCPU=86 XFAT=32 all
  • カーネル : FAT32, 8086 用

おまけ:最近の開発版のビルド (Linux/Windows)

github にある開発版ソースツリーではいちおう Windows でも Linux とほぼ同様の手順でビルドできるようになっている(はず)。 mingw 版の GNU make(mingw32-make。x64 環境ならたぶん mimgw64-make も使える)が必要。

主に Watcom コンパイラのパス名/オプション指定の都合により cygwin や msys 環境ではまともにビルドできないので、ふつうのコマンドプロンプトから make を行う。