2.4. ソフトウェアへのパッチの適用
本セクションでは、ソフトウェアにパッチを適用する方法を説明します。
RPM のパッケージ化では、元のソースコードを変更するのではなく、コードを維持し、コードにパッチを使用します。
パッチは、ソースコードを更新するソースコードです。これは、2 つのバージョンのテキストの差を示すため、diff としてフォーマットされます。diff は、diff
ユーティリティーを使用して作成されます。これは、パッチ ユーティリティーを使用してソースコードに適用されます。
ソフトウェア開発者は多くの場合、git などのバージョン管理システムを使用してコードベースを管理します。このようなツールでは、diff やパッチソフトウェアを独自の方法で作成できます。
以下の例は、diff
を使用して元のソースコードからパッチを作成する方法と、パッチ
でパッチを適用する方法を示しています。後続のセクションで RPM を作成するときにパッチを適用します。「SPEC ファイルでの作業」 を参照してください。
この手順では、cello.c
の元のソースコードからパッチを作成する方法を説明します。
手順
元のソースコードを保持します。
cp -p cello.c cello.c.orig
$ cp -p cello.c cello.c.orig
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -p
オプションは、モード、所有権、およびタイムスタンプを保持するために使用されます。必要に応じて
cello.c
を変更します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow diff
ユーティリティーを使用してパッチを生成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
で始まる行は、元のソースコードから削除され、+
で始まる行に置き換えられます。通常のユースケースの多くに適切なため、
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
$ diff -Naur cello.c.orig cello.c > cello-output-first-patch.patch
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 元の
cello.c
を復元します。cp cello.c.orig cello.c
$ cp cello.c.orig cello.c
Copy to Clipboard Copied! Toggle word wrap Toggle overflow RPM を構築するときは変更後のファイルではなく、元のファイルが使用されるため、元の
cello.c
を保持する必要があります。詳細は、「SPEC ファイルでの作業」 を参照してください。
以下の手順は、output-first-patch.patch
を使用して cello.c
にパッチを適用して、パッチプログラムを構築し、これを実行する方法を示しています。
パッチファイルの出力先を
patch
コマンド変更します。patch < cello-output-first-patch.patch
$ patch < cello-output-first-patch.patch patching file cello.c
Copy to Clipboard Copied! Toggle word wrap Toggle overflow cello.c
の内容がパッチを反映していることを確認します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow パッチが適用された
cello.c
を構築して実行します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow