読者です 読者をやめる 読者になる 読者になる

Folioscope

プログラミング/Unix系/デザイン/CG などのメモがもりもり

zypperを使ってパッケージにパッチをあててインストール

多くのLinuxディストリビューションがそうであるように、 openSUSEリポジトリには、パッケージのソースコードも含まれています。 幸いopenSUSEのZypperは、バックエンドにRPMを使用しているので、 基本的な手順はRPMのビルドとほとんど変わりません。

基本的な流れは次のとおりです。

  1. src.rpmをダウンロード
  2. ソースコードに変更点を加え、 変更前との差分をパッチ化
  3. rpmを作成してインストール

rootでのビルドはトラブルのもとなので、 パッチを当てる作業などは一般ユーザーで行い、 パッケージのインストール時のみに管理者権限を発動します。

環境を揃える

まずRPMを構築するためのrpm-buildパッケージをインストールします。

$ sudo zypper in rpm-build

つぎに、RPMの構築に必要なディレクトリを作成します。

$ mkdir -p ~/rpmbuild/{SOURCES,SPECS,BUILD,RPMS,SRPMS}

それぞれのディレクトリの役割は、次のとおりです。

SOURCES
アーカイブ化されたソースやパッチファイルがあるところ。
SPECS
RPMの生成手順などが記述されるSPECファイルがあるところ。
BUILD
展開されたソースファイルが置かれるところ。
RPMS
.rpm形式の、コンパイル済みのバイナリパッケージが置かれるところ。
SRPMS
.src.rpm形式の、ソースパッケージが置かれるところ。

ソースをダウンロード

ソースコードsource-installオプションでインストールされます。

$ sudo zypper source-install package_name

これでパッケージのソースコードと、ビルドに必要なパッケージがインストールされました。 ソースコード/usr/src/packages/以下にrpmbuild可能な形で提供されます。

次にユーザがrpmbuild可能なよう、先ほど作成したディレクトリに、ビルドに必要なファイルのリンクを貼ります。 まずビルドに必要なソースコードおよびパッチのシンボリックリンクを、~/rpmbuild/SOURCES以下に作成します。

$ ln -s /usr/src/packages/SOURCES/package_name* ~/rpmbuild/SOURCES

そして.specファイルを、~/rpmbuild/SPEC以下にコピーします。

$ cp /usr/src/packages/SPECS/package_name.spec ~/rpmbuild/SPECS

パッチの作成

パッチをWeb上から拾ってきた人は、BUILDディレクトリに配置してここのステップは終了。 ソースコードを自分で編集する人は、パッチを自作してSOURCEディレクトリに配置します。

まずソースコードを展開して、提供されているパッチをすべて適用します。

$ rpmbuild -bp SPECS/package_name.spec

展開されパッチを当てられたソースコードは、BUILDに展開されます。 差分をとる必要があるので、BUILD内にあるソースコードをコピーします。

$ cd ~/rpmbuild/BUILD
$ cp -r package_name package_name.modify

ソースコードの変更を終えると、変更前とdiffしてSOURCEディレクトリにパッチを作成します。

diff -aurN package_name package_name.modify > ../SOURCE/additional_feature.diff

SPECファイルの変更

作成したパッチをソースコードに適用するように、.specに追記します。

Source: ...
BuildRoot: ...
Patch99: add-share.patch

...

%prep
%setup ...
%patch99 -p1

ビルド & インストール

これですべての準備ができました。 あとはソースコードをビルドしてRPMを作成するだけ。

$ rpmbuild -ba SPECS/package_name.spec

あるいはバイナリパッケージのみで良かったら、-bbオプションで。

$ rpmbuild -bb SPECS/package_name.spec

ビルドが完了すれば、BUILD以下に.rpmができているはずなので、インストールです。

$ sudo zypper in package_name.rpm

参考