Solaris10でTokyo Cabinetをビルドしてみた

Tokyo Cabinetってなんぞ?という人は、
http://tokyocabinet.sourceforge.net/
このページを。

Tokyo TyrantをSolaris10で動かすために、まずはTokyo Cabinetをビルドしようとしたらいろいろと怒られたので無理矢理ビルドを通してみました。正しい修正かどうかは知りません(*・ε・*)
なので指摘は大歓迎です。

環境は「SunOS tamsvr10 5.10 Generic_127128-11 i86pc i386 i86pc Solaris」です。
あとgccやccが混在していたり、いろいろ弄っていた環境なので実は素のSolarisだとすんなり通っちゃうのかもしれません。

アーカイブをげっちゅ。

wget http://tokyocabinet.sourceforge.net/tokyocabinet-1.4.1.tar.gz
gtar zxvf tokyocabinet-1.4.1.tar.gz
cd tokyocabinet-1.4.1

まずはconfigureを弄ります。これはrealpathが云々と怒られる対策です。std=c99をstd=gnu99にします。特に外から設定を与えない場合は1カ所の修正で大丈夫ですが、fastestの場合とか中で結構分岐していたので弄くり倒す予定の人は一括置換してください。

 MYCFLAGS="-std=gnu99 -Wall -fPIC -fsigned-char -O2"

Solaris10では「pthread_yield()なんて実装は排除しちゃったよ。あなたたちは違うんです。フフンっ。」という事らしいので、その代わりに「sched_yield」を使います。
本当は「_POSIX_PRIORITY_SCHEDULING」が定義されているか確認して、定義されていれば↓を、そうでなければ別の代替実装をするのが正しいのかもしれません。

// myconfig.hの413行目くらい
#if defined(_SYS_SUNOS_) && TCUSEPTHREAD
#include <sched.h>
#define pthread_yield() sched_yield()
#endif

警告が気持ち悪いのでtcutils.cを弄ります。

// tcutils.c
//static pthread_once_t tcglobalmutexonce = PTHREAD_ONCE_INIT;
static pthread_once_t tcglobalmutexonce = {PTHREAD_ONCE_INIT};

あとはconfigureしてgmakeします。
-D_REENTRANTはgmtime_r, localtime_rの実装を有効にするために、LIBS="-lrt"はsched_yield関連で必要です。

./configure CC=gcc CFLAGS="-D_REENTRANT" LIBS="-lrt"
gmake

まだ動くかどうか確認していません(; ・`д・´)
これで動いたら次はTokyoTyrantの/dev/poll対応してみます。

※追記:動きました。

新しいサイトもよろしくお願いします!