読者です 読者をやめる 読者になる 読者になる

Yocto に関するメモ

Linux Kernel において .config がどのようにつくられるか?Yocto は特殊なことをしているようだ。Yocto 的には普通みたいだけど。

Linux の Kernel を構築するときよく使われる手法は次みたいな感じ。

make ARCH=arm xilinx_zynq_defconfig

昔は「make の使い方これでいいのかね?」と気持ち悪さを感じたけど、今は普通に使ってます。なんか手法が隠ぺいされていて気持ち悪いんだよね。で、どうなるかというと、これは Linux の掟で、ARCH で指定したアーキテクチャディレクトリの configs の下に指定されたコンフィグレーションのひな形があるので、これをベースに .config を自動的に作る。まぁこれはこれで便利だからいいか。

上記の例の場合は arch/arm/configs/xilinx_zynq_defconfig をつかう。

ところが、Yocto ではどうも、これをつかってないみたい。bitbake で .coonfig だけをつくる命令は kernel_configme 。最初、なんでわざわざこんな前にしたのか疑問だったけど、Yocto ではもともと configure というコマンドがありこれはこれで、"Yocto 的なコンフィグしてね" コマンドなので、それとは意味的に分離して、"Linux 的な kernel の config を作ってね" という命令を追加したみたい。よく考えられている。

さて、で実行してみる。

bitbake linux-xlnx -c kernel_configme -f 

xilinx_zynq_defconfig とは違う .config ができる。そして、defconfig に相当するファイルや指定が recipe を見ても見当たらない。そこで、meta/classes/kernel-yocto.bbclass に do_kernel_configme という関数があるので見てみる。日本語の資料が少ないから、どうしてこ~~~なる?というのがわからないのが Yocto の悪いところだな。その上、適当にやっているとできたりするから始末に悪い。

do_kernel_configme() {
    bbnote "kernel configme"
    export KMETA=${KMETA}

    if [ -n "${KCONFIG_MODE}" ]; then
        configmeflags=${KCONFIG_MODE}
    else
        # If a defconfig was passed, use =n as the baseline, which is achieved
        # via --allnoconfig
        if [ -f ${WORKDIR}/defconfig ]; then
            configmeflags="--allnoconfig"
        fi
    fi

    cd ${S}
    PATH=${PATH}:${S}/scripts/util
    configme ${configmeflags} --reconfig --output ${B} ${LINUX_KERNEL_TYPE} ${KMACHINE}
    if [ $? -ne 0 ]; then
        bbfatal_log "Could not configure ${KMACHINE}-${LINUX_KERNEL_TYPE}"
    fi

これをみると最終的には configme という関数を呼んでいて、引数に ${LINUX_KERNEL_TYPE} ${KMACHINE} になっている。実行して bbwarn で表示させてみると、それぞれ standard、 zynq だった。どうやら zynq-standard.scc というファイルから .config を作っているようだ。モー資料がなさすぎ。検索するよりソース読んだ方がいいという(昔なら当然か)オールドスタイルで中身がわかっていく。もちろん、本家には scc の説明はある!!

さて、Yocto では BSP(Board Support Package) という概念があって(あるらしいぞ)、scc というファイルを用意することで、フレキシブルにできるらしい。もう、らしい、らしい、ばっかりでどう作ったらいいかが判明するには結構時間がかかりそうだ。

これつくるのは結構大変そうなので(あと他の人の scc に自分の bsp あわせるのは大変かもしれないぞ)、別の方法で対処する。defconfig を bbappend の recipe に追加すればよい。上記の python のコードにもなにやら、${WORKDIR}/defconfig があれば、別の処理をするようになっている。ということで、ここに自分の defconfig を置いておくことにしよう。Yocto は適当に書いたらサーチしてくれるぞ。あと、最初はファイルをおかずにエラーにさせておくと、サーチパスを表示して(エラーにして)くれるので、適当に書いて後から追加することが出来る。

Yocto 万歳。スゲー複雑なシステムだけど。

あと、特定の git の blob(?) を指定する方法。SRCREV を使う。

SRCREV_linux-xlnx_4.4 = "89cc643affcce18122373fe7c78e780526243fdf"

local.conf にこのように書くか、recipe のほうだったら、単純に SRCREV を書けばよい。