This service is available only in Japanese-language.

レイヤ間のパッチの適用順序について

Yocto Project 公式実践講座 (LFD461-JP)の講座中よくいただく質問について紹介します。

■ レイヤ間のパッチの適用順序について

1つのレシピ(bb)に対して複数のレイヤにアペンドファイル(bbappend)が存在する場合の
do_patchの適用順序についてよく質問されます。

結論を先に書くと下記のようになります。

* アペンドファイル(bbappend)のパッチはレイヤの優先度が低い方から適用される
* レシピ(bb)のパッチはレイヤの優先度に関わらず最初に適用される

以下に詳細を記載します。

レイヤの優先度は数字が大きいほうが優先度が高いというルールになっています。

処理順序はレイヤの優先度が低いほうが先に適用されます。
考え方としては、後から行った修正が残るという考え方です。

下記のようにレイヤがあった時に、meta-appsにあるa.bbというレシピをオーバーライドする場合のパッチ適用順について考えます。

meta-apps: 優先度 10
meta-workA: 優先度 8
meta-workB: 優先度 7
meta-workC: 優先度 6

meta-workA、B、Cにはそれぞれ、a.bbappendが存在しておりa.bbのアプリケーションに対してパッチを当てようとしています。
それぞれのアペンドファイルのSRC_URIには下記のようなパッチが登録されています。

* meta-workA: A.patch
* meta-workB: B.patch
* meta-workC: C.patch

この場合の処理順序は、下記のようになります。

C.patch -> B.patch -> A.patch

これは、"${T}/log.do_patch"を確認すると下記のようなログが出力されているので確認できます。

===
NOTE: Applying patch 'C.patch' (meta-workC/recipes-example/example/a/C.patch)
NOTE: Applying patch 'B.patch' (meta-workB/recipes-example/example/a/B.patch)
NOTE: Applying patch 'A.patch' (meta-workA/recipes-example/example/a/A.patch)
===

ただし、レイヤの優先度による処理順序については1つ例外があり、レシピ(bb)のSRC_URIにパッチが存在する場合はそれが最初に適用されます。
D.patchがa.bbのSRC_URIに登録されている場合を考えます。

a.bbが存在するmeta-appsの優先度は10となっているため、レイヤの優先度だけを考えると下記のようになりそうです。

C.patch -> B.patch -> A.patch -> D.patch

しかし実際の処理順序は下記のようになります。

D.patch -> C.patch -> B.patch -> A.patch

===
NOTE: Applying patch 'D.patch' (meta-apps/recipes-example/example/files/D.patch)
NOTE: Applying patch 'C.patch' (meta-workC/recipes-example/example/a/C.patch)
NOTE: Applying patch 'B.patch' (meta-workB/recipes-example/example/a/B.patch)
NOTE: Applying patch 'A.patch' (meta-workA/recipes-example/example/a/A.patch)
===