試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

wime(1.8.0)のビルドメモとebuild

wime(www.venus.sannet.ne.jp/thomas/wime/)というプログラムを用いることで、Wineの力を借りてWindows用の日本語入力システム(IME)をCannaと同様に扱うことができる。
ここでは、そのインストール(x86_64上のビルドについてとGentoo Linuxebuild)を扱う。

  1. x86_64上でのビルドメモ
  2. その他メモ
  3. Gentoo Linux向けのebuild

x86_64上でのビルドメモ

wimex86_64上でも動作することを確認済みだが、バージョン1.8.0の時点では、そのまま普通にmakeでビルドしようとしても失敗してしまう。
色々試行錯誤した末
cid-3f9be5b1cd4a806c.skydrive.live.com/browse.aspx/%E5%85%AC%E9%96%8B/Gentoo%20Linux%20ebuild/app-i18n/wime/files
にアップロードした差分による修正でビルドがうまくいくようになり、動作状態も良好。

$ tar jxf [wime-1.8.0.tar.bz2の場所]
$ cd wime-1.8.0/
$ patch -p1 < [wime-1.8.0-x86_64.patchの場所]
patching file Makefile
patching file dll/Makefile
patching file exe/Makefile
patching file lib/Makefile
patching file so/Makefile
patching file tools/hinshi-list/Makefile
$ make -j1
for d in lib so dll exe tools;do make -C $d all || exit 1; done
make[1]: Entering directory `/tmp/work/wime-1.8.0/lib'
cc -g -Wall -fPIC -std=gnu99 -Wno-multichar -fgnu89-inline -m32   -c -o lib.o lib.c
make[1]: Leaving directory `/tmp/work/wime-1.8.0/lib'
make[1]: Entering directory `/tmp/work/wime-1.8.0/so'
cc -g -Wall -fPIC -std=gnu99 -Wno-multichar -fgnu89-inline -m32 -I../lib -I../exe -I../so   -c -o libwime.o libwime.c
cc -shared -Wl,-soname,libwime.so -o libwime.so libwime.o ../lib/lib.o  -m32
make[1]: Leaving directory `/tmp/work/wime-1.8.0/so'
make[1]: Entering directory `/tmp/work/wime-1.8.0/dll'
winegcc -g -Wall -fPIC -std=gnu99 -Wno-multichar -fgnu89-inline -m32 -I../so   -c -o libwime.o libwime.c
winegcc -shared libwime.dll.spec -mno-cygwin -L../so -lwime  -m32 -o libwime.dll.so libwime.o
make[1]: Leaving directory `/tmp/work/wime-1.8.0/dll'
make[1]: Entering directory `/tmp/work/wime-1.8.0/exe'
winegcc -g -Wall -fPIC -std=gnu99 -Wno-multichar -fgnu89-inline -m32 -I../so -I../lib -mconsole -mno-cygwin   -c -o apisup.o apisup.c
apisup.c: In function 'CloseConnection':
apisup.c:45: warning: generating trampoline in object (requires executable stack)
winegcc -g -Wall -fPIC -std=gnu99 -Wno-multichar -fgnu89-inline -m32 -I../so -I../lib -mconsole -mno-cygwin   -c -o cannaapi.o cannaapi.c
winegcc -g -Wall -fPIC -std=gnu99 -Wno-multichar -fgnu89-inline -m32 -I../so -I../lib -mconsole -mno-cygwin   -c -o ut.o ut.c
winegcc -g -Wall -fPIC -std=gnu99 -Wno-multichar -fgnu89-inline -m32 -I../so -I../lib -mconsole -mno-cygwin   -c -o wime.o wime.c
winegcc -g -Wall -fPIC -std=gnu99 -Wno-multichar -fgnu89-inline -m32 -I../so -I../lib -mconsole -mno-cygwin  -m32 -limm32 -o wime.exe apisup.o cannaapi.o ut.o wime.o ../lib/lib.o
make[1]: Leaving directory `/tmp/work/wime-1.8.0/exe'
make[1]: Entering directory `/tmp/work/wime-1.8.0/tools'
for d in hinshi-list wimectrl;do make -C $d all || exit 1; done
make[2]: Entering directory `/tmp/work/wime-1.8.0/tools/hinshi-list'
winegcc -g -Wall -fPIC -std=gnu99 -Wno-multichar -fgnu89-inline -m32 -I../../so -mconsole -mno-cygwin -DNOTFIX_GCS_COMPREADCLAUSE   -c -o hinshi-list.o hinshi-list.c
winegcc -g -Wall -fPIC -std=gnu99 -Wno-multichar -fgnu89-inline -m32 -I../../so -mconsole -mno-cygwin -DNOTFIX_GCS_COMPREADCLAUSE  -m32 -limm32 -o hinshi-list.exe hinshi-list.o
make[2]: Leaving directory `/tmp/work/wime-1.8.0/tools/hinshi-list'
make[2]: Entering directory `/tmp/work/wime-1.8.0/tools/wimectrl'
cc -g -Wall -fPIC -std=gnu99 -Wno-multichar -fgnu89-inline -I../../{exe,lib}   -c -o main.o main.c
cc -g -Wall -fPIC -std=gnu99 -Wno-multichar -fgnu89-inline -I../../{exe,lib}   -c -o ut.o ../../exe/ut.c
cc -g -Wall -fPIC -std=gnu99 -Wno-multichar -fgnu89-inline -I../../{exe,lib}   -c -o lib.o ../../lib/lib.c
cc -g -Wall -fPIC -std=gnu99 -Wno-multichar -fgnu89-inline -I../../{exe,lib}   -c -o corr.o corr.c
cc -g -Wall -fPIC -std=gnu99 -Wno-multichar -fgnu89-inline -I../../{exe,lib}   -c -o wimeapi.o wimeapi.c
cc  -lcanna -o wimectrl main.o ut.o lib.o corr.o wimeapi.o
make[2]: Leaving directory `/tmp/work/wime-1.8.0/tools/wimectrl'
make[1]: Leaving directory `/tmp/work/wime-1.8.0/tools'

インストールは、上のパッチを当てた状態で

$ sudo make -j1 install PREFIX=/usr LIBDIR=/usr/lib32

とする。ただし、プログラム以外は入らないため、レジストリファイルなどは手動でどこかにコピーしておく。

その他メモ

GCC-O系オプションを付けると

make[1]: Entering directory `/tmp/work/wime-1.8.0/so'
cc -O -g -Wall -fPIC -std=gnu99 -Wno-multichar -fgnu89-inline -m32 -I../lib -I../exe -I../so   -c -o libwime.o libwime.c
libwime.c:22: error: expected identifier or '(' before '__extension__'
make[1]: *** [libwime.o] Error 1

のようにエラーが出るが、「char* strdup(const char* s);」の行をコメントアウト*1もしくは削除することで、ビルドは正常に行われた。

Gentoo Linux向けのebuild

Gentoo Linuxのパッケージとしてインストールするためのebuildファイルを
cid-3f9be5b1cd4a806c.skydrive.live.com/browse.aspx/%E5%85%AC%E9%96%8B/Gentoo%20Linux%20ebuild/app-i18n/wime
に作成・アップロードした。
(2008/7/20)バージョン1.8.1に合わせて、パッチとebuildを更新した。strdup()の記述が消えたため、それをコメントアウトする処理は外している。
(2008/7/28)バージョン1.8.2に合わせた更新を行ったが、パッチは1.8.1のものをそのまま使えるため、ebuildの変更点はそのパッチのファイル名の変更のみ。


インストールされるファイルは以下(x86_64上の場合)。qlistで一覧した各行(ファイル)に対してfileで種類を調べている。

$ qlist wime | while read f; do file ${f}; done
/usr/share/doc/wime-1.8.0/Readme.bz2: bzip2 compressed data, block size = 900k
/usr/share/doc/wime-1.8.0/Changelog.bz2: bzip2 compressed data, block size = 900k
/usr/share/wime-1.8.0/hinshi: ISO-8859 text
/usr/share/wime-1.8.0/atok.reg: ASCII text
/usr/share/wime-1.8.0/atok-taiken.reg: Non-ISO extended-ASCII text
/usr/bin/wime.exe.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, stripped
/usr/bin/hinshi-list.exe.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, stripped
/usr/bin/wimectrl: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), stripped
/usr/bin/hinshi-list: Bourne shell script text executable
/usr/bin/wime: Bourne shell script text executable
/usr/lib32/libwime.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, stripped
/usr/lib32/wine/libwime.dll.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, stripped

配布されているパッケージのビルドシステムによるインストールと違うのは

という点。

使用したバージョン:

  • Wine 1.0
  • wime 1.8.0
  • GCC 4.2.4
  • Canna 3.7_p2

*1:コメント記号の使用により該当部分を無視させることで、C言語なので「/*」と「*/」で囲む・GCCではC++形式の「//」の後ろも無視される

*2:iconv -f eucjp -t sjis [EUC-JPのファイル] > [Shift_JISのファイル]

*3:ディレクト[ホームディレクトリ]/.wime/が存在しないときに初回とみなしている