OpenWatcom 1.4 で Linux 版はろーわーるど作ってみたヨ
まあ適当にやってみました。
ちなみにコンパイルしたソース (hw.c)。超なげやり。
#include <stdio.h> void main(void) { printf("hello, world!\n"); }
手順1:ヘッダとライブラリがインストールされているか確認する。
とりあえず OpenWatcom のベースディレクトリ(ふつうは C:\WATCOM だと思う)の下に lh というディレクトリ(フォルダ)があるか確認する(じつ言うとさっぱりわからんのですが、たぶん Linux のときはこれ使うんですよね?)。私はインストール時に Selective installation を選んだので、Full installation 時に Linux ターゲットが使えるようになってるのかどうかよくわからない。入ってなかったらもう一度インストーラを実行して、Selective installation → Target で Linux をチェックしてインストール。
手順2:ビルドターゲット向けの INCLUDE パス指定
ターゲットを Linux にするときは lh の下にあるヘッダを使うようにする。具体的には環境変数 linux_INCLUDE の設定。コマンドプロンプトでコンパイラを使うならこんな感じ(統合環境の場合はシラネ)。
set linux_INCLUDE=%WATCOM%\lh
つまり、コンパイラオプションに -bt=hoge が指定されたとき、%hoge_INCLUDE% がデフォルトインクルードパスとなる。クロス開発するときはこれを指定しないと面倒なことになる。
手順3:リンカへのオプション、ディレクティブの確認
wlink のテンプレは自分で書かないとダメかなーと思ったけど、%WATCOM%\binw\wlsystem.lnk にちゃんと書いてあった。よかったよかった。
system begin linux option osname='Linux x86' libpath %WATCOM%/lib386 libpath %WATCOM%/lib386/linux format elf op exportall op norelocs end system begin linuxmips option osname='Linux MIPS' libpath %WATCOM%/libmps libpath %WATCOM%/libmps/linux format elf op exportall op norelocs end
op caseexact(マイクロソフトのリンカで言うところの /NOI オプション)がついてないけどいいの? もしかして大文字/小文字の区別がデフォルトになったのかな(そういえば option nocaseexact というがあったな。売り物時代はそんなのなかったはず…)。
手順4:コンパイルとかリンクとか
リンカのデフォルトテンプレに "linux" があったので、そのまま使う(-l=linux)。
wcl386 -bt=linux hw.c -l=linux
とりあえずできた。
生成バイナリのデフォルト拡張子は .elf になるようです。
手順5:んで実際動くの?
VMware Player で Knoppix を立ち上げて、作ったバイナリを実行してみる(ちなみに、実物のフロッピー経由というアタマの悪い方法で転送)。
コンソールに hello, world! が表示されたので、たぶん動いてると思う。
つーことで、linux 上で実行可能なバイナリをコンパイル&リンクすることはひとまず可能でした。まあどの程度に実用的かはわかりませんが(gcc との互換性とか、ランタイムライブラリのライセンスとかいろいろあるし)。