この記事はRed Hat Developerの RPM packaging: A simplified guide to creating your first RPM を、許可をうけて翻訳したものです。
RPMパッケージングのコンセプトは、初めての人にとっては学ぶべきことが非常に多い印象をうけ、圧倒的されてしまうかもしれません。 この記事では、最小限の知識と経験でRPMを構築することが可能であることを実際に見ていきます。 この記事は出発点として提供しているもので、RPMパッケージ化の完全なガイドではありません。
ASCIIベースのテトリスゲーム
このデモでは、Cで書かれた簡単なASCIIベースのテトリスゲームを選びました、そして比較的簡単なRPMビルドとするためにわずかに調整をします。この記事ではダウンロード可能な例としてVitetrisと呼ばれるゲームを使います。
root以外のユーザーがRPMを構築できるようにするために、RPMパッケージの作成時にエラーが発生しないように、ファイルのオーナーをrootに変更するMakefile内の指定を削除します。 この修正は以下の箇所です。
$ cat Makefile |grep 'INSTALL ' INSTALL = install #INSTALL = install -oroot -groot # rpmをビルドしている非rootユーザーでは不可能なため、RPMビルドが失敗します。
この変更を加えたら、tarボールを同じ名前( vitetris-0.57.tar.gz
)で作成します。
環境を整える
Red Hat Enterprise Linux (RHEL)7システム上に開発環境をインストールし、RPMをビルドするためには以下のリポジトリが必要です: rhel-7-server-rpms
、 rhel-7-server-extras-rpms
、rhel-7-server-optional-rpms
以下のパッケージをインストールする必要があります:
# yum install -y rpm* gcc gpg* rng-tools
インストール時に覚えておくべきことを減らすためrpm*
とgpg*
とワイルドカードを使用しています。
ソフトウェアを手動でコンパイルする
RPMパッケージ作成を成功させるために大切なことは、対象のソフトウェアを理解することです。 まず、ソフトウェアを手動で(できれば、非rootユーザで)コンパイルします。 この例では、 rpmbuilder
ユーザーを使用しています。
tarボール( vitetris-0.57.tar.gz
)を展開してからREADMEファイルを調べます。 この場合、READMEファイルには、ソースコードからゲームをコンパイルすることに関する情報は含まれていません。 一般的には、Cで書かれたオープンソースソフトウェアは、 configure
、 make
、 make install
の3つのステップでコンパイルできます。 しかし、make
単独でソフトウェアがビルドされるかどうかを試してみる価値はあります。
非rootユーザーとして、 makeの実行だけで十分かどうかテストします。
[rpmbuilder@rpm vitetris-0.57]$ make generating src/src-conf.mk ./src-conf.sh 'cc' '' '' ... Done. Now run ./tetris (or make install)
ゲームをテストするには、単に ./tetris
を実行して、ゲームがロードされてプレイできるかどうかを確認します。
ソースコードからビルドした後にTetrisを実行する
GPGキーを作成する
RPMパッケージに署名することでパッケージにさらなる信頼の層を追加します。
rpmbuilder
ユーザーとしてGPGキーを作成するには、 rngd
を実行する(生成プロセスを高速化する)ためにrootアクセス権を持つセッションと、 rpmbuilder
ユーザーとしてX11転送を行うセッションが必要になります。
以下をrootとして実行します。
# rngd -r /dev/urandom
次のエラーが発生した場合は
Failed to init entropy source 2: Intel RDRAND Instruction RNG
以下を試してください:
# rngd -r /dev/urandom -o /dev/random -f
X11転送を使用してrpmbuilder
ユーザーとしてホストにログインします(鍵の生成に必要です)。
$ gpg --gen-key ... Please select what kind of key you want: (1) RSA and RSA (default) (2) DSA and Elgamal (3) DSA (sign only) (4) RSA (sign only) Your selection? 1 RSA keys may be between 1024 and 4096 bits long. What keysize do you want? (2048) Requested keysize is 2048 bits Please specify how long the key should be valid. 0 = key does not expire <n> = key expires in n days <n>w = key expires in n weeks <n>m = key expires in n months <n>y = key expires in n years Key is valid for? (0) Key does not expire at all Is this correct? (y/N) y GnuPG needs to construct a user ID to identify your key. Real name: RPM Build User Email address: rpmbuilder@rpm Comment: RPM Builder GPG Signing Key You selected this USER-ID: "RPM Build User (RPM Builder GPG Signing Key) <rpmbuilder@rpm>" Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O You need a Passphrase to protect your secret key.
X11転送を有効にしている場合に表示されるプロンプト このプロンプトは、X11転送がオンになっている場合にのみ表示されます。
... gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u pub 2048R/EEF6D9AD 2019-03-02 Key fingerprint = 6ED1 2456 B7ED EEC6 D0DF B870 444A 40A7 EEF6 D9AD uid RPM Build User (RPM Builder GPG Signing Key) <rpmbuilder@rpm> sub 2048R/D498F883 2019-03-02
カスタムソフトウェア用のRed Hat Satelliteまたはyumリポジトリ設定で使用するためにキーをエクスポートする必要がある場合は、次のコマンドを使用します。
$ gpg --armor --export -----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2.0.22 (GNU/Linux)
Vitetris用のRPMパッケージを作成する
RPMをビルドするには、まずビルドツリーとspecファイルを作成し、ソースコードを配置します。
$ rpmdev-setuptree $ rpmdev-newspec rpmbuild/SPECS/vitetris.spec rpmbuild/SPECS/vitetris.spec created; type minimal, rpm version >= 4.11. $ cp vitetris-0.57.tar.gz rpmbuild/SOURCES/
specファイルに初期詳細を追加する
まず以下の詳細を記述します。
Name: vitetris Version: 0.57 Release: 1%{?dist} Summary: ASCII based tetris game License: BSD URL: https://www.victornils.net/tetris/ Source0: vitetris-0.57.tar.gz BuildRequires: gcc
不要なセクションを削除
- このソフトウェアには依存関係がないため、
Requires
セクションを削除します - このソフトウェアはconfigureなしで構築できるので、 %configureセクションを削除します。(makeを実行する前にconfigureが必要な場合は保持します。)
descriptionを追加
好きなものを追加できますが、以下のような説明を書きます:
%description vitetris is a multiplayer ASCII-based Tetris game
初期ビルドをテストする
表示された情報でビルドをテストして、表示されるエラーを確認します。
$ rpmbuild -ba rpmbuild/SPECS/vitetris.spec ... RPM build errors: Installed (but unpackaged) file(s) found: /usr/local/bin/tetris /usr/local/share/applications/vitetris.desktop /usr/local/share/doc/vitetris/README /usr/local/share/doc/vitetris/licence.txt /usr/local/share/pixmaps/vitetris.xpm
前のステップのファイルのリストをspecファイルに追加する
次のように、前の手順で表示されたファイルのリストを%filesセクションに追加します。
%files /usr/local/bin/tetris /usr/local/share/applications/vitetris.desktop %doc /usr/local/share/doc/vitetris/README /usr/local/share/doc/vitetris/licence.txt /usr/local/share/pixmaps/vitetris.xpm
文書であることを示す %doc
がREADMEの前に置かれています。 RPMはこれなしでもビルドできます。
ビルドを再実行
$ rpmbuild -ba rpmbuild/SPECS/vitetris.spec Wrote: /home/rpmbuilder/rpmbuild/SRPMS/vitetris-0.57-1.el7.src.rpm Wrote: /home/rpmbuilder/rpmbuild/RPMS/x86_64/vitetris-0.57-1.el7.x86_64.rpm Wrote: /home/rpmbuilder/rpmbuild/RPMS/x86_64/vitetris-debuginfo-0.57-1.el7.x86_64.rpm Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.AqR4Aq + umask 022 + cd /home/rpmbuilder/rpmbuild/BUILD + cd vitetris-0.57 + /usr/bin/rm -rf /home/rpmbuilder/rpmbuild/BUILDROOT/vitetris-0.57-1.el7.x86_64 + exit 0
RPMパッケージに署名する
RPMへの署名は以下のようにするだけです:
$ rpmsign --addsign /home/rpmbuilder/rpmbuild/RPMS/x86_64/vitetris-0.57-1.el7.x86_64.rpm Enter pass phrase: Pass phrase is good. /home/rpmbuilder/rpmbuild/RPMS/x86_64/vitetris-0.57-1.el7.x86_64.rpm:
このエラーが発生した場合:
You must set "%_gpg_name" in your macro file
公開鍵の値を%_gpg_name で指定します。
$ gpg --list-keys /home/rpmbuilder/.gnupg/pubring.gpg ----------------------------------- pub 2048R/EEF6D9AD 2019-03-02 uid RPM Build User (RPM Builder GPG Signing Key) <rpmbuilder@rpm> sub 2048R/D498F883 2019-03-02 $ echo "%_gpg_name EEF6D9AD" >> .rpmmacros
再試行します:
$ rpmsign --addsign /home/rpmbuilder/rpmbuild/RPMS/x86_64/vitetris-0.57-1.el7.x86_64.rpm Enter pass phrase: Pass phrase is good. /home/rpmbuilder/rpmbuild/RPMS/x86_64/vitetris-0.57-1.el7.x86_64.rpm:
rootユーザーとしてRPMのインストール/アンインストールをテストします。
# rpm -i /home/rpmbuilder/rpmbuild/RPMS/x86_64/vitetris-0.57-1.el7.x86_64.rpm warning: /home/rpmbuilder/rpmbuild/RPMS/x86_64/vitetris-0.57-1.el7.x86_64.rpm: Header V4 RSA/SHA1 Signature, key ID eef6d9ad: NOKEY # /usr/local/bin/tetris
RPMをアンインストールします。
# rpm -qa |grep tetris vitetris-0.57-1.el7.x86_64 =# rpm -e vitetris-0.57-1.el7.x86_64 # /usr/local/bin/tetris -bash: /usr/local/bin/tetris: No such file or directory
おわりに
パッケージ化しようとしているソフトウェアによっては、カスタムRPMパッケージ作成は困難な場合があります。 この記事では、多くの場合にデフォルト設定で十分RPMを構築できることをデモンストレーションするため、できる限り作業を少なくしています。
もっと詳しく知りたい方は、 Red HatのRPM Packaging guideを参照してください。