2026年7月18日(土)掲載 2,747本日 29
HN2011

そろそろ「組み込みLinuxビルドシステム」の刷新が必要じゃないか?

Is it time for a new Embedded Linux build system?

cbrake30日前

議論

7
1cbrake30日前

次世代の組み込みLinuxビルドシステムがどうあるべきか、いろいろ実験してみたんだ。ターゲットアーキテクチャ上でのネイティブビルド、現代的な言語のパッケージマネージャをファーストクラスで扱うこと、そしてAIをシステムへの主要なインターフェースにすることがポイント。巨大なメタレイヤースタックを使ったクロスコンパイルの代わりに、ツールがカーネル、ルートファイルシステム、アプリケーションを1つのエンジンでまとめてビルドする仕組みで、CLI、TUI、AIアシスタントが同じコアとやり取りする。必要なのはこのツールとDocker、Gitだけで、グローバルなSDKや隠れた状態(hidden state)に悩まされることはない。

まだ1.0未満で粗削りだけど、Yocto/OpenEmbeddedやBuildroot、Nixなんかを触ってる人たちからフィードバックが欲しくて公開したよ。みんなのボードでどこが動かないか、どんなワークフローに違和感があるか、「ネイティブビルド+AI認識型のビルドグラフ」という方向性に将来性を感じるか、ぜひ意見を聞かせてほしい。

2nrdvana25日前

このプロジェクトの動機になった悩みには共感する部分が多いよ。でも僕の解決策は、ターゲットと同じアーキテクチャ(場合によってはqemu経由)で普通にAlpineを使って、その一部をファイルシステムイメージとしてエクスポートするというやり方だった。Perlのコアモジュール以外に依存しないPerlモジュール集として実装して、イメージの中からエクスポートを実行してる。これなら、straceを使ってイメージに必要なランタイムライブラリの依存関係を特定できるのがメリットだね。

https://metacpan.org/pod/Sys::Export (https://metacpan.org/pod/Sys::Export)

3johnea25日前

Buildrootはかなり使い込んできたし、時々Yoctoも触ったよ。

ここ数年の印象としては、こうしたクロスビルド環境の必要性は、昔ほどじゃなくなってきてる気がするね。最近の自分の組み込みLinux環境は、単なる組み込みArch Linuxだし。

イメージをクロスビルドする必要なんてなくて、最小構成のLinux環境をターゲットにそのままインストールして動かせばいいだけなんだ。

もちろん、こうしたクロスツールが必要とされる大きな理由は、現代の組み込みLinux開発者の大半が開発ワークステーションでWindowsを使ってるからだろうね 8-/

4okanat25日前

LinuxやGNU環境のビルドの問題は、そもそも前提条件がひどい設計に基づいていることに起因してるんだよ。

  • GNU/Linuxパッケージと同じネイティブシステムでビルドしていて、サーバーやデスクトップと同じ場所にグローバルインストールする前提
  • C/C++コンパイラやツールチェーン全体、バイナリユーティリティ、カーネルが一体となっていて、一度に一部しか変更できない
  • glibcやgcc、Linuxカーネルで常に最新のヘッダーを使う前提
  • 他のパッケージ(特にlibgcc_s, libstdc++, glibc)と同じ宇宙でビルドしていて、特にld-linux.so周りは悲惨
  • ビルドシステムが標準パスしか想定していない

Yoctoがこれほど複雑なのは、Webやサーバー、VM向けじゃないソフトウェアをLinux環境で開発するのが本当に苦痛だからだよ。Yoctoはそれを修正して、Linuxエコシステムのひどい設計思想を回避するための優れた抽象化を提供してる。OS設計が根本的に壊れているせいで、特にエコシステムの99.999%を占めるCベースのツールチェーンに問題が山積みなんだ。MSVCを含めた現代のCツールチェーンは、OSをCの内部型システムと70年代の悪い決断に強く縛り付けている。

タイトルが疑問形になっている記事は大抵そうであるように、答えは99%「NO」だ。クロスコンパイル機能やワークアラウンドを取り除いたところで、LinuxやFOSSエコシステムそのものの破綻は直らないよ。

より良い組み込み環境を探しているなら、Rustのツールチェーンを見てみるべきだね。Linuxならmusl-libcベースのもの(nssの複雑さを避けるためにsystemd必須だけど)を見てみるといい。もっと良いのはrelibcかな。RustのツールチェーンはC/C++/Makeと違って、ターゲットのファイルシステムやツールに対してほとんど前提を置いていない。Redox OSもあるけど、まだ開発が遅いし、Makeに固執しているのは悪手だったと思う。Androidは独自のビルドツールを使っているけど、GoogleがFuchsiaを復活させない限り、C/C++ツールチェーンからは逃げられないね。

5wasting_time25日前

Guixの名前が出てこないのが意外だな。Guixならこれらの問題をすべて解決できるし、様々なアーキテクチャでのクロスビルドやネイティブビルドについてもすでに実績があるよ。

新しいターゲットの追加も驚くほど簡単で、既存のテンプレートをコピーして値を置き換えるだけさ。

https://codeberg.org/guix/guix/src/branch/master/gnu/system/... (https://codeberg.org/guix/guix/src/branch/master/gnu/system/images)

https://codeberg.org/guix/guix/src/branch/master/gnu/bootloa... (https://codeberg.org/guix/guix/src/branch/master/gnu/bootloader/u-boot.scm)

6lukeh25日前

使ったことはないけど、Avocado OS [1] ってのもあるね。自分は仕事の組み込みビルドにはYoctoを使ってるよ。完璧とは言えないけど、Raspberry Pi CM4で動くSwiftとFlutterを使った組み込みオーディオ製品のビルドには十分役に立ってる。A/BアップデートにはMenderがおすすめ。

[1] https://www.peridio.com/avocado-os (https://www.peridio.com/avocado-os)