Red Hat Training
A Red Hat training course is available for Red Hat Enterprise Linux
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!