使用例● ＠Ubuntu 16.04 i386○ # apt install which bash patch sed make gcc g++binutils build-essential gzip bzip2 tarperl cpio python unzip rsync git wget○ $ make lego_ev3_defconfig○ $ make○ $ ls –lh output/images/sdcard.img-rw-r--r-- 1 motai 32M output/images/sdcard.img○ $ file output/images/sdcard.img●DOS/MBR boot sector;●partition 1 : FAT32(0xc), 32768 sectors;●partition 2 : ext3(0x83), 23874 sectors

3Buildroot - make● 何をしているか1. ソースコードのダウンロード2. クロスコンパイラ等ツールチェーンのコンフィグ、ビルド、インストール●既存ツールチェーンのインポート3. 選択したパッケージの configure, ビルド、インストール4. カーネルイメージのビルド(選択時)5. ブートローダのビルド(選択時)6. rootfsの生成

4BUILDROOT メニュー

1.
2.
3.
4.

コンパイラ/dev 管理init system主要パッケージ一覧13

Internal toolchain● コンパイラ○ gcc: gcc-4.x.x, gcc-5.x.x, gcc-6.x.x● 標準Cライブラリ○ GNU Libc : GNU Cライブラリ○ uClibc-ng : 組込みLinux向け小型Cライブラリ●Alpha, ARC, ARM, AVR32, Blackfin, CRIS, FR-V, H8/300,HPPA, i386, IA64, LM32, M68K/Coldfire, Metag, Microblaze,MIPS, MIPS64, NDS32, NIOS2, OpenRISC, PowerPC, Sparc,SuperH, X86_64 and XTENSA○ musl: Linuxの標準Cライブラリ●x86, x86_64, ARM, MIPS, Microblaze, PowerPC14External toolchain● 既存ツールチェイン○ 有名で試験済みのツールチェインを使いたいとき● 確認済み：CodeSourcery, Linaro, crosstools-NG○ sysroot 機能必須● 未対応：OpenEmbedded, Yocto, distribution toolchain○ コンパイル済みライブラリが含まれていて修正できない○ x86ターゲットの場合もクロスコンパイラが必須15/dev 管理● devノード① Static using device table② Dynamic using devtmpfs only (推奨)●デバイス発見次第、カーネルにより/dev配下が自動生成●kernel 2.6.32以降●CONFIG_DEVTMPFS=y && CONFIG_DEVTMPFS_MOUNT=y③ Dynamic using devtmpfs + mdev●BusyBox付属の軽量実装版 udev○ /etc/mdev.confに従い、パーミッション/所有者を設定●FirmwareへのPushリクエスト機能あり●CONFIG_DEVTMPFS=y && CONFIG_DEVTMPFS_MOUNT=y16/dev 管理● devノード (続き)④ Dynamic using devtmpfs + eudev●スタンドアローン版udev○ 一般的なディストリビューションのudevと同じ (Systemdの一部)● init systemがsystemdの場合はudevになる。

17init system① BusyBox (推奨)○ BR2_INIT_BUSYBOX=y○ /etc/inittab●デフォルトであれば、/etc/init.d/rcSスクリプトを実行し、gettyを立ち上げ。

② Systemd○ Cgroups、snapshot/restoreと多機能○ 並行起動、ソケット使用、D-Bus、udev③ SystemV○ Upstart/Systemdに未対応なプログラム用○ /etc/inittab (BusyBox形式と少し違う)18

主要パッケージ一覧● 1569パッケージalsagstreamervlcp7zipxzdhrystonegdbiozonekexeclatencytoplmbenchlttngnetperfoprofilert-testsramspeedstresswhetstonetrace-cmdvalgrindaufscifs-utilsfwupmmc-utilsntfs-3gsshfsunionfsdejavuicon-themesound-themegnuchesssupertuxkartfswebcamglmark2mesa3d-demoqt5rrdtooldirectfbfbtermimagemagickmesa3dsdlx11r7dockersynergyenlightenmentfluxboxopenboxmetacityhdparmi2c-toolsirda-utilslm-sensorsminicompowertoperlangluaperlpythonphprubyopensslbeecryptmbedtlsberkeleydbmysqlpostgresqlsqlitemongodbgaminfreetypewaylandpixmanlibpngjqueryjsonbitstreamx264opensshopenldaplibselinuxncurseseximmuttqemuwineclamavapacheavahidhcpcdiftopiperfipsec-toolslighttpdlrzsznginxnuttcpopenntpdproftpdrsyncsamba4tcpdumpwiresharkwireless_toolswgetbashzshxenuemacsvimcgroupslxc詳しくはこちらhttps://git.busybox.net/buildroot/tree/package19

各パッケージのコンフィグ変更BusyBox / uClibc / Linux Kernel22ビルドディレクトリ構成ビルドの仕方フルリビルドが必要な場合各パッケージのみリビルドする場合26

ビルドの仕方● $ make helpCleaning:cleandistclean- delete all files created by build- delete all non-source files (including .config)Build:alltoolchain:<略>● ビルド- make world- build toolchain(スライド3, スライド4 もご参照ください)$ make● フルリビルド$ make clean all28

フルリビルドが必要な場合● Buildrootの方針○ パッケージの依存関係は定義できるが、開発者に対応を強いるのは困難。ユーザ側で対応する。
● ユーザに知っておいて欲しいこと① ターゲットのアーキテクチャを変更：フルリビルド② ツールチェインを変更：フルリビルド③ パッケージを追加：リビルド●追加により他パッケージへ影響がある場合は除く例)パッケージAがあれば機能が有効になるパッケージBがある④ パッケージの除去：（急がないが）フルリビルド推奨29

フルリビルドが必要な場合● ユーザに知っておいて欲しいこと（続き）⑤ パッケージ内オプションを変更：フルリビルド⑥ rootfsスケルトンファイルを変更：フルリビルド●overlay, post-build/imageスクリプトの変更はリビルドのみ● ビルドエラーになった場合はフルリビルド試行30

各パッケージのリビルド方法● パッケージのビルドディレクトリを消す（簡単で確実）○ $ rm –rf output/build/<package>○ $ make <package>● パッケージのビルドディレクトリをクリーンする○ $ make <package>-dirclean● パッケージをリビルド、インストールする○ $ make <package>-rebuild● コンフィグからやり直す○ $ make <package>reconfigure31

ソースコードのダウンロード● $ make source● $ ls dlDirectFB-1.7.7.tar.gzautoconf-2.69.tar.xzbinutils-2.26.1.tar.bz2busybox-1.25.1.tar.bz2LuaJIT-2.0.4.tar.gzautomake-1.15.tar.xzbison-3.0.4.tar.xzcairo-1.14.6.tar.xzPython-2.7.13.tar.xzbash-4.3.30.tar.gzbonnie++-1.03e.tgz…

● バージョン管理したい場合に使用32ライセンス確認 [2/2]○ output/legal-info/|-|-|-|-|-|-|-|-`--READMEbuildroot.configlegal-info.sha256host-manifest.csvhost-licenses/host-sources/manifest.csvlicenses/sources/ COPYING,LICENSE,README ファイル tarball,patchファイル COPYING,LICENSE,README ファイル tarball,patchファイル○ 各ディレクトリ以下はパッケージ毎に分かれて該当ファイルが配置される● Buildroot license GPLv2+ [GPLv2 or any later version]36グラフ● 出力形式の指定○ $ BR2_GRAPH_OUT=svgmake graph-depends graph-build graph-size○ $ man dot (-Tオプション記載のフォーマット）● 指定パッケージ起点○ $ make busybox-graph-depends38

もう少し踏み込んで開発したいdefconfigの作成rootfsの構成変更ユーザの追加開発中パッケージの指定39defconfigの作成● $ make savedefconfig○ cp defconfig configs/<boardname>_defconfig● $ make linux-update-defconfig○ BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE に指定した.configからデフォルト値を取り除いたconfigを作成● $ make busybox-update-config○ BR2_PACKAGE_BUSYBOX_CONFIG● $ make uclibc-update-config○ BR2_UCLIBC_CONFIG40rootfsの構成変更● Root filesystem overlays (BR2_ROOTFS_OVERLAY)○ 指定したツリーをビルド後のターゲットrootfsにコピー● Post-build scripts (BR2_ROOTFS_POST_BUILD_SCRIPT)○ 全パッケージのインストール後に指定したスクリプトを実行● Custom target skeleton (BR2_ROOTFS_SKELETON_CUSTOM)○ 指定したツリーをビルド前のターゲットrootfsにコピー● Post-fakeroot scripts (BR2_ROOTFS_POST_FAKEROOT_SCRIPT)○ fakerootにて/devを作成した後に指定したスクリプトを実行○ root権限にて実行される41

開発中パッケージの指定● 特定のパッケージは別のパスを指定したい場合。

例えば、Linuxカーネルは特定のソースコードを使用したい。
○ 通常はBuildrootにより、ダウンロード、展開され、output/build/<package>-<version>に置かれる。
● local.mkにて<pkg>_OVERRIDE_SRCDIRを定義○ $ catlocal.mkLINUX_OVERRIDE_SRCDIR = /home/motai/linux/● 注意事項○ make clean の対象外となる。
○ ソースコードに修正を加えたら make <package>-rebuild all を実行する。
● 動作○ rsync にて output/build/<package>-custom にコピー○ その後、ビルド。
43まとめ● 組込みLinux向けユーザランド構築ツール『Buildroot』はツールチェインからソースコードより生成する便利なツール● 100超のリファレンスボードのdefconfigあり1500超のパッケージあり。
設定変更も容易で、依存関係も図示。
● コツは必要だが、豊富なマニュアルとシンプルな作りで開発しやすい。

44