MeCabは日本語の文章を単語(形態素)に分割する形態素解析ソフトウェアです。最新版が2013年リリースという古いプログラムですが現代のWindows11でソースコードからビルドする機会があったのでメモしておきたいと思います。
Windowsバイナリが見つからない
mecab-0.996.exeというWindows用のインストーラがあるらしいので、それだけでインストール完了。
と思ったのですが、mecab-0.996.exeが現在は配布されていないようで、検索しても見つかりませんでした。
ビルドツールの選択
ということでmecab-0.996.tar.gzから自分でビルドすることにしました。WindowsでビルドするならばBuild Tools for Visual Studioを使うのが一番スムーズにいくのではないかと思います。実際に行われている方もいらっしゃいますのでそちらを参考にしていただくのがよいでしょう。
しかしビルドツールはそれなりのディスク容量を占めます。私はすでにRのパッケージ開発用にRtoolsをインストールしてあるので、これでビルドできないか試してみようと思いました。
Rtools45によるビルド
RtoolsはC:\rtools45(4.5の場合)というフォルダにインストールされます。MSYS2というコマンドライン環境をベースに作られていて、mingw32などの開発用ターミナルも含まれています。含まれているだけで通常は使うことはないのでしょうけど、今回はこれを流用します。mingw32.exeを実行するとターミナルが開きます。
Rtoolsは「x86_64-w64-mingw32.static.posix」フォルダの中に開発環境が入っていますので、まずここにパスを通します。
export PATH=$PATH:/x86_64-w64-mingw32.static.posix/binそしてmecab-0.996.tar.gzのあるフォルダにカレントディレクトリを移し、gzファイルを展開。
tar zxfv mecab-0.996.tar.gz辞書のバージョンとコンパイルオプションの変更
展開されたmecab-0.996フォルダの中にあるconfigureファイルを直接編集します。本当はautoconfコマンドを使って生成するのがよいらしいのですが、元となるconfigure.acがないので直接書き換えてしまいます。
3073行目(-を削除して+を追加する)
- DIC_VERSION="102"
+ DIC_VERSION="270"
18704行目
- CFLAGS="$CFLAGS -municode -DUNICODE -D_UNICODE"
- CXXFLAGS="$CXXFLAGS -municode -DUNICODE -D_UNICODE"
+ CFLAGS="$CFLAGS -DUNICODE -D_UNICODE"
+ CXXFLAGS="$CXXFLAGS -DUNICODE -D_UNICODE"
+ LDFLAGS="$LDFLAGS -municode"
3073行目は辞書のバージョンです。今回はIPA辞書2.7.0を使用するので270にしておきます。
18704行目はコンパイラに渡すオプションです。これが今回つまづいたポイントなのですが、このように変更しないとビルドの後半で実行exeをリンクする際に次のエラーで止まってしまいます。
libtool: link: g++ -O3 -Wall -municode -DUNICODE -D_UNICODE -o .libs/mecab.exe mecab.o ./.libs/libmecab.dll.a -lpthread -lmingw32 -lstdc++ -L/mingw32/lib
C:\rtools45\x86_64-w64-mingw32.static.posix\bin/ld.exe: C:/rtools45/x86_64-w64-mingw32.static.posix/bin/../lib/gcc/x86_64-w64-mingw32.static.posix/14.2.0/../../../../lib/libmingw32.a(lib64_libmingw32_a-ucrtexewin.o): in function wmain': /root/mxe/tmp-gcc-x86_64-w64-mingw32.static.posix/gcc-14.2.0.build_.crt/../gcc-14.2.0.build_/mingw-w64-v11.0.1/mingw-w64-crt/crt/crtexewin.c:70:(.text+0xb5): undefined reference to 'wWinMain'
collect2.exe: error: ld returned 1 exit status何度か試行錯誤した結果、「コンパイル時は-municodeオプションを外し、リンク時に-municodeオプションを付ける」とうまくいくことが分かりました。そこで上のようにオプションを変更しています。
libiconvのインストール
MeCabをビルドする際にはlibiconvが必要です。Rtoolsにiconv自体は含まれているようなのですが、そのままビルドに流用しようとしてもうまくいかなかったので新しくインストールしました。
pacman -S mingw-w64-i686-libiconv32bit版(i686)を選ぶのがポイントです。64bit版(x86_64)をインストールしてもうまく動きませんでした。これを使うためにターミナルもmingw64ではなくmingw32を使っています。
ビルド
あとはよくあるmakeコマンドでビルドするだけです。
cd mecab-0.996
./configure
makeエラーで止まったりしなければビルド完了です。
実行ファイルの配置
そのまま実行exeをインストールしましょう。
make installmingw32をターミナルとして使った場合、C:\rtools45\mingw32\bin\mecab.exeに実行ファイルがインストールされます。設定ファイルはC:\rtools45\mingw32\etc\mecabrcに置かれますので、実行時に-rオプションで設定ファイルを指定します。
mecab -r /mingw32/etc/mecabrc設定ファイルは環境変数MECABRCがあればそのパスが使われますので、MECABRCをあらかじめ設定しておいてもよいでしょう。
mingw32(bash)の場合
export MECABRC=/mingw32/etc/mecabrc
コマンドプロンプトの場合
set MECABRC=C:\rtools45\mingw32\etc\mecabrc
設定ファイルのデフォルトパスをビルド時に変更しておく方法もあります。
configureの18703行目(-を削除して+を追加する)
- MECAB_DEFAULT_RC='c:\\\\Program Files\\\\mecab\\\\etc\\\\mecabrc'
+ MECAB_DEFAULT_RC='c:\\\\rtools45\\\\mingw32\\\\etc\\\\mecabrc'
辞書のビルド
もう1つ、辞書も自らビルドする必要がありますので、mecab-ipadic-2.7.0-20070610.tar.gzをダウンロードして展開します。
tar zxfv mecab-ipadic-2.7.0-20070610.tarデフォルトでは文字コードにEUCが使われますので、ここではUTF-8に変更します。
./configure --with-charset=utf8
make
make installこうするとC:\rtools45\mingw32\lib\mecab\dic\ipadicに辞書がインストールされます。これをMeCabの実行時に-dオプションで指定すればよいのですが、設定ファイルmecabrcに記述しておくのが通常のやり方です。
mecabrcの6行目
dicdir = C:\rtools45\mingw32\lib\mecab\dic\ipadic
インストール完了
これでWindows11におけるMeCabのビルドが成功しました。Rtoolsを転用したイレギュラーな方法でしたが何とかなってよかったです。