第3章 RPM パッケージ化を行うためのソフトウェアの準備

次のセクションでは、RPM パッケージ化用のソフトウェアを準備する方法を説明します。

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

ソフトウェアをパッケージ化する場合、バグの修正や設定ファイルの変更など、元のソースコードに特定の変更を加えることが必要になる場合があります。RPM パッケージでは、元のソースコードをそのままにして、パッチを適用するだけで済みます。

パッチは、ソースコードファイルを更新するテキストです。パッチは 2 つのバージョンのテキストの差を示すものであるため、diff 形式を使用します。diff ユーティリティーを使用してパッチを作成し、patch ユーティリティーを使用してそのパッチをソースコードに適用できます。

注記

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

次のセクションでは、C プログラミング言語で記述された Hello World プログラムのパッチを作成 する方法と、このプログラムにパッチを適用する する方法を説明します。

3.1.1. cello プログラムのパッチファイルの作成

diff ユーティリティーを使用して、元のソースコードからパッチを作成できます。

手順

  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 -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 オプションを指定することを推奨します。ほとんどのユースケースに適しているためです。

    • -N (--new-file)

      -N オプションは、存在しないファイルを空のファイルとして処理します。

    • -a (--text)

      -a オプションは、すべてのファイルをテキストとして扱います。その結果、diff ユーティリティーがバイナリーとして分類されたファイルを無視しなくなります。

    • -u (-U NUM または --unified[=NUM])

      -u オプションは、統一されたコンテキストの出力の NUM 行 (デフォルトは 3 行) の形式で出力を返します。これは、パッチファイルで一般的に使用される、コンパクトで読みやすい形式です。

    • -r (--recursive)

      -r オプションは、diff ユーティリティーが検出したサブディレクトリーを再帰的に比較します。

    ただし、この場合は、-u オプションのみが必要であることに注意してください。

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

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

    $ mv cello.c.orig cello.c

    RPM パッケージマネージャーは RPM パッケージをビルドするときに、変更されたファイルではなく元のファイルを使用するため、元の cello.c を保持する必要があります。詳細は、SPEC ファイルでの作業 を参照してください。

関連情報

  • diff(1) man ページ

3.1.2. cello プログラムへのパッチ適用

patch ユーティリティーを使用してソフトウェアにパッチを適用できます。

手順

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

    $ patch < cello.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
    gcc -g -o cello cello.c
  4. ビルドした cello.c プログラムを実行します。

    $ ./cello
    Hello World from my very first patch!