DOS/FreeDOS/build/kernel

DOS/FreeDOS/build/kernel

FreeDOS のカーネルビルド法(ほぼ OpenWatcom 編)。
想定しているカーネルのバージョンは 2042 です。

過去バージョン(2041想定)
過去バージョン(2035a想定)

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

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

  • DOS(コンパイラを選べば 16bit 環境でも可)
  • Windows (x86/x64)
  • Linux (x86/x64)

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

必要なもの

FreeDOS カーネルのソース

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

コンパイラ

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

openwatcom.orgで落とせる Linux 用の公式版は 32bit 版しかないので、x64 版が必要な場合は openwatcom-v2 版を使う。 ちなみに OpenWatcom の Linux 版インストーラは、16bit ターゲットのコンパイラやライブラリをデフォルトではすべてインストールしてくれない。手動でチェックを追加する必要がある。
(インストーラの実行には TERMINFO の設定が必要な場合がある→参考:公式wiki

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

アセンブラ

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

ちなみに 16bit DOS 用の最終版は 0.98.39 だと思われます。

UPX

カーネルイメージ圧縮に使う。ビルドに必須ではないことになっているが、現状の makefile では使わないように設定できない気がする。makefile 中にある XUPX=... の設定を消去するかコメントアウトし、upx を使うかどうかは config.bat (config.mak) に任せるほうがいいと思う。

Ubuntu あたりだと apt-get で何も考えずにインストールできるが、これは ucl ライブラリを使った「オープンソース版」であり圧縮率が劣る(圧縮後のカーネルサイズが 1K バイト以上異なる)。公式サイトから落としたバイナリを使ったほうがいい。

(なお、upx の DOS バイナリは i386 必須なので、i286 以下の DOS 環境でビルドする場合は upx 圧縮を使わない設定にする必要がある)

その他ツール

  • unzip カーネルソースの展開に使う。
    まあ zip がほどけるツールなら何だっていいんですが、コマンドライン版の unzip って意外と便利なんですよ…オプション -aa (treat all files as text) を使うと改行コードを変換しながら展開してくれる。つまり Windows 用の unzip だと LF → CRLF になるし(元から CRLF だったらそのまま)、Unix 版だと CRLF → LF になるのです…
  • make (GNU make) Linux 上でビルドする場合は必須。

ビルド(Windows もしくは DOS で build.bat を使う)

OpenWatcom 以外のコンパイラを使う場合はこちらの方法しかない。 おおまかな手順はこんな感じ(この項、以前とほぼ同じ…)。

  1. コンパイラやツールを(正しく)インストールしておく
  2. copy config.b config.bat
  3. config.bat を手持ちの環境にあわせて修正
  4. build.bat 実行

実際にビルドを行う前に、バッチファイルの改行コードを確認しておいたほうがいいと思う。CR+LF でないバッチファイルは動かない可能性がある。

現状では、ビルド中に 16bit DOS プログラム(exeflat)がビルド、実行されることに注意。
これには以下のような問題(といっていいと思う)がある。

  • フォルダ(ディレクトリ)の制限。16bit DOS アプリで正しくアクセスできない場所にソースが展開されているとビルドが失敗する。
  • DOS プログラム実行時にコンソールが英語モードになってしまう(一応、chcp 932 すれば元の日本語コンソールに戻せるけど、ねえ…)。
  • 64bit 環境でのビルドが面倒(16bitバイナリがそのまま動作しない)。

適当な仮想マシンに DOS ぶちこんで、その中でやるのがいちばん無難な気がする。 (VMWare とか VirtualBox より、qemu のソフトエミュレーションのほうが逆に軽快かもしれませんね…)

ちなみに、ソースの一部に // で始まる C++ 形式のコメントが残っているため、C++ 形式のコメントを許さないコンパイラ(turbo C 2.0)でコンパイルする場合は該当部分を修正する必要がある(kernel/config.c 内)。

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 を指定して回避した(ke2035a 時代。最近のものがビルドできるかどうかは未確認)。
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 をつける。

ビルド (GNUmake + OpenWatcom)

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

Linux (x86/x64)

  1. コンパイラやツールを(正しく)インストールしておく
  2. cp config.m config.mak
  3. config.mak を手持ちの環境にあわせて修正
  4. make clobber && make all

Windows (x86/x64) の場合は、make のかわりに mingw (mingw-w64) の gcc についてくる mingw32-make を使う。
コマンドプロンプト上からビルドを行うこと。主に Watcom コンパイラのパス名/オプション指定の都合により、cygwin や msys 環境ではまともにビルドできない。

  1. コンパイラやツールを(正しく)インストールしておく
  2. copy config.m config.mak
  3. config.mak を手持ちの環境にあわせて修正
  4. mingw32-make clobber && mingw32-make all

Linux:コンパイラ(OpenWatcom)

OpenWatcom公式サイトのLinuxパッケージは32ビットx86(i386)版のみなので、amd64 Linux環境でビルドを行いたい場合は派生版(open-watcom-v2)のバイナリを使う必要がある。

open-watcom-v2最新版のバイナリパッケージ https://github.com/open-watcom/open-watcom-v2/releases/tag/Current-build

インストーラ内のファイルは実はunzipで取り出すことができるが、バイナリファイルに実行属性がついていないので、Linuxの場合は素直にインストーラとして実行するほうが楽だと思う。 また、FreeDOSのビルドには16ビットのCコンパイラとライブラリがひととおり必須なので、インストール時に何も考えずデフォルトの Selective installation を選ぶと必要なものがインストールされない場合がある。よほどディスク残量が少なくない限り、Full installation でいいんじゃないですかね…

そういえば Linux環境の場合、~/watcom/binl にパスを通す処理がmakefile 中にあるのでローカルユーザーとしてこのへんにインストールしてしまえば、PATH や WATCOM ベースディレクトリの事後設定が不要になる(64ビット版のバイナリは binl64 に入っているので、amd64 上でビルドする場合は makefile に若干の変更が必要かも)

Linux:ツール(upx)

upxは前述のようにディストリビューションが標準提供しているパッケージ(オープンソース版とでも言うべきか)だと圧縮率がやや落ちるため、upx公式が配布しているバイナリを使ったほうがよい。tar.xzを適当にほどいて中身の実行ファイル upx を /usr/local/bin あたりに放り込めばいいと思われます(適当)。

upx最新版のバイナリパッケージ https://github.com/upx/upx/releases

config.mak

OpenWatcom によるクロスビルドしか考慮されていないので、(使用するツールのフルパス名を変更したい場合を除いて)特に変更の必要もないと思う。

WATCOM
OpenWatcom C/C++ がインストールされているベースディレクトリの指定。 Windowsなどでインストーラを使ってOpenWatcomをインストールした場合、環境変数として設定済み。
基本的に、コンパイラのバイナリがインストールされているディレクトリにパスを通しておく必要がある。Windowsの場合 %WATCOM%\binnt、32bitx86版Linuxの場合 $WATCOM/binl、amd64版Linuxの場合 $WATCOM/binl64となる。
XUPX
UPX のパス名(と実行時オプション)。
UPX を使わない場合は、XUPX= で始まる行の先頭に # をつけてコメントアウトしておく。
XCPU, XFAT
ビルドするカーネルの種類。
make 時に引数指定して上書きすることも可能。
ALLCFLAGS
コンパイラに対する追加フラグ。 詳細は上記の config.bat の説明参照。
NASMFLAGS
アセンブラに対する追加フラグ。 詳細は上記の config.bat の説明参照。

make

用例:

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

ビルド (GNUmake + gcc-ia16)

ビルド環境はほぼ Ubuntu (i686,amd64) 専用。 手順は OpenWatcom の場合とほぼ同じで、違う点はコンパイラの明示が必要なぐらい。

(Windows版のコンパイラがあれば)一応 Windows 上の msys2 でもできないことはない。 しかし、同じ環境の仮想マシン内で Ubuntu を起動してビルドしたほうが、ホスト上の msys 内よりビルドが早い。

Linux:コンパイラ(gcc-ia16)

https://github.com/tkchia/build-ia16

Ubuntu だと ppa が使えるので自分でツールチェインをビルドしなくても済む。 たぶんこれがいちばん楽だと思います。

https://launchpad.net/~tkchia/+archive/ubuntu/build-ia16/

make

コンパイラが gcc であることを明示する必要がある。

用例:

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

make all 時に gcc-ia16用の GNUMakefile を動的に生成してビルドを行っているので、いきなり make clobber を実行するとエラー終了する。 消去を行いたい場合でもまずはじめに make COMPILER=gcc all する必要がある。

make (msys + gcc-ia16)

Linuxの場合とほぼ同じだが、ビルド環境を明示的にlinuxに設定する必要がある。 (指定しない場合は通常のWindows環境と思われてしまい都合が悪い)

make COMPILER=gcc BUILDENV=linux XCPU=86 XFAT=32 all