« | »

2009年10月12日

sennaをsolaris@sparcでコンパイルした

今年の三月に、mysqlなどで利用する組み込み型前文検索エンジンのsennaがsparcで動作しているsolarisでコンパイルできないと書いた。

仕事でなかなかに膨大な量のテキストデータベースを扱っているのだが、このsennaをmysqlに組み込む事で、一万件程度のテーブルでの複数カラム内のテキストデータの検索が一瞬で終わるくらいの恐ろしい速度で、単語ベースの精度の高い日本語インデックス検索が可能になるので、ぜひともsolarisで、しかも大好きなsparcで動作させたかったのだ。
あれから、Sparcには対応してない事を知って以来ずっと気になっていたのだが、最近仕事でSparcのサーバーを入れなおしたのを機会にもう一度チャレンジした。
そして無理やりではあるが、ソースコードにちょっとした手を加える事でコンパイルに成功したのでその方法を書いてみる。
なんというか、ちょっとした悲願達成である。


まず現時点での最新安定版のバージョン1.1.4ではどう頑張っても無理だったので、2009年10月1日の時点での開発版の最新ソースコードのtarballをダウンロードしてくる。
このサイトでは常に最新のソースコードに更新されてゆくので、一応ココに2009/10/01版をおいておく。
で、とりあえず特に変わったことをせずにmakeすると、
SunStudioのコンパイラccでは

/opt/SUNWspro/bin/cc -D_REENTRANT -I. -I. -I.. -I/usr/local/include -fno-strict-aliasing -g -I/usr/local/include -c store.c -KPIC -DPIC -o .libs/store.o
cc: 警告: 不正オプション -fno-strict-aliasing
"store.c", 427 行目: 警告: 1 番目の引数は、プロトタイプ宣言の型と互換性がありま せん:
プロトタイプ: volatile unsigned long longへのポインタ : "/usr/include/sys/atomic.h", 196 行目
引数 : struct _sen_ja_einfo {unsigned short seg, unsigned short pos, unsigned short size, unsigned charの配列[2] tail}へのポインタ
"store.c", 427 行目: 2 番目の引数は、プロトタイプ宣言の型と互換性がありません:
プロトタイプ: unsigned long long : "/usr/include/sys/atomic.h", 196 行目
引数 : struct _sen_ja_einfo {unsigned short seg, unsigned short pos, unsigned short size, unsigned charの配列[2] tail}
cc: store.c に対して、acomp が失敗しました。
gmake[2]: *** [store.lo] Error 1
gmake[2]: Leaving directory `/export/home/ukawa/src/senna/lib'
gmake[1]: *** [all-recursive] Error 1
gmake[1]: Leaving directory `/export/home/ukawa/src/senna'
gmake: *** [all] Error 2

gccの場合は

gcc -D_REENTRANT -I. -I. -I.. -I/usr/local/include -fno-strict-aliasing -g -O2 -Wall -Wextra -Wno-unused-parameter -Wno-sign-compare -Wformat=2 -Wstrict-aliasing=2 -Wdisabled-optimization -Wfloat-equal -Wpointer-arith -Wdeclaration-after-statement -Wbad-function-cast -Wcast-align -Wredundant-decls -Winline --param max-inline-insns-single=12000 --param large-function-growth=28000 --param inline-unit-growth=400 -I/usr/local/include -MT store.lo -MD -MP -MF .deps/store.Tpo -c store.c -fPIC -DPIC -o .libs/store.o
store.c: In function `sen_ja_replace':
store.c:427: warning: passing arg 1 of `atomic_swap_64' from incompatible pointer type
store.c:427: error: incompatible type for argument 2 of `atomic_swap_64'
make[2]: *** [store.lo] Error 1
make[2]: Leaving directory `/export/home/ukawa/src/senna/lib'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/export/home/ukawa/src/senna'
make: *** [all] Error 2

てな感じでstore.cのコンパイルに失敗してmakeが終了してしまう。
どちらもstore.cの427行目の引数の型が違うような事を言っているので
とりあえずlib/store.cを見てみる。
$vi lib/store.c

421 *pseg = i;
422 }
423 SEN_IO_SEG_MAP(ja->io, *pseg, einfo);
424 if (!einfo) { return sen_memory_exhausted; }
425 eback = einfo[pos];
426 einfo[pos] = *ei;
427 SEN_SET_64BIT(&einfo[pos], *ei);
428 sen_ja_free(ctx, ja, &eback);
429 return sen_success;

となっており、引数がおかしいらしいこの427行目の「SEN_SET_64BIT」が何をしてるのか良くわからんのだが、どうせ作るのは32ビットバイナリやからなんちゃら64ビットなんちゃらが何であっても別にいらんやろ。と勝手に無理やり決めて、これを強引にコメントアウトする。

/* SEN_SET_64BIT(&einfo[pos], *ei); */

これで一応makeすればコンパイルはちゃんと通る。
生成されたオブジェクトに対して、
$ file lib/store.o
としてやれば
lib/store.o: ELF 32-ビット MSB 再配置可能 SPARC32PLUS バージョン 1[V8+ が必要]
と32ビットバイナリになっているのが確認できるし、make install 後に動作確認してみても一通り問題なく動作する。ちょっと怖いような気もするけどまぁ大丈夫であろう。
これでsennaが動作するようになったので、sennaのエンジンが使えるmysqlであるTritonnが利用できる。
この時点での最新版の安定バージョンのsennaは1.1.4であるが、この開発版のソースコードから作ったsennaはバージョン1.1.3とみなされ、最新版のTritonnではsennaのバージョンが古いと怒られるので、tritonn-1.0.10-mysql-5.0.51aを入れるとよい。

Trackback URL

Comment & Trackback

No comments.

Comment feed

Comment





XHTML: You can use these tags:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>