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

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

C/Migemoの辞書についての覚え書き(.specファイルの分け方と辞書のRPMパッケージ作成についてのメモ)

C/Migemoの辞書についての覚え書き(作成の流れ、エンコーディング)」の続きで、ここでは.specファイルの分け方に関してとC/Migemoの辞書のRPMパッケージの作成に関するメモを扱う。

  1. 辞書パッケージはEUC-JP版のみを含めることにする
  2. .specファイルの分け方について
  3. 辞書の変換処理をシンプルにして手動実行

辞書パッケージは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・RubyMigemoのバージョン]


上のようなバージョンを持たせて、アーキテクチャ非依存データは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.LEUC-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で要求する必要もなくなった。iconvglibc(Cライブラリ)の一部でperl/usr/lib/rpm/macrosのマクロになっているぐらいなので標準のコマンドという扱いで、これらはBuildRequiresには記述していない。

*1:パッケージ作成時に要求するパッケージ/コマンド