This is an entry that I cross-posted from my Intel Software blog at http://software.intel.com/en-us/blogs/2010/10/19/why-is-embedded-linux-so-hard/ - It caused a bit of a controversy there because it sounded like I was dissing Linux for embedded. Actually, I was just setting the stage for the Yocto Project!
Linux seems like an ideal OS to use to run a lot of devices -
- There is no cost for the software itself, so it's easy to get a project going quickly and for low cost.
- All of the source code is available, so finding and fixing problems is considerably easier.
- The software is highly modularized, making it easy to build something with exactly the features you want.
And as a result, Linux use keeps growing rapidly year on year in devices.
But actually building that custom Linux for an embedded project is rather hard. As Ev Williams, the CEO of Twitter recently commented, "Twitter is too hard to use. Amazing it's grown considering." You could make the same comment about embedded Linux. Although here you could say, "Linux is too hard to build for embedded."
Why is building a custom embedded Linux so hard? Typcially, when you get the source code for an operating system or any large software system, there also must be a way to "build" the source into a runnable binary. This involves compiling, linking, creating libraries and a final binary image.
But the thing we know of as "Linux" is not a complete operating system. In fact, it's only the OS kernel. If you want applications, libraries, shells, or games to run on that kernel - in short, if you want a complete operating system - you need to find them on the internet in their separate projects. And there is no standard build system for this collection of stuff. Instead, every project has its own scripts and makefiles for building its little component.
Now what you really want as an embedded developer is to very easily
- Pick the architecture you want to use, whether it's some flavor of ARM or x86 or some of the other ones popular in embedded.
- Dial in the basic capabilities of your system, like whether or not you have graphics or maybe a limited amount of memory or storage
- Easily trim or add packages to get exactly the functions you want and to fit your available storage
- Oh yeah, and reuse the packages and patches you applied in your last embedded project to get your application to work.
- Then you want to hit a button and compile a working OS and create a bootable image
And preferably to do all of this without getting a PhD degree in OS building.