This service is available only in Japanese-language.

Linux Kernelへのパッチ適用方法

kernelにパッチをあてるレシピを作成したいものです。
パッチファイルは
https://github.com/Microchip-Ethernet/EVB-KSZ9477/tree/57c11b043bf6aecfc...
にあるものですので、以下のlinux-imx_%.bbappendを追加しました。
~~~~
SRC_URI += "https://github.com/Microchip-Ethernet/EVB-KSZ9477/archive/57c11b043bf6ae...
SRC_URI[md5sum] = "02763539f65f5f165e3448abc1c93f36"
SRC_URI[sha256sum] = "5f57d8ae2758f5c2a249b4a6f4d70f1a91673cbfff84899765d203a2a3ef0af8"
SRC_URI += "file:///${WORKDIR}/EVB-KSZ9477-57c11b043bf6aecfc06e5c8ae1386d3cdad17120/KSZ/linux-drivers/imx/linux-4.14/drivers/net/ethernet/freescale/fec.h.patch"
SRC_URI += "file:///${WORKDIR}/EVB-KSZ9477-57c11b043bf6aecfc06e5c8ae1386d3cdad17120/KSZ/linux-drivers/imx/linux-4.14/drivers/net/ethernet/freescale/fec_main.c.patch"
~~~~
bitbake linux-imxを実行すると以下のエラーとなりました。
何かしらパッチ適用先のファイルを指定しないといけないのでしょうか?
~~~~
ERROR: linux-imx-4.14.98-r0 do_patch: Command Error: 'quilt --quiltrc /home/secom/imx-yocto-bsp/build-esp-rut/tmp/work/imx6dlsabresd-poky-linux-gnueabi/linux-imx/4.14.98-r0/recipe-sysroot-native/etc/quiltrc push' exited with 0 Output:
Applying patch fec.h.patch
can't find file to patch at input line 3
Perhaps you used the wrong -p or --strip option?
The text leading up to this was:
--------------------------
|--- fec.h.orig 2018-05-01 12:58:27.000000000 -0700
|+++ fec.h 2019-11-09 12:36:28.191936099 -0800
--------------------------
No file to patch. Skipping patch.
1 out of 1 hunk ignored
Patch fec.h.patch does not apply (enforce with -f)
~~~~

推測いただいている通り、使用予定のパッチの記述内容に問題があるため、
Yocto の do_patch タスクでカーネルソースにパッチをうまく適用できていないようです。

[原因]
一般的に Yocto で使用できるパッチは、以下のように
"git am" コマンドで適用可能な形式である必要がございます。

~~~
git am <パッチファイル名>
~~~

このコマンドでは "---" および "+++" の箇所について、
主には以下のような記述形式が想定されております。
(カーネルソースへのパッチ適用を例とした場合)

~~~
--- a/<カーネルソースのトップディレクトリからのパス>
+++ b/<カーネルソースのトップディレクトリからのパス>
~~~

具体的には、例えばカーネルソースの
drivers/net/ethernet/freescale/fec.h
に対してパッチを適用する場合は、
以下のような記述になっている必要があると存じます。

~~~
--- a/drivers/net/ethernet/freescale/fec.h
+++ b/drivers/net/ethernet/freescale/fec.h
~~~

[対策のご提案]
現在は Web 上の GitHub リポジトリ (Microchip-Ethernet/EVB-KSZ9477) における、
KSZ/linux-drivers/imx/linux-4.14/ ディレクトリ内のパッチをご利用いただいていると思います。

上記ディレクトリの代わりに、同一リポジトリ内の以下のディレクトリ
KSZ/linux-drivers/imx/imx-linux-4.14/
のほうに配置されているパッチであれば、Yocto でもそのまま適用いただける
はずと考えております。

後者のパッチによるソースの変更内容は前者のパッチと同じままで、
"---" および "+++" の箇所のみが Yocto でも利用いただけるような
形式に修正されているように見受けられました。

(1)
KSZ/linux-drivers/imx/imx-linux-4.14/drivers/net/ethernet/freescale/fec.h.patch

https://github.com/Microchip-Ethernet/EVB-KSZ9477/blob/57c11b043bf6aecfc...

(2)
KSZ/linux-drivers/imx/imx-linux-4.14/drivers/net/ethernet/freescale/fec_main.c.patch

https://github.com/Microchip-Ethernet/EVB-KSZ9477/blob/57c11b043bf6aecfc...

そのため、作成いただいた linux-imx_%.bbappend の末尾2行を以下のように修正し、
KSZ/linux-drivers/imx/imx-linux-4.14/ ディレクトリのほうのパッチを
試していただけないでしょうか。

(修正前)

~~~
SRC_URI += "file:///${WORKDIR}/EVB-KSZ9477-57c11b043bf6aecfc06e5c8ae1386d3cdad17120/KSZ/linux-drivers/imx/linux-4.14/drivers/net/ethernet/freescale/fec.h.patch"
SRC_URI += "file:///${WORKDIR}/EVB-KSZ9477-57c11b043bf6aecfc06e5c8ae1386d3cdad17120/KSZ/linux-drivers/imx/linux-4.14/drivers/net/ethernet/freescale/fec_main.c.patch"
~~~

(修正後)

~~~
SRC_URI += "file:///${WORKDIR}/EVB-KSZ9477-57c11b043bf6aecfc06e5c8ae1386d3cdad17120/KSZ/linux-drivers/imx/imx-linux-4.14/drivers/net/ethernet/freescale/fec.h.patch"
SRC_URI += "file:///${WORKDIR}/EVB-KSZ9477-57c11b043bf6aecfc06e5c8ae1386d3cdad17120/KSZ/linux-drivers/imx/imx-linux-4.14/drivers/net/ethernet/freescale/fec_main.c.patch"
~~~

以上、よろしくお願いいたします。

アドバイスありがとうございました。ご指摘の変更でうまくゆきました。

fec.h/fec.cについては適切なpatchがありますが、
KSZ/linux-drivers/ksz9897/linux-4.14/net/bridge/br_device.c.patch
のようにパスの指定が不適切な場合はどのような対応が考えられますでしょうか?

Web 上にて適切な記述形式のパッチが見つからなかった場合は、
ローカル上に一旦ダウンロードした後に自前で編集いただく必要が
あると存じます。

例えば以下 [1]〜[3] のような手順を実施すると、編集した
パッチをローカル環境の管理下に配置し、Yocto のビルドにご利用
いただくことが可能です。まずはお試しいただけると幸いです。

[1]
問題のパッチを Web 上で開き、
https://github.com/Microchip-Ethernet/EVB-KSZ9477/blob/57c11b043bf6aecfc...

右端の3点リーダのアイコンから "Download" をクリックして、
パッチをローカルの開発環境にダウンロードします。

[2]
ダウンロードしたパッチを任意のテキストエディタで開き、
"---" と "+++" の行に関して以下の内容となるよう修正し、保存します。
(未確認ですが、おそらく以下の内容で問題ないと思います。)

~~~
--- a/net/bridge/br_device.c
+++ b/net/bridge/br_device.c
~~~

[3]
以下リンク先の説明を参考にしながら、上記 [2] で編集したパッチが
適用されるように linux-imx_%.bbappend を編集します。
https://yoctobbq.lineo.co.jp/?q=node/36

パッチの置き方に関しては、以下リンク先の meta-v2x レイヤなどが
具体例として参考になるかと思います。
(あくまでもディレクトリ構成に関する参考資料であり、レイヤ内の
パッチの内容は今回の件とは無関係です。)
https://github.com/nxp-imx/meta-imx/tree/be6fc6bb092a9434246f7e2b1de4e5e...

手順は以上です。

また余談ですが、独自 bbappend ファイルの長期的なメンテナンスという観点から
すると、一つの bbappend ファイルでのパッチ適用の方法を統一しておいたほうが
管理しやすいかと思います。
上記 [1]〜[3] の手順を実施いただきますと、カーネルソース向けのパッチに
関して以下 (A), (B) のように2種類の 管理/適用 の方法が混在するようになる
と存じます。

(A)
先日に言及していた2つのパッチ (fec.h.patch 及び fec_main.c.patch)
はローカル上では管理せず、構築時に Web 上からダウンロードして適用する。

(B)
新しく問題となった br_device.c.patch のほうは自前で編集する必要がある
ため、ローカル上など独自の環境に配置して管理しなければならない。

そのため (A) のパッチ2つもローカル上にダウンロードしておき、今回の
(B) のパッチ br_device.c.patch と同様の方法で 管理/適用 いただくよう
linux-imx_%.bbappend を修正した方が良いかもしれません。

以上です。宜しくお願い申し上げます。

patchファイルのアドバイスありがとうございます。
オリジナルのリポジトリを参照するのではなく、修正したものを適用する方向で進めてみます。