Is It Time for a New Embedded Linux Build System?
摘要
作者回顾了20年嵌入式Linux开发经验,认为OpenEmbedded / Yocto Project / Buildroot 等传统方案长期适用于“构建一次、冻结多年”的静态设备模式,但现在边缘设备越来越像云系统,持续OTA更新、远程管理、容器化与遥测成为常态,使旧的发布与冻结模型不再匹配。同时,现代软件生态(Python、JS、Go、Rust等)各自拥有复杂包管理体系,跨编译和Yocto recipe维护成本上升,而Yocto的网络隔离也进一步增加集成难度。 文章指出当前方案的三种典型路径各有问题:源码全构建(慢且重)、通用发行版(如Debian / Ubuntu)缺少系统级定制能力、以及厂商BSP冻结导致版本过旧且难以升级。作者强调小团队尤其受影响,因为缺乏专职构建系统工程能力。 在“新机会”部分,文章认为变化来自三点:ARM算力(如云/边缘ARM服务器)可用于构建、现代语言生态的包管理机制、以及AI可辅助构建与工程化工作。作者提出未来嵌入式Linux构建系统应减少跨编译、支持多发行版基础(如Alpine Linux)、更好整合语言生态、引入缓存与统一工具链,并强化AI辅助与可解释错误信息,实现从开发到CI到设备的一致体验。 同时文章也承认传统工具仍有价值,例如对合规、强可复现、长期冻结的工业设备场景仍然适合Yocto Project。整体是在提出一个实验性方向(yoe build),探索面向持续更新设备与小团队的下一代构建体系。
荐读理由
在评估是否继续投入 Yocto/Buildroot 或转向新构建体系时,能够基于文中对 OTA 化设备与现代语言生态冲突的分析,重新校准构建系统选型的判断标准。
原文
Is It Time for a New Embedded Linux Build System?
I’ve been building products using embedded Linux for the past 20 years. The first time I tried OpenEmbedded (the precursor to Yocto), it felt like a gift to be able to run a single command and build a bootable ARM image from my x86 workstation. But things are changing. We have more and more components (both hardware and software) available. We have AI tools. We have powerful processors with loads of memory. Small teams (startups and industrial companies building small/medium volume connected products) want to do bigger things, yet they struggle with the complexity of stitching it all together, miss their shipping dates, and strain to maintain these systems once they’re in the field. This article explores what has changed, and how we can build and maintain embedded Linux systems more efficiently.
The Embedded Systems Golden Age
We live in a remarkable time for embedded systems engineering. We have:
A large number of Linux system-on-modules (SOMs), perfect hardware building blocks for industrial products.
Zephyr, an excellent OS for building software on MCU platforms.
Mature tools (compilers, build systems, etc.).
A vast array of open source software we can apply to these systems.
Fast, reasonably priced prototyping (PCB assembly, mechanical 3D printing, etc.).
More vendors upstreaming their Linux kernel support.
Yocto’s solid tooling for building images and custom parts of the system.
And all of this is available to companies of any size. It’s a bit like inheriting a mansion: open source has handed us a sprawling house full of rooms and features we’d never have built ourselves, and we have to live in it to stay competitive. The catch is that nobody handed us the tools to keep the place running. There is nothing holding us back, except our ability to put it all together.
How Embedded Linux Systems are currently built
Embedded Linux build systems solve the problem of putting all the pieces together, and the existing ones have served us well. Buildroot (2001) and OpenEmbedded/Yocto (2003) are now the standard, supported by most SOC/SOM vendors, and some teams ship successfully on Debian, Ubuntu, or even Arch (as Valve does with the Steam Deck).
The shape of mainstream embedded Linux development has held remarkably steady for ~20 years: cross-compile on a powerful x86 workstation, assemble a BSP (board support package), freeze an SDK (software development kit), ship the image, and hold that line for years. It’s a model built for a static, single-purpose, rarely updated product, and until recently, for that product, it worked well.
But things are changing …
The products have changed more than the tools that build them. Edge devices have started behaving like cloud systems. They run containers, pull OTA (over the air) updates, stream telemetry, and are managed remotely over their entire life. A device is no longer a static artifact you flash once and forget; it’s a system that keeps moving forward after it ships. That inverts the old release cadence: instead of freezing an SDK and holding it for years, teams track upstream continuously and push updates as a matter of course. The long LTS (long-term support) freeze that the cross-compile model was built around no longer fits a new class of products.
At the same time, the software itself has outgrown the cross-compile model. Modern languages each ship their own package ecosystem: Python (wrapping C/C++/CUDA via NumPy and PyTorch), JavaScript (linking to C libraries), Go, Rust, and vcpkg (for C/C++). Most of it is written for desktop/server, not cross-compilation. That puts the cross-compile burden squarely on embedded developers, and maintaining recipes for thousands of packages has been a steady drain on the Yocto community. Yocto compounds this by blocking network access during the build, so language package tooling doesn’t work without complex do_fetch integration. That’s useful when you must control every source, but unnecessary friction for many projects.
Each of these solutions trades one problem for another. Building everything from source in Yocto means long builds, heavy memory use, and powerful workstations. A stock binary distro like Debian starts development faster but lacks the tooling to integrate the custom parts. And vendor BSPs frozen on a 4-year-old Yocto make it hard to integrate modern software at all.
We could go on, but the cause is structural. Talented teams working hard still hit this, because the problem is inherently difficult and the software keeps getting harder to build.
To summarize, three things have changed:
Products never stop moving. Edge devices now behave like cloud systems: continuous OTA updates, not a multi-year freeze.
Software outgrew cross-compilation. Every modern language brings its own package ecosystem that doesn’t always cross-compile cleanly.
The old tradeoffs got sharper. Build-from-source is slow and heavy; stock distros lack custom tooling; BSPs freeze you in time.
The old model is good. The real question is whether it still fits the product you’re building and the team you have.
Small teams have different problems, not smaller ones
I’ve been talking to a lot of people building products, and keep hearing a consistent message. First, the ground has shifted: both the products and the way we have to put them together. Second, what works for a big team doesn’t always work for a small one.
Small teams and startups need to build and ship. They often don’t have the resources to sustain multi-year development cycles. They don’t have dedicated build or platform engineers experienced in creating complex build infrastructure and debugging hard build problems. Simplicity and ease of build/deployment often matter more than binary-reproducible builds or building everything from scratch. Easily deploying the latest open-source releases is frequently required to leverage new technologies.
These teams are often hampered by three things: vendor BSPs that lock them into old versions of Yocto, frustrating debug cycles where a critical component won’t build, and the heavy effort of back-porting needed components into a system frozen in time. A large organization can hire dedicated experts and throw resources at these problems. A small organization does not have this luxury.
To be clear, small != hobbyist. These are often startups or industrial products produced at moderate scale (100’s to 1000’s of units) that sit between the one-off maker projects and consumer scale mass production.
The new opportunity
Buildroot and OpenEmbedded were created in an era when ARM-based computers were slow, and cross-compiling software on powerful x86 workstations was the only practical option. When we were building a limited set of C/C++-based applications, these systems worked great. However, several things have changed in recent times:
Application development is moving to modern languages (Python, JS, Go, Rust, Zig). These languages have their own package ecosystems, caching, etc.
The hardware story has flipped. We now have fast ARM computers (AWS Graviton, Hetzner CAX) available for building and are no longer constrained to x86 workstations.
AI has emerged as a powerful tool for creating software, including build systems.
We need to leverage these change agents and rethink the world of connected products. The key shift is this: stop borrowing only the technology of modern ecosystems, and start borrowing their process too. When we adopt Rust or Python and take the language but force it into the old build process, it’s a bit like running a train on a paved road. The win comes from adopting how those ecosystems build, package, and cache, not just what they produce.
We now have an opportunity to rethink embedded Linux build systems. For me, this got personal. It hit me recently — if I’m going to keep doing this for another 20 years, I want something different, something that better fits the problems my customers and I are actually trying to solve, instead of fighting the tools.
So I’ve been experimenting. Over the past couple of months I’ve been building real pieces of this in the open, and the early results have been encouraging: software that used to mean a day of fighting cross-compilation now goes from idea to running on target hardware in minutes, using the same tooling on my laptop and in CI. It’s rough and early, but it’s enough to convince me this approach is worth pursuing.
What if …
… we could:
Get to market faster. Shorten the path from idea to a working product.
Takes an idea to running on target hardware in seconds to minutes, not days or weeks.
Doesn’t require cross-compilation.
Leverages modern language ecosystems (Python, JavaScript, Rust, Go, Zig, pkgbuild, etc.).
Caches builds so no piece of software is built twice.
Provides the convenience of pre-built packages from mainstream distributions with the tooling benefits of Yocto.
Do more with a small team. One toolset the whole team (and AI) can use, so you don’t need dedicated build specialists.
Provides one build system for applications and system software: the same tooling on laptop, cloud CI, and build farms.
Is easy for humans and AI to understand.
Includes tooling that works well with AI agents.
Leverages AI to do most of the low-level work.
Provides error messages that clearly point to the problem.
Keep products current and supportable in the field. Stay on modern software and maintain devices over their whole life.
Tracks current software versions easily, without being held back by vendor BSPs.
Scales from system to application to CI with consistent tooling throughout.
Deploys updates to fielded devices easily.
(These problems seem universal, but they hit small teams disproportionately hard, since those teams rarely have dedicated resources to solve them.)
This is what I am experimenting with in this next-generation Embedded Linux build system. A few examples of how this tool makes development easier:
Alpine, Debian, and Ubuntu are all supported base distributions that get us going quickly without rebuilding the world.
Integrate Python and JavaScript native package ecosystems instead of fighting them.
First-class AI support.
The terminal user interface (TUI) is fast, and allows us to easily monitor what is going on and drill down into detailed information as needed.
A few key features are still missing, such as distributed caching and remote build runners, but these are coming soon.
The old models still have their place
None of this means the old models are going away, or should. For deeply embedded regulated products (compliance-certified, bit-reproducible, built entirely from source, and intentionally frozen for years), Yocto is battle-tested and remains the right tool. It does exactly what those products need, and it does it well.
We’ve seen this pattern before. Alpine Linux didn’t replace Debian. It answered a different need: minimal, container-friendly images. Both distributions still ship today, serving different points in the design space. Nobody frames it as a competition; they’re simply shaped for different jobs.
The same is true here. Dynamic, connected, frequently updated devices built with modern languages are a different job, and they deserve a tool built for that job.
So, is it time?
For a real and growing class of teams and products, I think the answer is yes. [yoe] build is an early experiment exploring what that could look like. It’s pre-1.0 and developed in the open, rough edges and all. It’s a bet that this is a problem worth solving, and an invitation to work out the shape of the solution together.
It depends on you: the teams building products and the vendors that support them. Provide feedback. What am I missing? Test it out and let me know how it works. Sign up for my newsletter. Tell your vendors you need something like this. Like/watch the GitHub repo. Share it with someone who might be interested. Contribute improvements. Fund development or infrastructure. Many small teams need this, and these small companies form a significant portion of the global economy (the long tail). Startups are where a lot of innovation happens. And if a community emerges who can leverage modern AI tools, it will happen. The progress in the past two months demonstrates this is possible.
这条对你有帮助吗?