2012年10月2日火曜日

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

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

前回mozc のビルドを開始し、CentOSFedra EPELの範囲でビルドに必要なパッケージをインストールし、そこには含まれていなかった zinniaFedora のソース・パッケージからビルドして、zinnia と関連するパッケージをインストールしました。

今回は、mozc のビルドに必要なパッケージが揃ったので、mozc そのものをビルドしていきます。

$ cd ~/rpmbuild/SPECS/
$ rpmbuild -ba mozc.spec
実行中(%prep): /bin/sh -e /var/tmp/rpm-tmp.p57ke1
+ umask 022
+ cd /home/packager/rpmbuild/BUILD
+ LANG=C
............................................................................
Package gtk+-2.0 was not found in the pkg-config search path.
Perhaps you should add the directory containing `gtk+-2.0.pc'
to the PKG_CONFIG_PATH environment variable
No package 'gtk+-2.0' found
Package gdk-2.0 was not found in the pkg-config search path.
Perhaps you should add the directory containing `gdk-2.0.pc'
to the PKG_CONFIG_PATH environment variable
No package 'gdk-2.0' found
............................................................................

エラーとなって終了してしまいました。出力されたメッセージに

gtk+-2.0 was not found in the pkg-config search path ....
という部分があります。

gtk+-2.0pkg-config サーチ・パスにないためにエラーとなっています。gtk+-2.0をパスに含んだパッケージがないか捜してみます。

$ yum provides \*gtk+-2.0\*
        .............................................
gtk2-devel-2.18.9-10.el6.i686 : Development files for GTK+
Repo        : base
Matched from:
Other       : pkgconfig(gtk+-2.0) = 2.18.9
Filename    : /usr/lib/pkgconfig/gtk+-2.0.pc
        .............................................

gtk2-devel が該当することがわかりました。gtk2-devel をインストールします。

$ sudo yum -y install gtk2-devel
        .............................................
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package gtk2-devel.i686 0:2.18.9-10.el6 will be installed
--> Processing Dependency: pango-devel >= 1.20.0-1 for package: gtk2-devel-2.18.9-10.el6.i686
        .............................................

gtk2-devel が依存関係のあるパッケージとともにインストールされました。 もう一度 mozc をビルドしてみましょう。

$ rpmbuild -ba mozc.spec
実行中(%prep): /bin/sh -e /var/tmp/rpm-tmp.nVb34T
        ...................................................
  export LD_LIBRARY_PATH=/home/packager/rpmbuild/BUILD/mozc-1.5.1090.102/
out_linux/Release/lib.host:/home/packager/rpmbuild/BUILD/mozc-1.5.1090.102/out_linux/Release/lib.target:$LD_LIBRARY_PATH; cd gui; mkdir -p /home/packager/rpmbuild/BUILD/mozc-1.5.1090.102/out_linux/Release/obj/gen/gui/tool; /usr/lib/qt-3.3/bin/rcc -o "/home/packager/rpmbuild/BUILD/mozc-1.5.1090.102/out_linux/Release/obj/gen/gui/tool/qrc_mozc_tool.cc" -name qrc_mozc_tool tool/mozc_tool.qrc
/bin/sh: /usr/lib/qt-3.3/bin/rcc: No such file or directory
        ...................................................

前にエラーとなっていた部分は解決しましたが、再びエラーとなってしまいました。

今度は

/usr/lib/qt-3.3/bin/rcc: No such file or directory
というメッセージより /usr/lib/qt-3.3/bin/rcc がないためにエラーとなったことがわかります。

/usr/lib/qt-3.3/bin/rcc を提供するプログラムがないか捜してみます。

$ yum provides /usr/lib/qt-3.3/bin/rcc
      ................................
No Matches found

該当するパッケージはありませんでした。

今度は rcc コマンドについて調査してみます。

$ whereis rcc
rcc: /usr/bin/rcc
$ rpm -qf /usr/bin/rcc
qt-devel-4.6.2-24.el6.i686
$ rpm -qa|grep qt
qt-devel-4.6.2-24.el6.i686
qt-4.6.2-24.el6.i686
qt3-3.3.8b-30.el6.i686
qt-sqlite-4.6.2-24.el6.i686
qt-x11-4.6.2-24.el6.i686
ibus-qt-1.3.0-2.el6.i68

rccqt-devel パッケージの中にありますが、qt3 パッケージも入っているため、パスが混乱してしまっているようです。

もう一度ビルドの出力を見ると下記の部分があります。

+ python build_mozc.py gyp --gypdir=/usr/bin --server_dir=/usr/libexec --use_libprotobuf 
INFO: Generating version definition file... 
INFO: Version string is 1.5.1090.102 
      ............................ 
INFO: Running GYP... 
Running: /usr/bin/python /usr/bin/gyp --depth=. --include=./gyp/common.gypi -D python_executable=/usr/bin/python ./base/base.gyp ./base/base_test.gyp ./build_tools/build_tools.gyp ./build_tools/primitive_tools/primitive_tools.gyp ./client/client.gyp ./client/client_test.gyp ./composer/composer.gyp ./config/config.gyp ./config/config_test.gyp ./converter/converter.gyp ./converter/converter_base.gyp ./converter/converter_test.gyp ./data_manager/data_manager.gyp ./dictionary/dictionary.gyp ./dictionary/dictionary_base.gyp ./dictionary/dictionary_test.gyp ./dictionary/file/dictionary_file.gyp ./dictionary/rx/rx_storage.gyp ./dictionary/system/system_dictionary.gyp ./gui/gui.gyp ./gui/zinnia.gyp ./gyp/tests.gyp ./handwriting/handwriting.gyp ./handwriting/handwriting_test.gyp ./ipc/ipc.gyp ./mac/mac.gyp ./net/net.gyp ./prediction/prediction.gyp ./prediction/prediction_test.gyp ./protobuf/protobuf.gyp ./renderer/renderer.gyp ./rewriter/calculator/calculator.gyp ./rewriter/rewriter.gyp ./rewriter/rewriter_base.gyp ./rewriter/rewriter_test.gyp ./server/server.gyp ./session/session.gyp ./session/session_base.gyp ./session/session_test.gyp ./storage/storage.gyp ./sync/sync.gyp ./testing/testing.gyp ./transliteration/transliteration.gyp ./unix/emacs/emacs.gyp ./unix/ibus/ibus.gyp ./usage_stats/usage_stats.gyp third_party/jsoncpp/jsoncpp.gyp third_party/rx/rx.gyp -D branding=Mozc -D use_qt=YES
-D qt_dir=/usr/lib/qt-3.3 -D use_wix=NO -D build_base=out_linux -D enable_unittest=0
-D mac_dir=<(DEPTH)/../mac -D channel_dev=1 -D enable_webservice_infolist=0
-D enable_cloud_sync=0 -D enable_cloud_handwriting=0 -D enable_http_client=0
-D enable_ambiguous_search=0 -D target_platform=Linux -D use_dynamically_linked_qt=0
-D use_zinnia=YES -D use_libibus=1 -D use_libprotobuf=1 -D dictionary=desktop
-D use_separate_connection_data=0 -D use_separate_dictionary=0 
-D pkg_config_command=pkg-config -D language=japanese -D server_dir=/usr/libexec 

build_mozc.py という Python スクリプトの中で qt_dir=/usr/lib/qt-3.3 を設定しているようです。

build_mozc.py を調べると728 行目で環境変数 QTDIR の値を qt_dir に設定している部分があります。

 712   # Build GYP command line. 
 713   PrintInfo('Building GYP command line...') 
        ........................................................
 727   if options.qtdir: 
 728     command_line.extend(['-D', 'qt_dir=%s' % os.path.abspath(options.qtdir)     ]) 
 729   else: 
 730     command_line.extend(['-D', 'qt_dir=']) 

環境変数で qt-3.3 が入っているものを捜してみます。

$ env | grep qt-3.3
QTDIR=/usr/lib/qt-3.3
QTINC=/usr/lib/qt-3.3/include
PATH=/usr/lib/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin
QTLIB=/usr/lib/qt-3.3/lib

これらの環境変数をリセットします。

$ export QTDIR=
$ export QTINC=
$ exprot PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin
$ export QTLIB=

再度 mozc のビルドを実行します。

$ rpmbuild -ba mozc.spec
実行中(%prep): /bin/sh -e /var/tmp/rpm-tmp.nVb34T
+ umask 022
+ cd /home/packager/rpmbuild/BUILD
+ LANG=C
+ export LANG
+ unset DISPLAY
+ cd /home/packager/rpmbuild/BUILD
        ...................................
+ exit 0
$

これで mozc のビルドが完了しました。

次にビルドしたパッケージをインストールします。

$ cd ~/rpmbuild/RPMS/i686
$ ls
emacs-common-mozc-1.5.1090.102-2.fc17.i686.rpm
ibus-mozc-1.5.1090.102-2.fc17.i686.rpm
mozc-1.5.1090.102-2.fc17.i686.rpm
mozc-debuginfo-1.5.1090.102-2.fc17.i686.rpm
zinnia-0.06-12.fc17.i686.rpm
zinnia-debuginfo-0.06-12.fc17.i686.rpm
zinnia-devel-0.06-12.fc17.i686.rpm
zinnia-perl-0.06-12.fc17.i686.rpm
zinnia-python-0.06-12.fc17.i686.rpm
zinnia-tomoe-0.06-12.fc17.i686.rpm
zinnia-utils-0.06-12.fc17.i686.rpm
$ sudo yum -y localinstall emacs-common-mozc-1.5.1090.102-2.fc17.i686.rpm
ibus-mozc-1.5.1090.102-2.fc17.i686.rpm mozc-1.5.1090.102-2.fc17.i686.rpm
        .....................................................
Installed:
  emacs-common-mozc.i686 0:1.5.1090.102-2.fc17                                  
  ibus-mozc.i686 0:1.5.1090.102-2.fc17                                          
  mozc.i686 0:1.5.1090.102-2.fc17                                               

Complete!
$ cd ../noarch/
$ ls
emacs-mozc-1.5.1090.102-2.fc17.noarch.rpm
emacs-mozc-el-1.5.1090.102-2.fc17.noarch.rpm
xemacs-mozc-1.5.1090.102-2.fc17.noarch.rpm
xemacs-mozc-el-1.5.1090.102-2.fc17.noarch.rpm
zinnia-doc-0.06-12.fc17.noarch.rpm
$ sudo yum localinstall -y emacs-mozc-1.5.1090.102-2.fc17.noarch.rpm \
emacs-mozc-el-1.5.1090.102-2.fc17.noarch.rpm \
 xemacs-mozc-1.5.1090.102-2.fc17.noarch.rpm \
 xemacs-mozc-el-1.5.1090.102-2.fc17.noarch.rpm
        .....................................................
Installed:
  emacs-mozc.noarch 0:1.5.1090.102-2.fc17                                       
  emacs-mozc-el.noarch 0:1.5.1090.102-2.fc17                                    
  xemacs-mozc.noarch 0:1.5.1090.102-2.fc17                                      
  xemacs-mozc-el.noarch 0:1.5.1090.102-2.fc17                                   

Complete!

以上で mozc に関連したパッケージは全てインストールされました。

パッケージ公開のための作業

これからは、作成したパッケージを独自レポジトリを作成して公開することを念頭に置いて作業していきます。

パッケージを公開する場合、悪意のあるユーザがパッケージを偽物に入れ替えたりする場合も考慮しなければなりません。

パッケージが正しいものであることを証明するためには、パッケージに鍵を使った署名を行います。

ユーザーは公開鍵を利用して署名が正しいことを確認することができます。

それではパッケージ提供者として鍵を作っていくことにします。

鍵に関する操作は gpg コマンドを利用して行います。

鍵の作成

公開鍵と秘密鍵を作成します。(入力部分はイタリックで示します。)

$ gpg --gen-key 
gpg (GnuPG) 2.0.14; Copyright (C) 2009 Free Software Foundation, Inc. 
This is free software: you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. 

ご希望の鍵の種類を選択してください: 
   (1) RSA and RSA (default) 
   (2) DSA and Elgamal 
   (3) DSA (署名のみ) 
   (4) RSA (署名のみ) 
選択は? 1 
RSA keys may be between 1024 and 4096 bits long. 
What keysize do you want? (2048) 
要求された鍵長は2048ビット 
鍵の有効期限を指定してください。 
         0 = 鍵は無期限 
        = 鍵は n 日間で満了 
      w = 鍵は n 週間で満了 
      m = 鍵は n か月間で満了 
      y = 鍵は n 年間で満了 
鍵の有効期間は? (0) 
Key does not expire at all 
これで正しいですか? (y/N) y 

You need a user ID to identify your key; the software constructs the user ID 
from the Real Name, Comment and Email Address in this form: 
    "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>" 

本名: SIOS Technology Inc.
電子メール・アドレス: xxxxxxxx@sios.com
コメント: RPM Signing Key
次のユーザーIDを選択しました: 
    “SIOS Technology Inc. (RPM Signing Key) <xxxxxxxx@sios.com>” 

名前(N)、コメント(C)、電子メール(E)の変更、またはOK(O)か終了(Q)? O 
秘密鍵を保護するためにパスフレーズがいります。 

[パスフレーズを入力するためのウィンドウがポップアップするのでパスフレーズを入力します。]

can't connect to `/home/packager/.gnupg/S.gpg-agent': そのようなファイルやディレクトリはありません 
gpg-agent[9651]: ディレクトリー「/home/packager/.gnupg/private-keys-v1.d」ができました 
今から長い乱数を生成します。キーボードを打つとか、マウスを動かす 
とか、ディスクにアクセスするとかの他のことをすると、乱数生成子で 
乱雑さの大きないい乱数を生成しやすくなるので、お勧めいたします。 
今から長い乱数を生成します。キーボードを打つとか、マウスを動かす 
とか、ディスクにアクセスするとかの他のことをすると、乱数生成子で 
乱雑さの大きないい乱数を生成しやすくなるので、お勧めいたします。 
gpg: 鍵7306CC2Eを絶対的に信用するよう記録しました 
公開鍵と秘密鍵を作成し、署名しました。 

gpg: 信用データベースの検査 
gpg: 最小の「ある程度の信用」3、最小の「全面的信用」1、PGP信用モデル 
gpg: 深さ: 0  有効性:   1  署名:   0  信用: 0-, 0q, 0n, 0m, 0f, 1u 
pub   2048R/7306CC2E 2012-07-31 
                 指紋 = 6C34 7073 56CD 1A64 B7E1  4A5F D7D8 4E17 7306 CC2E 
uid                  SIOS Technology Inc. (RPM Signing Key) <xxxxxxxx@sios.com> 
sub   2048R/DE202282 2012-07-31 

$

gpg key を作成したので keyring を確認してみます。

$ gpg --list-keys 
/home/packager/.gnupg/pubring.gpg 
--------------------------------- 
pub   2048R/7306CC2E 2012-07-31 
uid                  SIOS Technology Inc. (RPM Signing Key) <xxxxxxxx@sios.com>
sub   2048R/DE202282 2012-07-31 

次に公開鍵をエクスポートするために keyring から公開鍵をテキスト形式で取り出します。

$ gpg --export -a SIOS Technology Inc. > RHM-GPG-KEY-sios 
$ cat RHM-GPG-KEY-sios 
-----BEGIN PGP PUBLIC KEY BLOCK----- 
Version: GnuPG v2.0.14 (GNU/Linux) 

mQENBFAXdK0BCADDIgYHybaBrjsAtCMNnp7i/JfhA2O2CDZkLcV0SMAB8c/EOW/E 
uqKDqbwFzQbx94JzGDpyoSp0YP2Tks3b1nnSpW5u/sc08kZk5OCJp2+lkRtITjR4 
8BSj3nN7KXg0jT9ZVkr7+46/osJqhvIm5KfM3c0UQQAB/cq0kQMehxhQ7Yg9ERLK 
2AqPxniss3raes7fOHTxvfEB447yKSjgeBaTdD3rkKYYcflc2IkbXJOhYiDab4l0 
dQ0nVd2De7xXTLI0bavLyTuq+iTJIrUyCoBDvbFwf7gbm/efBACdZqVxyia35vSw 
x2i768VNM/VSI03DmotY47XyReUW3/jSx/0jABEBAAG0OlNJT1MgVGVjaG5vbG9n 
eSBJbmMuIChSUE0gU2lnbmluZyBLZXkpIDxncC1vc3N0Y0BzaW9zLmNvbT6JATgE 
EwECACIFAlAXdK0CGwMGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJENfYThdz 
Bswu+hkIALJYLCVZEOjXcYuvORtQFHDafAEOYYo89nljAaQzm2diUiWPpw/gJUDA 
pHIt1YRbd2VJxyFc0kMlQGiyjIwADN3/T8C+ZP5mseTIsp4pZSdq7ozuD/LnYKnw 
z1yAz4lj3QJV+8jSKj+jAXdSn77lFTS2qMDJvcASswOK98j9hCIbkzaoYjMJ64Sy 
LR37miIjppcuMBYcgrmxymONKQ1OM1tciRxjKgVzSLsbYa1Oyc8Ie1M1iHkwQ/BA 
YzL+GZtzBgBoE5oFnEL3RS9G40M500y+t3VbNcrkG2ucvtl95IV+VPIbFBM0HC/O 
qvUXA0uSLuKxhN80RowxfSGNrd+mX/K5AQ0EUBd0rQEIAMU8QeQOBJb+o7boAyDi 
QRbA9JmYoXxcnUbnVnEtyYoF5DJHAsC+uwkzGeftojPtD0SssWtcIsqn5Yc8bB0p 
k51OQgkDW4s01GkAuZdQxTdiDtSF1fxGhCJF3ioN73YiURbSZiPBN2O0qC0eBk6l 
jp+CZdyJ0b4KT9ZEdaOBxW6BSzF4g2Hm0pnL2BMk/brCUuZTeIzD6f6oZqQmP8tH 
elvdLn6yaCFmqA3fMHmBlHbbRQr4lWOq7PuRhKd+bU9Kqbjhi9PGRhvu6KDONM4e 
pDzr8I/42IQSQdu5hSO7nskysooDiPCcq4j4DoStYOMIlJhm3PYR8lEKUMo+FBwP 
aXsAEQEAAYkBHwQYAQIACQUCUBd0rQIbDAAKCRDX2E4XcwbMLqN1B/0e+Dka/GmR 
cBAHqUZwtHZt4VitJ+hwQZwUieWEYOLiyTY20+Bs8voX6taJeJHOVot1TMLe70yT 
w12c5U65XDV3p83/I0PkJN1e6cysVP7vrmQbgQaJUMAyY1rvf3r74pM63DXa9iN/ 
qQCDZsyex+GU7fACbZVWV48juNx4POu/P0/rDsNMjLTZlcvRlmqIZyiE+3/IWimI 
fFqolLmP5IqfvSAu67ngHyk3WP0DRKWO6uhBf/XLHbwrsmt74eLipolnSZxBqAyb 
3k89tnTrMXn3JnWE/y8d3HiHS0F/KEAxetCDSIaGUW7XoXN82Xr1XUAjNTCETGsm 
SXxQeon0cl2P 
=dIAE 
-----END PGP PUBLIC KEY BLOCK----- 

rpmbuild コマンド用のマクロの作成

次に rpmbuild コマンドが参照するマクロを定義します。ここで定義した内容は rpmbuild コマンドに取り込まれ、結果として作成するパッケージに反映されます。

マクロファイルは ホーム・ディレクトリに.rpmmacros として作成します。

下記は .rpmmacros ファイルの例です。

%_signature gpg 
%_gpg_path /home/packager/.gnupg 
%_gpg_name SIOS Technology Inc. (RPM Signing Key) <xxxxxxxx@sios.com>
%_gpgbin /usr/bin/gpg 
%vendor SIOS Technology Inc.
%packager SIOS Technology Inc.

このマクロがどのように反映されるかを lv コマンドをビルドして確かめてみます。lv コマンドは、現在標準には提供されていないので fedora からソースコードを持ってきて作成します。ソースコードパッケージをダウンロードしてインストールするところは今までと同じです。作成するときに署名をいれて、ビルドしたパッケージをインストールして rpm コマンドで確認してみます。

署名を入れる場合には rpmbuild コマンドに –-sign オプションを適用します。

$ rpmbuild -ba --sign lv.spec 
パスフレーズの入力: (パスフレーズを入力するー入力はエコーされない)
パスフレーズは正常です。 
実行中(%prep): /bin/sh -e /var/tmp/rpm-tmp.aT4qj8 
+ umask 022 
+ cd /home/packager/rpmbuild/BUILD 
+ LANG=C 
+ export LANG 
+ unset DISPLAY
................................
+ exit 0 
$ cd ../RPMS/x86_64
$ ls
lv-4.51-17.el6.x86_64.rpm  lv-debuginfo-4.51-17.el6.x86_64.rpm
$ sudo yum localinstall lv-4.51-17.el6.x86_64.rpm 
.................................
Installed: 
  lv.x86_64 0:4.51-17.el6                                                      

Complete! 

lv のインストールが完了したので rpm コマンドで lv の情報を確認します。

$ rpm -qi lv 
Name        : lv                           Relocations: (not relocatable) 
Version     : 4.51                              Vendor: SIOS Technology Inc. 
Release     : 17.el6                        Build Date: 2012年07月31日 16時07分04秒 
Install Date: 2012年07月31日 16時14分55秒      Build Host: centos6-3-64.labs.sios.com 
Group       : Applications/Text             Source RPM: lv-4.51-17.el6.src.rpm 
Size        : 614239                           License: GPLv2+ 
Signature   : RSA/SHA1, 2012年07月31日 16時07分05秒, Key ID d7d84e177306cc2e 
Packager    : SIOS Technology Inc. 
URL         : http://www.ff.iij4u.or.jp/~nrt/lv/ 
Summary     : A Powerful Multilingual File Viewer 
Description : 
lv is a powerful file viewer like less. 
lv can decode and encode multilingual streams through 
many coding systems: ISO-8859, ISO-2022, EUC, SJIS, Big5, 
HZ, Unicode. 
It recognizes multi-bytes patterns as regular 
expressions, lv also provides multilingual grep. 
In addition, lv can recognize ANSI escape sequences 
for text devoration. 

.rpmmacros で定義した vendor 及び packager の値が反映されていることがわかります。また Signature のところを見ると署名した日付と署名に使用したキーの Key ID (フィンガープリントの下16桁)が示されて、パッケージが署名されていることがわかります。

署名については、yum の .repo ファイルで署名のチェックをオンにしていると署名が異なる場合には不正なファイルとしてインストールが中止されます。

x86_64マシンでのビルド

今までビルドに利用してきたシステムは i386 ベースのシステムを利用してきました。しかし作成したソースコード・パッケージは i386x86_64 の両方のアーキテクチャに対応しています。

パッケージを公開するにあたり、すべてのパッケージに署名をいれるために、i386 マシンとx64_64 マシンの両方で出来上がったソースコード・パッケージから署名を入れてパッケージを作り直します。

また、同じ鍵を使用するために作成した ~/.gnupg 配下と .rpmmacros を、ビルドを行うマシンのユーザーのディレクトリにコピーします。

x86_64 マシンでの場合の大まかな手順を確認します。

  • ログイン・ディレクトリに .gnupg 配下と .rpmmacros をコピーする。
  • 開発ツールのインストール
  • Fedora EPEL レポジトリの追加
  • Fedora17 のレポジトリの追加と、repo ファイルの修正
  • システムのアップデート
  • ソースコード・パッケージのインストール
  • zinnia と mozc の作成に依存関係のあるパッケージのインストール
  • zinnia パッケージのビルド rpmbuild に --sign オプションを付ける。
  • 作成された zinnia 関連のパッケージのインストール
  • QT関連の環境変数のリセット
  • mozc のビルドとできたパッケージのインストール

    また、パッケージを公開するためには「パッケージ公開のための作業」で紹介したように署名の入ったパッケージを作成する必要があります。

    今回は mozc のビルドを完了し、パッケージを公開するために必要な署名を入れたパッケージの作成方法を解説しました。

    次回は mozc のインストールと設定方法について解説します。

  • 0 件のコメント:

    コメントを投稿