Solarisをサポートしよう


というわけでSolarisをサポートするために多少努力する。
将来的にはSolaris studio(NetBeansベースの公式IDE)でビルドする必要が有るが、とりあえずは公式pkgのgccで。公式pkgのgcci386のようだ。

ターゲットの準備

Solaris studioは基本的にクロス開発を良くサポートしていない。なので、コンパイルホスト == ターゲットとするのが無難。(これはUNIXプラットフォームほぼ全てにあてはまる。例えばclang等はコンパイルホストのアーキテクチャでコード生成オプションを選択してしまうことが有る。)
開発ホストは普段ゲームの開発に使っているWindowsVirtualBox上に:

  • ファイルサーバ。Ubuntu Studio 14.04、NFSを使用。
  • ビルドホスト、ターゲット。Oracle Solaris 11。

の2つのVMを置き、それぞれに仮想NICを2枚装備してひとつをNFSトラフィック専用の静的IPv4ネットワークとした。Solaris側のネットワーク構成は DefaultFixed 構成を選び、ipadm create-ip net0 のようにしてそれぞれで静的IPv4設定をする。
ライブラリはoniguruma以外はSolarisの公式pkgから入手できる。onigurumaも普通にビルドすることができる。

Solaris libcへの対応

なかなか難しい。判定としては __sun を使った。BSDglibcとはまた違っている感が有るが、由緒正しいUNIXのlibcの一つとも言える。SYSVベース。

多分 _REENTRANT はコンパイラに -pthread を食わせるなどもっと正当な方法が有る。

C++11を要求するのとどちらが良いか迷うところ。。C++11はSolaris studio 12.4からサポートされるが、まだbetaなので採用しないことにした。
C99 namespaceを要求する簡単な方法は、POSIX2008を要求すること。これは _XOPEN_SOURCE を 700以上に設定することで行うことができる。少々野蛮な方法だがしかたない。。多分config.hに相当する共通ヘッダに括り出す方が好ましい。

標準規格では要求していないが、BSDglibcではallocaはstdlibの一部になっている。もともとallocaは標準でないので扱いはOS毎に異なる可能性がある。
これは、alloca.hの存在をテストして存在しない場合にはstdlib.hをincludeするのが望ましい。