Open Watcom

From ArchWiki
Jump to navigation Jump to search

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 でコンパイルした PythonMSVC でコンパイルしたプラグインをロードできます。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 のユーザーフォーラムで行われています。