Buildrootの概要と使い方
BuildrootはMakefileとKconfigだけで構成された、軽量で理解しやすいビルドシステムです。make menuconfig でターゲットアーキテクチャ・カーネル・パッケージを選び、make を実行すると、クロスツールチェーンの構築からルートファイルシステムの生成まで一気に走ります。ボードごとの推奨設定は defconfig として用意されており、make ボード名_defconfig で一括読み込みできます。成果物は output/images/ にまとまり、構成が単純なため初学者がイメージ自作の全体像をつかむのに向いています。
Buildroot(bs-buildroot)は、組込みLinuxイメージを手早く作るためのビルドシステムです。最大の特徴は、その仕組みがMakefileとKconfigという、Linuxカーネルの開発で長年使われてきた枯れた道具立てだけで出来ている点にあります。新しい独自言語や複雑な概念を覚える必要がなく、設定の選び方も make menuconfig という、カーネルの設定でおなじみの操作とまったく同じです。結果として全体像が見通しやすく、「組込みのイメージを自作するとは具体的に何をすることなのか」を、手を動かしながら体感的に理解するのに、Buildrootは格好の入り口になっています。構成が単純なぶん、後で扱うYoctoに比べて初回ビルドが速く、結果が早く手に入るのも、学習段階では大きな利点です。
menuconfig で構成を選ぶ
Buildrootの設定は make menuconfig(make-menuconfig)で行います。これを実行すると、ターミナル上に青い設定画面が現れ、矢印キーで項目を移動し、スペースキーで選択を切り替え、Enterで下の階層へ降りる、という操作でメニューをたどっていけます。ここで決めるのは大きく分けて4つです。ターゲットのCPUアーキテクチャ(Armかどうか、何ビットか、浮動小数点演算の方式など)、使うLinuxカーネル(bs-kernel)のバージョンとその設定、ルートファイルシステム(bs-rootfs)に含めるパッケージ(BusyBoxやライブラリ、各種アプリ)、そして出力するイメージ(bs-image)の形式です。選んだ内容はすべて .config という1つのファイルに保存されます。一度この画面に触れると、概念の節で学んだ「アーキテクチャを決め、カーネルとrootfsを組み立てる」という抽象的な流れが、目の前に並ぶ具体的な選択肢として立ち現れるのが分かります。
defconfig で定番設定を一発で読み込む
とはいえ、何もない状態からすべての項目を自分で選ぶのは、初学者には荷が重く、設定の取りこぼしや矛盾も起きやすいものです。そこでBuildrootには、よく使われるボードごとにあらかじめ用意された設定のひな型、defconfig(bs-defconfig)が多数同梱されています。これは「このボードならまずこの設定で動く」という、検証済みの定番の組み合わせをまとめたファイルで、make ボード名_defconfig(make-defconfig)と打つだけで一括して読み込めます。たとえばRaspberry Pi 4(64ビット)向けなら make raspberrypi4_64_defconfig、QEMU上でArmを試すなら make qemu_arm_vexpress_defconfig といった具合です。利用できるdefconfigの一覧は make list-defconfigs で確認できます。実務でも学習でも、まずdefconfigを土台として読み込み、そこから必要な部分だけ menuconfig で微調整する、という進め方が、最も安全で現実的です。ゼロから組むより、動く土台に少し足す方が、はるかに失敗しにくいからです。
make でビルドを走らせる
設定が固まったら、あとは引数なしで make(make-buildroot)を実行するだけです。たったこれだけで、Buildrootは膨大な作業を順番にこなしていきます。まずクロスツールチェーン(bs-cross-toolchain)を構築し、母艦のx86上でターゲットCPU向けの実行ファイルを作れる環境を整えます。続いてカーネルや選択した各パッケージのソースをインターネットから取得し、ターゲット向けにクロスコンパイルし、それらを集めてルートファイルシステムを組み立て、最後にストレージへ書き込める形式のイメージにまとめます。この間、人間は何もする必要がありません。初回はツールチェーンから全部を一から作るため、マシンの性能やパッケージ数によっては数十分から数時間かかることもあります。しかし2回目以降は、変更のあった部分とその影響を受ける部分だけが作り直されるため、所要時間はぐっと短くなります。ビルド中は何がコンパイルされているかが延々と画面を流れ、エラーで止まらず最後まで到達すれば成功です。
成果物の置き場所
ビルドが完了すると、成果物はすべて output/ ディレクトリ以下に整理されます。とくに書き込み対象となるカーネルイメージやrootfsアーカイブ、SDカード用のイメージは output/images/ にまとまって出力されるので、ここを ls(ls-images)で覗けば「何が出来たか」が一目で分かります。それ以外も整理されていて、クロスツールチェーン本体は output/host/ に、各パッケージのソースを展開しビルドした中間ファイルは output/build/ に、最終的にrootfsへ配置されるファイル群は output/target/ に置かれます。どこに何があるかが明快なので、迷ったときも追いかけやすい構造です。
Buildrootが向いている用途
Buildrootはこのように、構成も操作も出力先も単純明快で、設定ファイルである .config と、その元になる defconfig さえ押さえれば全体を掌握できます。覚えることが少なく、結果も早く出るため、学習の入り口として理想的です。そのぶん、後の節で扱うYoctoのような、パッケージ単位での後からの更新管理や、アプリ開発者へ配るSDKの生成といった重厚な機能は持ちません。構成全体を1枚の設定で表す性質上、複数機種への枝分かれや、変更点だけを差分として積み上げる管理も、規模が大きくなると手狭になってきます。したがってBuildrootが真価を発揮するのは、小規模で構成が固定的な機器、単機種で完結する製品、そして全体像をつかむための学習や試作の場面です。まずBuildrootで「イメージ自作とは何か」を体得し、保守要件が重くなったらYoctoを検討する——この順序が、組込みビルドシステム習得の王道になります。