第3章 RPM パッケージ化を行うためのソフトウェアの準備
RPM を使用してソフトウェアをパッケージ化する準備をするには、まずソフトウェアにパッチを適用し、LICENSE ファイルを作成し、それを tarball 形式でアーカイブします。
3.1. ソフトウェアへのパッチの適用
ソフトウェアをパッケージ化する場合、バグの修正や設定ファイルの変更など、元のソースコードに特定の変更を加えることが必要になる場合があります。RPM パッケージでは、元のソースコードを変更せずにそのままにして、パッチを適用することができます。
パッチは、ソースコードファイルを更新するテキストです。パッチは 2 つのバージョンのテキストの差を示すものであるため、diff 形式を使用します。diff
ユーティリティーを使用してパッチを作成し、patch ユーティリティーを使用してそのパッチをソースコードに適用できます。
ソフトウェア開発者は多くの場合、Git などのバージョン管理システムを使用してコードベースを管理します。このようなツールでは、diff やパッチソフトウェアを独自の方法で作成できます。
3.1.1. サンプル C プログラムのパッチファイルの作成
diff
ユーティリティーを使用して、元のソースコードからパッチを作成できます。たとえば、C で書かれた Hello world
プログラム (cello.c
) にパッチを適用するには、次の手順を実行します。
前提条件
システムに
diff
ユーティリティーをインストールした。# yum 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 ファイルでの作業 を参照してください。
関連情報
-
diff(1)
man ページ
3.1.2. サンプル C プログラムへのパッチ適用
ソフトウェアにコードパッチを適用するには、patch
ユーティリティーを使用できます。
前提条件
システムに
patch
ユーティリティーをインストールした。# yum install patch
- 元のソースコードからパッチを作成した。手順については、サンプル C プログラムのパッチファイルの作成 参照してください。
手順
次の手順では、以前に作成した cello.patch
ファイルを cello.c
ファイルに適用します。
パッチファイルの出力先を
patch
コマンド変更します。$ patch < cello.patch patching file cello.c
cello.c
の内容に必要な変更が反映されていることを確認します。$ cat cello.c #include<stdio.h> int main(void){ printf("Hello World from my very first patch!\n"); return 1; }
検証
パッチを適用した
cello.c
プログラムをビルドします。$ make gcc -g -o cello cello.c
ビルドした
cello.c
プログラムを実行します。$ ./cello Hello World from my very first patch!