3.2. SPEC ファイルでの作業
このセクションでは、SPEC ファイルを作成して変更する方法を説明します。
前提条件
このセクションでは、「ソースコードの例」 で説明された Hello World!
の 3 つの実装例を使用します。
各プログラムは、以下の表で詳細に説明しています。
ソフトウェアの名前 | 例の説明 |
bello | raw インタープリタープログラミング言語で書かれたプログラム。ソースコードを構築する必要はなく、インストールのみが必要である場合を示しています。事前にコンパイル済みのバイナリーをパッケージ化する必要がある場合、バイナリーは単なるファイルであるため、この方法を使用することもできます。 |
pello | バイトコンパイルインタプリタ-プログラム言語で書かれたプログラム。これは、ソースコードのバイトコンパイルと、生成される事前処理ファイルのバイトコードのインストールを示しています。 |
cello | ネイティブコンパイル言語で書かれたプログラム。これは、ソースコードをマシンコードにコンパイルし、生成される実行ファイルをインストールする一般的なプロセスを示しています。 |
Hello World!
の実装は次のとおりです。
前提条件として、これらの実装は、~/rpmbuild/SOURCES
ディレクトリーに置く必要があります。
3.2.1. 新しい SPEC ファイルを作成する方法
新しいソフトウェアをパッケージ化するには、新しい SPEC ファイルを作成する必要があります。
これをアーカイブするには、2 つの方法があります。
- 手動による SPEC ファイルの新規作成
rpmdev-newspec
ユーティリティーの使用このユーティリティーは、空の SPEC ファイルを作成し、必要なディレクティブとフィールドを入力します。
プログラマーに焦点を合わせたテキストエディターの中には、独自の SPEC テンプレートで新しい .spec
ファイルを事前に準備しているものもあります。rpmdev -newspec
ユーティリティーでは、エディターに依存しないアプローチを利用できます。
3.2.2. rpmdev-newspec を使用した新規 SPEC ファイルの作成
以下の手順は、rpmdev -newspec
ユーティリティーを使用して、上記の 3 つの Hello World!
プログラムごとに SPEC ファイルを作成する方法を示しています。
手順
~/rpmbuild/specs
ディレクトリーに移動し、rpmdev -newspec
ユーティリティーを使用します。$ cd ~/rpmbuild/SPECS $ rpmdev-newspec bello bello.spec created; type minimal, rpm version >= 4.11. $ rpmdev-newspec cello cello.spec created; type minimal, rpm version >= 4.11. $ rpmdev-newspec pello pello.spec created; type minimal, rpm version >= 4.11.
~/rpmbuild/specs/
ディレクトリーには、bello.spec
、cello.spec
、およびpello.spec
という名前の 3 つの SPEC ファイルが含まれています。
fd。ファイルを調べます。
+
rpmdev-newspec
ユーティリティーは、特定の Linux ディストリビューションに固有のガイドラインや規則を使用しません。ただし、本ドキュメントは Red Hat Enterprise Linux を対象にしています。そのため、SPEC ファイル全体にわたり定義または提供したその他のすべてのマクロとの一貫性を確立するために、RPM のビルドルートを参照する際には、$RPM_BUILD_ROOT
において %{buildroot}
の記述が推奨されます。
3.2.3. RPM を作成するための、元の SPEC ファイルの変更
以下の手順では、RPM を作成する rpmdev- newspec
による SPEC 出力ファイルを修正する方法を示しています。
前提条件
以下の点を確認してください。
-
特定のプログラムのソースコードが、
~/rpmbuild/SOURCES/
ディレクトリーに置かれている。 -
空の SPEC ファイル (
~/rpmbuild/specs/<name>.spec
ファイル) が、rpmdev -newspec
ユーティリティーで作成されている。
手順
-
rpmdev -newspec
ユーティリティーで生成される~/rpmbuild/specs/<name>.spec
ファイルの出力テンプレートを開きます。 SPEC ファイルの最初のセクションを作成します。
最初のセクションには、
rpmdev -newspec
がグループ化される以下のディレクティブが含まれます。-
Name
-
Version
-
Release
Summary
Name
はすでにrpmdev -newspec
の引数として指定されています。Version
を、ソースコードのアップストリームのリリースバージョンと一致するように設定します。Release
は、1%{?dist}
に自動的に設定されます。最初は1
となります。パッチを追加する場合など、アップストリームリリースのVersion
を変更せずにパッケージを更新するたびに、初期値を増やします。新しいアップストリームリリースが行われた際に、Release
が1
にリセットされます。Summary
は、ソフトウェアに関する 1 行の短い説明です。
-
License
、URL
、およびSource0
ディレクティブを入力します。License
フィールドは、アップストリームリリースのソースコードに関連するソフトウェアライセンスです。SPEC ファイルでLicense
にラベルを付ける方法は、使用する RPM ベースの特定の Linux ディストリビューションガイドラインによって異なります。たとえば、GPLv3+ を使用できます。
URL
フィールドは、アップストリームのソフトウェア Web サイトへの URL を指定します。一貫性を保つために、%{name}
の RPM マクロ変数を利用し、https://example.com/%{name} を使用します。Source0
フィールドは、アップストリームのソフトウェアソースコードへの URL を指定します。これは、パッケージ化している特定のバージョンのソフトウェアに直接リンクする必要があります。本ドキュメントの URL の例には、将来変更される可能性があるハードコーディングした値が含まれています。同様に、リリースのバージョンも変更される可能性があります。今後の変更を簡素化するには、%{name}
マクロと%{version}
マクロを使用します。これらを使用して、SPEC ファイルの 1 つのフィールドのみを更新する必要があります。BuildRequires
ディレクティブ、Requires
ディレクティブ、およびBuildArch
ディレクティブを入力します。BuildRequires
は、パッケージのビルドタイム依存関係を指定します。Requires
は、パッケージのランタイム依存関係を指定します。これは、ネイティブにコンパイルされた拡張機能がない、インタープリター型プログラミング言語で書かれたソフトウェアです。したがって、
noarch
値とともにBuildArch
ディレクティブを追加します。これは、このパッケージを構築するプロセッサーアーキテクチャーに制限する必要がないことを RPM に指定します。%description
、%prep
、%build
、%install
、%files
、%license
ディレクティブを入力します。これらのディレクティブは、マルチライン、マルチインストラクション、または実行するスクリプト処理タスクを定義することができるため、セクションの見出しと考えることができます。
%description
は、ソフトウェアの完全な説明でSummary
よりも長く、複数の段落が含まれています。% prep
セクションでは、ビルド環境の準備方法を指定します。通常、これには、ソースコードの圧縮アーカイブのデプロイメント、パッチの適用、および SPEC ファイルの後半で使用するためにソースコードでによる情報の解析が含まれます。このセクションでは、ビルトインの% setup -q
マクロを使用できます。%build
セクション では、ソフトウェアを構築する方法を指定します。%install
セクションには、ソフトウェアを構築してからBUILDROOT
ディレクトリーにインストールする方法に関するrpmbuild
の説明が記載されています。このディレクトリーは空の chroot ベースディレクトリーで、エンドユーザーの root ディレクトリーに似ています。ここでは、インストールしたファイルを格納するディレクトリーを作成できます。このようなディレクトリーを作成するには、パスをハードコードせずに RPM マクロを使用します。
%files
セクションは、この RPM によるファイルのリストと、エンドユーザーシステム上のファイルの完全なパス場所を指定します。このセクションでは、組み込みのマクロを使用して、さまざまなファイルのロールを示すことができます。これは、command[]
rpm
コマンドを使用したパッケージファイルマニフェストのメタデータの照会に役立ちます。たとえば、LICENSE ファイルがソフトウェアライセンスファイルであることを示すには、%license
マクロを使用します。最後のセクションの
%changelog
は、パッケージの各 Version-Release に対する日付入りのエントリーのリストです。これらは、ソフトウェアの変更ではなく、パッケージの変更を記録します。パッケージ変更の例: パッチの追加、%build
セクションのビルド手順の変更。最初の行は、以下の形式に従います。
*
文字でで始まり、Day-of-Week Month Day Year Name Surname <email> - Version-Release
が続きます。実際の変更エントリーには、以下の形式に従います。
- 各変更エントリーには、変更ごとに複数の項目を含めることができます。
- 各項目は新しい行で始まります。
-
各項目は
-
文字で始まります。
これで、必要なプログラム用に SPEC ファイル全体を作成できるようになりました。
異なるプログラミング言語で書かれた SPEC ファイルの例は、以下を参照してください。
3.2.4. bash で書かれたプログラム用の SPEC ファイルサンプル
このセクションでは、bash 書かれた bello プログラムの SPEC ファイルの例を示しています。bello の詳細は 「ソースコードの例」 を参照してください。
bash で記載された bello の SPEC ファイルの例
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
シェル環境のみが必要なためです。
bash
はビルド不要のため、ソフトウェアの構築方法を示す %build
セクションは空白です。
bello
をインストールする場合は、インストール先のディレクトリーを作成し、そこに実行可能な bash
スクリプトファイルをインストールする必要があります。よって、%install
セクションで install
コマンドを使用できます。RPM マクロを使用すると、パスをハードコーディングせずにこれを実行できます。
3.2.5. Python で書かれたプログラムの SPEC ファイルサンプル
このセクションでは、Python プログラミング言語で書かれた pello プログラムの SPEC ファイルの例を示します。pello の詳細は 「ソースコードの例」 を参照してください。
Python で書かれた pello プログラムの SPEC ファイルサンプル
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
pello バイトコンパイルインタープリター言語で書かれたプログラムです。よって、生成されるファイルにはエントリーが含まれていないため、シバンは使いません。
シバンは使わないため、以下のアプローチのいずれかを適用する必要があります。
- 実行ファイルを呼び出す、バイトコンパイル以外のシェルスクリプトを作成します。
- プログラムの実行にエントリーポイントとしてバイトコンパイルされない小規模の Python コードを提供します。
これらのアプローチは特に、事前にコンパイルされたコードのパフォーマンス向上が大きい、数千行ものコードを含む大規模ソフトウェアプロジェクトに便利です。
パッケージのビルドタイム依存関係を指定する BuildRequires
ディレクティブには、以下の 2 つのパッケージが含まれます。
-
python
パッケージが、バイトコンパイルのビルドプロセスを実行する必要がある。 -
小規模なエントリーポイントスクリプトを実行するには、
bash
パッケージが必要。
パッケージのランタイム依存関係を指定する Requires
ディレクティブには、python
パッケージのみが含まれます。pello
プログラムは、実行時にバイトコンパイルコードを実行するために python
パッケージを必要とします。
%build
セクションは、ソフトウェアを構築する方法を指定します。つまり、ソフトウェアがバイトコンパイルされるということになります。
pello
をインストールするには、ラッパースクリプトを作成する必要があります。これは、シバンがバイトコンパイル言語で該当しないためです。これを行うには、以下のような複数のオプションを利用できます。
-
個別のスクリプトを作成し、それを個別の
SourceX
ディレクティブとして使用します。 - SPEC ファイルにファイルをインラインで作成。
この例では、SPEC ファイルにラッパースクリプトのインラインを作成し、SPEC ファイル自体がスクリプト可能であるこを示しています。このラッパースクリプトは、こちら
のドキュメントを使用して Python バイトコンパイルコードを実行します。
この例の %install
セクションは、アクセスできるように、バイトコンパイルファイルをシステム上のライブラリーディレクトリーにインストールする必要があるという事実に一致します。
3.2.6. C で書かれたプログラムの SPEC ファイルサンプル
このセクションでは、C プログラミング言語で書かれた cello プログラム用の SPEC ファイルの例を示します。cello の詳細は 「ソースコードの例」 を参照してください。
C 言語で書かれた cello の SPEC ファイルの例
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
ディレクティブには、コンパイルビルドプロセスを実行するために必要な 2 つのパッケージが含まれます。
-
gcc
パッケージ -
make
パッケージ
この例では、パッケージにランタイム依存関係を指定する Requires
ディレクティブは省略されています。すべてのランタイム要件は rpmbuild
により処理されます。cello
プログラムはコア C 標準ライブラリー以外のものは必要としません。
%build
セクションは、この例では、cello プログラムの Makefile
が書かれているため、rpmdev-newspec
ユーティリティーによる GNU make コマンドを使用できます。ただし、設定スクリプトを指定していないため、%configure
に対する呼び出しを削除する必要があります。
cello プログラムのインストールは、rpmdev-newspec
コマンドによる %make_install
マクロを使用して行うことができます。これは、cello プログラムの Makefile
が利用できるため可能です。