YoctoLinuxのビルドはGetting Startedの手順にしたがって特に何も設定せずにビルドするとrunqemuコマンドの実行に必要なqemuもビルドターゲットと並行してビルドされるようになっている。これによってビルドした状態でrunqemuコマンドを使えば開発用のエミュレータがすぐに起動できる状態になっているが、必要ない場合には単にqemu-nativeのビルド時間の無駄になっているといえる。
また、runqemuコマンド自体はYoctoのシステム自体でビルドされたqemuバイナリがない場合はホストシステムにインストールされているqemuを探して起動するようになっている。
def find_qemu(self):
qemu_bin = os.path.join(self.bindir_native, self.qemu_system)
# It is possible to have qemu-native in ASSUME_PROVIDED, and it won't
# find QEMU in sysroot, it needs to use host's qemu.
上記はrunqemuの当該部分から抜粋。
EXTRA_IMAGEDEPENDS
最初にlocal.confに対する記述のみでqemu-nativeおよびqemu-helper-nativeを外したい場合にとれる対策は下記を記載することである。
EXTRA_IMAGEDEPENDS:remove = "qemu-system-native"
EXTRA_IMAGEDEPENDS:remove = "qemu-helper-native:do_addto_recipe_sysroot"
これは下記のようにして導出されたもの。
1) bitbake -eで EXTRA_IMAGEDEPENDSに入っているqemu関連のターゲットを探す 2) それらをすべてlocal.confからremoveする
nativesdk-packagegroup-sdk-host
poky/meta/recipes-core/packagegroups/nativesdk-packagegroup-sdk-host.bbにあるnativesdk-qemuおよびnativesdk-qemu-helperを除去する。
RDEPENDS:nativesdk-packagegroup-sdk-host:remove = "nativesdk-qemu"
RDEPENDS:nativesdk-packagegroup-sdk-host:remove = "nativesdk-qemu-helper"
こちらは.bbに書かれているものなのでbbappendで上位レイヤから除去してもよい。RDEPENDSの打ち消しの際にはpn-は必要ないようだ。
meta-extsdk-toolchain
meta/recipes-core/meta/meta-extsdk-toolchain.bbにあるqemu-nativeおよびqemu-helper-nativeを除去する。
DEPENDS:pn-meta-extsdk-toolchain:remove = "qemu-native"
DEPENDS:pn-meta-extsdk-toolchain:remove = "qemu-helper-native"
以上の箇所を環境に応じてチェックすることでbitbakeで目的のターゲットソフトを構築する際に不要なqemu-native系およびその依存ビルドの時間を削減することができるだろう。
おわりに
QEMUはq35やvirtのような仮想のハードウェア以外に、実際に存在するハードウェア(ラズパイ等)のエミュレーションも行えるためBSP (Board Support Package)が非常によくできている(=完全にYoctoのコンセプトに従って完成されている)場合はBSPの対象ハードウェアをエミュレーションするためのQEMUをビルド環境として構築してくれるだろう。ただ現状は単にビルド時間の浪費となっているBSPが多いのではないかと思う。