The Yocto Project does most of the work for you when it comes to creating cross-development toolchains. This section provides some technical background on how cross-development toolchains are created and used. For more information on toolchains, you can also see the Yocto Project Application Development and the Extensible Software Development Kit (eSDK) manual.
In the Yocto Project development environment, cross-development toolchains are used to build the image and applications that run on the target hardware. With just a few commands, the OpenEmbedded build system creates these necessary toolchains for you.
The following figure shows a high-level build environment regarding toolchain construction and use.
Most of the work occurs on the Build Host.
This is the machine used to build images and generally work within the
the Yocto Project environment.
When you run BitBake to create an image, the OpenEmbedded build system
uses the host gcc
compiler to bootstrap a
cross-compiler named gcc-cross
.
The gcc-cross
compiler is what BitBake uses to
compile source files when creating the target image.
You can think of gcc-cross
simply as an
automatically generated cross-compiler that is used internally within
BitBake only.
gcc-cross-canadian
since this SDK
ships a copy of the OpenEmbedded build system and the sysroot
within it contains gcc-cross
.
The chain of events that occurs when gcc-cross
is
bootstrapped is as follows:
gcc -> binutils-cross -> gcc-cross-initial -> linux-libc-headers -> glibc-initial -> glibc -> gcc-cross -> gcc-runtime
gcc
:
The build host's GNU Compiler Collection (GCC).
binutils-cross
:
The bare minimum binary utilities needed in order to run
the gcc-cross-initial
phase of the
bootstrap operation.
gcc-cross-initial
:
An early stage of the bootstrap process for creating
the cross-compiler.
This stage builds enough of the gcc-cross
,
the C library, and other pieces needed to finish building the
final cross-compiler in later stages.
This tool is a "native" package (i.e. it is designed to run on
the build host).
linux-libc-headers
:
Headers needed for the cross-compiler.
glibc-initial
:
An initial version of the Embedded GLIBC needed to bootstrap
glibc
.
gcc-cross
:
The final stage of the bootstrap process for the
cross-compiler.
This stage results in the actual cross-compiler that
BitBake uses when it builds an image for a targeted
device.
gcc-cross
.
This tool is also a "native" package (i.e. it is designed to run on the build host).
gcc-runtime
:
Runtime libraries resulting from the toolchain bootstrapping
process.
This tool produces a binary that consists of the
runtime libraries need for the targeted device.
You can use the OpenEmbedded build system to build an installer for
the relocatable SDK used to develop applications.
When you run the installer, it installs the toolchain, which contains
the development tools (e.g., the
gcc-cross-canadian
),
binutils-cross-canadian
, and other
nativesdk-*
tools,
which are tools native to the SDK (i.e. native to
SDK_ARCH
),
you need to cross-compile and test your software.
The figure shows the commands you use to easily build out this
toolchain.
This cross-development toolchain is built to execute on the
SDKMACHINE
,
which might or might not be the same
machine as the Build Host.
Here is the bootstrap process for the relocatable toolchain:
gcc -> binutils-crosssdk -> gcc-crosssdk-initial -> linux-libc-headers -> glibc-initial -> nativesdk-glibc -> gcc-crosssdk -> gcc-cross-canadian
gcc
:
The build host's GNU Compiler Collection (GCC).
binutils-crosssdk
:
The bare minimum binary utilities needed in order to run
the gcc-crosssdk-initial
phase of the
bootstrap operation.
gcc-crosssdk-initial
:
An early stage of the bootstrap process for creating
the cross-compiler.
This stage builds enough of the
gcc-crosssdk
and supporting pieces so that
the final stage of the bootstrap process can produce the
finished cross-compiler.
This tool is a "native" binary that runs on the build host.
linux-libc-headers
:
Headers needed for the cross-compiler.
glibc-initial
:
An initial version of the Embedded GLIBC needed to bootstrap
nativesdk-glibc
.
nativesdk-glibc
:
The Embedded GLIBC needed to bootstrap the
gcc-crosssdk
.
gcc-crosssdk
:
The final stage of the bootstrap process for the
relocatable cross-compiler.
The gcc-crosssdk
is a transitory compiler
and never leaves the build host.
Its purpose is to help in the bootstrap process to create the
eventual relocatable gcc-cross-canadian
compiler, which is relocatable.
This tool is also a "native" package (i.e. it is
designed to run on the build host).
gcc-cross-canadian
:
The final relocatable cross-compiler.
When run on the
SDKMACHINE
,
this tool
produces executable code that runs on the target device.
Only one cross-canadian compiler is produced per architecture
since they can be targeted at different processor optimizations
using configurations passed to the compiler through the
compile commands.
This circumvents the need for multiple compilers and thus
reduces the size of the toolchains.