Menu Close
Settings Close

Language and Page Formatting Options

Red Hat Training

A Red Hat training course is available for RHEL 8

2.6. ソフトウェアへのパッチの適用

RPM のパッケージ化では、元のソースコードを変更するのではなく、コードを維持し、コードにパッチを使用します。

パッチは、ソースコードを更新するソースコードです。これは、2 つのバージョンのテキストの差を示すため、diff としてフォーマットされます。diff は、diff ユーティリティーを使用して作成されます。これは、パッチ ユーティリティーを使用してソースコードに適用されます。

注記

ソフトウェア開発者は多くの場合、git などのバージョン管理システムを使用してコードベースを管理します。このようなツールでは、diff やパッチソフトウェアを独自の方法で作成できます。

本セクションでは、ソフトウェアにパッチを適用する方法を説明します。

以下の例は、diff を使用して元のソースコードからパッチを作成する方法と、パッチ でパッチを適用する方法を示しています。後半のセクションで RPM を作成するときにパッチを適用します。

この手順では、cello.c の元のソースコードからパッチを作成する方法を説明します。

手順

  1. 元のソースコードを保持します。

    $ cp -p cello.c cello.c.orig

    -p オプションは、モード、所有権、およびタイムスタンプを保持するために使用されます。

  2. 必要に応じて cello.c を変更します。

    #include <stdio.h>
    
    int main(void) {
        printf("Hello World from my very first patch!\n");
        return 0;
    }
  3. 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 を参照してください。

  4. ファイルにパッチを保存します。

    $ diff -Naur cello.c.orig cello.c > cello-output-first-patch.patch
  5. 元の cello.c を復元します。

    $ cp cello.c.orig cello.c

    RPM を構築するときは変更後のファイルではなく、元のファイルが使用されるため、元の cello.c を保持する必要があります。詳細は、「SPEC ファイルでの作業」を参照してください。

以下の手順は、output-first-patch.patch を使用して cello.c にパッチを適用して、パッチプログラムを構築し、これを実行する方法を示しています。

手順

  1. パッチファイルの出力先を patch コマンド変更します。

    $ patch < cello-output-first-patch.patch
    patching file cello.c
  2. cello.c の内容がパッチを反映していることを確認します。

    $ cat cello.c
    #include<stdio.h>
    
    int main(void){
        printf("Hello World from my very first patch!\n");
        return 1;
    }
  3. パッチが適用された cello.c を構築して実行します。

    $ make clean
    rm cello
    
    $ make
    gcc -g -o cello cello.c
    
    $ ./cello
    Hello World from my very first patch!