ソフトウェアのパッケージ化および配布
RPM パッケージ管理システムを使用したソフトウェアのパッケージ化
概要
Red Hat ドキュメントへのフィードバック (英語のみ) リンクのコピーリンクがクリップボードにコピーされました!
Red Hat は質の高いドキュメントを提供することに尽力しており、皆様からのフィードバックを大切にしています。改善にご協力いただくため、Red Hat Jira トラッキングシステムを通じてご提案やエラー報告をお寄せください。
手順
Jira の Web サイトにログインします。
アカウントがない場合、アカウント作成オプションを選択します。
- 上部のナビゲーションバーで Create をクリックします。
- Summary フィールドにわかりやすいタイトルを入力します。
- Description フィールドに、ドキュメントの改善に関するご意見を記入してください。ドキュメントの該当部分へのリンクも追加してください。
- ウィンドウ下部の Create をクリックします。
第1章 RPM の概要 リンクのコピーリンクがクリップボードにコピーされました!
RPM Package Manager (RPM) は、Red Hat Enterprise Linux (RHEL)、CentOS、および Fedora で実行できるパッケージ管理システムです。RPM を使用すると、これらのオペレーティングシステム用に作成したソフトウェアを配布、管理、および更新できます。
RPM パッケージ管理システムには、従来のアーカイブファイルでソフトウェアを配布する場合と比べて、次のような利点があります。
- RPM は、ソフトウェアを個別にインストール、更新、または削除できるパッケージの形式で管理されるため、オペレーティングシステムのメンテナンスが容易になります。
- RPM パッケージは圧縮アーカイブと同様にスタンドアロンのバイナリーファイルであるため、RPM によりソフトウェアの配布が簡素化されます。これらのパッケージは、特定のオペレーティングシステムとハードウェアアーキテクチャー向けにビルドされています。RPM には、コンパイルされた実行可能ファイルやライブラリーなどのファイルが含まれています。これらのファイルは、パッケージのインストール時にファイルシステム上の適切なパスに配置されます。
RPM を使用すると、次のタスクを実行できます。
- パッケージ化されたソフトウェアをインストール、アップグレード、削除する。
- パッケージソフトウェアの詳細情報を問い合わせる。
- パッケージ化されたソフトウェアの整合性を検証する。
- ソフトウェアソースから独自のパッケージをビルドし、ビルド手順を完了する。
- GNU Privacy Guard (GPG) ユーティリティーを使用して、パッケージにデジタル署名する。
- パッケージを DNF リポジトリーに公開する。
RHEL では、RPM は DNF や PackageKit といった上位レベルのパッケージ管理ソフトウェアに完全に統合されています。RPM には独自のコマンドラインインターフェイスが用意されていますが、ほとんどのユーザーはこのようなソフトウェアを通じて RPM を操作するだけで済みます。ただし、RPM パッケージをビルドする場合は、rpmbuild(8) などの RPM ユーティリティーを使用する必要があります。
1.1. RPM パッケージ リンクのコピーリンクがクリップボードにコピーされました!
RPM パッケージは、Red Hat Enterprise Linux (RHEL) にこれらのファイルをインストールおよび削除するために使用されるファイルとメタデータのアーカイブで設定されています。
具体的には、RPM パッケージには次の要素が含まれています。
GPG 署名
GPG 署名は、パッケージの整合性を検証するために使用されます。
ヘッダー (パッケージのメタデータ)
RPM パッケージマネージャーは、このメタデータを使用して、パッケージの依存関係、ファイルのインストール先、その他の情報を確認します。
ペイロード
ペイロードは、システムにインストールするファイルを含む
cpioアーカイブです。
RPM パッケージには 2 つの種類があります。いずれも、同じファイル形式とツールを使用しますが、コンテンツが異なるため、目的が異なります。
ソース RPM (SRPM)
SRPM には、ソースコードと、ソースコードをバイナリー RPM にビルドする方法を記述した
specファイルが含まれています。必要に応じて、SRPM にはソースコードへのパッチを含めることができます。バイナリー RPM
バイナリー RPM には、ソースおよびパッチから構築されたバイナリーが含まれます。
1.2. RPM パッケージ化ユーティリティーのリスト リンクのコピーリンクがクリップボードにコピーされました!
パッケージをビルドするための rpmbuild(8) プログラムに加えて、RPM は Red Hat Enterprise Linux (RHEL) 上でパッケージを作成するプロセスを容易にするための他のユーティリティーも提供しています。
rpmdevtools パッケージには、その他の RPM パッケージングユーティリティーが含まれています。詳細は、お使いのシステムの rpmdevtools の man ページを参照してください。
前提条件
rpmdevtoolsパッケージがインストールされている。# dnf install rpmdevtools
手順
RPM パッケージ化ユーティリティーをリスト表示するには、次のいずれかの方法を使用します。
rpmdevtoolsパッケージによって提供される特定のユーティリティーとその簡単な説明をリストするには、次のように入力します。$ rpm -qi rpmdevtoolsすべてのユーティリティーをリストするには、次のように入力します。
$ rpm -ql rpmdevtools | grep ^/usr/bin
第2章 RPM パッケージ化ワークスペースのセットアップ リンクのコピーリンクがクリップボードにコピーされました!
RPM パッケージをビルドするには、まず、特別なワークスペースを作成する必要があります。このワークスペースは、さまざまなパッケージ化のために使用するディレクトリーで構成されています。
2.1. RPM パッケージ化ワークスペースの設定 リンクのコピーリンクがクリップボードにコピーされました!
RPM パッケージングワークスペースを設定して、ソフトウェアパッケージングのための環境を準備します。
RPM パッケージ化ワークスペースを設定するには、rpmdev-setuptree ユーティリティーを使用してディレクトリーレイアウトを設定できます。
前提条件
RPM をパッケージ化するためのユーティリティーを提供する
rpmdevtoolsパッケージをインストールした。# dnf install rpmdevtools
手順
rpmdev-setuptreeユーティリティーを実行します。$ rpmdev-setuptreeパッケージングワークスペースディレクトリーを設定します。
$ tree ~/rpmbuild//home/user/rpmbuild/ |-- BUILD |-- RPMS |-- SOURCES |-- SPECS `-- SRPMS 5 directories, 0 files
2.2. RPM パッケージ化ワークスペースディレクトリー リンクのコピーリンクがクリップボードにコピーされました!
RPM パッケージングワークスペースを設定するために rpmdev-setuptree ユーティリティーが作成する以下のディレクトリーを確認してください。
| ディレクトリー | 目的 |
|---|---|
|
|
|
|
|
バイナリー RPM は、さまざまなアーキテクチャー用のサブディレクトリーの |
|
|
圧縮されたソースコードのアーカイブとパッチが格納されます。 |
|
|
パッケージャーによって作成された |
|
|
|
第3章 RPM マクロ リンクのコピーリンクがクリップボードにコピーされました!
RPM マクロは、単純なテキスト置換に加えて、さまざまな文字列操作、式の評価、オペレーティングシステム (OS) との対話、その他のアクションを実行できる、直接的なテキスト置換です。
3.1. 組み込みの RPM マクロの表示 リンクのコピーリンクがクリップボードにコピーされました!
Red Hat Enterprise Linux (RHEL) システムに組み込まれている RPM マクロのリストを表示します。RPM には、複数の組み込みマクロが用意されています。これを使用すると、パッケージのメンテナンスを簡素化し、パッケージ間で一貫性を保つことができます。
手順
組み込みの RPM マクロを表示します。
$ rpm --showrc|grep "<builtin>”
3.2. RPM ディストリビューションマクロの表示 リンクのコピーリンクがクリップボードにコピーされました!
お使いの Red Hat Enterprise Linux (RHEL) システムの RPM ディストリビューションマクロを表示します。
各ディストリビューションは、パッケージ化の対象となるソフトウェアの実装言語や、そのディストリビューション固有のガイドラインに基づき、それぞれ異なる推奨 RPM マクロのセットを提供しています。推奨される RPM マクロのセットは、多くの場合、DNF パッケージマネージャーを使用してインストールできる RPM パッケージの形式で提供されます。インストール済みのマクロファイルは /usr/lib/rpm/macros.d/ ディレクトリーにあります。
詳細は、システム上の rpm man ページを参照してください。
手順
RPM マクロの定義そのものを表示します。
$ rpm --showrcマクロの機能と、RPM をパッケージ化するときにマクロがどのように役立つかを確認します。
$ rpm --showrc | grep <macro_name>オプション: お使いのシステムの RPM バージョンに対応する RPM マクロに関する情報を表示します。
$ rpm -ql rpm | grep macros
3.3. マクロを使用した RPM の動作のカスタマイズ リンクのコピーリンクがクリップボードにコピーされました!
RPM マクロを編集することで、RPM の動作をカスタマイズできます。
組み込みのマクロを除き、~/.rpmmacros ファイル内のすべてのマクロをカスタムマクロでオーバーライドできます。行った変更は、同じホームディレクトリーを共有するすべてのシステム上のあらゆるビルドに影響します。
マシンごとにマクロをオーバーライドするには、そのマクロを /etc/rpm/macros.* ファイルに配置してください。
パッケージ化の際に ~/.rpmmacros ファイルで定義した新しいマクロを使用することは推奨しません。そのようなマクロは他のマシンにはおそらく存在しませんが、そのマシン上で他のユーザーがパッケージの再ビルドを試みる可能性があります。
手順
マクロをカスタマイズします。
%_topdir /opt/<directory>/rpmbuildrpmdev-setuptreeユーティリティーを使用して、すべてのサブディレクトリーを含む<directory>を作成できます。このマクロの値はデフォルトでは
~/rpmbuildであることに注意してください。
3.4. spec ファイルでのカスタム RPM マクロの定義 リンクのコピーリンクがクリップボードにコピーされました!
パッケージのメンテナンスを簡素化し、パッケージ間で一貫性を保つために、組み込みの RPM マクロや配布用 RPM マクロに加えて、カスタム RPM マクロを定義します。RPM の spec ファイルでは、%define マクロと %global マクロのいずれかを使用できます。
%define マクロと %global マクロの違いは次のとおりです。
-
%defineはグローバルスコープを持ちます。ただし、パラメトリックマクロ内で使用される場合、そのスコープはそのマクロ内に限定されます。%defineマクロの本体は使用時に展開されます。 -
%globalはグローバルスコープを持ちます。%globalマクロの本体は定義時に展開されます。
次の操作を行う場合は、%global マクロを使用してください。
- 重複した複数の評価を避ける
- パラメトリックマクロ内でグローバルマクロを定義する
それ以外の場合は、%define マクロを使用してください。
%define および %global マクロは、%global <name> <body> または %define <name>[(opts)] <body> というパターンを使用します。
-
<body>を囲む前後のすべての空白は、マクロの展開時に削除されます。 -
マクロ名は、英数字とアンダースコア (
_) 文字で構成されている場合があります。 (opts)フィールドの指定は任意です。-
単純なマクロには
(opts)フィールドは含まれません。この場合、再帰的なマクロ展開のみが実行されます。 -
パラメトリックオプションを指定したマクロは、引数や使用可能なオプションを受け取る関数のようなマクロです。詳細は、
/usr/share/doc/rpm/macros.mdファイルを参照してください。
-
単純なマクロには
マクロは、ハッシュ (#) を使用してコメント化された行や、%changelog などの spec ファイルのセクション内でも、spec ファイル内のすべての場所で評価および展開されます。
マクロの展開をエスケープするには、次の新しい行までの内容をすべてコメントアウトする %dnl マクロを使用できます。
マクロの前にパーセント記号 (%) をもう 1 つ配置することで、マクロの展開をエスケープすることもできます (例: %%{name})。
マクロの詳細は、/usr/share/doc/rpm/macros.md ファイルを参照してください。
手順
マクロを定義します。たとえば、RPM
specファイルに次の行を含めることができます。%define date 20241114 %define upstream_version 2.5.4-pre1
3.5. spec の %files セクションの一般的な RPM ディレクティブ リンクのコピーリンクがクリップボードにコピーされました!
spec ファイルの %files セクションで、以下の RPM ディレクティブを使用してください。
| マクロ | 定義 |
|---|---|
|
|
|
|
|
重要
ドキュメントは、イメージのディスク領域節約などのために、パッケージのインストール時に除外することができます。ライセンスファイルはドキュメントファイルのように見えるかもしれませんが、常にソフトウェアと一緒にインストールする必要があります。したがって、ライセンスファイルには
|
|
|
使用例:
|
|
|
使用例:
|
3.6. %autosetup および %setup マクロ リンクのコピーリンクがクリップボードにコピーされました!
%patch ディレクティブを使用して各パッチを手動で指定する代わりに、%autosetup マクロを使用してソースアーカイブを展開し、パッチを自動的に適用します。
%autosetup は、spec ファイル内に記載されている順序でパッチを適用します。予期しない動作を回避するために、spec 内ではソースとパッチを常にその番号順に並べるようにしてください。または、%patchlist や番号なしの Patch エントリーを使用して、番号付けそのものを避けるようにしてください。
%setup マクロを使用して、RPM パッケージをビルドするためのソースアーカイブを展開することもできます。
可能な場合は、%setup マクロの代わりに %autosetup マクロを使用してください。
3.6.1. %autosetup マクロのオプション リンクのコピーリンクがクリップボードにコピーされました!
以下の %autosetup マクロオプションを使用して、その動作を制御します。%autosetup はすべての %setup マクロオプションも受け取ります。
%autosetup マクロのオプションは、組み合わせて使用できます。
詳細は、システム上の patch(1) man ページを参照してください。
| マクロのオプション | 説明 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
3.6.2. %autopatch マクロのオプション リンクのコピーリンクがクリップボードにコピーされました!
%autopatch マクロは、spec ファイルで指定されている順序ですべてのパッチを適用します。以下の %autopatch マクロオプションを使用して、その動作を制御します。
%autopatch マクロのオプションは、組み合わせて使用できます。
詳細は、システム上の patch(1) man ページを参照してください。
| マクロのオプション | 説明 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3.6.3. %setup マクロのオプション リンクのコピーリンクがクリップボードにコピーされました!
ソースアーカイブの展開を制御するには、以下の %setup マクロオプションを使用してください。
%setup マクロのオプションは、組み合わせて使用できます。
| マクロのオプション | 説明 |
|---|---|
|
|
|
|
|
たとえば、このオプションは、展開したソースコードアーカイブのディレクトリーの名前が、想定されるもの (
|
|
|
このディレクトリーはアーカイブの展開後も変更されません。 |
|
|
|
|
|
|
|
|
たとえば、サンプルが別の
|
|
|
たとえば、
|
第4章 RPM パッケージ化を行うためのソフトウェアの作成 リンクのコピーリンクがクリップボードにコピーされました!
Red Hat Enterprise Linux (RHEL) 上での RPM パッケージング用に、ソフトウェアのソースコードを準備してください。
4.1. ソースコードとは リンクのコピーリンクがクリップボードにコピーされました!
ソースコードとは、人間が判読できるコンピューターへの命令で、計算の実行方法を記述したものです。ソースコードは、プログラミング言語で書かれています。
3 つの異なるプログラミング言語で書かれた次のバージョンの Hello World プログラムにより、RPM パッケージマネージャーの主な使用例を説明します。
Bash で書かれた
Hello Worldbello プロジェクトでは、Bash で
Hello Worldを実装します。この実装にはbelloシェルスクリプトのみが含まれています。このプログラムの目的は、コマンドラインでHello Worldを出力することです。belloファイルには次の内容が含まれています。#!/bin/bash printf "Hello World\n"
Python で書かれた
Hello Worldpello プロジェクトでは、Python で
Hello Worldを実装します。この実装にはpello.pyプログラムのみが含まれています。このプログラムの目的は、コマンドラインでHello Worldを出力することです。pello.pyファイルには次の内容が含まれています。#!/usr/bin/python3 print("Hello World")
C で書かれた
Hello Worldcello プロジェクトは、C で
Hello Worldを実装しています。この実装にはcello.cとMakefileファイルのみが含まれています。したがって、作成されるtar.gzアーカイブには、LICENSEファイルに加えて 2 つのファイルが含まれます。このプログラムの目的は、コマンドラインでHello Worldを出力することです。cello.cファイルには次の内容が含まれています。#include <stdio.h> int main(void) { printf("Hello World\n"); return 0; }
パッケージ化プロセスは、Hello World プログラムのバージョンごとに異なります。
4.2. ソフトウェアの作成方法 リンクのコピーリンクがクリップボードにコピーされました!
人間が読めるソースコードを、ソフトウェアをネイティブコンパイルまたはインタープリター方式でコンパイルすることにより、機械語に変換できます。
4.2.1. ネイティブにコンパイルされたソフトウェア リンクのコピーリンクがクリップボードにコピーされました!
ネイティブにコンパイルされたソフトウェアは、生成されたバイナリーの実行ファイルでマシンコードにコンパイルされるプログラミング言語で書かれたソフトウェアです。ネイティブにコンパイルされたソフトウェアはスタンドアロンソフトウェアです。
ネイティブにコンパイルされた RPM パッケージは、アーキテクチャー固有のパッケージです。
64 ビット (x86_64) AMD または Intel のプロセッサーを使用するコンピューターでこのようなソフトウェアをコンパイルすると、32 ビット (x86) AMD または Intel プロセッサーでは実行できません。生成されるパッケージには、名前でアーキテクチャーが指定されています。
4.2.2. インタープリター型ソフトウェア リンクのコピーリンクがクリップボードにコピーされました!
Bash や Python などの一部のプログラミング言語は、マシンコードにコンパイルされません。代わりに、言語インタープリターまたは言語仮想マシンが、事前の変換を行わずにプログラムのソースコードを逐次実行します。
インタープリター型のプログラミング言語でのみ書かれたソフトウェアは、アーキテクチャーに依存しません。そのため、作成される RPM パッケージの名前には noarch 文字列が付きます。
インタープリター言語で書かれたソフトウェアは、そのまま解釈することも、バイトコンパイルすることもできます。
そのまま解釈されるソフトウェア
このタイプのソフトウェアをコンパイルする必要はありません。そのまま解釈されるソフトウェアは、インタープリターによって直接実行されます。
バイトコンパイルされるソフトウェア
このタイプのソフトウェアはまずバイトコードにコンパイルする必要があり、その後言語仮想マシンによって実行されます。
注記一部のバイトコンパイル言語は、そのまま解釈することも、バイトコンパイルすることもできます。
RPM を使用してソフトウェアをビルドおよびパッケージ化する方法は、これら 2 つのソフトウェアタイプで異なることに注意してください。
4.3. ソースからのソフトウェアのビルド リンクのコピーリンクがクリップボードにコピーされました!
コンパイル言語で記述されたソフトウェアをソースコードから実行可能なソフトウェアアーティファクトにビルドします。
4.3.1. ネイティブにコンパイルされたコードからのソフトウェアのビルド リンクのコピーリンクがクリップボードにコピーされました!
コンパイル言語で記述されたソフトウェアを、手動または自動ビルドを使用して実行可能ファイルに変換する。
4.3.1.1. サンプル C プログラムを手動ビルド リンクのコピーリンクがクリップボードにコピーされました!
コンパイル言語で書かれたソフトウェアを手動でビルドする。
C で書かれたサンプルの Hello World プログラム (cello.c) には次の内容が含まれています。
#include <stdio.h>
int main(void) {
printf("Hello World\n");
return 0;
}
手順
GNU コンパイラーコレクションから C コンパイラーを呼び出して、ソースコードをバイナリーにコンパイルします。
$ gcc -g -o cello cello.c作成されたバイナリー
celloを実行します。$ ./celloHello World
4.3.1.2. サンプル C プログラムの自動ビルドの設定 リンクのコピーリンクがクリップボードにコピーされました!
実際には、すべてのソフトウェアは自動ビルドを利用している。Makefile ファイルを作成し、GNU make ユーティリティーを実行することで、自動ビルドを設定します。
手順
次の内容を含む
Makefileファイルをcello.cと同じディレクトリーに作成します。cello: gcc -g -o cello cello.c clean: rm cellocello:とclean:の下の行は、行頭にタブ文字 (タブ) を追加する必要があることに注意してください。ソフトウェアをビルドします。
$ makemake: 'cello' is up to date.すでにカレントディレクトリーにビルドが存在するため、以下の手順を繰り返してください。
make cleanコマンドを入力してください。$ make cleanrm cellomakeコマンドを入力してください。$ makegcc -g -o cello cello.cGNU
makeシステムが既存のバイナリーを検出するため、この時点でプログラムを再度ビルドしても効果がないことに注意してください。$ makemake: 'cello' is up to date.
プログラムを実行します。
$ ./celloHello World
4.3.2. ソースコードの解釈 リンクのコピーリンクがクリップボードにコピーされました!
コンパイル言語で書かれたソースコードをバイトコンパイルし、シェルスクリプト言語で書かれたソースコードを直接実行可能にする。
- バイトコンパイル
ソフトウェアのバイトコンパイル手順は、次の要素によって異なります。
- プログラミング言語
- 言語の仮想マシン
- その言語で使用するツールおよびプロセス
注記たとえば Python で書かれたソフトウェアをバイトコンパイルできます。配布を目的とした Python ソフトウェアは多くの場合バイトコンパイルされますが、このドキュメントで説明されている方法では行われません。説明されている手順は、コミュニティー標準に準拠することではなく、簡素化することを目的としたものです。実際の Python ガイドラインは Software Packaging and Distribution を参照してください。
Python ソースコードは、そのまま解釈することもできます。ただし、バイトコンパイルされたバージョンの方が高速です。したがって、RPM パッケージの作成者は、エンドユーザーに配布するために、バイトコンパイルされたバージョンをパッケージ化する傾向があります。
- 直接解釈
- Bash などのシェルスクリプト言語で書かれたソフトウェアは、常に直接解釈によって実行されます。
4.3.2.1. サンプル Python プログラムのバイトコンパイル リンクのコピーリンクがクリップボードにコピーされました!
ソフトウェアのパフォーマンスを向上させるために、サンプル Python ソースコードをバイトコンパイルします。Python コードは生のコードを直接解釈することもできますが、バイトコンパイルされたコードの方が高速に動作します。
Python ソースコードの直接解釈ではなくバイトコンパイルを選択すると、より高速なソフトウェアを作成できます。
Python プログラミング言語で書かれたサンプルの Hello World プログラム (pello.py) には、次の内容が含まれています。
print("Hello World")
手順
pello.pyファイルをバイトコンパイルします。$ python -m compileall pello.pyファイルのバイトコンパイルされたバージョンが作成されたことを確認します。
$ ls pass:[pycache]pello.cpython-311.pyc出力内のパッケージのバージョンは、インストールされている Python のバージョンによって異なる場合があることに注意してください。
pello.pyでプログラムを実行します。$ python pello.pyHello World
4.3.2.2. サンプル Bash プログラムの直接解釈 リンクのコピーリンクがクリップボードにコピーされました!
Bash のソースコードを直接実行可能にする。
Bash シェルの組み込み言語で書かれたサンプルの Hello World プログラム (bello) には、次の内容が含まれています。
#!/bin/bash
printf "Hello World\n"
bello ファイルの先頭にある シバン (#!) 記号は、プログラミング言語のソースコードの一部ではありません。
シバン を使用して、テキストファイルを実行可能ファイルに変換します。システムのプログラムローダーが、シバン を含む行を解析してバイナリー実行可能ファイルへのパスを取得し、それがプログラミング言語インタープリターとして使用されます。
手順
ソースコードを含むファイルを実行可能ファイルにします。
$ chmod +x bello作成したファイルを実行します。
$ ./belloHello World
第5章 RPM パッケージ化を行うためのソフトウェアの準備 リンクのコピーリンクがクリップボードにコピーされました!
RPM を使用してソフトウェアをパッケージ化する準備をするには、まずソフトウェアにパッチを適用し、LICENSE ファイルを作成して、それを tarball 形式でアーカイブします。
5.1. ソフトウェアへのパッチの適用 リンクのコピーリンクがクリップボードにコピーされました!
ソフトウェアをパッケージ化する場合、バグの修正や設定ファイルの変更など、元のソースコードに特定の変更を加えることが必要になる場合があります。RPM パッケージでは、元のソースコードを変更せずにそのままにして、パッチを適用することができます。
パッチは、ソースコードファイルを更新するテキストです。パッチは 2 つのバージョンのテキストの差を示すものであるため、diff 形式を使用します。diff ユーティリティーを使用してパッチを作成し、patch ユーティリティーを使用してそのパッチをソースコードに適用できます。
ソフトウェア開発者は多くの場合、Git などのバージョン管理システムを使用してコードベースを管理します。このようなツールでは、diff やパッチソフトウェアを独自の方法で作成できます。
5.1.1. サンプル C プログラムのパッチファイルの作成 リンクのコピーリンクがクリップボードにコピーされました!
diff ユーティリティーを使用して、C 言語で書かれたサンプル Hello World プログラム (cello.c) の元のソースコードからパッチを作成します。このパッチを適用することで、元のソースコードを変更することなく、パッケージ化されたソフトウェアに変更を加えることができます。
詳細は、お使いのシステムの diff(1) man ページを参照してください。
前提条件
システムに
diffユーティリティーをインストールした。# dnf install diffutils
手順
元のソースコードをバックアップします。
$ cp -p cello.c cello.c.orig-pオプションは、モード、所有権、およびタイムスタンプを保持します。必要に応じて
cello.cを変更します。#include <stdio.h> int main(void) { printf("Hello World from my very first patch!\n"); return 0; }パッチを生成します。
$ diff -Naur cello.c.orig cello.c--- cello.c.orig 2016-05-26 17:21:30.478523360 -0500 +++ cello.c 2016-05-27 14:53:20.668588245 -0500 @@ -1,6 +1,6 @@ #include<stdio.h> int main(void){ - printf("Hello World!\n"); + printf("Hello World from my very first patch!\n"); return 0; } \ No newline at end of file+で始まる行は、-で始まる行を置き換えます。注記diffコマンドにはNaurオプションを指定することを推奨します。ほとんどのユースケースに適しているためです。-N(--new-file)-Nオプションは、存在しないファイルを空のファイルとして処理します。-a(--text)-aオプションは、すべてのファイルをテキストとして扱います。その結果、diffユーティリティーがバイナリーとして分類されたファイルを無視しなくなります。-u(-U NUMまたは--unified[=NUM])-uオプションは、統一されたコンテキストの出力の NUM 行 (デフォルトは 3 行) の形式で出力を返します。これは、パッチファイルで一般的に使用される、コンパクトで読みやすい形式です。-r(--recursive)-rオプションは、diffユーティリティーが検出したサブディレクトリーを再帰的に比較します。
ただし、この場合は、
-uオプションのみが必要であることに注意してください。ファイルにパッチを保存します。
$ diff -Naur cello.c.orig cello.c > cello.patch元の
cello.cを復元します。$ mv cello.c.orig cello.c重要RPM パッケージマネージャーは RPM パッケージをビルドするときに、変更されたファイルではなく元のファイルを使用するため、元の
cello.cを保持する必要があります。詳細は、spec ファイルでの作業 を参照してください。
5.1.2. サンプル C プログラムへのパッチ適用 リンクのコピーリンクがクリップボードにコピーされました!
パッチ ユーティリティーを使用して、C 言語で書かれたサンプル Hello World プログラム (cello.c) にコードパッチを適用します。
前提条件
システムに
patchユーティリティーをインストールした。# dnf install patch- 元のソースコードからパッチを作成した。手順は、サンプル C プログラムのパッチファイルの作成 参照してください。
手順
パッチファイルの出力先を
patchコマンド変更します。$ patch < cello.patchpatching file cello.ccello.cの内容に必要な変更が反映されていることを確認します。$ cat cello.c#include<stdio.h> int main(void){ printf("Hello World from my very first patch!\n"); return 1; }
検証
パッチを適用した
cello.cプログラムをビルドします。$ makegcc -g -o cello cello.cビルドした
cello.cプログラムを実行します。$ ./celloHello World from my very first patch!
5.2. LICENSE ファイルの作成 リンクのコピーリンクがクリップボードにコピーされました!
ソフトウェアを適切に使用できるようにするには、RPM パッケージに必要な著作権情報と法的情報を含むライセンスファイルを作成してください。パッケージ化の目的上、パッケージ化するソフトウェアにはライセンスファイルも同梱する必要があります。
ソフトウェアは、ソフトウェアライセンスとともに配布することを推奨します。ソフトウェアライセンスファイルには、ユーザーがソースコードに関して何ができるか、何ができないかが記載されています。ソースコードに対するライセンスがないということは、そのコードに対するすべての権利を作成者が保持し、誰もソースコードから複製、配布、または派生著作物を作成できないことを意味します。
手順
必要なライセンスステートメントを含む
LICENSEファイルを作成します。$ vim LICENSEたとえば、GPLv3
LICENSEファイルには次のようなテキストが含まれています。$ cat /tmp/LICENSEThis program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see \http://www.gnu.org/licenses/.
5.3. 配布用ソースコードアーカイブの作成 リンクのコピーリンクがクリップボードにコピーされました!
ソフトウェアを配布用に準備するには、ソースコードと必要なコンポーネントをアーカイブファイルにまとめてください。
アーカイブファイルは、.tar.gz または .tgz 接尾辞を持つファイルです。ソースコードのアーカイブは、後で配布用にパッケージ化するソフトウェアのリリース方法として一般的です。
5.3.1. サンプル Bash プログラムのソースコードアーカイブの作成 リンクのコピーリンクがクリップボードにコピーされました!
配布用のサンプル Bash プログラムを作成するには、ソースコードと必要なコンポーネントをアーカイブファイルにまとめます。
bello プロジェクトは、Bash の Hello World ファイルです。次の例には、bello シェルスクリプトのみが含まれています。したがって、作成される tar.gz アーカイブには、LICENSE ファイルのほかにファイルが 1 つだけ含まれます。
patch ファイルは、プログラムとともにアーカイブで配布されません。RPM パッケージマネージャーは、RPM のビルド時にパッチを適用します。パッチは、tar.gz アーカイブとともに ~/rpmbuild/SOURCES/ ディレクトリーに配置されます。
前提条件
-
belloプログラムのバージョン0.1を使用する。 -
LICENSEファイルを作成した。手順は、LICENSE ファイルの作成 を参照してください。
手順
必要なファイルをすべて 1 つのディレクトリーに移動します。
$ mkdir bello-0.1$ mv ~/bello bello-0.1/$ mv LICENSE bello-0.1/配布用のアーカイブを作成します。
$ tar -cvzf bello-0.1.tar.gz bello-0.1bello-0.1/ bello-0.1/LICENSE bello-0.1/bello作成したアーカイブを
~/rpmbuild/SOURCES/ディレクトリーに移動します。これは、rpmbuildコマンドがパッケージをビルドするためのファイルを保存するデフォルトのディレクトリーです。$ mv bello-0.1.tar.gz ~/rpmbuild/SOURCES/
5.3.2. サンプル Python プログラムのソースコードアーカイブの作成 リンクのコピーリンクがクリップボードにコピーされました!
配布用のサンプル Python プログラムを作成するには、ソースコードと必要なコンポーネントをアーカイブファイルにまとめます。
pello プロジェクトは、Python の Hello World ファイルです。次の例には、pello.py プログラムのみが含まれています。したがって、作成される tar.gz アーカイブには、LICENSE ファイルのほかにファイルが 1 つだけ含まれます。
patch ファイルは、プログラムとともにアーカイブで配布されません。RPM パッケージマネージャーは、RPM のビルド時にパッチを適用します。パッチは、tar.gz アーカイブとともに ~/rpmbuild/SOURCES/ ディレクトリーに配置されます。
前提条件
-
pelloプログラムのバージョン0.1.1を使用する。 -
LICENSEファイルを作成した。手順は、LICENSE ファイルの作成 を参照してください。
手順
必要なファイルをすべて 1 つのディレクトリーに移動します。
$ mkdir pello-0.1.1$ mv pello.py pello-0.1.1/$ mv LICENSE pello-0.1.1/配布用のアーカイブを作成します。
$ tar -cvzf pello-0.1.1.tar.gz pello-0.1.1pello-0.1.1/ pello-0.1.1/LICENSE pello-0.1.1/pello.py作成したアーカイブを
~/rpmbuild/SOURCES/ディレクトリーに移動します。これは、rpmbuildコマンドがパッケージをビルドするためのファイルを保存するデフォルトのディレクトリーです。$ mv pello-0.1.1.tar.gz ~/rpmbuild/SOURCES/
5.3.3. サンプル C プログラムのソースコードアーカイブの作成 リンクのコピーリンクがクリップボードにコピーされました!
配布用のサンプル C プログラムを作成するには、ソースコードと必要なコンポーネントをアーカイブファイルにまとめます。
cello プロジェクトは、C 言語で書かれた Hello World ファイルです。以下の例には、cello.c ファイルと Makefile ファイルのみが含まれています。したがって、作成される tar.gz アーカイブには、LICENSE ファイルに加えて 2 つのファイルが含まれます。
patch ファイルは、プログラムとともにアーカイブで配布されません。RPM パッケージマネージャーは、RPM のビルド時にパッチを適用します。パッチは、tar.gz アーカイブとともに ~/rpmbuild/SOURCES/ ディレクトリーに配置されます。
前提条件
-
celloプログラムのバージョン1.0を使用する。 -
LICENSEファイルを作成した。手順は、LICENSE ファイルの作成 を参照してください。
手順
必要なファイルをすべて 1 つのディレクトリーに移動します。
$ mkdir cello-1.0$ mv cello.c cello-1.0/$ mv Makefile cello-1.0/$ mv LICENSE cello-1.0/配布用のアーカイブを作成します。
$ tar -cvzf cello-1.0.tar.gz cello-1.0cello-1.0/ cello-1.0/Makefile cello-1.0/cello.c cello-1.0/LICENSE作成したアーカイブを
~/rpmbuild/SOURCES/ディレクトリーに移動します。これは、rpmbuildコマンドがパッケージをビルドするためのファイルを保存するデフォルトのディレクトリーです。$ mv cello-1.0.tar.gz ~/rpmbuild/SOURCES/
第6章 ソフトウェアのパッケージ化 リンクのコピーリンクがクリップボードにコピーされました!
RPM パッケージマネージャーを使ったパッケージングプロセスの基本を学びましょう。
6.1. spec ファイルについて リンクのコピーリンクがクリップボードにコピーされました!
spec ファイルは、rpmbuild ユーティリティーが RPM パッケージをビルドするために使用する指示が記述されたファイルです。
仕様 ファイルは、一連のセクションで手順を定義することにより、ビルドシステムに必要な情報を提供する。これらのセクションは、spec ファイルの Preamble 部分と Body 部分で定義されます。
- Preamble セクションには、Body セクションで使用される一連のメタデータ項目が含まれています。
- Body セクションは、指示の主要部分を表します。
6.1.1. spec ファイルの Preamble の項目 リンクのコピーリンクがクリップボードにコピーされました!
RPM 仕様 ファイルの Preamble セクションで、以下の指示を使用してください。
| ディレクティブ | 定義 |
|---|---|
|
|
パッケージのベース名。 |
|
| ソフトウェアのアップストリームのバージョン番号。 |
|
| パッケージのバージョンがリリースされた回数。
初期値を |
|
| パッケージの簡単な一行の概要。 |
|
| パッケージ化するソフトウェアのライセンス。
|
|
| ソフトウェアの詳細情報の完全な URL (パッケージ化するソフトウェアのアップストリームプロジェクトの Web サイトなど)。 |
|
| パッチが適用されていないアップストリームソースコードの圧縮アーカイブへのパスまたは URL。このリンクの参照先は、パッケージャーのローカルストレージではなく、アクセスしやすく信頼性の高いアーカイブ保存場所 (アップストリームのページなど) である必要があります。
|
|
| 必要に応じて、ソースコードに適用する最初のパッチの名前。
|
|
| ソフトウェアのビルド対象アーキテクチャー。
ソフトウェアがアーキテクチャーに依存しない場合、たとえば、ソフトウェア全体をインタープリター型プログラミング言語で記述した場合は、値を |
|
|
コンパイル言語で記述されたプログラムをビルドするために必要なパッケージのコンマまたは空白区切りのリスト。複数の |
|
|
インストール後のソフトウェアの実行に必要なパッケージのコンマ区切りまたは空白区切りのリスト。複数の |
|
|
ソフトウェアが特定のプロセッサーアーキテクチャーで動作しない場合は、 |
|
|
ソフトウェアをインストールしたときに正常に機能させるために、システムにインストールしてはならないパッケージのコンマまたは空白区切りのリスト。複数の |
|
|
|
|
|
パッケージに |
6.1.2. spec ファイルの Body の項目 リンクのコピーリンクがクリップボードにコピーされました!
RPM 仕様 ファイルの 本文 セクションで、以下の指示を使用してください。
| ディレクティブ | 定義 |
|---|---|
|
| RPM でパッケージ化されているソフトウェアの完全な説明。この説明は、複数の行や、複数の段落にまでわたることがあります。 |
|
|
ソフトウェアのビルドを準備するための 1 つまたは一連のコマンド。たとえば、 |
|
| ビルド用にソフトウェアを設定するための 1 つまたは一連のコマンド。 |
|
| ソフトウェアをマシンコード (コンパイル言語の場合) またはバイトコード (一部のインタープリター言語の場合) にビルドするための 1 つまたは一連のコマンド。 |
|
|
ソフトウェアのビルド後に、
|
|
| ソフトウェアをテストするための 1 つまたは一連のコマンド (ユニットテストなど)。 |
|
| RPM パッケージによって提供され、ユーザーのシステムにインストールされるファイルのリストと、システム上におけるファイル配置場所のフルパスのリスト。
ビルド中に、
|
|
|
異なる |
6.1.3. spec ファイルの高度な項目 リンクのコピーリンクがクリップボードにコピーされました!
仕様 ファイルには、スクリプトレット、ファイルトリガー、トリガーなどの高度な項目を含めることができます。これらのディレクティブは、spec ファイルに影響するだけでなく、RPM からの情報を使用してシステムを更新することにより、結果として生成される RPM がインストールされるターゲットオペレーティングシステムにも影響します。
スクリプトレット、ファイルトリガー、およびトリガーは、ビルドプロセスではなく、ターゲットシステムへのインストールプロセスのさまざまな段階で有効になります。
- スクリプトレットは、パッケージがインストールまたは削除される前または後に無条件に実行されます。
- トリガーは、指定されたトリガー条件が、インストール済みのシステム上またはトランザクション内の他のパッケージと一致した場合に、条件付きで実行されます。
- ファイルトリガーは、指定されたパス接頭辞が、インストール先のシステム上またはトランザクション内の他のファイルと一致した場合に、条件付きで実行されます。
6.1.3.1. スクリプトレットのディレクティブ リンクのコピーリンクがクリップボードにコピーされました!
スクリプトレットは、パッケージのライフサイクルに関連する、あらかじめ決められたタイミング (パッケージのインストールや削除の前後など) で実行される任意のプログラムです。スクリプトレットは、ビルド時または起動スクリプトでは実行できないタスクにのみ使用してください。
デフォルトでは、スクリプトレットは、spec ファイル内のさまざまな %pre または %post ディレクティブによって宣言される短いシェルスクリプトです。
一般的なスクリプトレットのディレクティブは、%build や %install などの spec ファイルのセクションヘッダーに似ています。複数行のコードのまとまりとして定義され、多くの場合、標準の POSIX シェルスクリプトとして記述されます。ただし、ターゲットマシンのディストリビューションの RPM が対応している他のプログラミング言語で記述することもできます。
6.1.3.2. スクリプトレットのディレクティブの実行順序 リンクのコピーリンクがクリップボードにコピーされました!
パッケージのアップグレード中にスクリプトレットが実行される順序を確認してください。
| ディレクティブ | 説明 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
6.1.3.3. スクリプトレットの実行をオフにする リンクのコピーリンクがクリップボードにコピーされました!
スクリプトレット名に --no オプションを指定することで、任意のスクリプトレットの実行を無効にできます。
--noscripts オプションを使用することもできます。これは、次のすべてのスクリプトレットの実行をオフにするのと同じです。
-
--nopre -
--nopost -
--nopreun -
--nopostun -
--nopretrans -
--noposttrans -
--nopreuntrans -
--nopostuntrans
詳細は、システム上の rpm man ページを参照してください。
手順
スクリプトレットの実行をオフにします。
# rpm --no<scriptlet_name>たとえば、
%pretransスクリプトレットの実行をオフにするには、次のように入力します。# rpm --nopretrans
6.1.3.4. スクリプトレットのマクロの例 リンクのコピーリンクがクリップボードにコピーされました!
以下は、spec ファイル内のスクリプトレットに使用できるマクロの例です。これらのマクロは、systemd-rpm-macros パッケージによって提供される実際のマクロです。これらのマクロは、systemd 関連の処理をパッケージ化するために使用できます。同様の原則を他のパッケージに適用することもできます。
systemd ユニットファイルを含むパッケージは、systemd サービスを適切に処理するために、スクリプトレットを使用する必要があります。systemd パッケージは、systemd のスクリプトレット操作を処理するための一連のマクロを提供しています。以下に例を示します。
%post
%systemd_post httpd.service
%preun
%systemd_preun httpd.service
これらのマクロはパッケージ内で次のように展開されます。
$ rpm --eval "%systemd_preun httpd.service"
if [ $1 -eq 0 ] && [ -x "/usr/lib/systemd/systemd-update-helper" ]; then
# Package removal, not upgrade
/usr/lib/systemd/systemd-update-helper remove-system-units httpd.service || :
fi
マクロの動作は変更される可能性があります。たとえば、マクロの動作はパッケージの開発に応じて変更される可能性があります。
6.1.4. Epoch ディレクティブ リンクのコピーリンクがクリップボードにコピーされました!
Version spec ファイルディレクティブを設定するだけではパッケージのバージョンを比較できない場合は、Epoch ディレクティブを使用できます。たとえば、Epoch を 使用すると、上流でのバージョン番号付け方式の変更が互換性のない方法で行われたために発生したアップグレードパスの問題を解決できます。
Epoch は数値フィールドです。Epoch に値を割り当てると、パッケージのバージョンを比較するときに RPM が使用する修飾子が追加されます。spec ファイルに Epoch ディレクティブが記載されていないことは、Epoch が未設定であることを意味します。これは、Epoch を設定しないと Epoch は 0 になる、という一般的な認識とは異なります。ただし、処理上の理由から、RPM は Epoch が未設定であっても、Epoch が 0 に設定されている場合と同じように扱います。その逆も同様です。
通常、spec ファイル内での Epoch の使用は省略されます。これは、ほとんどの場合、Epoch 値を導入すると、パッケージのバージョンを比較するときに RPM の動作が予想と異なるものになるためです。したがって、Epoch の使用は最後の手段として検討してください。
たとえば、Epoch: 1 および Version: 1.0 で foobar パッケージをインストールしたとします。このとき、別のパッケージ作成者が、Epoch ディレクティブを指定せずに、foobar を Version: 2.0 でパッケージ化したとします。この場合、この新しいバージョンが更新版とみなされることは決してありません。RPM パッケージのバージョン管理を表す従来の Name-Version-Release マーカーよりも、Epoch のバージョンが優先されるためです。
6.1.5. パッケージのバージョン管理の基本 リンクのコピーリンクがクリップボードにコピーされました!
パッケージの説明の基本的な要素は、spec ファイルのディレクティブである Name、Version、および Release (NVR) で定義されている情報です。RPM はこの情報を使用してパッケージのバージョンを比較し、パッケージの依存関係を追跡します。
RPM を扱っていると、EVR (epoch-version-release)、NEVR (name-epoch-version-release)、NEVRA (name-epoch-version-release-architecture) という表記を目にすることもあるでしょう。EVR は、RPM が比較の際に常に使用するパッケージの完全なバージョン情報です。RPM は、最初のコンポーネントから 1 つずつコンポーネントを比較します。RPM は、コンポーネントの違いを検出すると比較を停止します。たとえば、Epoch が異なる場合、RPM は残りの EVR コンポーネントを比較しません。
RPM データベースを照会することで、特定のパッケージの NVR 情報を表示できます。次に例を示します。
# rpm -q bash
bash-4.4.19-7.el8.x86_64
ここでは、bash がパッケージ名で、4.4.19 がバージョン番号を示し、7.el8 がリリースを意味しています。x86_64 は、パッケージアーキテクチャーを示すマーカーです。アーキテクチャーマーカーは、NVR とは異なり、RPM パッケージャーが直接制御するものではなく、rpmbuild ビルド環境によって定義されます。アーキテクチャーに依存しない noarch パッケージは例外です。
rpm -q コマンドは、NEVRA 形式のパッケージ情報をデフォルトで表示します。
6.2. spec ファイルの条件分岐 リンクのコピーリンクがクリップボードにコピーされました!
仕様 ファイルの条件式を使用することで、仕様 ファイルのさまざまなセクションを条件付きで含めることを可能にします。
通常、条件分岐は次の側面を扱います。
- アーキテクチャー固有のセクション
- オペレーティングシステム固有のセクション
- さまざまなバージョンのオペレーティングシステム間の互換性に関する問題
spec の条件分岐はさまざまな目的で使用できます。次に例を示します。
条件式 (
%if)。%ifは複数の目的で使用できます。たとえば、次のような構文で使用できます。“式が真であれば、ある操作を実行する”:
%if expression ... %endif“式が真であればある操作を実行し、そうでない場合は別の操作を実行する”:
%if expression ... %elsif expression ... %else ... %endif%ifの後には、任意の数の%elif条件分岐 (ネストされた%elsif) を指定することもできます。次に例を示します。%if expression %elif expression ... %else %endif
システムアーキテクチャー (
%ifarch、%ifnarch)。%ifarchは、現在のターゲットシステムのアーキテクチャーが一致するかどうかをテストします。%ifarchを使用すると、複数のプラットフォーム用の RPM パッケージをビルドできます。次に例を示します。%ifarch s390 s390x BuildRequires: s390utils-devel %endif-
オペレーティングシステム (
%ifos、%ifnos)。%ifosは、ビルド対象のオペレーティングシステムに応じてspecファイルの処理を制御します。
6.2.1. %if 条件分岐の使用例 リンクのコピーリンクがクリップボードにコピーされました!
仕様 ファイル内で %if 条件式を使用する方法を示す以下の例を確認してください。
例6.1 %if 条件分岐を使用して Red Hat Enterprise Linux 10 と他のオペレーティングシステム間の互換性を処理する
%if 0%{?rhel} == 10
sed -i '/AS_FUNCTION_DESCRIBE/ s/^/#/' configure.in
sed -i '/AS_FUNCTION_DESCRIBE/ s/^/#/' acinclude.m4
%endif
RHEL 10 でパッケージをビルドする際、この条件分岐により、%rhel マクロの値が 10 に設定されている場合に、対象となる autoconf スクリプトから AS_FUNCTION_DESCRIBE 行がコメントアウトされます。
例6.2 %if 条件分岐を使用してマクロの定義を処理する
%define ruby_archive %{name}-%{ruby_version}
%if 0%{?milestone:1}%{?revision:1} != 0
%define ruby_archive %{ruby_archive}-%{?milestone}%{?!milestone:%{?revision:r%{revision}}}
%endif
この条件分岐はマクロの定義を処理します。%milestone または %revision マクロが設定されている場合、アップストリームのアーカイブの名前を定義する %ruby_archive マクロが再定義されます。
6.2.2. %if 条件分岐の特殊なバリアント リンクのコピーリンクがクリップボードにコピーされました!
システムアーキテクチャーやオペレーティングシステムを指定するために 仕様 ファイル内で使用できる、以下の特殊な %if 条件文を確認してください。
%if 条件分岐の特殊なバリアントとして、%ifarch、%ifnarch、および %ifos 条件があります。これらの条件分岐はよく使用されるため、独自のマクロが用意されています。
| 条件分岐 | 説明 |
|---|---|
|
|
|
|
|
|
|
|
|
6.3. BuildRoots リンクのコピーリンクがクリップボードにコピーされました!
RPM のパッケージ化のコンテキストでは、buildroot は chroot 環境です。ビルドアーティファクトは、エンドユーザーシステムの将来の階層と同じファイルシステム階層を使用してここに配置され、buildroot はルートディレクトリーとして機能します。ビルドアーティファクトの配置は、エンドユーザーシステムのファイルシステム階層の標準に準拠する必要があります。
buildroot 内のファイルは、後で RPM ペイロードに組み込まれ、RPM の主要部分となる。RPM がエンドユーザーのシステムにインストールされている場合、これらのファイルは root ディレクトリーに抽出され、階層が正しく保持されます。
rpmbuild プログラムには独自のデフォルト設定があります。このデフォルト設定をオーバーライドすると、特定の問題が発生する可能性があります。したがって、buildroot マクロの独自の値を定義することは避けてください。代わりにデフォルトの %{buildroot} マクロを使用してください。
6.4. spec ファイルでの作業 リンクのコピーリンクがクリップボードにコピーされました!
RPM パッケージを使って新しいソフトウェアをパッケージ化するには、仕様 ファイルを作成する必要があります。
仕様 ファイルは以下のいずれかの方法で作成できます。
-
新しい
specファイルを最初から手動で作成します。 -
rpmdev-newspecユーティリティーを使用します。このユーティリティーは、空のspecファイルを作成します。このファイルに必要なディレクティブとフィールドを入力します。
プログラマー向けのテキストエディターの中には、新しい spec ファイルに独自の spec テンプレートを事前に入力するものもあります。rpmdev-newspec ユーティリティーでは、エディターに依存しないアプローチを利用できます。
6.4.1. サンプルの Bash、Python、および C プログラム用の新しい spec ファイルを作成する リンクのコピーリンクがクリップボードにコピーされました!
rpmdev-newspec ユーティリティーを使用して、Hello World! プログラムの 3 つのサンプル実装それぞれに対応する spec ファイルを作成します。
前提条件
次の
Hello World!プログラム実装が、~/rpmbuild/SOURCESディレクトリーに配置されている。
手順
~/rpmbuild/SPECSディレクトリーに移動します。$ cd ~/rpmbuild/SPECSHello World!プログラムの 3 つの実装それぞれにspecファイルを作成します。$ rpmdev-newspec bellobello.spec created; type minimal, rpm version >= 4.11.$ rpmdev-newspec cellocello.spec created; type minimal, rpm version >= 4.11.$ rpmdev-newspec pellopello.spec created; type minimal, rpm version >= 4.11.~/rpmbuild/SPECS/ディレクトリーに、bello.spec、cello.spec、pello.specという 3 つのspecファイルが追加されます。作成されたファイルを調べます。
ファイル内のディレクティブは、spec ファイルについて で説明されているものです。次のセクションでは、
rpmdev-newspecの出力ファイルの特定のセクションを作成します。
6.4.2. 元の spec ファイルの変更 リンクのコピーリンクがクリップボードにコピーされました!
rpmdev-newspec ユーティリティーによって生成された元の出力 仕様 ファイルを変更することにより、rpmbuild ユーティリティーに必要な指示を提供します。rpmbuild は、その指示を使用して RPM パッケージをビルドします。
前提条件
-
未入力の
~/rpmbuild/SPECS/<name>.specspecファイルを、rpmdev-newspecユーティリティーを使用して作成した。詳細は、サンプルの Bash、Python、および C プログラム用の新しい spec ファイルを作成する を参照してください。
手順
-
rpmdev-newspecユーティリティーによって提供される~/rpmbuild/SPECS/<name>.specファイルを開きます。 specファイルの Preamble セクションに次のディレクティブを入力します。-
名前:名前はすでにrpmdev-newspecの引数として指定されています。 -
バージョン: ソースコードのアップストリームリリースバージョンと一致するようにバージョンを設定してください。 -
リリース:リリースは自動的に1%{?dist}に設定され、初期値は1です。 -
概要: パッケージの説明を 1 行で入力してください。 -
ライセンス: ソースコードに関連付けられているソフトウェアライセンスを入力してください。 -
URL: 上流ソフトウェアのウェブサイトの URL を入力してください。一貫性を保つために、%{name}RPM マクロ変数を利用し、https://example.com/%{name}形式を使用します。 ソース: 上流のソフトウェアソースコードへの URL を入力してください。パッケージ化するソフトウェアバージョンに直接リンクします。注記このドキュメントのサンプル URL には、ハードコードされた値が含まれています。この値は将来変更される可能性があります。同様に、リリースのバージョンも変更される可能性があります。今後の変更を簡素化するには、
%{name}マクロと%{version}マクロを使用します。これらのマクロを使用すると、更新する必要がある箇所が、specファイル内の 1 つのフィールドだけになります。-
BuildRequires: パッケージのビルド時依存関係を指定します。 -
必須: パッケージの実行時依存関係を指定します。 -
BuildArch: ソフトウェアアーキテクチャーを指定します。
-
specファイルの Body セクションに次のディレクティブを入力します。これらのディレクティブは、実行する複数行、複数指示のタスクやスクリプト処理タスクを定義できるため、セクションの見出しと考えることができます。-
%description: ソフトウェアの完全な説明を入力してください。 -
%prep: ソフトウェアをビルド用に準備するためのコマンドまたは一連のコマンドを入力します。 -
%conf: ソフトウェアをビルド用に設定するためのコマンドまたは一連のコマンドを入力します。 -
%build: ソフトウェアをビルドするためのコマンドまたは一連のコマンドを入力します。 -
%install:rpmbuildコマンドにソフトウェアをBUILDROOTディレクトリーにインストールする方法を指示するコマンドまたは一連のコマンドを入力します。 -
%files: RPM パッケージによって提供される、システムにインストールするファイルのリストを指定します。 %changelog: パッケージの各バージョンリリースに対応する、日付付きエントリーのリストを入力します。%changelogセクションの最初の行は、アスタリスク (*) 文字で始め、その後にDay-of-Week Month Day Year Name Surname <email> - Version-Releaseを入力します。実際の変更エントリーは、次のルールに従ってください。
- 各変更エントリーには、変更ごとに複数の項目を含めることができます。
- 各項目は新しい行で始まります。
-
各項目の先頭にハイフン (
-) 文字を付けます。
-
6.4.3. サンプル Bash プログラムの spec ファイルの例 リンクのコピーリンクがクリップボードにコピーされました!
Bash プログラミング言語 (bello) で書かれたサンプルプログラムのアノテーション付きサンプル 仕様 ファイルを確認してください。
bello をインストールするには、インストール先ディレクトリーを作成し、そこに実行可能な bash スクリプトファイルをインストールする必要があります。したがって、%install セクションで install コマンドを使用できます。RPM マクロを使用すると、パスをハードコーディングせずにこれを行うことができます。
例6.3 bello プログラムの仕様ファイルの例
Name: bello
Version: 0.1
Release: 1%{?dist}
Summary: Hello World example implemented in bash script
License: GPLv3+
URL: https://www.example.com/%{name}
Source0: https://www.example.com/%{name}/releases/%{name}-%{version}.tar.gz
Requires: bash
BuildArch: noarch
%description
The long-tail description for our Hello World Example implemented in
bash script.
%prep
%setup -q
%build
%install
mkdir -p %{buildroot}/%{_bindir}
install -m 0755 %{name} %{buildroot}/%{_bindir}/%{name}
%files
%license LICENSE
%{_bindir}/%{name}
%changelog
* Tue May 31 2016 Adam Miller <maxamillion@fedoraproject.org> - 0.1-1
- First bello package
- Example second item in the changelog for version-release 0.1-1
-
belloのビルドステップがないため、パッケージのビルドタイム依存関係を指定するBuildRequiresディレクティブが削除されました。bash は、raw インタープリタープログラミング言語で、ファイルはシステム上のその場所にインストールされます。 -
パッケージの実行時の依存関係を指定する
Requiresディレクティブには、bashのみが含まれています。これは、belloスクリプトの実行にはbashシェル環境のみが必要であるためです。 -
ソフトウェアのビルド方法を指定する
%buildセクションは空白です。これはbashスクリプトはビルドする必要がないためです。
6.4.4. サンプル Python プログラムの spec ファイルの例 リンクのコピーリンクがクリップボードにコピーされました!
Python プログラミング言語 (pello) で書かれたサンプルプログラムのアノテーション付きサンプル 仕様 ファイルを確認してください。
spec ファイル内にインラインでラッパースクリプトを作成するこの例は、spec ファイル自体がスクリプト可能であることを示しています。このラッパースクリプトは、ヒア ドキュメントを使用して、Python のバイトコンパイルされたコードを実行します。
例6.4 pello プログラムの仕様ファイルの例
Name: pello
Version: 0.1.1
Release: 1%{?dist}
Summary: Hello World example implemented in Python
License: GPLv3+
URL: https://www.example.com/%{name}
Source0: https://www.example.com/%{name}/releases/%{name}-%{version}.tar.gz
BuildRequires: python
Requires: python
Requires: bash
BuildArch: noarch
%description
The long-tail description for our Hello World Example implemented in Python.
%prep
%setup -q
%build
python -m compileall %{name}.py
%install
mkdir -p %{buildroot}/%{_bindir}
mkdir -p %{buildroot}/usr/lib/%{name}
cat > %{buildroot}/%{_bindir}/%{name} <<EOF
#!/bin/bash
/usr/bin/python /usr/lib/%{name}/%{name}.pyc
EOF
chmod 0755 %{buildroot}/%{_bindir}/%{name}
install -m 0644 %{name}.py* %{buildroot}/usr/lib/%{name}/
%files
%license LICENSE
%dir /usr/lib/%{name}/
%{_bindir}/%{name}
/usr/lib/%{name}/%{name}.py*
%changelog
* Tue May 31 2016 Adam Miller <maxamillion@fedoraproject.org> - 0.1.1-1
- First pello package
Requiresディレクティブ (パッケージにランタイム依存関係を指定) には、以下の 2 つのパッケージが含まれます。-
実行時にバイトコンパイルされたコードを実行するために必要な
Pythonパッケージ。 -
小さなエントリーポイントスクリプトを実行するために必要な
bashパッケージ。
-
実行時にバイトコンパイルされたコードを実行するために必要な
-
BuildRequiresディレクティブは、パッケージのビルド時の依存関係を指定し、pythonパッケージのみを含みます。Pelloプログラムは、バイトコンパイルのビルドプロセスを実行するためにPythonを必要とします。 -
ソフトウェアのビルド方法を指定する
%buildセクションでは、スクリプトのバイトコンパイルバージョンを作成します。実際のパッケージングでは、使用されるディストリビューションに応じて、通常は自動的に実行されることに注意してください。 -
%installセクションは、バイトコンパイルされたファイルをシステム上のライブラリーディレクトリーにインストールしてアクセスできるようにする必要があるという事実に一致しています。
6.4.5. サンプル C プログラムの spec ファイルの例 リンクのコピーリンクがクリップボードにコピーされました!
C プログラミング言語 (cello) で書かれたサンプルプログラムのアノテーション付きサンプル 仕様 ファイルを確認してください。
cello プログラムは、%make_install マクロを使用してインストールできます。これが可能なのは、cello プログラムの Makefile を利用できるためです。
例6.5 チェロプログラムの仕様ファイルの例
Name: cello
Version: 1.0
Release: 1%{?dist}
Summary: Hello World example implemented in C
License: GPLv3+
URL: https://www.example.com/%{name}
Source0: https://www.example.com/%{name}/releases/%{name}-%{version}.tar.gz
Patch0: cello-output-first-patch.patch
BuildRequires: gcc
BuildRequires: make
%description
The long-tail description for our Hello World Example implemented in
C.
%prep
%setup -q
%patch0
%build
make %{?_smp_mflags}
%install
%make_install
%files
%license LICENSE
%{_bindir}/%{name}
%changelog
* Tue May 31 2016 Adam Miller <maxamillion@fedoraproject.org> - 1.0-1
- First cello package
パッケージのビルド時の依存関係を指定する
BuildRequiresディレクティブには、コンパイルビルドプロセスを実行するために必要な次のパッケージが含まれています。-
gcc -
make
-
-
この例では、パッケージにランタイム依存関係を指定する
Requiresディレクティブは省略されています。すべてのランタイム要件はrpmbuildにより処理されます。celloプログラムはコア C 標準ライブラリー以外のものは必要としません。 -
%buildセクションは、この例で cello プログラム用のMakefileファイルを作成したことを反映しています。したがって、GNU make コマンドを使用できます。ただし、設定スクリプトを指定していないため、%configureへの呼び出しを削除する必要があります。
6.5. RPM のビルド リンクのコピーリンクがクリップボードにコピーされました!
rpmbuild ユーティリティーを使用して、サンプルプログラムである bello、pello、cello の RPM パッケージを作成します。
rpmbuild コマンドでは、ユースケースや期待する結果によって組み合わせる引数が異なります。主な使用例は次のとおりです。
- ソース RPM をビルドします。
バイナリー RPM をビルドします。
- ソース RPM からバイナリー RPM を再ビルドします。
-
specファイルからバイナリー RPM をビルドします。
rpmbuild コマンドを使用する場合、特定のディレクトリー構造とファイル構造が想定されます。これは 、rpmdev-setuptree ユーティリティーによって設定された構造と同じです。
6.5.1. ソース RPM のビルド リンクのコピーリンクがクリップボードにコピーされました!
rpmbuild ユーティリティーを使用して、bello、pello、cello サンプルプログラムのソースコードを Source RPM(SRPM) パッケージに格納します。
SRPM を構築することには、以下の利点があります。
-
環境にデプロイされた RPM ファイルの特定の
名前 - バージョン - リリース(NVR) の正確なソースを保存できます。これには、正確なspecファイル、ソースコード、および関連するすべてのパッチが含まれます。これは追跡とデバッグに役立ちます。 - 異なるハードウェアプラットフォームまたはアーキテクチャー上でバイナリー RPM をビルドできます。
前提条件
システムに
rpmbuildユーティリティーをインストールしました。# dnf install rpm-buildあなたは以下の
Hello World!実装を~/rpmbuild/SOURCES/ディレクトリーに配置しました。-
パッケージ化するプログラムの
specファイルが存在する。
手順
作成した
specファイルが含まれている~/rpmbuild/SPECS/ディレクトリーに移動します。$ cd ~/rpmbuild/SPECS/rpmbuildコマンドを入力し、specファイルを指定して、ソース RPM をビルドします。$ rpmbuild -bs <specfile>-bsオプションは ビルドソース を表します。たとえば、
bello、pello、celloプログラムのソース RPM を作成するには、以下の手順を実行します。belloプログラムのソース RPM を作成します。$ rpmbuild -bs bello.specWrote: /home/admiller/rpmbuild/SRPMS/bello-0.1-1.el8.src.rpmpelloプログラムのソース RPM パッケージを作成します。$ rpmbuild -bs pello.specWrote: /home/admiller/rpmbuild/SRPMS/pello-0.1.2-1.el8.src.rpmチェロプログラムのソース RPM を作成します。$ rpmbuild -bs cello.specWrote: /home/admiller/rpmbuild/SRPMS/cello-1.0-1.el8.src.rpm
検証
-
rpmbuild/SRPMSディレクトリーに、生成されたソース RPM が含まれていることを確認します。ディレクトリーは、rpmbuildで必要な構造の一部です。
6.5.2. ソース RPM からのバイナリー RPM の再ビルド リンクのコピーリンクがクリップボードにコピーされました!
rpmbuild ユーティリティーを使用して、サンプルプログラムである bello、pello、cello の バイナリー RPM パッケージを、元の RPM(SRPM) パッケージから再構築します。その後、バイナリーパッケージを複数のシステムにインストールして実行できます。
バイナリー RPM の作成時に生成される出力は詳細なもので、デバッグに役立ちます。出力は例によって異なり、それぞれの spec ファイルに対応したものになります。
生成されたバイナリー RPM は、次のいずれかのディレクトリーにあります。
-
~/rpmbuild/RPMS/YOURARCH(YOURARCHはアーキテクチャーを表します) -
パッケージがアーキテクチャー固有でない場合
、~/rpmbuild/RPMS/noarch/を使用します。
前提条件
システムに
rpmbuildユーティリティーをインストールしました。# dnf install rpm-build
手順
SRPM が含まれる
~/rpmbuild/SRPMS/ディレクティブに移動します。$ cd ~/rpmbuild/SRPMS/SRPM からバイナリー RPM を再ビルドします。
$ rpmbuild --rebuild <srpm>たとえば、
bello、pello、cello をそれぞれの SRPM ファイルから再構築するには、以下の手順を実行します。ベロプログラムを再構築する:$ rpmbuild --rebuild bello-0.1-1.el8.src.rpmペロプログラムを再構築する:$ rpmbuild --rebuild pello-0.1.2-1.el8.src.rpmチェロプログラムを再構築する:$ rpmbuild --rebuild cello-1.0-1.el8.src.rpm
注記rpmbuild --rebuildを呼び出すと、次のプロセスが実行されます。-
SRPM の内容 (
specファイルとソースコード) を~/rpmbuild/ディレクトリーにインストールします。 - インストールされたコンテンツを使用して RPM をビルドします。
-
specファイルとソースコードを削除します。
次のいずれかの方法でビルドすると、
specファイルとソースコードを保持できます。-
RPM をビルドするときに、
--rebuildオプションではなく--recompileオプションを指定したrpmbuildコマンドを使用します。 bello、pello、celloプログラムの SRPM をインストールしてください。bello用の SRPM をインストールしてください。$ rpm -Uvh ~/rpmbuild/SRPMS/bello-0.1-1.el8.src.rpmUpdating / installing... 1:bello-0.1-1.el8 [100%]pello用の SRPM をインストールしてください。$ rpm -Uvh ~/rpmbuild/SRPMS/pello-0.1.2-1.el8.src.rpmUpdating / installing... ...1:pello-0.1.2-1.el8 [100%]チェロ用の SRPM をインストールしてください:$ rpm -Uvh ~/rpmbuild/SRPMS/cello-1.0-1.el8.src.rpmUpdating / installing... ...1:cello-1.0-1.el8 [100%]
6.5.3. spec ファイルからバイナリー RPM をビルドする リンクのコピーリンクがクリップボードにコピーされました!
rpmbuild コマンドを使用して、サンプルプログラムである bello、pello、cello の仕様 ファイルからバイナリー RPM パッケージを作成します。
前提条件
システムに
rpmbuildユーティリティーがインストールされている。# dnf install rpm-build
手順
specファイルが含まれている~/rpmbuild/SPECS/ディレクトリーに移動します。$ cd ~/rpmbuild/SPECS/specからバイナリー RPM をビルドします。$ rpmbuild -bb <spec_file>たとえば、
specファイルからbello、pello、cello のバイナリー RPM をビルドするには、以下の手順を実行します。belloプログラムを構築する:$ rpmbuild -bb bello.specペロプログラムを作成する:$ rpmbuild -bb pello.specチェロプログラムを作成する:$ rpmbuild -bb cello.spec
6.6. RPM アクティビティーの syslog へのロギング リンクのコピーリンクがクリップボードにコピーされました!
RPM のアクティビティーやトランザクションは、システムロギングプロトコル (syslog) を使用してログに記録します。
前提条件
syslogプラグインがシステムにインストールされている。# dnf install rpm-plugin-syslog注記syslogメッセージのデフォルトの場所は、/var/log/messagesファイルです。ただし、メッセージを別の場所に保存するようにsyslogを設定することもできます。
手順
syslogメッセージを保存するように設定したファイルを開きます。または、デフォルトの
syslog設定を使用する場合は、/var/log/messagesファイルを開きます。-
[RPM]文字列を含む新しい行を検索します。
6.7. RPM コンテンツの抽出 リンクのコピーリンクがクリップボードにコピーされました!
場合によってはパッケージのコンテンツを抽出する必要があります。たとえば、RPM に必要なパッケージが破損している場合などです。この場合、RPM インストールが破損しているにもかかわらず機能している場合は、rpm2archive ユーティリティーを使用して、.rpm ファイルを tar アーカイブに変換し、パッケージのコンテンツを使用できます。
RPM インストールが著しく破損している場合は、rpm2cpio ユーティリティーを使用して RPM パッケージファイルを cpio アーカイブに変換できます。
手順
RPM ファイルを tar アーカイブに変換します。
$ rpm2archive <filename>.rpm作成されたファイルには
.tgz接尾辞が付きます。たとえば、bashパッケージからアーカイブを作成するには、以下の手順を実行します。bashRPM パッケージを tar アーカイブに変換する:$ rpm2archive bash-4.4.19-6.el8.x86_64.rpmアーカイブファイルの内容を表示します。
$ ls bash-4.4.19-6.el8.x86_64.rpm.tgzbash-4.4.19-6.el8.x86_64.rpm.tgz
6.8. RPM パッケージへの署名 リンクのコピーリンクがクリップボードにコピーされました!
RPM パッケージに署名することで、第三者がその内容を改変できないようにします。
以下のいずれかのソフトウェアを使用して、RPM パッケージに署名できます。
- Sequoia PGP は OpenPGP 標準をサポートしています。RPM はソフトウェア署名の検証にも Sequoia PGP を使用します。
- GNU Privacy Guard (GnuPG) は古い OpenPGP 標準バージョンをサポートしています。そのため、GnuPG は RHEL 9 以前のバージョンとの互換性に優れています。
RHEL バージョン 10.1 以降では、OpenPGPv6 および RPMv6 署名がサポートされています。これらの署名は、以前のバージョンの RHEL とは互換性がありません。以前のバージョンの RPM はこれらの署名を無視します。パッケージに RPMv4 署名が含まれている場合、RPM は代わりにその署名を使用します。
ただし、RHEL 9.7 以降の RHEL 9 バージョンでは、multisig DNF プラグインを使用して OpenPGPv6 および RPMv6 署名のサポートを有効にできます。
6.8.1. GnuPG を使用した RPM パッケージへの署名 リンクのコピーリンクがクリップボードにコピーされました!
GNU Privacy Guard (GnuPG) を使用して RPM パッケージに署名することで、第三者がパッケージの内容を改変できないようにします。
6.8.1.1. GnuPG を使用してパッケージに署名するための OpenPGP 鍵の作成 リンクのコピーリンクがクリップボードにコピーされました!
GNU Privacy Guard (GnuPG) ソフトウェアを使用して RPM パッケージに署名するには、まず OpenPGP キーを作成する必要があります。
前提条件
-
システムに
rpm-signおよびpinentryパッケージがインストールされている。
手順
OpenPGP 鍵ペアを生成します。
$ gpg --gen-key生成された鍵ペアを確認します。
$ gpg --list-keys公開鍵をエクスポートします。
$ gpg --export -a '<public_key_name>' > RPM-GPG-KEY-pmanager
6.8.1.2. GnuPG を使用してパッケージに署名するための RPM の設定 リンクのコピーリンクがクリップボードにコピーされました!
GNU Privacy Guard (GnuPG) ソフトウェアを使用して RPM パッケージに署名するには、%_gpg_name RPM マクロを指定して RPM を設定します。
前提条件
- GnuPG 用の OpenPGP 鍵を作成した。詳細は、GnuPG を使用してパッケージに署名するための OpenPGP 鍵の作成 を参照してください。
手順
$HOME/.rpmmacrosディレクトリーで%_gpg_nameマクロを定義します。%_gpg_name <key_ID>GnuPG の有効な鍵 ID 値は、鍵のフィンガープリント、フルネーム、または鍵の作成時に指定したメールアドレスです。
6.8.1.3. RPM パッケージへの署名の追加 リンクのコピーリンクがクリップボードにコピーされました!
パッケージは通常、署名なしでビルドします。荷物が発送される前に第三者が内容物を改ざんできないように、荷物に署名を追加してください。
前提条件
- GnuPG 用の OpenPGP 鍵を作成した。詳細は、GnuPG を使用してパッケージに署名するための OpenPGP 鍵の作成 を参照してください。
- パッケージに署名するように RPM を設定した。詳細は、GnuPG を使用してパッケージに署名するための RPM の設定 を参照してください。
-
システムに
rpm-signパッケージがインストールされている。
手順
パッケージに署名を追加します。
$ rpmsign --addsign <package-name>.rpm
検証
エクスポートした OpenPGP 公開鍵 を RPM キーリングにインポートします。
# rpmkeys --import RPM-GPG-KEY-pmanagerGnuPG で鍵 ID を表示します。
$ gpg --list-keys[...] pub rsa3072 2025-05-13 [SC] [expires: 2028-05-12] A8AF1C39AC67A1501450734F6DE8FC866DE0394D [...]鍵 ID は、コマンド出力の 40 文字の文字列です (例:
A8AF1C39AC67A1501450734F6DE8FC866DE0394D)。RPM ファイルに対応する署名があることを確認します。
$ rpm -Kv <package_name>.rpm<package_name>.rpm: Header V4 RSA/SHA256 Signature, key ID 6de0394d: OK Header SHA256 digest: OK Header SHA1 digest: OK Payload SHA256 digest: OK MD5 digest: OK署名の鍵 ID は、OpenPGP の鍵 ID の末尾と一致します。
6.8.2. Sequoia PGP を使用した RPM パッケージへの署名 リンクのコピーリンクがクリップボードにコピーされました!
RPM パッケージに Sequoia PGP を使用して署名することで、第三者がパッケージの内容を改ざんできないようにします。
6.8.2.1. Sequoia PGP を使用してパッケージに署名するための OpenPGP 鍵の作成 リンクのコピーリンクがクリップボードにコピーされました!
Sequoia PGP ソフトウェアを使用してパッケージに署名するには、まず OpenPGP キーを作成する必要があります。
手順
Sequoia PGP ツールをインストールします。
# dnf install sequoia-sqOpenPGP 鍵ペアを生成します。
$ sq key generate --own-key --userid <key_name>生成された鍵ペアを確認します。
$ sq key list公開鍵をエクスポートします。
$ sq cert export --cert-userid '<key_name>' > RPM-PGP-KEY-pmanager
6.8.2.2. Sequoia PGP を使用してパッケージに署名するための RPM の設定 リンクのコピーリンクがクリップボードにコピーされました!
Sequoia PGP ソフトウェアを使用して RPM パッケージに署名するには、RPM を Sequoia PGP を使用するように設定し、%_gpg_name マクロを指定します。
前提条件
-
システムに
rpm-signパッケージがインストールされている。
手順
macros.rpmsign-sequoiaファイルを/etc/rpmディレクトリーにコピーします。# cp /usr/share/doc/rpm/macros.rpmsign-sequoia /etc/rpm/鍵リストの出力から有効な OpenPGP 鍵のフィンガープリント値を取得します。
$ sq cert list --cert-userid '<key_name>'- 7E4B52101EB3DB08967A1E5EB595D12FDA65BA50 - created 2025-05-13 10:33:29 UTC - will expire 2028-05-13T03:59:50Z - [ ✓ ] <key_name>鍵のフィンガープリントは、出力の最初の行にある 40 文字の文字列です (例:
7E4B52101EB3DB08967A1E5EB595D12FDA65BA50)。次のように、
$HOME/.rpmmacrosファイルで%_gpg_nameマクロを定義します。%_gpg_name <key_fingerprint>フィンガープリントの代わりに完全な鍵 ID を使用することもできます。
注記GnuPG とは異なり、Sequoia PGP では完全な鍵 ID またはフィンガープリントしか使用できません。
6.8.2.3. RPM パッケージへの署名の追加 リンクのコピーリンクがクリップボードにコピーされました!
パッケージは通常、署名なしでビルドします。荷物が発送される前に第三者が内容物を改ざんできないように、荷物に署名を追加してください。
前提条件
- OpenPGP 鍵を作成した。詳細は、Sequoia PGP を使用してパッケージに署名するための OpenPGP 鍵の作成 を参照してください。
- パッケージに署名するように RPM を設定した。詳細は、Sequoia PGP を使用してパッケージに署名するための RPM の設定 を参照してください。
-
システムに
rpm-signパッケージがインストールされている。
手順
パッケージに署名を追加します。
$ rpmsign --addsign <package-name>.rpm
検証
エクスポートした OpenPGP 公開鍵 を RPM キーリングにインポートします。
# rpmkeys --import RPM-PGP-KEY-pmanager署名鍵のフィンガープリントを表示します。
$ sq key list --cert-userid <key_name>- 7E4B52101EB3DB08967A1E5EB595D12FDA65BA50 - user ID: <key_name> (authenticated) - created 2025-05-13 10:33:29 UTC - will expire 2028-05-13T03:59:50Z - usable for signing - @softkeys/7E4B52101EB3DB08967A1E5EB595D12FDA65BA50: available, unlocked - 78E56DD2E12E02CFEEA27F8B9FE57972D6BCEA6F - created 2025-05-13 10:33:29 UTC - will expire 2028-05-13T03:59:50Z - usable for decryption - @softkeys/7E4B52101EB3DB08967A1E5EB595D12FDA65BA50: available, unlocked - C06E45F8ABC3E59F44A9E811578DDDB66422E345 - created 2025-05-13 10:33:29 UTC - will expire 2028-05-13T03:59:50Z - usable for signing - @softkeys/7E4B52101EB3DB08967A1E5EB595D12FDA65BA50: available, unlocked - E0BD231AB350AD6802D44C0A270E79FFC39C3B25 - created 2025-05-13 10:33:29 UTC - will expire 2028-05-13T03:59:50Z - usable for signing - @softkeys/7E4B52101EB3DB08967A1E5EB595D12FDA65BA50: available, unlocked鍵のフィンガープリントは、通常
sq key list --cert-userid <key_name>コマンド出力内の署名サブキーです (例:E0BD231AB350AD6802D44C0A270E79FFC39C3B25)。RPM ファイルに対応する署名があることを確認します。次に例を示します。
$ rpm -Kv <package_name>.rpm<package_name>.rpm: Header V4 EdDSA/SHA512 Signature, key ID c39c3b25: OK Header SHA256 digest: OK Header SHA1 digest: OK Payload SHA256 digest: OK MD5 digest: OK署名の鍵 ID は、鍵のフィンガープリントの末尾と一致します。
6.8.3. Sequoia PGP での PQC を使用した RPM パッケージへの署名 リンクのコピーリンクがクリップボードにコピーされました!
Sequoia PGP を使用して PQC アルゴリズムで RPM パッケージに署名することで、第三者がパッケージの内容を改ざんできないようにします。
耐量子計算機暗号 (PQC) は、量子コンピューターからの攻撃に耐えるように設計された一連のアルゴリズムであり、ソフトウェアのセキュリティーを強化します。
RPM パッケージマネージャーは、OpenPGP 標準を使用してパッケージに署名します。OpenPGPv6 では、ハイブリッド方式の鍵および署名のサポートが導入されています。これは、現在の暗号化アルゴリズムと PQC アルゴリズムを組み合わせることで、単一障害点を回避し、生成される署名の信頼性を高めます。
RHEL バージョン 10.1 以降では、RPMv6 署名がサポートされています。この形式を使用すると、パッケージに複数の OpenPGP 署名を追加して、RPM レベルで冗長性を高めることができます。
パッケージへの署名は、RPMv4 署名と RPMv6 署名の両方を組み合わせて行うことができます。この機能を使用すると、複数の異なる RPM バージョンを使用して同じ署名を検証できます。RHEL 10.1 以降、RPM は RPMv6 署名が存在する場合はそれだけを検証し、RPMv4 署名は無視します。パッケージに RPMv6 署名が存在しない場合、RPM は RPMv4 署名を使用します。以前の RHEL バージョンでは、RPM はデフォルトで RPMv4 の署名を検証し、RPMv6 の署名を無視していました。RHEL 9.7 以降の RHEL 9 バージョンでは、RPMv6 署名のサポートを有効にできます。
6.8.3.1. PQC 鍵の作成 リンクのコピーリンクがクリップボードにコピーされました!
耐量子計算機暗号 (PQC) アルゴリズムを使用してパッケージに署名するには、まず Sequoia PGP でハイブリッドキーペアを作成します。
別のアルゴリズムを指定することも可能です。たとえば、次の手順では ML-DSA-87-Ed448 アルゴリズムを使用します。
手順
Sequoia PGP ツールをインストールします。
# dnf install sequoia-sqOpenPGP 鍵ペアを生成します。
$ sq key generate --own-key --expiration=never \ --cannot-authenticate --cannot-encrypt \ --email <vendor_email> --name "<vendor_name>" \ --cipher-suite mldsa87 --profile rfc9580<vendor_email> と <vendor_name> を、RPM パッケージを提供するソフトウェアベンダーのメールと名前に置き換えます。
このコマンドは、プライマリーキーと署名用のサブキーを生成します。
生成された鍵ペアを確認します。
$ sq key list --cert-email <vendor_email>- <ml_dsa_fingerprint> - user IDs: - <vendor_email> (authenticated) - <vendor_name> (authenticated) - created 2025-10-03 14:36:44 UTC - usable for signing - @softkeys/<ml_dsa_fingerprint>: available, unlocked - <subkey_fingerprint> - created 2025-10-03 14:36:44 UTC - usable for signing - @softkeys/<subkey_fingerprint>: available, unlockedPQC OpenPGP 証明書をエクスポートします。
$ sq cert export --cert-email '<vendor_email>' > RPM-PGP-KEY-VENDOR
次のステップ
6.8.3.2. PQC 用の RPM の設定 リンクのコピーリンクがクリップボードにコピーされました!
パッケージの署名に使用する PQC キーを生成したら、RPM がこのキーを使用するように設定してください。
ビルドシステム外部の別の署名サーバー上で RPM を設定してください。RPM は、Sequoia PGP によるパッケージの署名をサポートするために、マクロを必要とします。このマクロはテンプレートファイルで提供されています。
前提条件
- PQC 鍵ペアを作成した。詳細は、PQC 鍵の作成 を参照してください。
-
システムに
rpm-signパッケージがインストールされている。
手順
macros.rpmsign-sequoiaファイルを/etc/rpmディレクトリーにコピーします。# cp /usr/share/doc/rpm/macros.rpmsign-sequoia /etc/rpm/生成された鍵ペアを確認します。
$ sq key list --cert-email <vendor_email>- <ml_dsa_fingerprint> - user IDs: - <vendor_email> (authenticated) - <vendor_name> (authenticated) - created 2025-10-03 14:36:44 UTC - usable for signing - @softkeys/<ml_dsa_fingerprint>: available, unlocked - <subkey_fingerprint> - created 2025-10-03 14:36:44 UTC - usable for signing - @softkeys/<subkey_fingerprint>: available, unlocked鍵のフィンガープリントを
~/.rpmmacrosファイルにエクスポートします。$ echo "%_gpg_name <ml_dsa_fingerprint>" > ~/.rpmmacros
次のステップ
6.8.3.3. RPM に複数の署名を追加する リンクのコピーリンクがクリップボードにコピーされました!
RHEL バージョン 10.1 以降では、RPMv6 署名がサポートされています。この形式を使用すると、RPM パッケージに複数の署名を追加できます。これにより、いずれかの鍵が侵害された場合や、いずれかの暗号化アルゴリズムがセキュアでなくなった場合でも、セキュリティーが強化されます。
複数の異なる鍵で RPM に署名するには、rpmsign --addsign --rpmv6 コマンドを複数回実行します。通常は OpenPGPv4 RSA 鍵を使用して生成され、RPMv4 と互換性のある最初の RPMv6 署名は、RPMv4 署名としても保存されることに注意してください。これにより、古いバージョンの RPM でもパッケージの署名を信頼することが可能になります。
PQC アルゴリズムを使用する RPMv6 署名を追加する前に、必ず RPMv4 互換の署名をパッケージに追加することを検討してください。これにより、バージョンが RHEL 10.1 より前の RHEL 上の RPM によって検証可能な署名が、パッケージに確実に含まれるようになります。
前提条件
- PQC 鍵ペアを生成した。詳細は、PQC 鍵の作成 を参照してください。
- PQC 鍵を使用するように RPM を設定した。詳細は、PQC 用の RPM の設定 を参照してください。
手順
パッケージに署名を追加します。
$ rpmsign --addsign --rpmv6 <package_name>.rpm- 複数の RPMv6 署名を使用してパッケージに署名するために、最初のステップを繰り返します。
検証
エクスポートした PQC OpenPGP 証明書 を RPM キーリングにインポートします。
# rpmkeys --import RPM-PGP-KEY-VENDORRPM ファイルに対応する署名があることを確認します。次に例を示します。
$ rpmkeys -Kv <package_name>.rpm<package_name>.rpm: Header OpenPGP V6 ML-DSA-87+Ed448/SHA512 signature, key fingerprint: <ml_dsa_fingerprint>: OK Header OpenPGP V4 RSA/SHA512 signature, key fingerprint: <rsa_fingerprint>: OK Header SHA256 digest: OK Payload SHA256 digest: OK
第7章 Python 3 RPM のパッケージ化 リンクのコピーリンクがクリップボードにコピーされました!
DNF パッケージマネージャーを使用すると、システムに Python パッケージをインストールできます。DNF は RPM パッケージ形式を使用します。これにより、ソフトウェアのダウンストリーム制御が強化されます。
Python プロジェクトを RPM パッケージにパッケージ化すると、ネイティブ Python パッケージと比較して次の利点が得られます。
- DNF パッケージマネージャーは、Python パッケージおよび Python 以外のパッケージへの依存関係を可能にし、それらを厳密に管理します。
- パッケージに暗号で署名できます。暗号化署名を使用すると、RPM パッケージのコンテンツを、オペレーティングシステムの他の部分を使用して検証、統合、およびテストできます。
- ビルドプロセス中にテストを実行できます。
ネイティブ Python パッケージのパッケージ形式は、Python Packaging Authority (PyPA) 仕様 によって定義されています。歴史的に、ほとんどの Python プロジェクトでは、パッケージ化に distutils または setuptools ユーティリティーを使用し、setup.py ファイルでパッケージ情報を定義していました。ただし、ネイティブ Python パッケージ作成の可能性は、時間の経過とともに進化しています。
-
setup.pyファイルを使用する Python ソフトウェアをパッケージ化するには、このドキュメントに従ってください。 -
pyproject.tomlファイルを使用してより新しいパッケージをパッケージ化するには、pyproject-rpm-macros のREADMEファイルを参照してください。pyproject-rpm-macrosは、サポート対象外のパッケージを含む CodeReady Linux Builder (CRB) リポジトリーに含まれており、より新しい Python パッケージング標準への対応のために時間の経過とともに変更される可能性があることに注意してください。
7.1. Python パッケージの例に対する spec ファイルの説明 リンクのコピーリンクがクリップボードにコピーされました!
python3-pello パッケージの以下の例にある、Python RPM 仕様 ファイルの詳細に関する注記を確認してください。
Python プロジェクトの RPM 仕様 ファイルには、Python 以外の RPM 仕様 ファイルと比較していくつかの特有の点があります。たとえば、Python ライブラリーの RPM パッケージ名には、python3- という 接頭辞を含めることが推奨されます。
例7.1 Python で書かれたプログラムの SPEC ファイルの例
%global python3_pkgversion 3
Name: python-pello
Version: 1.0.2
Release: 1%{?dist}
Summary: Example Python library
License: MIT
URL: https://github.com/fedora-python/Pello
Source: %{url}/archive/v%{version}/Pello-%{version}.tar.gz
BuildArch: noarch
BuildRequires: python%{python3_pkgversion}-devel
# Build dependencies need to be specified manually
BuildRequires: python%{python3_pkgversion}-setuptools
# Test dependencies need to be specified manually
# Runtime dependencies need to be BuildRequired manually to run tests during build
BuildRequires: python%{python3_pkgversion}-pytest >= 3
%global _description %{expand:
Pello is an example package with an executable that prints Hello World! on the command line.}
%description %_description
%package -n python%{python3_pkgversion}-pello
Summary: %{summary}
%description -n python%{python3_pkgversion}-pello %_description
%prep
%autosetup -p1 -n Pello-%{version}
%build
# The macro only supports projects with setup.py
%py3_build
%install
# The macro only supports projects with setup.py
%py3_install
%check
%pytest
# Note that there is no %%files section for python-pello
%files -n python%{python3_pkgversion}-pello
%doc README.md
%license LICENSE.txt
%{_bindir}/pello_greeting
# The library files needed to be listed manually
%{python3_sitelib}/pello/
# The metadata files needed to be listed manually
%{python3_sitelib}/Pello-*.egg-info/
-
python3_pkgversionマクロを定義することで、このパッケージがビルドされる Python バージョンを設定します。デフォルトの Python バージョン3.12用にビルドするには、行を削除します。 -
Python プロジェクトを RPM にパッケージ化するときは、常に
python-接頭辞をプロジェクトの元の名前に追加してください。ここでは元の名前がPelloであるため、ソース RPM (SRPM) の名前はpython-pelloになります。 -
BuildRequiresは、このパッケージのビルドおよびテストに必要なパッケージを指定します。BuildRequiresには、Python パッケージのビルドに必要なツールを提供するアイテムpython3-develと、パッケージ化する特定のソフトウェアに必要な関連プロジェクト (python3-setuptools、または%checkセクションでテストを実行するのに必要なランタイムとテストの依存関係) を常に含めます。 -
バイナリー RPM (ユーザーがインストールできるパッケージ) の名前を選択する際には、バージョン管理された Python 接頭辞を追加します。デフォルトの Python 3.12 の場合は、
python3-接頭辞を使用します。%{python3_pkgversion}マクロを使用できます。このマクロは、デフォルトの Python バージョン3.12に対して3と評価されます。ただし、たとえば、より新しいバージョンの Python が利用可能な場合など、明示的にバージョンを指定すればその値に設定されます (脚注 1 を参照)。 %py3_buildマクロおよび%py3_installマクロは、インストール場所、使用するインタープリター、その他の詳細を指定する追加の引数を使用して、setup.py buildコマンドおよびsetup.py installコマンドをそれぞれ実行します。注記setuptoolsパッケージのsetup.py buildコマンドとsetup.py installコマンドの使用は非推奨となり、今後の RHEL メジャーリリースでは削除される予定です。代わりに pyproject-rpm-macros を使用できます。-
%checkセクションでは、パッケージ化されたプロジェクトのテストを実行します。正確なコマンドはプロジェクト自体によって異なりますが、%pytestマクロを使用して、RPM に適した方法でpytestコマンドを実行できます。
7.2. Python 3 RPM の一般的なマクロ リンクのコピーリンクがクリップボードにコピーされました!
Python RPM spec ファイルでは、値をハードコーディングするのではなく、常に Python 3 RPM のマクロを使用します。
spec ファイルの冒頭で python3_pkgversion マクロを定義することで、これらのマクロで使用する Python 3 バージョンを再定義できます。詳細は、Python パッケージの例の仕様ファイルの説明を 参照してください。python3_pkgversion マクロを定義すると、以下の表で説明されているマクロの値は、指定された Python 3 バージョンを反映します。
| マクロ | 一般的な定義 | 説明 |
|---|---|---|
| %{python3_pkgversion} | 3 | 他のすべてのマクロで使用される Python バージョン。今後追加される Python バージョンに合わせて再定義できます。 |
| %{python3} | /usr/bin/python3 | Python3 インタープリター |
| %{python3_version} | 3.12 | Python3 インタープリターの major.minor バージョン |
| %{python3_sitelib} | /usr/lib/python3.12/site-packages | pure-Python モジュールがインストールされている場所 |
| %{python3_sitearch} | /usr/lib64/python3.12/site-packages | アーキテクチャー固有の拡張モジュールを含むモジュールがインストールされている場所 |
| %py3_build |
RPM パッケージに適した引数で | |
| %py3_install |
RPM パッケージに適した引数で | |
| %{py3_shebang_flags} | sP |
Python インタープリターディレクティブマクロのデフォルトのフラグセット |
| %py3_shebang_fix |
Python インタープリターディレクティブを |
7.3. Python RPM の自動生成された依存関係の使用 リンクのコピーリンクがクリップボードにコピーされました!
アップストリームが提供するメタデータを使用して、Python RPM の依存関係の自動生成を有効にします。
前提条件
-
RPM の
specファイルが存在する。詳細は、Python パッケージの例の仕様ファイルの説明を 参照してください。
手順
生成された RPM に次のいずれかのディレクトリーを含めます。
-
.dist-info .egg-infoRPM ビルドプロセスは、これらのディレクトリーから仮想
pythonX.YdistProvides を自動的に生成します。次に例を示します。python3.12dist(pello)次に、Python 依存関係ジェネレーターはアップストリームメタデータを読み取り、生成された
pythonX.Ydist仮想 Provides を使用して各 RPM パッケージのランタイム要件を生成します。生成された要件タグの例:Requires: python3.12dist(requests)
-
-
生成された
Requiresを検査します。 -
生成された
Requiresの一部を削除するには、specファイルの%prepセクションでアップストリーム提供のメタデータを変更します。 -
自動要件ジェネレーターを無効にするには、メインパッケージの
%description宣言の上に%{?python_disable_dependency_generator}マクロを含めます。
第8章 Python スクリプトでのインタープリターディレクティブの変更 リンクのコピーリンクがクリップボードにコピーされました!
パッケージ化した Python スクリプトを、想定される形式に準拠するように変更します。
Red Hat Enterprise Linux (RHEL) 10 では、実行可能な Python スクリプトは、ハッシュバンまたはシェバンとも呼ばれるインタープリターディレクティブを使用して、少なくとも Python のメジャーバージョンを明示的に指定することが求められます。以下に例を示します。
#!/usr/bin/python3
#!/usr/bin/python3.12
/usr/lib/rpm/redhat/brp-mangle-shebangs buildroot ポリシー BRP (buildroot policy) スクリプトは、RPM パッケージをビルドする際に自動的に実行され、実行可能なすべてのファイルでインタープリターディレクティブを修正しようとします。BRP スクリプトは、#!/usr/bin/python や #!/usr/bin/env python などのあいまいなインタープリターディレクティブを持つ Python スクリプトを検出するとエラーを生成します。
前提条件
- Python スクリプトのインタープリターディレクティブの一部でビルドエラーが発生する。
手順
シナリオに応じて、次のいずれかの手順を実行してインタープリターディレクティブを変更します。
specファイルの%prepセクションで次のマクロを使用します。%py3_shebang_fix <SCRIPTNAME> ...SCRIPTNAME には、任意のファイル、ディレクトリー、またはファイルおよびディレクトリーのリストを指定できます。
その結果、リストされたすべてのファイルと、リストされたディレクトリー内のすべての
.pyファイルのインタープリターディレクティブが%{python3}を指すように変更されます。元のインタープリターディレクティブの既存のフラグは保持され、%{py3_shebang_flags}マクロで定義された追加のフラグが追加されます。specファイルの%{py3_shebang_flags}マクロを再定義すると、追加されるフラグを変更できます。- パッケージ化した Python スクリプトを、想定される形式に準拠するように変更します。
第9章 Ruby gem のパッケージ化 リンクのコピーリンクがクリップボードにコピーされました!
Ruby プロジェクトを RPM ファイルとしてパッケージ化する。
Ruby は、インタープリター型の汎用プログラミング言語です。Ruby で記述されたプログラムは通常、特定の Ruby パッケージ形式を提供する RubyGems ソフトウェアを使用してパッケージ化されます。
RubyGems によって作成されたパッケージは gem と呼ばれます。gem を RPM パッケージに再パッケージ化することができます。
このドキュメントは、gem 接頭辞とともに RubyGems の概念に関する用語を参照します。たとえば、.gemspec は gem specification に使用され、RPM に関連する用語は修飾されません。
9.1. RubyGems が RPM に関連している仕組み リンクのコピーリンクがクリップボードにコピーされました!
RubyGems は、Ruby 独自のパッケージ形式を表します。ただし、RubyGems には RPM に必要なメタデータに類似したメタデータが含まれています。このメタデータにより、gem を RPM としてパッケージ化することが効率化されます。gem から再パッケージ化された RPM は、他のディストリビューションと整合性が取れています。エンドユーザーは、適切な RPM パッケージ化された gem やその他のシステムライブラリーをインストールすることで、gem の依存関係を満たすこともできます。
RubyGems では、spec ファイル、パッケージ名、依存関係などの項目について、RPM パッケージと同様の用語が使用されます。
RHEL RPM ディストリビューションの他の部分に準拠するには、RubyGems によって作成されたパッケージは次のルールに準拠する必要があります。
-
パッケージに名前を付けるときは、
rubygem-%{gem_name}のパターンに従ってください。 -
インタープリターディレクティブとして
#!/usr/bin/ruby文字列を使用します。
9.2. RubyGems spec ファイルの規則 リンクのコピーリンクがクリップボードにコピーされました!
RubyGems の spec ファイルの構造例と、そのような spec ファイルを作成する際に従うべき具体的な事項を確認してください。
RubyGems の 仕様 ファイルは、以下の規則に従う必要があります。
-
ファイルには、gem の仕様からの名前である
%{gem_name}の定義が含まれています。 - パッケージのソースは、リリースされた gem アーカイブへの完全な URL である必要があります。
- パッケージのバージョンは gem のバージョンと同じである必要があります。
ファイルには次の
BuildRequires:ディレクティブが含まれています。BuildRequires: rubygems-develrubygems-develパッケージにはビルドに必要なマクロが含まれています。-
このファイルには、追加の
rubygem(foo)RequiresまたはProvidesディレクティブは含まれていません。これらのディレクティブは gem のメタデータから自動生成されるためです。
9.2.1. RubyGems spec ファイルの例 リンクのコピーリンクがクリップボードにコピーされました!
以下の、gem をビルドするためのサンプル 仕様 ファイルのうち、RubyGems 固有の部分の詳細を確認してください。なお、仕様 ファイルの残りの部分は、一般的な 仕様 ファイル作成ガイドラインに従っています。
例9.1 サンプル spec ファイルの RubyGems 固有の部分
%prep
%setup -q -n %{gem_name}-%{version}
# Modify the gemspec if necessary
# Also apply patches to code if necessary
%patch 0 -p1
%build
# Create the gem as gem install only works on a gem file
gem build ../%{gem_name}-%{version}.gemspec
# %%gem_install compiles any C extensions and installs the gem into ./%%gem_dir
# by default, so that we can move it into the buildroot in %%install
%gem_install
%install
mkdir -p %{buildroot}%{gem_dir}
cp -a ./%{gem_dir}/* %{buildroot}%{gem_dir}/
# If there were programs installed:
mkdir -p %{buildroot}%{_bindir}
cp -a ./%{_bindir}/* %{buildroot}%{_bindir}
# If there are C extensions, copy them to the extdir.
mkdir -p %{buildroot}%{gem_extdir_mri}
cp -a .%{gem_extdir_mri}/{gem.build_complete,*.so} %{buildroot}%{gem_extdir_mri}/
9.2.2. RubyGems spec ファイルのディレクティブ リンクのコピーリンクがクリップボードにコピーされました!
spec ファイルの RubyGems 固有の部分にある、特定の項目に関する以下の詳細を確認してください。
| ディレクティブ | RubyGems の詳細 |
|---|---|
|
|
RPM は gem アーカイブを直接展開できます。
|
|
|
このセクションには、ソフトウェアをマシンコードにビルドするためのコマンドが含まれています。 |
|
|
インストールは、 |
9.3. RubyGems マクロ リンクのコピーリンクがクリップボードにコピーされました!
RubyGems で作成されたパッケージに役立つ以下のマクロを確認してください。これらのマクロは、rubygems-devel パッケージで提供されています。
| マクロ名 | 拡張パス | 使用方法 |
|---|---|---|
|
|
| gem 構造のトップディレクトリー。 |
|
|
| gem の実際のコンテンツが含まれるディレクトリー。 |
|
|
| gem のライブラリーディレクトリー。 |
|
|
| キャッシュした gem。 |
|
|
| gem 仕様ファイル。 |
|
|
| gem の RDoc ドキュメンテーション。 |
|
|
| gem 拡張のディレクトリー。 |
9.4. gem2rpm を使用して spec ファイルを生成する リンクのコピーリンクがクリップボードにコピーされました!
gem2rpm ユーティリティーを使用して、gem をビルドするための RPM 仕様 ファイルを作成します。
9.4.1. Ruby gem の RPM spec ファイルを作成する リンクのコピーリンクがクリップボードにコピーされました!
gem2rpm ユーティリティーを使用して、RubyGems パッケージの RPM 仕様 ファイルを生成します。
前提条件
システムに
gem2rpmユーティリティーがインストールされている。$ gem install gem2rpm
手順
最新バージョンの gem をダウンロードし、この gem の RPM
specファイルを生成します。$ gem2rpm --fetch <gem_name> > <gem_name>.spec-
生成された
specファイルを編集して、ライセンスや変更ログなどの不足している情報を追加します。
9.4.2. カスタム gem2rpm テンプレートを使用して spec ファイルを生成する リンクのコピーリンクがクリップボードにコピーされました!
gem2rpm テンプレートは、RPM spec ファイルを生成できる標準の Embedded Ruby (ERB) ファイルです。生成された 仕様 ファイルを編集するのではなく、RPM 仕様 ファイルが生成されるテンプレートを編集してください。
前提条件
システムに
gem2rpmユーティリティーがインストールされている。$ gem install gem2rpm
手順
すべての
gem2rpm組み込みテンプレートを表示します。$ gem2rpm --templates組み込みテンプレートの 1 つを選択し、カスタムテンプレートとして保存します。
$ gem2rpm -t <template> -T > rubygem-<gem_name>.spec.templateRHEL 10 Beta の場合は、
fedora-27-rawhideテンプレートが推奨される点に注意してください。- 必要に応じてテンプレートを編集します。詳細は、gem2rpm テンプレート変数 を参照してください。
編集したテンプレートを使用して
specファイルを生成します。$ gem2rpm -t rubygem-<gem_name>.spec.template <gem_name>-<latest_version>.gem > <gem_name>-GEM.spec
9.4.3. gem2rpm テンプレート変数 リンクのコピーリンクがクリップボードにコピーされました!
RPM 仕様 ファイル生成用の gem2rpm テンプレートに含まれる以下の変数を確認してください。
| 変数 | 詳細 |
|---|---|
|
|
gem の |
|
|
gem の |
|
|
|
|
|
パッケージランタイム依存関係のリストを提供する |
|
|
パッケージ開発依存関係のリストを提供する |
|
|
実行を許可するテストフレームワークのリストを提供する |
|
|
パッケージ内のフィルタリングされていないファイルリストを提供する |
|
|
メインパッケージに適したファイルのリストを提供する |
|
|
|