LoginSignup
20
16

More than 3 years have passed since last update.

YoctoでLinuxカーネル触るときのTips

Last updated at Posted at 2018-09-12

ことあるごとに「Yoctoで取ってきたコードで開発しちゃダメ」とはいわれるものの、ビルド環境がある以上はソースを触りたいのが人情。
というわけでYoctoでLinuxカーネル触るときのTipsを記載してみる

以下ターゲットがi.MX6の環境について記載されているので、それ以外のターゲットでは適宜読み替えること。

最重要事項: gitリポジトリは作り直される

基本的にdo_unpackタスクが走ると、gitリポジトリごと一から作り直される。
そのためコード修正してgit commitして一安心、と思っていると泣きを見ることになる。

do_unpackはdo_cleansstateしたりレシピファイルを修正したりすると簡単に走ってしまうため要注意。

カーネルソースはどこにあるか

以下で確認可能

$ bitbake -e linux-imx | grep '^S='
S="/home/user/imx-3.14.52-1.1.0_ga/build/tmp/work/imx6qpsabreauto-poky-linux-gnueabi/linux-imx/3.14.52-r0/git"

おまけ
ソースディレクトリに飛ぶワンライナー

$ cd $(bitbake -e linux-imx | grep '^S=' | sed -e s/^S=//g | xargs echo)

git amでパッチを当てる

gitリポジトリは作り直されてしまうため自前でリモートリポジトリを用意してレシピファイルはそのリポジトリを指すようにしてやるのが良い。

そういった方法が取れない場合はパッチを作成し、do_unpackの後で適用されるようにレシピを書くと良い。
レシピファイル内にSRC_URI += "hoge.patch"のように書いておくとdo_unpackの後で自動的にパッチを当ててくれる。しかし、この方法ではコミットまではしてくれない。コミットまで実行して欲しいときは自前でdo_patchを書く必要がある。

sources/meta-local/recipes-kernel/linux/linux-imx_3.14.52.bbappend
FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"

do_patch() {
        cd ${S}
        git am ${WORKDIR}/*.patch
}

パッチは以下のコマンドで作成する

$ git format-patch -o <yocto dir>/sources/meta-local/recipes-kernel/linux/linux-imx <start rev>..<end rev>

カーネル用bbappendの作り方

上の例で説明もなくmeta-localが出てきたがこれは自前で作ったYoctoレイヤーである。
yocto-layerコマンドで作成できる

$ cd ../sources
$ yocto-layer create local
Please enter the layer priority you'd like to use for the layer: [default: 6]
Would you like to have an example recipe created? (y/n) [default: n]
Would you like to have an example bbappend file created? (y/n) [default: n]

これでmeta-localが作成されるのでbuild/conf/bblayers.confのBBLAYERSに追加すれば認識される

build/conf/bblayers.conf(抜粋)
BBLAYERS += " ${BSPDIR}/sources/meta-local "

meta-local以下にbbappendファイルを作るわけだが、bbファイルとディレクトリ階層を合わせる必要がある。
どういうことかというとbbファイルのパスが以下のようになっているとき

$ bitbake -e linux-imx | grep '^FILE='
FILE="/home/user/imx-3.14.52-1.1.0_ga/sources/meta-fsl-bsp-release/imx/meta-bsp/recipes-kernel/linux/linux-imx_3.14.52.bb"

bbappendファイルはmeta-local/recipes-lernel/linux/以下に置く必要がある。
またファイル名はlinux-imx_3.14.52.bbappendもしくはlinux-imx_%.bbappendである必要がある。
(後者はバージョンによらず適用されるbbappendとなる)

カーネルコンフィグを変更する

$ bitbake linux-imx -c menuconfigでカーネルコンフィグを変更できるが、当然do_unpackが走れば初期化されてしまう。
diffconfigというタスクを使えばカーネルコンフィグの変更点をfragment.cfgというファイルに抽出してくれるためこれを利用する。

menuconfig実行後$ bitbake linux-imx -c diffconfigし、fragment.cfgをmeta-local/recipes-lernel/linux/linux-imx以下に格納する。

bbappendにSRC_URI += "fragment.cfg"を書けば自動で反映してくれるというような記述も見かけるが、i.MXの場合はdo_copy_defconfigで.configが上書きされてしまうためbbappendに以下のように記載した。

sources/meta-local/recipes-kernel/linux/linux-imx_3.14.52.bbappend(抜粋)
do_copy_defconfig_append() {
        cat ${WORKDIR}/*.cfg >> ${B}/.config
        cat ${WORKDIR}/*.cfg >> ${B}/../defconfig
}
20
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
16