ことあるごとに「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を書く必要がある。
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
に追加すれば認識される
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に以下のように記載した。
do_copy_defconfig_append() {
cat ${WORKDIR}/*.cfg >> ${B}/.config
cat ${WORKDIR}/*.cfg >> ${B}/../defconfig
}