2.4. ソフトウェアへのパッチの適用
本セクションでは、ソフトウェアにパッチを適用する方法を説明します。
RPM のパッケージ化では、元のソースコードを変更するのではなく、コードを維持し、コードにパッチを使用します。
パッチは、ソースコードを更新するソースコードです。これは、2 つのバージョンのテキストの差を示すため、diff としてフォーマットされます。diff は、diff
ユーティリティーを使用して作成されます。これは、パッチ ユーティリティーを使用してソースコードに適用されます。
ソフトウェア開発者は多くの場合、git などのバージョン管理システムを使用してコードベースを管理します。このようなツールでは、diff やパッチソフトウェアを独自の方法で作成できます。
以下の例は、diff
を使用して元のソースコードからパッチを作成する方法と、パッチ
でパッチを適用する方法を示しています。後続のセクションで RPM を作成するときにパッチを適用します。「SPEC ファイルでの作業」 を参照してください。
この手順では、cello.c
の元のソースコードからパッチを作成する方法を説明します。
手順
元のソースコードを保持します。
$ 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
ユーティリティーを使用してパッチを生成します。$ 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
オプションを指定することが推奨されます。ただし、この場合は、-u
オプションのみが必要になります。特定のオプションにより、以下が確保されます。-
-N
(または--new-file
) - 存在しないファイルを、空のファイルであるかのように処理します。 -
-a
(または--text
) - すべてのファイルをテキストとして処理します。そのため、diff
がバイナリーとして分類するファイルは無視されません。 -
-u
(もしくは-U NUM
または--unified[=NUM]
) - 統一されたコンテキストの出力の NUM (デフォルトは 3) 行の形式で、出力を返します。これは、変更したソースツリーにパッチを適用する際に、あいまい一致を可能にする読みやすい形式です。 -r
(または--recursive
) - 検出されたサブディレクトリーを再帰的に比較します。diff
ユーティリティーの一般的な引数は、man ページのdiff
を参照してください。
-
ファイルにパッチを保存します。
$ diff -Naur cello.c.orig cello.c > cello-output-first-patch.patch
元の
cello.c
を復元します。$ cp cello.c.orig cello.c
RPM を構築するときは変更後のファイルではなく、元のファイルが使用されるため、元の
cello.c
を保持する必要があります。詳細は、「SPEC ファイルでの作業」 を参照してください。
以下の手順は、output-first-patch.patch
を使用して cello.c
にパッチを適用して、パッチプログラムを構築し、これを実行する方法を示しています。
パッチファイルの出力先を
patch
コマンド変更します。$ patch < cello-output-first-patch.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 clean rm cello $ make gcc -g -o cello cello.c $ ./cello Hello World from my very first patch!