2012年9月25日火曜日

RPM パッケージのビルドと作成と公開 (2)

こんにちは、サイオステクノロジーの山田です。

前回mozc をビルドするのに必要な環境を整えるまでの解説をしました。

今回からはいよいよ、mozc のソースをダウンロードしてビルド作業を開始します。

ソースコードの入手

それでは、今度は Fedora から mozc のソースコードを取ってきましょう。RPM 系のパッケージ管理を使っている場合、ソースコードを取ってくるにはyumdownloader というコマンドを使います。yumdownloader は RPM パッケージを取得するコマンドですが、--source というオプションをつけるとソース・パッケージ (.src.rpm) を取得します。

また、 --enablerepo=repository1,repository2,... というオプションは、リポジトリ・ファイル(.repo) で enable=0 として無効化されているレポジトリを有効にします。

$ yumdownloader --source --enablerepo=fedora,fedora-updates mozc
        ....................................................
mozc-1.5.1090.102-2.fc17.src.rpm                         |  47 MB     00:09

CentOS には mozc パッケージはないので、Fedora のレポジトリを有効にしてソースコード・パッケージをダウンロードしています。

yumdownloader の詳しい使い方は man を参照して下さい。

2012年7月現在、Fedora から入手できる mozc のソースコード・パッケージ は下記のバージョンになります。これは mozc プロジェクトの最新リリースと一致し ています。

mozc-1.5.1090.102-2.fc17

ソース・パッケージのインストール

次にこのソースコードを展開します。展開には RPM パッケージのインストールと同様に RPM コマンドで行います。

$ rpm -ivh mozc-1.5.1090.102-2.fc17.src.rpm

コマンドを実行すると、ホームディレクトリ配下に下記のディレクトリとファイルが展開されます。

$ cd
$ ls -R ./rpmbuild

./rpmbuild:
SOURCES  SPECS

./rpmbuild/SOURCES:
jigyosyo.zip                mozc-fix-model-path-for-zinnia.patch
ken_all.zip                 mozc-init.el
mozc-1.5.1090.102.tar.bz2   mozc-no-Werror.patch
mozc-build-verbosely.patch  mozc-support-new-ibus.patch
mozc-fix-dirs.patch

./rpmbuild/SPECS:
mozc.spec

備考
ソースコードを $HOME/rpmbuild に展開するのは RPM4.8 以降の仕様で、それ以前のものは /usr/src/redhat に展開していました。

RPM4.8RHEL では RHEL6 で、 Fedora では Fedora13 で導入されました。

パッケージのビルド

パッケージのビルドには rpmbuild コマンドを利用します。

rpmbuild は、RPM パッケージをビルドするコマンドですがオプションにより次のようにビルド段階を調整することができます。

  • -ba
  • (%prep, %build, %install を実行した後に) バイナリパッケージとソースパッケージをビルドする。
  • -bb
  • (%prep, %build, %install を実行した後に) バイナリパッケージをビルドする。
  • -bp
  • spec ファイルから "%prep" 段階を実行する。通常、ソースを展開しパッチを適用することを意味する。
  • -bc
  • (%prep を実行した後に) spec ファイルから "%build" 段階を実行する。 一般的には "make" と等価である。
  • -bi
  • (%prep, %build を実行した後に) spec ファイルから "%install" 段階を実行する。一般的には "make install" と等価である。
  • -bl
  • "list check" を実行する。 spec ファイルの "%files" セクション のマクロが展開され、各ファイルが存在するかの検証をするためのチェッ クが行われる。
  • -bs
  • ソースパッケージだけをビルドする。

それでは、展開した mozc のソースを早速 rpmbuild コマンドでビルドしてみましょう。先ほど見た SPECS というディレクトリに、パッケージの作成方法を記述した spec ファイル (mozc.spec) がインストールされているので、rpmbuild コマンドで mozc.spec ファイルを指定しています。

$ rpmbuild -ba mozc.spec
エラー: ビルド依存性の失敗:
        openssl-devel は mozc-1.5.1090.102-2.fc17.i686 に必要とされています
        zlib-devel は mozc-1.5.1090.102-2.fc17.i686 に必要とされています
        libcurl-devel は mozc-1.5.1090.102-2.fc17.i686 に必要とされています
        gtest-devel は mozc-1.5.1090.102-2.fc17.i686 に必要とされています
        protobuf-devel は mozc-1.5.1090.102-2.fc17.i686 に必要とされています
        glib2-devel は mozc-1.5.1090.102-2.fc17.i686 に必要とされています
        qt-devel は mozc-1.5.1090.102-2.fc17.i686 に必要とされています
        zinnia-devel は mozc-1.5.1090.102-2.fc17.i686 に必要とされています
        gyp >= 0.1-0.4.840svn は mozc-1.5.1090.102-2.fc17.i686 に必要とされています
        ibus-devel >= 1.3.99 は mozc-1.5.1090.102-2.fc17.i686 に必要とされています
        scim-devel は mozc-1.5.1090.102-2.fc17.i686 に必要とされています
        emacs は mozc-1.5.1090.102-2.fc17.i686 に必要とされています
        xemacs は mozc-1.5.1090.102-2.fc17.i686 に必要とされています
        xemacs-packages-extra は mozc-1.5.1090.102-2.fc17.i686 に必要とされています

ビルドするのに依存性のあるパーッケージが沢山表示されています。これらのインストールを試みてみましょう。

# yum install openssl-devel zlib-devel libcurl-devel  gtest-devel protobuf-devel 
glib2-devel qt-devel zinnia-devel gyp ibus-devel scim-devel emacs xemacs 
xemacs-packages-extra  
        ..............................
Setting up Install Process
No package zinnia-devel available.
No package scim-devel available.
Resolving Dependencies
        ..............................

zinnia-develscim-devel というパッケージはありませんでしたが、その他のパッケージは依存性のあるパッケージも含めてインストールされました。

パッケージがインストールされたところで、再び rpmbuild コマンドを実行して、残っている依存性を確認します。

$ rpmbuild -ba mozc.spec
エラー: ビルド依存性の失敗:
        zinnia-devel は mozc-1.5.1090.102-2.fc17.i686 に必要とされています
        ibus-devel >= 1.3.99 は mozc-1.5.1090.102-2.fc17.i686 に必要とされています
        scim-devel は mozc-1.5.1090.102-2.fc17.i686 に必要とされています

これらの3つのパッケージの扱いを考えてみます。

まず scim-devel ですが、これは scim の開発用パッケージです。 一般に <package>-devel というパッケージはある <package> に関連する開発用パッケージで、<package> をビルドするときに同時に作成されます。

scim はインプット・メソッドで、RHEL5 まではサポートされていましたが、RHEL6 からは ibus というインプット・メソッドが採用され、scim はサポートされなくなりました。

そこで、spec ファイルを修正して scim に関連するパッケージはビルドしない方針にします。

spec ファイルで scim に関連する部分を削除します。 変更の詳細は文末の diff 出力を参照してください。

また、ibus-develRHEL6 に含まれていますがバージョンが異なります。

$ rpm -q ibus-devel
ibus-devel-1.3.4-6.el6.i686

これに関しては SPEC ファイルを修正してバージョンに関する条件を外します。

BuildRequires: ibus-devel >= 1.3.99 (修正前)
BuildRequires: ibus-devel (修正後)

残りは zinnia-devel だけとなりました。

zinnia とは何でしょうか。 Fedora システムで調べてみましょう。

下記は Fedora システム上での操作です。

Fedora17 # rpm -qi zinnia
Name        : zinnia
Version     : 0.06
Release     : 12.fc17
        .........................
Summary     : Online handwriting recognition system with machine learning
Description :
Zinnia provides a simple, customizable, and portable dynamic OCR
system for hand-written input, based on Support Vector Machines.

Zinnia simply receives user pen strokes as coordinate data and outputs
the best matching characters sorted by SVM confidence. To maintain
portability, it has no rendering functionality. In addition to
recognition, Zinnia provides a training module capable of creating
highly efficient handwriting recognition models.

This package contains the shared libraries.

サマリーによれば、学習機能付きの手書き入力システム、ということです。

CentOS と EPEL のレポジトリにこのパッケージがあるかを確認してみましょう。

REHL6.3 $ yum search zinnia
        ............................
Warning: No matches found for: zinnia
No Matches found

どうやら Fedora にしかパッケージはないようです。

zinnia についても yumdownloader を使用してソースコード を持ってきてビルドします。

$ yumdownloader --source --enablerepo=fedora,fedora-updates zinnia
  ...............................
zinnia-0.06-12.fc17.src.rpm                              | 459 kB     00:00

zinnia のソースコードをインストールしてビルドします。

$ rpm -ivh zinnia-0.06-12.fc17.src.rpm
$ cd ~/rpmbuild/SPECS
$ rpmbuild -ba zinnia.spec
エラー: ビルド依存性の失敗:
        db4-devel は zinnia-0.06-12.fc17.i686 に必要とされています
        python2-devel は zinnia-0.06-12.fc17.i686 に必要とされています
        tomoe は zinnia-0.06-12.fc17.i686 に必要とされています

ビルドするのに依存性のあるパッケージのインストールを試みます。

# yum install db4-devel python2-devel tomoe

これら3つのパッケージとそれらに依存関係のあるパッケージは問題なくインス トールされます。

もう一度 zinnia.spec をビルドしてみます。

# rpmbuild -ba zinnia.spec
実行中(%prep): /bin/sh -e /var/tmp/rpm-tmp.NaCop2
+ umask 022
+ cd /home/packager/rpmbuild/BUILD
+ LANG=C
        …..............................................
Makefile.am: required file `./ChangeLog' not found
make: *** [Makefile.in] Error 1
エラー: /var/tmp/rpm-tmp.5eamTH の不正な終了ステータス (%build)


RPM ビルドエラー:
    /var/tmp/rpm-tmp.5eamTH の不正な終了ステータス (%build)

エラーメッセージの中に下記の部分があります。

Makefile.am: required file `./ChangeLog' not found

ChangeLog というファイルがなくてエラーとなっているようです。 今度は SPEC ファイル zinnia.spec を見てみましょう。 説明のため行番号を付けて表示しています。

zinnia.spec

    91 %prep
    92 %setup -q -n %{name}-%{version}
    93 %patch0 -p1 -b .bindings
    94 %patch1 -p1 -b .ppc
    95 %patch2 -p1 -R -b .little-endian
    96 find . -type f -name ChangeLog -size 0c -exec rm -f {} ';'
    97 find . -type f -name "*.pyc" -exec rm -f {} ';'
    98 cp %{SOURCE1} .
    99 cp %{SOURCE2} .

96行目で、find がサイズが 0ChangeLog を削除しています。 おそらく、これが原因で ChangeLog がなくてエラーになっていると考えられます。

このエラーをなくすために touch コマンドでサイズ 0ChangeLog を作成するように SPEC ファイルを修正します。

    91 %prep
    92 %setup -q -n %{name}-%{version}
    93 %patch0 -p1 -b .bindings
    94 %patch1 -p1 -b .ppc
    95 %patch2 -p1 -R -b .little-endian
    96 find . -type f -name ChangeLog -size 0c -exec rm -f {} ';'
    97 find . -type f -name "*.pyc" -exec rm -f {} ';'
    98 cp %{SOURCE1} .
    99 cp %{SOURCE2} .
   100 touch ChangeLog

もう一度ビルドしてみます。

$ rpmbuild -ba zinnia.spec
  ...........................................
伸張ファイルの検査中: /usr/lib/rpm/check-files /home/packager/rpmbuild/BUILDROOT/zinnia-0.06-12.el6.i386
書き込み完了: /home/packager/rpmbuild/SRPMS/zinnia-0.06-12.el6.src.rpm
書き込み完了: /home/packager/rpmbuild/RPMS/i686/zinnia-0.06-12.el6.i686.rpm
書き込み完了: /home/packager/rpmbuild/RPMS/i686/zinnia-devel-0.06-12.el6.i686.rpm
書き込み完了: /home/packager/rpmbuild/RPMS/i686/zinnia-utils-0.06-12.el6.i686.rpm
書き込み完了: /home/packager/rpmbuild/RPMS/noarch/zinnia-doc-0.06-12.el6.noarch.rpm
書き込み完了: /home/packager/rpmbuild/RPMS/i686/zinnia-perl-0.06-12.el6.i686.rpm
書き込み完了: /home/packager/rpmbuild/RPMS/i686/zinnia-python-0.06-12.el6.i686.rpm
書き込み完了: /home/packager/rpmbuild/RPMS/i686/zinnia-tomoe-0.06-12.el6.i686.rpm
書き込み完了: /home/packager/rpmbuild/RPMS/i686/zinnia-debuginfo-0.06-12.el6.i686.rpm
実行中(%clean): /bin/sh -e /var/tmp/rpm-tmp.21jOTO
+ umask 022
+ cd /home/packager/rpmbuild/BUILD
+ cd zinnia-0.06
+ rm -rf /home/packager/rpmbuild/BUILDROOT/zinnia-0.06-12.el6.i386
+ exit 0

今度はビルドに成功しました。

作成されたソースパッケージが ~/rpmbuild/SRPMS に、RPMパッケージが、 ~/rpmbuild/RPMS/i686~/rmpbuild/RPMS/noarch に書き込まれています。

一般に、

~/rpmbuild/SRPMS
には、ソース・パッケージ (.src.rpm) が作成され、
~/rmpbuild/RPMS/noarch
~/rpmbuild/RPMS/i686
には、それぞれアーキテクチャに依存しない RPM パッケージ、アーキテクチャに依存する RPM パッケージが作成されます。(パッケージによっては i686 でなく i386 であったり i586 であることもあります。)

また、x86_64 ベースのシステムでビルドすると、アーキテクチャ依存パッケージは、

~/rpmbuild/RPMS/x86_64
に作成されます。

作成したパッケージは、mozc の作成に必要となるのでインストールします。

zinnia-debuginfo というパッケージも作成されていますが、一般に <package>-debuginfo というパッケージは、デバック用のシンボルを含んだ特殊なパッケージなので、通常インストールは行いません。

また、作成したパッケージのインストールには、rpm コマンドでなく yum コマンドを使用してインストールします。yum コマンドを使用すれば、依存関係のあるパッケージも同時にインストールしてくれるからです。

アーキテクチャーに依存するパッケージのインストール

$ cd ~/rpmbuild/RPMS/i686
$ ls
zinnia-0.06-12.fc17.i686.rpm            zinnia-python-0.06-12.fc17.i686.rpm
zinnia-debuginfo-0.06-12.fc17.i686.rpm  zinnia-tomoe-0.06-12.fc17.i686.rpm
zinnia-devel-0.06-12.fc17.i686.rpm      zinnia-utils-0.06-12.fc17.i686.rpm
zinnia-perl-0.06-12.fc17.i686.rpm
$ sudo yum localinstall zinnia-0.06-12.fc17.i686.rpm zinnia-python-0.06-12.fc17.i686.rpm zinnia-tomoe-0.06-12.fc17.i686.rpm zinnia-devel-0.06-12.fc17.i686.rpm zinnia-utils-0.06-12.fc17.i686.rpm zinnia-perl-0.06-12.fc17.i686.rpm

アーキテクチャーに依存しないパッケージのインストール

$ cd ~/rpmbuild/RPMS/noarch
$ ls
zinnia-doc-0.06-12.fc17.noarch.rpm
$ sudo yum localinstall *.rpm


今回は、mozc のビルドに取り掛かり、ビルドに必要な zinnia のビルドを行い、zinnia および zinnia に関連するパッケージのインストールを行いました。次回は再び mozc パッケージの作成を行います。



参考資料

mozc の SPEC ファイルの修正

$ diff -u mozc.spec.orig  mozc.spec
--- mozc.spec.orig 2012-06-07 21:08:57.000000000 +0900
+++ mozc.spec 2012-07-23 12:53:30.793855102 +0900
@@ -31,8 +31,7 @@
 BuildRequires: python gettext
 BuildRequires: openssl-devel libstdc++-devel zlib-devel libcurl-devel gtest-devel protobuf-devel glib2-devel qt-devel zinnia-devel
 BuildRequires: gyp >= 0.1-0.4.840svn
-BuildRequires: ibus-devel >= 1.3.99
-BuildRequires: scim-devel
+BuildRequires: ibus-devel
 BuildRequires: emacs
 BuildRequires: xemacs xemacs-packages-extra
 
@@ -54,18 +53,6 @@
 
 This package contains the Input Method Engine for IBus.
 
-%package -n scim-mozc
-Summary: Open-sourced Google Japanese Input engine for SCIM input platform
-Group:  System Environment/Libraries
-Requires: %{name} = %{version}-%{release}
-Requires: scim
-
-%description -n scim-mozc
-Mozc is a Japanese Input Method Editor (IME) designed for
-multi-platform such as Chromium OS, Windows, Mac and Linux.
-
-This package contains the Input Method Engine for SCIM.
-
 %package -n emacs-common-mozc
 Summary: Open-sourced Google Japanese Input for Emacsen
 Group:  System Environment/Libraries
@@ -146,11 +133,9 @@
 
 
 %build
-sed -i -e "s|\(.*\)/usr/lib/\(glib-2.0/.*\)|\1%{_libdir}/\2|g" \
- -e "s|\(.*\)/usr/lib/\(gtk-2.0/.*\)|\1%{_libdir}/\2|g" unix/scim/scim.gyp
 python build_mozc.py gyp --gypdir=%{_bindir} --server_dir=%{_libexecdir} --use_libprotobuf
 python build_mozc.py build_tools -c Release
-python build_mozc.py build -c Release unix/ibus/ibus.gyp:ibus_mozc unix/scim/scim.gyp:scim_mozc unix/scim/scim.gyp:scim_mozc_setup unix/emacs/emacs.gyp:mozc_emacs_helper server/server.gyp:mozc_server gui/gui.gyp:mozc_tool renderer/renderer.gyp:mozc_renderer
+python build_mozc.py build -c Release unix/ibus/ibus.gyp:ibus_mozc unix/emacs/emacs.gyp:mozc_emacs_helper server/server.gyp:mozc_server gui/gui.gyp:mozc_tool renderer/renderer.gyp:mozc_renderer
 
 
 %install
@@ -171,20 +156,6 @@
  install -p -m0644 $i $RPM_BUILD_ROOT%{_datadir}/ibus-mozc/${i//ui-/}
 done)
 
-# scim-mozc
-scim_moddir=$(pkg-config --variable=moduledir scim)
-scim_icondir=$(pkg-config --variable=icondir scim)
-install -d $RPM_BUILD_ROOT$scim_moddir/IMEngine
-install -d $RPM_BUILD_ROOT$scim_moddir/SetupUI
-install -d $RPM_BUILD_ROOT$scim_icondir
-install -p -m0755 out_linux/Release/lib.target/libscim_mozc.so $RPM_BUILD_ROOT$scim_moddir/IMEngine/mozc.so
-install -p -m0755 out_linux/Release/lib.target/libscim_mozc_setup.so $RPM_BUILD_ROOT$scim_moddir/SetupUI/mozc-setup.so
-(cd data/images/unix;
-install -p -m0644 ime_product_icon_opensource-32.png $RPM_BUILD_ROOT$scim_icondir/scim-mozc.png
-for i in ui-*.png; do
- install -p -m0644 $i $RPM_BUILD_ROOT$scim_icondir/${i//ui-/scim-mozc-}
-done)
-
 # emacs-common-mozc
 install -d $RPM_BUILD_ROOT%{_bindir}
 install -p -m0755 out_linux/Release/mozc_emacs_helper $RPM_BUILD_ROOT%{_bindir}
@@ -225,14 +196,6 @@
 %{_datadir}/ibus/component/mozc.xml
 %{_datadir}/ibus-mozc/*.png
 
-%files -n scim-mozc
-%defattr(-,root,root,-)
-%doc data/installer/credits_en.html
-%lang(ja) %doc data/installer/credits_ja.html
-%{_libdir}/scim-1.0/*/IMEngine/mozc.so
-%{_libdir}/scim-1.0/*/SetupUI/mozc-setup.so
-%{_datadir}/scim/icons/*.png
-
 %files -n emacs-common-mozc
 %defattr(-,root,root,-)
 %doc data/installer/credits_en.html

0 件のコメント:

コメントを投稿