第3章 ソフトウェアのパッケージ化
3.1. RPM パッケージ
このセクションでは、RPM パッケージ形式の基本を説明します。
3.1.1. RPM とは
RPM パッケージは、他のファイルとそのメタデータ (システムが必要とするファイルに関する情報) を含むファイルです。
特に、RPM パッケージは cpio
アーカイブで設定されています。
cpio
アーカイブには以下が含まれます。
- ファイル
RPM ヘッダー (パッケージのメタデータ)
rpm
パッケージマネージャーはこのメタデータを使用して依存関係、ファイルのインストール先、およびその他の情報を決定します。
RPM パッケージの種類
RPM パッケージには 2 つの種類があります。いずれも、同じファイル形式とツールを使用しますが、コンテンツが異なるため、目的が異なります。
ソース RPM (SRPM)
SRPM には、ソースコードと SPEC ファイルが含まれます。これには、ソースコードをバイナリー RPM にビルドする方法が書かれています。必要に応じて、ソースコードへのパッチも含まれます。
バイナリー RPM
バイナリー RPM には、ソースおよびパッチから構築されたバイナリーが含まれます。
3.1.2. RPM パッケージ化ツールのユーティリティーのリスト表示
以下の手順では、rpmdevtools
パッケージが提供するユーティリティーのリストを表示する方法を示しています。
前提条件
RPM パッケージ化ツールを使用できるようにするには、rpmdevtools
パッケージをインストールする必要があります。
# yum install rpmdevtools
手順
RPM パッケージ化ツールのユーティリティーをリスト表示します。
$ rpm -ql rpmdevtools | grep bin
追加情報
- 上記のユーティリティーの詳細は、各マニュアルページまたはヘルプダイアログを参照してください。
3.1.3. RPM パッケージ化を行うためのワークスペースの設定
本セクションでは、rpmdev-setuptree
ユーティリティーを使用して、RPM のパッケージ化ワークスペースとなるディレクトリーレイアウトを設定する方法を説明します。
前提条件
rpmdevtools
パッケージがシステムにインストールされている必要があります。
# yum install rpmdevtools
手順
-
rpmdev-setuptree
ユーティリティーを実行します。
$ rpmdev-setuptree $ tree ~/rpmbuild/ /home/<username>/rpmbuild/ |-- BUILD |-- RPMS |-- SOURCES |-- SPECS `-- SRPMS 5 directories, 0 files
作成されたディレクトリーは、以下の目的で使用します。
ディレクトリー | 目的 |
BUILD |
パッケージを構築すると、ここにさまざまな |
RPMS |
バイナリー RPM は、さまざまなアーキテクチャーのサブディレクトリー (例: |
SOURCES |
ここでは、このパッケージャーは、圧縮したソースコードアーカイブとパッチを配置します。 |
SPECS | パッケージャーは、SPEC ファイルをここに配置します。 |
SRPMS |
|
3.1.4. SPEC ファイルの概要
SPEC ファイルには、RPM を構築するのに rpmbuild
ユーティリティーが使用するレシピが含まれています。SPEC ファイルは、一連のセクションで命令を定義することで、ビルドシステムに必要な情報を提供します。このセクションは、Preamble と Body で定義されます。Preamble では、Body に使用されている一連のメタデータ項目が含まれています。Body は、命令の主要部分を示しています。
3.1.4.1. Preamble 項目
以下の表では、RPM SPEC ファイルの Preamble セクションで頻繁に使用されるディレクティブの一部を示しています。
SPEC ディレクティブ | 定義 |
---|---|
| SPEC ファイル名と一致する必要があるパッケージのベース名。 |
| ソフトウェアのアップストリームのバージョン番号。 |
|
このバージョンのソフトウェアがリリースされた回数。通常、初期値は 1%{?dist} に設定し、パッケージの新規リリースごとに増加させます。新しい |
| パッケージの 1 行の概要 |
| パッケージ化しているソフトウェアのライセンス。 |
| プログラムに関する詳細情報の完全な URL。多くの場合、この URL は、パッケージ化しているソフトウェアのアップストリームプロジェクトの Web サイトです。 |
| アップストリームのソースコードの圧縮アーカイブへのパスまたは URL (パッチを適用していないものや、パッチは別の場所で処理されます)。これは、たとえば、パッケージャーのローカルストレージではなく、アップストリームページなどのアーカイブの、アクセス可能で信頼できるストレージを参照している必要があります。必要に応じて、SourceX ディレクティブを追加して、たとえば、Source1、Source2、Source3 など、毎回数を増やすことができます。 |
| 必要に応じて、ソースコードに適用する最初のパッチの名前。 ディレクティブは、パッチの末尾に数字を付けて、または付けずに適用できます。 数値を指定しないと、内部的にエントリーに割り当てられます。Patch0、Patch1、Patch2、Patch3 などを使用して、明示的に数字を指定することもできます。 このパッチは、%patch0、%patch1、%patch2 といったマクロを使用して、1 つずつ適用できます。マクロは、RPM SPEC ファイルの Body セクションの %prep ディレクティブ内で適用されます。または、%autounconfined マクロを使用できます。これは、SPEC ファイルに指定されている順序ですべてのパッチを自動的に適用します。 |
|
パッケージがアーキテクチャーに依存していない場合は (たとえば、インタープリター型のプログラミング言語ですべて書かれた場合など)、これを |
|
コンパイル言語で書かれたプログラムを構築するのに必要なコンマ区切りまたは空白区切りのリスト。 |
|
インストール後のソフトウェアの実行に必要なパッケージのコンマ区切りまたは空白区切りのリスト。 |
| ソフトウェアの一部が特定のプロセッサーアーキテクチャーで動作しない場合には、そのアーキテクチャーを除外できます。 |
|
|
|
このディレクティブでは、 |
|
|
Name
のディレクティブ、Version
のディレクティブ、および Release
のディレクティブは、RPM パッケージのファイル名から設定されます。RPM パッケージの担当者やシステム管理者は、これら 3 つのディレクティブを N-V-R または NVR と呼びます。これは、RPM パッケージのファイル名に NAME-VERSION-RELEASE
形式が含まれるためです。
以下の例は、rpm
コマンドを実行して、特定のパッケージの NVR 情報を取得する方法を示しています。
例3.1 bash パッケージの NVR 情報を出力する rpm のクエリー
$ rpm -q bash bash-4.2.46-34.el7.x86_64
ここでは、bash
がパッケージ名で 4.2.46
がバージョン、34.el7
がリリースです。最後のマーカーの x86_64
は、アーキテクチャーを意味しています。NVR とは異なり、アーキテクチャーのマーカーは RPM パッケージャーで直接管理されていませんが、rpmbuild
ビルド環境で定義されます。ただし、これはアーキテクチャーに依存しない noarch
パッケージです。
3.1.4.2. Body 項目
RPM SPEC ファイルの Body セクション
の項目を以下の表にリスト表示します。
SPEC ディレクティブ | 定義 |
---|---|
| RPM でパッケージ化されているソフトウェアの完全な説明。この説明は、複数の行や、複数の段落にまでわたることがあります。 |
|
|
| ソフトウェアをマシンコード (コンパイル言語用) またはバイトコード (インタープリター言語) に構築するための 1 つまたは一連のコマンド。 |
|
|
| ソフトウェアをテストする単一または一連のコマンド。これには通常、ユニットテストなどが含まれます。 |
| エンドユーザーのシステムにインストールされるファイルのリスト。 |
|
異なる |
3.1.4.3. 高度な項目
SPEC ファイルには、Scriptlets や Triggers などの高度な項目を追加することもできます。これは、ビルドプロセスではなく、エンドユーザーのシステムのインストールプロセスのさまざまな地点で有効になります。
3.1.5. BuildRoots
RPM のパッケージ化のコンテキストでは、buildroot
が chroot 環境となります。つまり、ビルドのアーティファクトが、エンドユーザーシステムの今後の階層と同じファイルシステム階層を使用して配置され、buildroot
がルートディレクトリーとして機能します。ビルドアーティファクトの配置は、エンドユーザーシステムのファイルシステム階層の基準に準拠する必要があります。
buildroot
のファイルは、後で dhcpd
アーカイブに置かれ、RPM の主要部分になります。RPM がエンドユーザーのシステムにインストールされている場合、これらのファイルは root
ディレクトリーに抽出され、階層が正しく保持されます。
6 以降では、rpmbuild
プログラムには独自のデフォルトが設定されています。このデフォルト値を上書きすると、問題が発生することがあります。{RH} では、このマクロの値を自身で定義することを推奨していません。%{buildroot}
マクロは、rpmbuild
ディレクトリーのデフォルトで使用できます。
3.1.6. RPM マクロ
rpm マクロ は、特定の組み込み機能が使用されている場合に、ステートメントのオプションの評価に基づいて、条件付きで割り当てられる直接的なテキスト置換です。したがって、RPM は、ユーザーに変わってテキストの置換を行うことができます。
使用例では、SPEC ファイルでパッケージ化されたソフトウェアの Version を複数回参照しています。%{version}
マクロで 1 回だけ Version を定義し、SPEC ファイル全体でこのマクロを使用します。すべては、以前に定義した Version に自動的に置き換えられます。
見たことのないマクロが表示されている場合は、次のコマンドを使用してマクロを評価できます。
$ rpm --eval %{_MACRO}
%{_bindir} マクロおよび %{_libexecdir} マクロの評価
$ rpm --eval %{_bindir} /usr/bin $ rpm --eval %{_libexecdir} /usr/libexec
一般的に使用されるマクロには、%{?dist}
マクロがあります。これは、ビルドに使用されるディストリビューション (ディストリビューションタグ) を示します。
# On a RHEL 8.x machine $ rpm --eval %{?dist} .el8