C/Migemoの辞書についての覚え書き(.specファイルの分け方と辞書のRPMパッケージ作成についてのメモ)
「C/Migemoの辞書についての覚え書き(作成の流れ、エンコーディング)」の続きで、ここでは.specファイルの分け方に関してとC/Migemoの辞書のRPMパッケージの作成に関するメモを扱う。
辞書パッケージはEUC-JP版のみを含めることにする
「C/Migemoの辞書についての覚え書き(作成の流れ、エンコーディング)」に書いたように、C/Migemoの辞書はEUC-JP版だけを作成する方針でパッケージを作成する(UTF-8版は入れない)ことにした。参考として、C/Migemoは、WindowsでDLLとして別のアプリケーションから使うという使い方もされているが、本家サイトで配布されているWindows向けファイルにも単一のエンコーディング(Shift_JIS版)だけしか入っていない。
.specファイルの分け方について
.specファイルは、1つのファイルから複数のRPMパッケージを作ることもできるようになっているものの、同一のバージョン番号のものに限られる上、Mandriva Linux 2009.0に含まれるrpmのバージョンではアーキテクチャ非依存データのパッケージ(「BuildArch: noarch」を書いたもの)をそうでないパッケージと.specファイルを共有できないため、C/Migemoの辞書パッケージに持たせるバージョンをSKKの辞書のバージョンに合わせる都合上、独立した.specファイルを設けることにした。GNU Emacs用のmigemo.elも、Ruby版のパッケージを使用する関係でバージョン付けが変わることから、同様に独立した.specファイルにすることにした。- cmigemo.spec: 本体とライブラリ部分、そのライブラリの開発ファイル群(ヘッダファイルとリンク時向けの.soファイルへのリンク)
- cmigemo-dictionary.spec: 辞書[noarch・SKK辞書のバージョン]
- cmigemo-vim.spec: vimプラグイン[noarch・本体のバージョン]
- cmigemo-emacs.spec: Emacs lisp[noarch・Ruby版Migemoのバージョン]
上のようなバージョンを持たせて、アーキテクチャ非依存データはnoarchのパッケージにする形にするのが狙い。
辞書の変換処理をシンプルにして手動実行
辞書パッケージの.specファイルの作成途中、あらかじめSKK-JISYO.Lをソースとして用意した上でdictディレクトリの「euc-jp-files」ターゲットをmakeするということをしていたのだが+ make -C dict euc-jp-files make: Entering directory `/home/mandrake/rpm/BUILD/cmigemo-1.3c-MIT/dict' mkdir -p euc-jp.d perl ../tools/skk2migemo.pl < SKK-JISYO.L > dict.tmp perl ../tools/optimize-dict.pl < dict.tmp > base-dict rm -f dict.tmp nkf -x -s < base-dict > migemo-dict nkf -x -e < migemo-dict > euc-jp.d/migemo-dict nkf -x -e < zen2han.dat > euc-jp.d/zen2han.dat nkf -x -e < han2zen.dat > euc-jp.d/han2zen.dat nkf -x -e < hira2kata.dat > euc-jp.d/hira2kata.dat nkf -x -e < roma2hira.dat > euc-jp.d/roma2hira.dat make: Leaving directory `/home/mandrake/rpm/BUILD/cmigemo-1.3c-MIT/dict'
EUC-JP版だけを作成することを考えると、余計な処理が含まれているのに気づいた。
SKK-JISYO.LはEUC-JP、オリジナルの.datファイル群はShift_JISのエンコーディングで書かれていたため
%define cmigemo_name cmigemo %define cmigemo_version 1.3c %define __iconv %{_bindir}/iconv %define __lzcat %{__lzma} -dc (Source0は%{cmigemo_name}-%{cmigemo_version}-MIT.tar.bz2) %prep %setup -q -n %{cmigemo_name}-%{cmigemo_version}-MIT/dict # 辞書はLZMA圧縮した上でソースにしておき、ここで伸長 %{__lzcat} [LZMA圧縮された辞書のソース] > SKK-JISYO.L %build %{__mkdir} euc-jp.d # 中間ファイルを作らずにSKK辞書からC/Migemo辞書までを処理 ../tools/skk2migemo.pl < SKK-JISYO.L | ../tools/optimize-dict.pl > euc-jp.d/migemo-dict # iconvで各.datファイルをShift_JISからEUC-JPへ変換 for f in han2zen hira2kata roma2hira zen2han; do %{__iconv} -f sjis -t eucjp ${f}.dat > euc-jp.d/${f}.dat done
のように、dictディレクトリの中に入ってiconvコマンドで変換を行うことにした。
nkfで変換したものと「iconv -f sjis -t eucjp」で変換したものを試しに比較してみたが、同一の内容となり、MD5は
$ md5sum /usr/share/migemo/* f304108a3457609760cea82e9d6afc5f /usr/share/migemo/han2zen.dat 9da41419f880ea0e845bed8139804733 /usr/share/migemo/hira2kata.dat c9d2bc3eda6e9fef57310c2bca8c844a /usr/share/migemo/migemo-dict abdc569172ab06af397dc2b0dab0299b /usr/share/migemo/roma2hira.dat
となった。つまり、nkfをBuildRequires*1で要求する必要もなくなった。iconvはglibc(Cライブラリ)の一部でperlも/usr/lib/rpm/macrosのマクロになっているぐらいなので標準のコマンドという扱いで、これらはBuildRequiresには記述していない。
*1:パッケージ作成時に要求するパッケージ/コマンド