Open Watcom
Open Watcom は多数のターゲット環境にクロスコンパイルすることができる Fortran/C/C++' コンパイラです [1]。古き良き DOS ゲームの DOS4GW エクステンダを覚えている人もいるでしょう ("W" は "watcom" の略です)。メモリに制約がある環境 (DOS など) で非常に効率的なバイナリを生成するため Watcom はハイエンドゲームのコンパイラとして一般に人気がありました。Watcom は Open Watcom として現存しており [2]、バージョン 1.9 の 公式リリース とバージョン 2.0 の 非公式フォーク が存在します。
インストール
公式 1.9 リリースのバイナリパッケージは AUR4 に存在しません。非公式 2.0 リリースのバイナリパッケージは openwatcom-v2AUR パッケージでインストールできます。v2 フォークのソースベースパッケージも存在しますが (openwatcom-v2-gitAUR)、コンパイルには長い時間がかかります。現時点では、GCC によるブートストラップは無効になっており (スタンドアロンのビルドは機能しますが makepkg では上手くいきません)、ソースリリースをビルドするには前のバージョンの open watcom が必要になります。
Wmake
Open Watcom には独自の make ユーティリティが付属しています (wmake)。Windows ホストの場合、CMake によって wmake ファイルの生成がサポートされています。残念ながら、Linux の CMake ではクロスコンパイル用の wmake ファイルを生成することはできません [3]。
Wine で Open Watcom パッケージを使う
openwatcom-v2-gitAUR はデフォルトでサポートされている全てのホストプラットフォームの実行ファイルをビルドします。watcom のデバッガ wd を使ってクロスコンパイルしたバイナリをデバッグしたい場合などに有用です。原理的に、DOS エミュレータなどでも同じことが可能です。既存の Watcom 環境を使うように WINEPREFIX を設定する手順:
- 新しい WINEPREFIX を作成 (例:
$HOME/.watcom
):WINEPREFIX=$HOME/.watcom winecfg
。 $WINEPREFIX/drive_c
に移動して watcom という名前の/opt/watcom
のシンボリックリンクを作成:ln -s /opt/watcom watcom
。regedit
を起動。HKEY_CURRENT_USER/Environment
に以下の文字列変数を追加:- WATCOM = C:\WATCOM
- PATH = C:\WATCOM\BINNT
- EDPATH = C:\WATCOM\EDDAT
- WIPFC = C:\WATCOM\WIPFC
コンパイラ
Open Watcom には DOS と Win16 をサポートしている効率的なネイティブの16ビット x86 コンパイラと、様々な OS をサポートしている32ビットの x86 コンパイラが含まれています (NT/Win32, OS/2, NetWare, Linux, ...)。実験的に PowerPC, Alpha AXP, MIPS, SPARC アーキテクチャもサポートされています。v2 の開発目標は x86_64 と ARM アーキテクチャのサポートです [4]。Open Watcom の「競合」として GCC ベースの MinGW (ターゲット環境: Win32) や DJGPP (ターゲット環境: DOS) があります。
16ビット x86 コンパイラ
16ビットの x86 コンパイラは OS に依存しないライブラリを $WATCOM/lib286
から検索し、OS に依存するライブラリを $WATCOM/lib286/${target_os}
サブディレクトリから検索します。OS によっては別のパスのライブラリを必要とするため、LIBPATH
環境変数で追加してください。
- wcc: 16ビットのコンパイルしか行わない C コンパイラ
- wpp: 16ビットのコンパイルしか行わない C++ コンパイラ
- wcl: 16ビットのコンパイルとリンクを行う C/C++ ユーティリティ
- wfc: 16ビットのコンパイルしか行わない Fortran コンパイラ
- wfl: 16ビットのコンパイルとリンクを行う Fortran ユーティリティ
- owcc: POSIX 準拠のコンパイル・リンクユーティリティ。GNU の makefiles を使うプロジェクトでは
CC=owcc
を設定してください。
32ビット x86 コンパイラ
32ビットの x86 コンパイラは OS に依存しないライブラリを $WATCOM/lib386
から検索し、OS に依存するライブラリを $WATCOM/lib386/${target_os}
サブディレクトリから検索します。OS によっては別のパスのライブラリを必要とするため、LIBPATH
環境変数で追加してください。
- wcc386: 32ビットのコンパイルしか行わない C コンパイラ
- wpp386: 32ビットのコンパイルしか行わない C++ コンパイラ
- wcl386: 32ビットのコンパイルとリンクを行う C/C++ ユーティリティ
- wfc386: 32ビットのコンパイルしか行わない Fortran コンパイラ
- wfl386: 32ビットのコンパイルとリンクを行う Fortran ユーティリティ
- owcc : POSIX 準拠のコンパイル・リンクユーティリティ。GNU の makefiles を使うプロジェクトでは
CC=owcc
を設定してください。
他の(クロス)コンパイラとの比較
クロスコンパイラとして使用するときに binutils ベースのコンパイラ (gcc, clang, pccAUR) と大きく違うところは、Open watcom はひとつのコンパイラ (各ターゲット CPU アーキテクチャ用のコンパイラ) だけを使用し、コンパイラフラグによってターゲット OS が決まるということです (下の「クロスコンパイル」を参照)。さらに、OS に依存しないライブラリの多くは $WATCOM/lib286
} と $WATCOM/lib386
にあり、OS 固有の機能を使用するライブラリだけが OS 別のサブディレクトリに保存されます。これは Open Watcom の C ランタイムがコンパイラと一緒に配布されているためです。ひとつの Open Watcom をクロスコンパイラとして幅広い OS で使うことが可能となっています。反対に、binutils ベースのクロスコンパイルツールチェインはターゲットごとに固有の binutils, コンパイラ, libc の組み合わせ を必要とします。Open Watcom は Win32 のクロスコンパイラとして作成されるバイナリやライブラリがターゲット OS と上手く統合できるという利点もあります。例えば Open Watcom でコンパイルした Python は MSVC でコンパイルしたプラグインをロードできます。binutils ベースのコンパイラが他の binutils ベースのコンパイラでビルドしたライブラリを (大抵の場合) 使うことができるのと同じです。現時点では、Open Watcom で作成されるバイナリは GCC によって作成されたバイナリよりも最適化で劣ります。
コンパイラ最適化フラグなどのオプション
Watcom コンパイラは使用するフラグが GCC と異なっています (例えば、デフォルトでは -O3 が認識されません)。Watcom にはターゲットアーキテクチャや最適化などを定義することができる 様々なオプション が存在します。16ビットのコードを最適化するときに推奨されるフラグは こちら に載っています。
(クロス)コンパイル : 一般的な設定
クロスコンパイルする場合、適切な環境変数とコンパイラフラグを設定してターゲットを指定する必要があります。コンパイラフラグを定義しなかった場合、ネイティブビルドが行われます。
全てのターゲットで共通の環境変数:
export WATCOM=/opt/watcom
export PATH=$WATCOM/binl:$PATH
export EDPATH=$WATCOM/eddat
export WIPFC=$WATCOM/wipfc
全てのビルドターゲットの概要が こちら に記載されています。
Linux
C の場合、次のコンパイラを使ってください: wcc386, wcl386, owcc。
wcc386 の場合 -bt=linux
を、wcl386 の場合 -bcl=linux
を、owcc の場合 -blinux
を追加してください。何も追加しなかった場合、コンパイラはネイティブビルドを行うためフラグは必ずしも追加する必要はありません。
export INCLUDE=$WATCOM/lh
DOS (16ビット)
wcc の場合 -bt=dos
を、wcl の場合 -bcl=dos
を、owcc の場合 -bdos
を追加してください。
export INCLUDE=$WATCOM/h
DOS (32ビット DOS4GW エクステンダ)
wcc386 の場合 -bt=dos
を、wcl386 の場合 -bt=dos -l=dos4g
を、owcc の場合 -bdos4g
を追加してください。
export INCLUDE=$WATCOM/h
WIN16
wcc の場合 -bt=windows
を、wcl の場合 -bcl=windows
を、owcc の場合 -bwindows
を追加してください。
export INCLUDE=$WATCOM/h:$WATCOM/h/win
WIN32
wcc386 の場合 -bt=nt
を、wcl386 の場合 -bcl=nt
を、owcc の場合 -bnt
を追加してください。
export INCLUDE=$WATCOM/h:$WATCOM/h/nt
OS/2 (16ビット)
wcc の場合 -bt=os2
を、wcl の場合 -bcl=os2
を、owcc の場合 -bos2
を追加してください。
export INCLUDE=$WATCOM/h:$WATCOM/h/os21x
export LIBPATH=$WATCOM/binp/dll:$LIBPATH
OS/2 (32ビット)
wcc386 の場合 -bt=os2
を、wcl386 の場合 -bt=os2 -l=os2v2
を、owcc の場合 -bos2v2
を追加してください。
export INCLUDE=$WATCOM/h:$WATCOM/h/os2
export LIBPATH=$WATCOM/binp/dll:$LIBPATH
Netware
wcc386 の場合 -bt=netware
を、wcl386 の場合 -bcl=netware
を、owcc の場合 -bnetware
を追加してください。
export INCLUDE=$WATCOM/h:$WATCOM/novh
export LIBPATH=$WATCOM/nlm:$LIBPATH
一部のパッケージは Novell が提供しているプロプライエタリなライブラリとヘッダ を必要とします。ow-netware_ndkAUR パッケージでインストールできます。
QNX
Watcom コンパイラはターゲット環境として QNX もサポートしていますが、オープンソースの Open Watcom と一緒にライブラリを再配布することができないため、あまりテストがされていません。理論的には、C ライブラリが Watcom 用にビルドされていれば QNX のコンパイラも出来るはずです。
サードパーティのライブラリとユーティリティ
Watcom には多数の サードパーティ製ライブラリとリソース があります。パッケージにするときは MinGW パッケージガイドラインを確認してください。ただし出来る限り分割パッケージとしてパッケージ化してください。ただしターゲットが固有 (プロプライエタリ) の依存関係を持つ場合は分割パッケージとはしません。パッケージ済みのライブラリやコンパイラフロントエンドでクロスコンパイラとして使いやすくなります。
ライブラリ
- ow-zlibAUR || ターゲット環境: 32ビット: linux, Win32, DOS(4GW), OS/2, Netware 16ビット: DOS, Win16, OS/2
- ow-libbz2AUR
- Curses: ow-curses-win32aAUR : 32ビット: Win32, DOS(4GW) 16ビット: DOS, (Win16)
参照
Open Watcom コミュニティは比較的小規模であり、Reddit で密やかに活動しています。主な議論は Open Watcom ニュースグループ の "contributors" や "users.c_cpp" グループ、あるいは sourceforge のユーザーフォーラムで行われています。