タグ「Tokyo Cabinet」が付けられているもの

Solaris10でTCとTTをビルドするメモ

Solaris10でTCとTTが動作するようになってからというもの、最新版をずっと試していなかったので久しぶりにビルドしてみました。ちなみに会社にもインストールしていますが、会社ではLua拡張も組み込んでいます。社内用に構文や機能が追加してあるLua拡張版があるのですが、私は標準のままのLuaを使っています。

今回はLuaをサポートしない場合のビルドメモ。

Luaを組み込んでビルドします。他の記事にLuaにビルドの記事がありますので、Luaについてはそちらを参照。

wget http://tokyocabinet.sourceforge.net/tokyocabinet-1.4.17.tar.gz
gtar -zxvf tokyocabinet-1.4.17.tar.gz
cd tokyocabinet-1.4.17
./configure \
  CC=gcc \
  --prefix=/export/home/tamtam/service/tc-1.4.17
gmake
gmake install
wget http://tokyocabinet.sourceforge.net/tyrantpkg/tokyotyrant-1.1.23.tar.gz
gtar -zxvf tokyotyrant-1.1.23.tar.gz
cd tokyotyrant-1.1.23
./configure \
  CC=gcc \
  LDFLAGS="-R/export/home/tamtam/service/tc-1.4.17/lib -R/export/home/tamtam/service/tt-1.1.23/lib" \
  --prefix=/export/home/tamtam/service/tt-1.1.23 \
  --with-tc=/export/home/tamtam/service/tc-1.4.17 \
  --enable-lua \
  --with-lua=/usr/local
gmake
gmake install

無事にビルドできました。

最新版を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すると必要ない場合でもコンテキストスイッチが走るから・・・なのかにゃ(´・ω・)

 

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対応してみます。

※追記:動きました。