はじめに
bitbake meta-toolchain
や-c populate_sdk
で作成したSDKを使用してOut-of-treeのカーネルモジュール(ドライバ)をビルドする時に少しハマったのでメモしておく。
SDKにカーネルソースを含める
作成されたSDKに確実にカーネルのソースコードを含めるためにlocal.conf
に下記を追加する。
TOOLCHAIN_TARGET_TASK_append = " kernel-devsrc"
SDKを作成する
カーネルやカーネルモジュールをビルドしたいだけであればmeta-toolchain
でも問題ない。
$ bitbake meta-toolchain
もちろんイメージをpopulate_sdkしても構わない。
$ bitbake core-image-base -c populate_sdk
環境設定
また、カーネルソースの場所を簡単にアクセスできるようにするために、KERNEL_SRC
という環境変数を定義しておく。
$ source /opt/poky/3.1.4/environment-setup-aarch64-poky-linux $ export KERNEL_SRC=${OECORE_TARGET_SYSROOT}/usr/src/kernel
カーネルモジュールをビルドするための準備
Out-of-treeのカーネルモジュールをビルドするためには下記のようにあらかじめカーネルのソースツリーでmake scripts
などを実行しておく必要がある。
SDKにインストールされたカーネルのソースツリーの所有者がroot
になっているため下記のようにする。
$ cd ${KERNEL_SRC} $ sudo chown -R ${USER} . $ make scripts $ make prepare $ sudo chown -R root .
この時make scripts
やmake prepare
を直接sudoで実行すると、実行時の環境変数が切り替わってしまうためうまくいかない。
作成するモジュール
Yoctoターゲットのセルフコンパイル環境でカーネルモジュールをビルドの回でもお世話になったhello-mod
をここでも試してみる。
~/hello
にソースとMakefileを作成する。
# mkdir ~/hello # cd hello
~/hello/hello.c
を次の内容で作成する。
#include <linux/module.h> int init_module(void) { printk("Hello World!\n"); return 0; } void cleanup_module(void) { printk("Goodbye Cruel World!\n"); } MODULE_LICENSE("GPL");
~/hello/Makefile
を次の内容で作成する。
obj-m := hello.o SRC := $(shell pwd) all: $(MAKE) -C $(KERNEL_SRC) M=$(SRC) modules_install: $(MAKE) -C $(KERNEL_SRC) M=$(SRC) modules_install clean: rm -f *.o *~ core .depend .*.cmd *.ko *.mod.c rm -f Module.markers Module.symvers modules.order rm -rf .tmp_versions Modules.symvers
ビルド
$ make
まとめ
YoctoのSDKでOut-of-treeをビルドする時は注意が必要。