web-dev-qa-db-ja.com

ソフトウェアパッチを適用するにはどうすればよいですか?

誰かが私の好きな機能を追加するためのパッチを書いたアプリケーションfoobarがあります。パッチはどのように使用できますか?

15
goldilocks

パッチはdiffコマンドを使用して作成されるため、通常、パッチは.diffファイルに含まれています。

パッチは、ソースコードへの一連の挿入と削除です。このため、パッチを使用するには、パッチを適用した後、ソースからアプリケーション(「foobar」など)をビルドする必要があります。したがって、段階的に:

(1。foobar。)のソースパッケージを取得します

ほとんどのLinuxディストリビューション(n.b.パッチはLinuxに固有ではありません)には、この目的に使用できる「ソースパッケージ」がありますが、これらは異種混合であるため、ここでは元のソースの形式のみを参照します。元のソースはディストリビューションの一部ではなく、見つけるのが難しい場合があります。開始するのに適した場所は、多くの人気のあるアプリケーションの記事が掲載されているウィキペディアです。記事には、ソースをダウンロードしたホームページへのリンクが含まれている必要があります。もちろん、自分でグーグルすることもできます。ソースパッケージはfoobar.0.1.tar.bz2のようなものと呼ばれます。これを解凍します。これでfoobar.0.1というディレクトリができました。

2。パッチを追加します。

パッチが単一のファイルである場合もあれば、複数のファイルのセットである場合もあります。それらをfoobar.0.1cd foobar.0.1にコピーします。次に、patchコマンドを実行する必要があります。これは標準入力から読み取るため、.diffファイルをパイプで転送します。トリッキーな部分は、-pオプションに何を使用するかを決定することです(パッチに指示がない場合)。これを行うには、パッチファイルの先頭を確認する必要があります。例えば:

--- old/comm.c  2003-09-08 14:25:08.000000000 +0000
+++ new/comm.c  2006-07-07 02:39:24.000000000 +0000

この場合、comm.cは変更されるソースファイルの名前です。ただし、それに追加されたディレクトリがあることに注意してください。これらは同じディレクトリ(「古い」と「新しい」)ではないため、これはパスのこの部分が(私たちの目的のために)ジャンクであるという大きな手がかりです。 -pスイッチ(man patchを参照)の目的は、この接頭辞を削除することです。削除するスラッシュ(/)の数である数値が必要で、その間にすべてが含まれます。この場合、-p1を使用して、パスを単なるcomm.cに減らします。

これは、comm.cが実際には同じディレクトリにあることを前提としています。これは、解釈が正しいかどうかに関する別の手がかりになります。これらの行が両方ともsrc/comm.cであり、comm.cが実際にビルドツリーのsrcサブディレクトリにある場合は、-p0を使用する必要があります。-pをまったく使用しないとすべてのスラッシュが削除されることに注意してください。パスが絶対パスである場合(つまり、/で始まる場合)、おそらくそれが必要です。次にパッチを適用します。

patch -p1 < patch.diff

ソースが変更されました。さらに.diffファイルがある場合は、同じ方法で適用します。

。ビルドしてインストールします。

これは、ソースから何かを構築するために実行する通常のプロセスです。最初に./configure、次にmakemake checkmake installです。最後のインストールを行う前に、foobarの既存のインストールがある場合は、それを削除するか上書きするか、または名前の競合にどのように対処するかを決定します。 foobarに、古いバージョンではなく、新しいパッチバージョンを参照させたいと思うでしょう。

21
goldilocks