もう何百回もやってるはずなのに定期的にハマるのでメモ
kernelのspec ファイル書き換えてオレオレカーネルを作るには以下の三箇所を変更する
まず、rpm名を書き換えるために6行目ぐらいのbuildidのところ、コメントアウトされてるのを元に戻す
変更元)
変更後)
ここで罠なのは % と define の後に、スペースを入れるのは許されていないのだが、なぜか
変更元はスペースが入っているのでまんまと騙されることである。
あと、名前は "." で初めておかないと、いろいろと後悔する。
kernel-3.10.0-1.el7.mytest.src.rpm
みたいなファイル名になるんだが、ここで "." がないと、前の el7 とくっついてしまう。
次に
となっているところに、適用するパッチを足す
変更後)
とかみたいにする。番号は適当でいいが、ユニークな番号にすること。
なお、ここでファイル名を書くときに余分なスペースは絶対に入れてはいけない。
パッチ適用をするApplyPatchという関数の中で
というクソコードが有るため、スペースが1つでも余分にあるとパッチ適用に失敗する。
わたしは、dired から矩形選択でファイル名持ってきて、これでハマったよ。
さて、rpm specfileはクソフォーマットなので、これで話が終わりじゃなくて、別の場所にもう一度
パッチ一覧を列挙しないといけない。
変更元)
変更先)
のように、ApplyOptionalPatchがあるあたりに、ApplyPatchを書いていく。ここで間違ってもApplyOptionalPatchを
使ってはいけない。
ApplyOptionalPatchはパッチがなきゃあスキップする関数なので、間違った時に気づくのが遅れてしまう。
で、こんなん憶えていられるはずなのでスクリプト書いた
のように名前をファイル名を引数に取ってパッチしてくれる。
以下に置いとく。
https://gist.github.com/kosaki/de41d67a899b0d839599
kernelのspec ファイル書き換えてオレオレカーネルを作るには以下の三箇所を変更する
まず、rpm名を書き換えるために6行目ぐらいのbuildidのところ、コメントアウトされてるのを元に戻す
変更元)
# % define buildid .local
変更後)
%define buildid .mytest
ここで罠なのは % と define の後に、スペースを入れるのは許されていないのだが、なぜか
変更元はスペースが入っているのでまんまと騙されることである。
あと、名前は "." で初めておかないと、いろいろと後悔する。
kernel-3.10.0-1.el7.mytest.src.rpm
みたいなファイル名になるんだが、ここで "." がないと、前の el7 とくっついてしまう。
次に
# empty final patch to facilitate testing of kernel patches
Patch999999: linux-kernel-test.patch
となっているところに、適用するパッチを足す
変更後)
# empty final patch to facilitate testing of kernel patches
Patch999999: linux-kernel-test.patch
Patch10001: hoge1.patch
とかみたいにする。番号は適当でいいが、ユニークな番号にすること。
なお、ここでファイル名を書くときに余分なスペースは絶対に入れてはいけない。
パッチ適用をするApplyPatchという関数の中で
ApplyPatch()
{
(略)
if ! grep -E "^Patch[0-9]+: $patch\$" %{_specdir}/${RPM_PACKAGE_NAME%%%%%{?variant}}.spec ; then
というクソコードが有るため、スペースが1つでも余分にあるとパッチ適用に失敗する。
わたしは、dired から矩形選択でファイル名持ってきて、これでハマったよ。
さて、rpm specfileはクソフォーマットなので、これで話が終わりじゃなくて、別の場所にもう一度
パッチ一覧を列挙しないといけない。
変更元)
ApplyOptionalPatch linux-kernel-test.patch
変更先)
ApplyOptionalPatch linux-kernel-test.patch
ApplyPatch hoge1.patch
のように、ApplyOptionalPatchがあるあたりに、ApplyPatchを書いていく。ここで間違ってもApplyOptionalPatchを
使ってはいけない。
ApplyOptionalPatchはパッチがなきゃあスキップする関数なので、間違った時に気づくのが遅れてしまう。
で、こんなん憶えていられるはずなのでスクリプト書いた
rpmpatch kernel.spec --localname .mytest ../SOURCES/00*.patch
のように名前をファイル名を引数に取ってパッチしてくれる。
以下に置いとく。
https://gist.github.com/kosaki/de41d67a899b0d839599
コメント