「パッケージにパッチを適用」の版間の差分
(ページの作成:「Category:パッケージ管理 en:Patching in ABS {{Related articles start}} {{Related|ABS}} {{Related|SVN から PKGBUILD を取得}} {{Related articles end}}...」) |
細 (Kusakata がページ「ABS でパッチを適用」を「パッケージにパッチを適用」に移動しました) |
(相違点なし)
| |
2018年1月18日 (木) 20:44時点における版
関連記事
このドキュメントでは ABS を使ってパッケージにパッチを作成したり適用する手順を説明します。
パッチの作成
別の場所から入手したパッチを使う場合 (例: Linux カーネルのパッチをダウンロードした場合)、下のセクションに飛んでください。ただしソースコードや Makefile、設定ファイルなどを編集する必要がある場合、パッチを作成できるようにならなければなりません。
パッケージのパッチを作成するときは、パッケージのコピーを2つ作成して、新しいコピーを編集し、2つのファイルの差分を作成します。Arch Linux パッケージを作成する場合、以下の手順に従うことでパッチが作成できます:
- ファイルのダウンロード先を
PKGBUILDの source 配列に追加してください。もちろん、既存の PKGBUILD を編集する場合、必要ありません。 - ダミーの (空の、あるいは
echoコマンドだけしか存在しない) build() 関数を作成してください。既存のPKGBUILDを修正する場合、build 関数の大部分をコメントアウトしてください。makepkgを複数回実行することになるため、壊れたパッケージをビルドするのに時間を費やすのは無駄です。 makepkg -oを実行してください。編集する必要があるソースファイルがsrcディレクトリにダウンロードされます。srcディレクトリに移動してください。通常の場合、ダウンロードした圧縮ファイルから解凍されたファイルが含まれたディレクトリが存在します (ファイルしかない場合もありますが、差分は複数のファイルを処理できます)。ディレクトリのコピーを2つ作成してください。片方のコピーには手を入れず makepkg で操作しません。もう片方のコピーからパッチを作成します。2つのコピーにはpackage.pristineとpackage.newなどと名前を付けます。package.newディレクトリに移動してください。編集する必要があるファイルを全て編集します。必要な変更はパッチで何をするかによります。Makefile のパスを修正する、あるいはソースのエラーを修正する (例えば、gcc 3.4でコンパイルできるようにする) などです。無論、package.newディレクトリのサブディレクトリにあるファイルを編集することもできます。package.newディレクトリに大量のファイルを作成するコマンドを実行しないように気をつけてください。プログラムをコンパイルして変更が問題ないかを確認してはいけません。コンパイルを実行してしまうと、無用なファイルがパッチの中に入ってしまいます。代わりに、手動でpatchコマンドを使用するかPKGBUILD(下を参照) でディレクトリの別のコピー (先に作成した pristine ディレクトリではありません) にパッチを適用して、そこから変更を適用してください。srcディレクトリに戻ってください。diff -aur package.pristine package.newを実行してください。unified 形式の diff フォーマットで全ての変更が出力されます。ファイルを開いてパッチが問題ないことを確認することができます。diff -aur package.pristine package.new > package.patchを実行して全ての変更をpackage.patchという名前のファイルにまとめてください。これが patch で使用するファイルになります。元のディレクトリのコピーに変更を適用して、上手くパッチが機能することを確認できます。また、パッチに無駄な情報が含まれていないことも確認すると良いでしょう。例えば、ファイル内のタブがパッチによってスペースに変換されるのは望ましくありません (テキストエディタが行ったことが原因です)。パッチはテキストエディタを使って編集することができます。あるいは万全を期して (diff ファイルに誤りを入れないように)、元のファイルを編集してから再度パッチを作成してもかまいません。
パッチの適用
このセクションでは自分で作成した、あるいはインターネットからダウンロードしてきたパッチを PKGBUILD の prepare() 関数で適用する方法を説明します。以下の手順に従ってください:
PKGBUILDのsource配列にパッチファイルのエントリを追加してください。元のソース url とは空白で区切られます。ファイルがオンライン上に存在する場合、完全な URL を記入すればsrcディレクトリに自動的にダウンロード・配置されます。パッチを自分で作成した場合、あるいはインターネット上からパッチを取得できない場合、PKGBUILDファイルと同じディレクトリにパッチファイルを置いて、source 配列にファイルの名前を追加してください。ファイルがsrcディレクトリにコピーされるようになります。PKGBUILDを再配布する場合、PKGBUILDとパッチを一緒にする必要があります。- 次に
updpkgsumsを使用してmd5sums配列を更新してください。あるいは手動でmd5sums配列にエントリを追加してください。md5sumツールを使うことでパッチのチェックサムを生成できます。 PKGBUILDの中にprepare()関数を(存在しない場合)作成してください。- まずはパッチをあてる必要があるディレクトリに移動します (移動を行うのは
prepare()関数の中で、ターミナルではありません。パッチの適用を自動化します)。cd $srcdir/$pkgname-$pkgverなどとすることでディレクトリを移動できます。$pkgname-$pkgverはダウンロードされたソースファイルが展開されたときによく作られるディレクトリの名前ですが、必ずしもこの名前になるとは限りません。 - ディレクトリの中からパッチを適用してください。
prepare()関数に以下を追加するだけです (pkgname.patchは差分が含まれているファイルの名前に置き換えてください。パッチファイルはPKGBUILDのsource配列に追加したので自動的にsrcディレクトリにコピーされています):patch -p1 <pkgname.patch
- prepare 関数の例:
prepare() { cd $pkgname-$pkgver patch -Np1 <../eject.patch }
- prepare 関数の例:
(ターミナルから) makepkg を実行してください。全てが上手くいっていれば、パッチが自動的に適用されて、新しいパッケージにはパッチに含まれている変更が追加されているはずです。そうならない場合、patch の -p オプションを使って実験を行ってみてください。詳しくは man patch を読んでください。
基本的には次のようになっています。myversion/ のファイルにパッチを適用する diff ファイルが作成された場合、diff ファイルは myversion/file に適用されます。(PKGBUILD で cd した) yourversion/ ディレクトリの中から実行する場合、ファイルにパッチが適用されるときに、myversion/ の部分は省いて file ファイルに適用されるようにしなくてはなりません。-p1 でパスからディレクトリが一つ削除されます。しかしながら、開発者が myfiles/myversion にパッチを適用した場合、ディレクトリを二つ削除する必要があるので、-p2 を使います。
-p オプションを指定しなかった場合、全てのディレクトリ構造が取り除かれます。全てのファイルがベースディレクトリに存在する場合はそれで ok ですが、パッチを作成したのが myversion/ で編集したファイルが myversion/src/file の場合、yourversion の中から -p オプションを付けずにパッチを実行したときに、yourversion/file という名前のファイルにパッチが適用されてしまいます。
ほとんどの開発者はパッチを適用するディレクトリの親ディレクトリからパッチを作成するので、通常は -p1 が正しくなります。
参照
- http://www.kegel.com/academy/opensource.html — Useful information on patching files
- http://patch-tracker.debian.org/
- http://gentoo-portage.com/
- http://packages.gentoo.org/
- http://pkgs.fedoraproject.org/cgit/