SolarisでMeCab

なんか昔も同じエントリを書いたような覚えがあるんだけど、やるたびに結果が違うのってどういうことなんだろう(笑)。
今回インストールしたのは、mecab-0.80です。

ソースの展開

mecabのソースはここにあります。昔のエントリでは0.83あたりのビルドの挑戦して玉砕していますので、今回は0.80で。
それと辞書のファイルが必要です。今回使ったのはipadic-2.6.1。ここにあります。
まずmecabを展開。

$ /usr/local/bin/tar -zxvf mecab-0.80.tar.gz

次に辞書も展開します。

$ cd mecab-0.80
$ cd dic
$ /usr/local/bin/tar -zxvf /hoge/ipadic-2.6.1.tar.gz

textuitlsをインストール

Solaris標準のsortでは辞書を作成するときにコアダンプします。なので、gnuのtextutilをインストールします。GNUの適当なミラーサイトからダウンロードしてください。
ソースを展開して、適当なprefixをつけてconfigure。標準のものをむやみに置換えると痛い目にあう可能性が高いので、別ディレクトリにインストールしたほうがいいでしょう。

$ /usr/local/bin/tar -jxvf textutils-2.1.tar.bz2
$ cd textutils-2.1
$ ./configure --prefix=/opt/gnu
$ /usr/local/bin/make 
# /usr/local/bin/make install

mecabをビルド

さっきソースを展開したディレクトリに移動してconfigure。今回の環境ではUTF8を使うのでそれも一緒に指定してあげます。適当に変更しましょう。それとさっきインストールしたtextutilsが見えるようにパスを変更してあげます。

$ export PATH=/opt/gnu/bin:$PATH
$ cd mecab-0.80
$ ./configure --with-charset=utf8 --enable-shared
$ /usr/local/bin/make
(中略)
/usr/ccs/bin/ld -G -z defs -h libmecab.so.0 -o .libs/libmecab.so.0.0.0 
 nbest_generator.lo writer.lo stringbuffer.lo viterbi.lo param.lo 
tokenizer.lo japanese_tokenizer.lo csv.lo dictionary_maker.lo tagger.lo 
libmecab.lo libmecabdic.lo  -R/usr/local/lib -R/usr/local/lib  
-L/usr/local/lib/gcc/sparc-sun-solaris2.9/../.. -L/usr/ccs/lib 
-L/export/home/hoge/gcc/gcc-4.1.1/objdir/./gcc 
-L/export/home/hoge/gcc/gcc-4.1.1/objdir/sparc-sun-solaris2.9/libstdc++-v3/src/.libs 
-L/export/home/hoge/gcc/gcc-4.1.1/objdir/sparc-sun-solaris2.9/libstdc++-v3/src 
/usr/local/lib/libstdc++.so -lc
Undefined                       first referenced
 symbol                             in file
_Unwind_Resume                      nbest_generator.lo  (symbol belongs to implicit dependency /usr/local/lib/gcc/sparc-sun-solaris2.9/../../libgcc_s.so.1)
ld: fatal: Symbol referencing errors. No output written to .libs/libmecab.so.0.0.0
make[2]: *** [libmecab.la] Error 1
make[2]: Leaving directory `/export/home/hoge/mecab/mecab-0.80/src'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/export/home/hoge/mecab/mecab-0.80'
make: *** [all] Error 2

おっとエラーですね。_Unwind_Resumeがないって。調べたら、libgcc_s.soだかにあるみたい。そこで環境変数を設定して再度configure。

$ export LDFLAGS=-lgcc_s
$ ./configure --with-charset=utf8 --enable-shared
$ /usr/local/bin/make
(中略)
ん〜、ログとるの忘れた。

リンカがエラーを吐いていました。ligcc_s.soが2箇所あって、/usr/local/lib以下のどこかと、ログインしているユーザホームディレクトリのgccの開発環境以下。上記のエラーメッセージにもこんな出力があります。

-L/export/home/hoge/gcc/gcc-4.1.1/objdir/./gcc
-L/export/home/hoge/gcc/gcc-4.1.1/objdir/sparc-sun-solaris2.9/libstdc++-v3/src/.libs

なんだかご親切に調べてくれてるみたい。こんなところ見なくて良いよ。ということで、/export/home/hoge/gcc以下を削除。

$ rm -fr /export/home/hoge/gcc
$ cd mecab-0.80
$ export LDFLAGS=-lgcc_s
$ ./configure --with-charset=utf8 --enable-shared
$ /usr/local/bin/make
# /usr/local/bin/make install
Making install in src
make[1]: Entering directory `/export/home/hoge/mecab/mecab-0.80/src'
make[2]: Entering directory `/export/home/hoge/mecab/mecab-0.80/src'
/bin/bash ../mkinstalldirs /usr/local/lib
 /bin/bash ../libtool --mode=install .././install-sh -c  libmecab.la /usr/local/lib/libmecab.la
.././install-sh -c .libs/libmecab.so.0.0.0 /usr/local/lib/libmecab.so.0.0.0
../libtool: .././install-sh: bad interpreter: アクセス権がありません。
make[2]: *** [install-libLTLIBRARIES] Error 126
make[2]: Leaving directory `/export/home/hoge/mecab/mecab-0.80/src'
make[1]: *** [install-am] Error 2
make[1]: Leaving directory `/export/home/hoge/mecab/mecab-0.80/src'
make: *** [install-recursive] Error 1

あぁ、このエラーは見覚えがあるな。2006年8月22日のエントリにありますね。実行権をつけて。

# ls -l install-sh
-rw-r--r--   1 hoge   staff       5569  7月  4日 2003年 install-sh
# chmod 755 ./install-sh
# /usr/local/bin/make install

ようやくインストールできました。

試してみる

こないだはcoreダンプして撃沈していましたが、今回はちゃんと動くぞ。

bash-2.05# /usr/local/bin/mecab
今日はいい天気です。
今日    名詞,副詞可能,*,*,*,*,今日,キョウ,キョー
は      助詞,係助詞,*,*,*,*,は,ハ,ワ
いい      形容詞,自立,*,*,不変化型,基本形,いい,イイ,イイ
天気   名詞,一般,*,*,*,*,天気,テンキ,テンキ
です     助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
。       記号,句点,*,*,*,*,。,。,。
EOS