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が多いのではないかと思う。