Yocto Build System Architecture

The primary tool used in the build system is called ‘bitbake’. Basically, bitbake can be thought of as “make” on steroids. It basically performs the same type of functionality as make – which is: determining the actions to perform based on 1) what the user requests at the command line, 2) the project data and 3) the existing build state, and then performing those actions.

Bitbake uses files with it’s own new syntax for expressing:

  • the tasks to perform
  • the relationships (dependencies) between those tasks
  • the variables that control how the tasks are performed
  • the actual build instructions (e.g. compiler commands, linker commands, packaging commands, etc.)

Bitbake differs from ‘make’ in several key ways. The first is that it has a global view of the task list for a distribution. That is, it reads the entire set of files related to the distribution, and determines the global task list for a particular high-level build operation. This is considerably different from ‘make’, which processes just a single Makefile at a time. (Admittedly, ‘make’ can be made to work with extremely large projects, using complex include schemes and nested invocations. However, even these types of systems are rarely used for something as complex as a complete Linux distribution build.)

Another apparent difference is that the syntax of the files that bitbake processes allows for a very high degree of flexibility in defining the tasks that should be performed and the variables that control the build process and output.

[note to consider: maybe too much flexibility?]

A variety of mechanisms (described in the bitbake manual) are used to control what operations are performed and what variables are used to control them. bitbake supports inheritance mechanisms, to allow for a class-like definition of common operations. These common operations can be inherited and customized for specific situations. Bitbake also supports conditional definition of new tasks, and has the ability to customize or eliminate (mask) tasks based on variables computed during the build.

Bitbake is written in Python, and some aspects of the build system can be written using short Python snippets as well. Many aspects of the system are written in snippets of shell code as well.