tokyo cabinet1.4.4をsolaris10でコンパイルする

最新版をSolaris10でコンパイルしてみたです。
いつの間にかSunOSの定義でごにょごにょと分岐が追加されていました!ありがとうmikioさん!(もしかしてこのBLOG見てるのかな(*´∀`))

これでSolaris10でもすんなりビルドが・・・通りませんでした(´・ω・)
堅牢なOSなのは認めるし最近のコンテナやZFS、Dtraceはすばらしい技術だと思うけど、正直なところビルドくらい何も考えないで通って欲しい。。゚(゚´Д`゚)゚。  お願いしますよ。Sunマイクロシステムズ様。

で、やっぱりrealpath関係で怒られました。

Solaris10でrealpathが使えるようになるには、以下の条件を満たす必要があるみたいです。

#if defined(__EXTENSIONS__) || \
        (!defined(_STRICT_STDC) && !defined(__XOPEN_OR_POSIX)) || \
        defined(_XPG4_2)

std=c99をつけると、 __STRICT_ANSI__マクロが定義されます。
/usr/include/sys/feature_tests.hをひもといていくと、_STRICT_STDCが定義されるので上記の条件(の2行目のやつ)を満たさなくなってしまうようです。ここ(manpage)を見ると色々書いてあります。

これを回避するには以下の2つの方法があります。(正確にはもっとありますけど、試していません)

  • __EXTENSIONS__を定義する
  • std=c99をstd=gnu99にする

どれくらい影響範囲があるのか分からないので自己責任で好きな方を選択すれば良いと思います。

前者の場合は、以下のようにconfigureで指定します。

./configure CFLAGS="-D__EXTENSIONS__"

後者の場合は、configureとconfigure.inに記述されている内容を置換します。(configureした後にMakefileを修正しても良いですけど)

perl -i -p -e "s/c99/gnu99/g;" configure*

あとは普通にビルドをします。

gmake >/dev/null
tcutil.c:7401: 警告: 初期化子のまわりのブレースを欠いています
tcutil.c:7401: 警告: (`tcglobalmutexonce.__pthread_once_pad' の初期化は不完全です)
tcutil.c: In function `tcbwtdecode':
tcutil.c:7717: 警告: statement with no effect
tcutil.c: In function `tcbwtencode':
tcutil.c:7677: 警告: statement with no effect
ar: creating libtokyocabinet.a

出ている警告は全て動作に対して影響はありません。最初の2個の警告は前回の記事に回避策が書いてあります。(でも、わざわざ修正するような内容ではありません(*・ε・*))

ちなみにマクロの定義一覧を出したい場合は以下のような感じで出せます(2個ほどマクロ定義してあるのはTokyo Cabinetビルドしたらこのマクロももれなくついてきたので。)。実際のソースに対してやると何千行も出てきてしまいますが、以下の場合はその環境で最低限定義されるものが出てきます。(100行もないはずです)

 gcc -std=gnu99 -D_GNU_SOURCE=1 -D_REENTRANT -E -dM -x c /dev/null

 

ちょっと気になった点について。
1.4.2,3,4辺りでpthread_yield()の実装が毎回変更されていて今はusleepになっていますが、これってやっぱりusleepのが速いからなんでしょうか。Solaris10の場合、sched_yieldの実装はシステムコールのthr_yieldになっていて、これがスレッドセーフだから遅いのと、yieldすると必要ない場合でもコンテキストスイッチが走るから・・・なのかにゃ(´・ω・)

 

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