| <!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" | 
 | "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" | 
 | [<!ENTITY % poky SYSTEM "../poky.ent"> %poky; ] > | 
 |  | 
 | <chapter id='overview-yp'> | 
 |     <title>Introducing the Yocto Project</title> | 
 |  | 
 |     <section id='what-is-the-yocto-project'> | 
 |         <title>What is the Yocto Project?</title> | 
 |  | 
 |         <para> | 
 |             The Yocto Project is an open source collaboration project | 
 |             that helps developers create custom Linux-based systems that are | 
 |             designed for embedded products regardless of the product's hardware | 
 |             architecture. | 
 |             Yocto Project provides a flexible toolset and a development | 
 |             environment that allows embedded device developers across the | 
 |             world to collaborate through shared technologies, software stacks, | 
 |             configurations, and best practices used to create these tailored | 
 |             Linux images. | 
 |         </para> | 
 |  | 
 |         <para> | 
 |             Thousands of developers worldwide have discovered that Yocto | 
 |             Project provides advantages in both systems and applications | 
 |             development, archival and management benefits, and customizations | 
 |             used for speed, footprint, and memory utilization. | 
 |             The project is a standard when it comes to delivering embedded | 
 |             software stacks. | 
 |             The project allows software customizations and build interchange | 
 |             for multiple hardware platforms as well as software stacks that | 
 |             can be maintained and scaled. | 
 |         </para> | 
 |  | 
 |         <para id='yp-key-dev-elements'> | 
 |                 <imagedata fileref="figures/key-dev-elements.png" format="PNG" align='center' width="8in"/> | 
 |         </para> | 
 |  | 
 |         <para> | 
 |             For further introductory information on the Yocto Project, you | 
 |             might be interested in this | 
 |             <ulink url='https://www.embedded.com/electronics-blogs/say-what-/4458600/Why-the-Yocto-Project-for-my-IoT-Project-'>article</ulink> | 
 |             by Drew Moseley and in this short introductory | 
 |             <ulink url='https://www.youtube.com/watch?v=utZpKM7i5Z4'>video</ulink>. | 
 |         </para> | 
 |  | 
 |         <para> | 
 |             The remainder of this section overviews advantages and challenges | 
 |             tied to the Yocto Project. | 
 |         </para> | 
 |  | 
 |         <section id='gs-features'> | 
 |             <title>Features</title> | 
 |  | 
 |             <para> | 
 |                 The following list describes features and advantages of the | 
 |                 Yocto Project: | 
 |                 <itemizedlist> | 
 |                     <listitem><para> | 
 |                         <emphasis>Widely Adopted Across the Industry:</emphasis> | 
 |                         Semiconductor, operating system, software, and | 
 |                         service vendors exist whose products and services | 
 |                         adopt and support the Yocto Project. | 
 |                         For a look at the Yocto Project community and | 
 |                         the companies involved with the Yocto | 
 |                         Project, see the "COMMUNITY" and "ECOSYSTEM" tabs | 
 |                         on the | 
 |                         <ulink url='&YOCTO_HOME_URL;'>Yocto Project</ulink> | 
 |                         home page. | 
 |                         </para></listitem> | 
 |                     <listitem><para> | 
 |                         <emphasis>Architecture Agnostic:</emphasis> | 
 |                         Yocto Project supports Intel, ARM, MIPS, AMD, PPC | 
 |                         and other architectures. | 
 |                         Most ODMs, OSVs, and chip vendors create and supply | 
 |                         BSPs that support their hardware. | 
 |                         If you have custom silicon, you can create a BSP | 
 |                         that supports that architecture.</para> | 
 |  | 
 |                         <para>Aside from lots of architecture support, the | 
 |                         Yocto Project fully supports a wide range of device | 
 |                         emulation through the Quick EMUlator (QEMU). | 
 |                         </para></listitem> | 
 |                     <listitem><para> | 
 |                         <emphasis>Images and Code Transfer Easily:</emphasis> | 
 |                         Yocto Project output can easily move between | 
 |                         architectures without moving to new development | 
 |                         environments. | 
 |                         Additionally, if you have used the Yocto Project to | 
 |                         create an image or application and you find yourself | 
 |                         not able to support it, commercial Linux vendors such | 
 |                         as Wind River, Mentor Graphics, Timesys, and ENEA could | 
 |                         take it and provide ongoing support. | 
 |                         These vendors have offerings that are built using | 
 |                         the Yocto Project. | 
 |                         </para></listitem> | 
 |                     <listitem><para> | 
 |                         <emphasis>Flexibility:</emphasis> | 
 |                         Corporations use the Yocto Project many different ways. | 
 |                         One example is to create an internal Linux distribution | 
 |                         as a code base the corporation can use across multiple | 
 |                         product groups. | 
 |                         Through customization and layering, a project group | 
 |                         can leverage the base Linux distribution to create | 
 |                         a distribution that works for their product needs. | 
 |                         </para></listitem> | 
 |                     <listitem><para> | 
 |                         <emphasis>Ideal for Constrained Embedded and IoT devices:</emphasis> | 
 |                         Unlike a full Linux distribution, you can use the | 
 |                         Yocto Project to create exactly what you need for | 
 |                         embedded devices. | 
 |                         You only add the feature support or packages that you | 
 |                         absolutely need for the device. | 
 |                         For devices that have display hardware, you can use | 
 |                         available system components such as X11, GTK+, Qt, | 
 |                         Clutter, and SDL (among others) to create a rich user | 
 |                         experience. | 
 |                         For devices that do not have a display or where you | 
 |                         want to use alternative UI frameworks, you can choose | 
 |                         to not install these components. | 
 |                         </para></listitem> | 
 |                     <listitem><para> | 
 |                         <emphasis>Comprehensive Toolchain Capabilities:</emphasis> | 
 |                         Toolchains for supported architectures satisfy most | 
 |                         use cases. | 
 |                         However, if your hardware supports features that are | 
 |                         not part of a standard toolchain, you can easily | 
 |                         customize that toolchain through specification of | 
 |                         platform-specific tuning parameters. | 
 |                         And, should you need to use a third-party toolchain, | 
 |                         mechanisms built into the Yocto Project allow for that. | 
 |                         </para></listitem> | 
 |                     <listitem><para> | 
 |                         <emphasis>Mechanism Rules Over Policy:</emphasis> | 
 |                         Focusing on mechanism rather than policy ensures that | 
 |                         you are free to set policies based on the needs of your | 
 |                         design instead of adopting decisions enforced by some | 
 |                         system software provider. | 
 |                         </para></listitem> | 
 |                     <listitem><para> | 
 |                         <emphasis>Uses a Layer Model:</emphasis> | 
 |                         The Yocto Project | 
 |                         <link linkend='the-yocto-project-layer-model'>layer infrastructure</link> | 
 |                         groups related functionality into separate bundles. | 
 |                         You can incrementally add these grouped functionalities | 
 |                         to your project as needed. | 
 |                         Using layers to isolate and group functionality | 
 |                         reduces project complexity and redundancy, allows you | 
 |                         to easily extend the system, make customizations, | 
 |                         and keep functionality organized. | 
 |                         </para></listitem> | 
 |                      <listitem><para> | 
 |                         <emphasis>Supports Partial Builds:</emphasis> | 
 |                         You can build and rebuild individual packages as | 
 |                         needed. | 
 |                         Yocto Project accomplishes this through its | 
 |                         <link linkend='shared-state-cache'>shared-state cache</link> | 
 |                         (sstate) scheme. | 
 |                         Being able to build and debug components individually | 
 |                         eases project development. | 
 |                         </para></listitem> | 
 |                     <listitem><para> | 
 |                         <emphasis>Releases According to a Strict Schedule:</emphasis> | 
 |                         Major releases occur on a | 
 |                         <ulink url='&YOCTO_DOCS_REF_URL;#ref-release-process'>six-month cycle</ulink> | 
 |                         predictably in October and April. | 
 |                         The most recent two releases support point releases | 
 |                         to address common vulnerabilities and exposures. | 
 |                         This predictability is crucial for projects based on | 
 |                         the Yocto Project and allows development teams to | 
 |                         plan activities. | 
 |                         </para></listitem> | 
 |                     <listitem><para> | 
 |                         <emphasis>Rich Ecosystem of Individuals and Organizations:</emphasis> | 
 |                         For open source projects, the value of community is | 
 |                         very important. | 
 |                         Support forums, expertise, and active developers who | 
 |                         continue to push the Yocto Project forward are readily | 
 |                         available. | 
 |                         </para></listitem> | 
 |                     <listitem><para> | 
 |                         <emphasis>Binary Reproducibility:</emphasis> | 
 |                         The Yocto Project allows you to be very specific about | 
 |                         dependencies and achieves very high percentages of | 
 |                         binary reproducibility (e.g. 99.8% for | 
 |                         <filename>core-image-minimal</filename>). | 
 |                         When distributions are not specific about which | 
 |                         packages are pulled in and in what order to support | 
 |                         dependencies, other build systems can arbitrarily | 
 |                         include packages. | 
 |                         </para></listitem> | 
 |                     <listitem><para> | 
 |                         <emphasis>License Manifest:</emphasis> | 
 |                         The Yocto Project provides a | 
 |                         <ulink url='&YOCTO_DOCS_DEV_URL;#maintaining-open-source-license-compliance-during-your-products-lifecycle'>license manifest</ulink> | 
 |                         for review by people who need to track the use of open | 
 |                         source licenses (e.g.legal teams). | 
 |                         </para></listitem> | 
 |                 </itemizedlist> | 
 |             </para> | 
 |         </section> | 
 |  | 
 |         <section id='gs-challenges'> | 
 |             <title>Challenges</title> | 
 |  | 
 |             <para> | 
 |                 The following list presents challenges you might encounter | 
 |                 when developing using the Yocto Project: | 
 |                 <itemizedlist> | 
 |                     <listitem><para> | 
 |                         <emphasis>Steep Learning Curve:</emphasis> | 
 |                         The Yocto Project has a steep learning curve and has | 
 |                         many different ways to accomplish similar tasks. | 
 |                         It can be difficult to choose how to proceed when | 
 |                         varying methods exist by which to accomplish a given | 
 |                         task. | 
 |                         </para></listitem> | 
 |                     <listitem><para> | 
 |                         <emphasis>Understanding What Changes You Need to Make | 
 |                         For Your Design Requires Some Research:</emphasis> | 
 |                         Beyond the simple tutorial stage, understanding what | 
 |                         changes need to be made for your particular design | 
 |                         can require a significant amount of research and | 
 |                         investigation. | 
 |                         For information that helps you transition from | 
 |                         trying out the Yocto Project to using it for your | 
 |                         project, see the | 
 |                         "<ulink url='&YOCTO_HOME_URL;/docs/what-i-wish-id-known/'>What I wish I'd Known</ulink>" | 
 |                         and | 
 |                         "<ulink url='&YOCTO_HOME_URL;/docs/transitioning-to-a-custom-environment/'>Transitioning to a Custom Environment for Systems Development</ulink>" | 
 |                         documents on the Yocto Project website. | 
 |                         </para></listitem> | 
 |                     <listitem><para> | 
 |                         <emphasis>Project Workflow Could Be Confusing:</emphasis> | 
 |                         The | 
 |                         <link linkend='overview-development-environment'>Yocto Project workflow</link> | 
 |                         could be confusing if you are used to traditional | 
 |                         desktop and server software development. | 
 |                         In a desktop development environment, mechanisms exist | 
 |                         to easily pull and install new packages, which are | 
 |                         typically pre-compiled binaries from servers accessible | 
 |                         over the Internet. | 
 |                         Using the Yocto Project, you must modify your | 
 |                         configuration and rebuild to add additional packages. | 
 |                         </para></listitem> | 
 |                     <listitem><para> | 
 |                         <emphasis>Working in a Cross-Build Environment Can | 
 |                         Feel Unfamiliar:</emphasis> | 
 |                         When developing code to run on a target, compilation, | 
 |                         execution, and testing done on the actual target | 
 |                         can be faster than running a BitBake build on a | 
 |                         development host and then deploying binaries to the | 
 |                         target for test. | 
 |                         While the Yocto Project does support development tools | 
 |                         on the target, the additional step of integrating your | 
 |                         changes back into the Yocto Project build environment | 
 |                         would be required. | 
 |                         Yocto Project supports an intermediate approach that | 
 |                         involves making changes on the development system | 
 |                         within the BitBake environment and then deploying only | 
 |                         the updated packages to the target.</para> | 
 |  | 
 |                         <para>The Yocto Project | 
 |                         <ulink url='&YOCTO_DOCS_REF_URL;#build-system-term'>OpenEmbedded build system</ulink> | 
 |                         produces packages in standard formats (i.e. RPM, | 
 |                         DEB, IPK, and TAR). | 
 |                         You can deploy these packages into the running system | 
 |                         on the target by using utilities on the target such | 
 |                         as <filename>rpm</filename> or | 
 |                         <filename>ipk</filename>. | 
 |                         </para></listitem> | 
 |                     <listitem><para> | 
 |                         <emphasis>Initial Build Times Can be Significant:</emphasis> | 
 |                         Long initial build times are unfortunately unavoidable | 
 |                         due to the large number of packages initially built | 
 |                         from scratch for a fully functioning Linux system. | 
 |                         Once that initial build is completed, however, the | 
 |                         shared-state (sstate) cache mechanism Yocto Project | 
 |                         uses keeps the system from rebuilding packages that | 
 |                         have not been "touched" since the last build. | 
 |                         The sstate mechanism significantly reduces times | 
 |                         for successive builds. | 
 |                         </para></listitem> | 
 |                 </itemizedlist> | 
 |             </para> | 
 |         </section> | 
 |     </section> | 
 |  | 
 |     <section id='the-yocto-project-layer-model'> | 
 |         <title>The Yocto Project Layer Model</title> | 
 |  | 
 |         <para> | 
 |             The Yocto Project's "Layer Model" is a development model for | 
 |             embedded and IoT Linux creation that distinguishes the | 
 |             Yocto Project from other simple build systems. | 
 |             The Layer Model simultaneously supports collaboration and | 
 |             customization. | 
 |             Layers are repositories that contain related sets of instructions | 
 |             that tell the | 
 |             <ulink url='&YOCTO_DOCS_REF_URL;#build-system-term'>OpenEmbedded build system</ulink> | 
 |             what to do. | 
 |             You can collaborate, share, and reuse layers. | 
 |         </para> | 
 |  | 
 |         <para> | 
 |             Layers can contain changes to previous instructions or settings | 
 |             at any time. | 
 |             This powerful override capability is what allows you to customize | 
 |             previously supplied collaborative or community layers to suit your | 
 |             product requirements. | 
 |         </para> | 
 |  | 
 |         <para> | 
 |             You use different layers to logically separate information in your | 
 |             build. | 
 |             As an example, you could have BSP, GUI, distro configuration, | 
 |             middleware, or application layers. | 
 |             Putting your entire build into one layer limits and complicates | 
 |             future customization and reuse. | 
 |             Isolating information into layers, on the other hand, helps | 
 |             simplify future customizations and reuse. | 
 |             You might find it tempting to keep everything in one layer when | 
 |             working on a single project. | 
 |             However, the more modular your Metadata, the easier | 
 |             it is to cope with future changes. | 
 |             <note><title>Notes</title> | 
 |                 <itemizedlist> | 
 |                     <listitem><para> | 
 |                         Use Board Support Package (BSP) layers from silicon | 
 |                         vendors when possible. | 
 |                         </para></listitem> | 
 |                     <listitem><para> | 
 |                         Familiarize yourself with the | 
 |                         <ulink url='https://caffelli-staging.yoctoproject.org/software-overview/layers/'>Yocto Project curated layer index</ulink> | 
 |                         or the | 
 |                         <ulink url='http://layers.openembedded.org/layerindex/branch/master/layers/'>OpenEmbedded layer index</ulink>. | 
 |                         The latter contains more layers but they are less | 
 |                         universally validated. | 
 |                         </para></listitem> | 
 |                     <listitem><para> | 
 |                         Layers support the inclusion of technologies, hardware | 
 |                         components, and software components. | 
 |                         The | 
 |                         <ulink url='&YOCTO_DOCS_DEV_URL;#making-sure-your-layer-is-compatible-with-yocto-project'>Yocto Project Compatible</ulink> | 
 |                         designation provides a minimum level of standardization | 
 |                         that contributes to a strong ecosystem. | 
 |                         "YP Compatible" is applied to appropriate products and | 
 |                         software components such as BSPs, other OE-compatible | 
 |                         layers, and related open-source projects, allowing the | 
 |                         producer to use Yocto Project badges and branding | 
 |                         assets. | 
 |                         </para></listitem> | 
 |                 </itemizedlist> | 
 |             </note> | 
 |         </para> | 
 |  | 
 |         <para> | 
 |             To illustrate how layers are used to keep things modular, consider | 
 |             machine customizations. | 
 |             These types of customizations typically reside in a special layer, | 
 |             rather than a general layer, called a BSP Layer. | 
 |             Furthermore, the machine customizations should be isolated from | 
 |             recipes and Metadata that support a new GUI environment, | 
 |             for example. | 
 |             This situation gives you a couple of layers: one for the machine | 
 |             configurations, and one for the GUI environment. | 
 |             It is important to understand, however, that the BSP layer can | 
 |             still make machine-specific additions to recipes within the GUI | 
 |             environment layer without polluting the GUI layer itself | 
 |             with those machine-specific changes. | 
 |             You can accomplish this through a recipe that is a BitBake append | 
 |             (<filename>.bbappend</filename>) file, which is described later | 
 |             in this section. | 
 |             <note> | 
 |                 For general information on BSP layer structure, see the | 
 |                 <ulink url='&YOCTO_DOCS_BSP_URL;'>Yocto Project Board Support Packages (BSP) Developer's Guide</ulink>. | 
 |             </note> | 
 |         </para> | 
 |  | 
 |         <para> | 
 |             The | 
 |             <ulink url='&YOCTO_DOCS_REF_URL;#source-directory'>Source Directory</ulink> | 
 |             contains both general layers and BSP layers right out of the box. | 
 |             You can easily identify layers that ship with a Yocto Project | 
 |             release in the Source Directory by their names. | 
 |             Layers typically have names that begin with the string | 
 |             <filename>meta-</filename>. | 
 |             <note> | 
 |                 It is not a requirement that a layer name begin with the | 
 |                 prefix <filename>meta-</filename>, but it is a commonly | 
 |                 accepted standard in the Yocto Project community. | 
 |             </note> | 
 |             For example, if you were to examine the | 
 |             <ulink url='https://git.yoctoproject.org/cgit/cgit.cgi/poky/tree/'>tree view</ulink> | 
 |             of the <filename>poky</filename> repository, you will see several | 
 |             layers: <filename>meta</filename>, | 
 |             <filename>meta-skeleton</filename>, | 
 |             <filename>meta-selftest</filename>, | 
 |             <filename>meta-poky</filename>, and | 
 |             <filename>meta-yocto-bsp</filename>. | 
 |             Each of these repositories represents a distinct layer. | 
 |         </para> | 
 |  | 
 |         <para> | 
 |             For procedures on how to create layers, see the | 
 |             "<ulink url='&YOCTO_DOCS_DEV_URL;#understanding-and-creating-layers'>Understanding and Creating Layers</ulink>" | 
 |             section in the Yocto Project Development Tasks Manual. | 
 |         </para> | 
 |     </section> | 
 |  | 
 |     <section id='components-and-tools'> | 
 |         <title>Components and Tools</title> | 
 |  | 
 |         <para> | 
 |             The Yocto Project employs a collection of components and | 
 |             tools used by the project itself, by project developers, | 
 |             and by those using the Yocto Project. | 
 |             These components and tools are open source projects and | 
 |             metadata that are separate from the reference distribution | 
 |             (<ulink url='&YOCTO_DOCS_REF_URL;#poky'>Poky</ulink>) | 
 |             and the | 
 |             <ulink url='&YOCTO_DOCS_REF_URL;#build-system-term'>OpenEmbedded build system</ulink>. | 
 |             Most of the components and tools are downloaded separately. | 
 |         </para> | 
 |  | 
 |         <para> | 
 |             This section provides brief overviews of the components and | 
 |             tools associated with the Yocto Project. | 
 |         </para> | 
 |  | 
 |         <section id='gs-development-tools'> | 
 |             <title>Development Tools</title> | 
 |  | 
 |             <para> | 
 |                 The following list consists of tools that help you develop | 
 |                 images and applications using the Yocto Project: | 
 |                 <itemizedlist> | 
 |                     <listitem><para id='gs-crops-overview'> | 
 |                         <emphasis>CROPS:</emphasis> | 
 |                         <ulink url='https://git.yoctoproject.org/cgit/cgit.cgi/crops/about/'>CROPS</ulink> | 
 |                         is an open source, cross-platform development framework | 
 |                         that leverages | 
 |                         <ulink url='https://www.docker.com/'>Docker Containers</ulink>. | 
 |                         CROPS provides an easily managed, extensible environment | 
 |                         that allows you to build binaries for a variety of | 
 |                         architectures on Windows, Linux and Mac OS X hosts. | 
 |                         </para></listitem> | 
 |                     <listitem><para> | 
 |                         <emphasis><filename>devtool</filename>:</emphasis> | 
 |                         This command-line tool is available as part of the | 
 |                         extensible SDK (eSDK) and is its cornerstone. | 
 |                         You can use <filename>devtool</filename> to help build, | 
 |                         test, and package software within the eSDK. | 
 |                         You can use the tool to optionally integrate what you | 
 |                         build into an image built by the OpenEmbedded build | 
 |                         system.</para> | 
 |  | 
 |                         <para>The <filename>devtool</filename> command employs | 
 |                         a number of sub-commands that allow you to add, modify, | 
 |                         and upgrade recipes. | 
 |                         As with the OpenEmbedded build system, “recipes” | 
 |                         represent software packages within | 
 |                         <filename>devtool</filename>. | 
 |                         When you use <filename>devtool add</filename>, a recipe | 
 |                         is automatically created. | 
 |                         When you use <filename>devtool modify</filename>, the | 
 |                         specified existing recipe is used in order to determine | 
 |                         where to get the source code and how to patch it. | 
 |                         In both cases, an environment is set up so that when | 
 |                         you build the recipe a source tree that is under your | 
 |                         control is used in order to allow you to make changes | 
 |                         to the source as desired. | 
 |                         By default, both new recipes and the source go into | 
 |                         a “workspace” directory under the eSDK. | 
 |                         The <filename>devtool upgrade</filename> command | 
 |                         updates an existing recipe so that you can build it | 
 |                         for an updated set of source files.</para> | 
 |  | 
 |                         <para>You can read about the | 
 |                         <filename>devtool</filename> workflow in the Yocto | 
 |                         Project Application Development and Extensible | 
 |                         Software Development Kit (eSDK) Manual in the | 
 |                         "<ulink url='&YOCTO_DOCS_SDK_URL;#using-devtool-in-your-sdk-workflow'>Using <filename>devtool</filename> in Your SDK Workflow'</ulink>" | 
 |                         section. | 
 |                         </para></listitem> | 
 |                     <listitem><para> | 
 |                         <emphasis>Extensible Software Development Kit (eSDK):</emphasis> | 
 |                         The eSDK provides a cross-development toolchain and | 
 |                         libraries tailored to the contents of a specific image. | 
 |                         The eSDK makes it easy to add new applications and | 
 |                         libraries to an image, modify the source for an | 
 |                         existing component, test changes on the target | 
 |                         hardware, and integrate into the rest of the | 
 |                         OpenEmbedded build system. | 
 |                         The eSDK gives you a toolchain experience supplemented | 
 |                         with the powerful set of <filename>devtool</filename> | 
 |                         commands tailored for the Yocto Project environment. | 
 |                         </para> | 
 |  | 
 |                         <para>For information on the eSDK, see the | 
 |                         <ulink url='&YOCTO_DOCS_SDK_URL;'>Yocto Project Application Development and the Extensible Software Development Kit (eSDK)</ulink> | 
 |                         Manual. | 
 |                         </para></listitem> | 
 |                     <listitem><para> | 
 |                         <emphasis><trademark class='trade'>Eclipse</trademark> IDE Plug-in:</emphasis> | 
 |                         This plug-in enables you to use the popular Eclipse | 
 |                         Integrated Development Environment (IDE), which allows | 
 |                         for development using the Yocto Project all within the | 
 |                         Eclipse IDE. | 
 |                         You can work within Eclipse to cross-compile, deploy, | 
 |                         and execute your output into a QEMU emulation session | 
 |                         as well as onto actual target hardware.</para> | 
 |  | 
 |                         <para>The environment also supports performance | 
 |                         enhancing tools that allow you to perform remote | 
 |                         profiling, tracing, collection of power data, | 
 |                         collection of latency data, and collection of | 
 |                         performance data.</para> | 
 |  | 
 |                         <para>Once you enable the plug-in, standard Eclipse | 
 |                         functions automatically use the cross-toolchain | 
 |                         and target system libraries. | 
 |                         You can build applications using any of these | 
 |                         libraries.</para> | 
 |  | 
 |                         <para>For more information on the Eclipse plug-in, | 
 |                         see the | 
 |                         "<ulink url='&YOCTO_DOCS_SDK_URL;#adt-eclipse'>Working Within Eclipse</ulink>" | 
 |                         section in the Yocto Project Application Development | 
 |                         and the Extensible Software Development Kit (eSDK) | 
 |                         manual. | 
 |                         </para></listitem> | 
 |                     <listitem><para> | 
 |                         <emphasis>Toaster:</emphasis> | 
 |                         Toaster is a web interface to the Yocto Project | 
 |                         OpenEmbedded build system. | 
 |                         Toaster allows you to configure, run, and view | 
 |                         information about builds. | 
 |                         For information on Toaster, see the | 
 |                         <ulink url='&YOCTO_DOCS_TOAST_URL;'>Toaster User Manual</ulink>. | 
 |                         </para></listitem> | 
 |                 </itemizedlist> | 
 |             </para> | 
 |         </section> | 
 |  | 
 |         <section id='gs-production-tools'> | 
 |             <title>Production Tools</title> | 
 |  | 
 |             <para> | 
 |                 The following list consists of tools that help production | 
 |                 related activities using the Yocto Project: | 
 |                 <itemizedlist> | 
 |                     <listitem><para> | 
 |                         <emphasis>Auto Upgrade Helper:</emphasis> | 
 |                         This utility when used in conjunction with the | 
 |                         <ulink url='&YOCTO_DOCS_REF_URL;#build-system-term'>OpenEmbedded build system</ulink> | 
 |                         (BitBake and OE-Core) automatically generates upgrades | 
 |                         for recipes that are based on new versions of the | 
 |                         recipes published upstream. | 
 |                         </para></listitem> | 
 |                     <listitem><para> | 
 |                         <emphasis>Recipe Reporting System:</emphasis> | 
 |                         The Recipe Reporting System tracks recipe versions | 
 |                         available for Yocto Project. | 
 |                         The main purpose of the system is to help you | 
 |                         manage the recipes you maintain and to offer a dynamic | 
 |                         overview of the project. | 
 |                         The Recipe Reporting System is built on top of the | 
 |                         <ulink url="http://layers.openembedded.org/layerindex/layers/">OpenEmbedded Layer Index</ulink>, | 
 |                         which is a website that indexes OpenEmbedded-Core | 
 |                         layers. | 
 |                         </para></listitem> | 
 |                     <listitem><para> | 
 |                         <emphasis>Patchwork:</emphasis> | 
 |                         <ulink url='http://jk.ozlabs.org/projects/patchwork/'>Patchwork</ulink> | 
 |                         is a fork of a project originally started by | 
 |                         <ulink url='http://ozlabs.org/'>OzLabs</ulink>. | 
 |                         The project is a web-based tracking system designed | 
 |                         to streamline the process of bringing contributions | 
 |                         into a project. | 
 |                         The Yocto Project uses Patchwork as an organizational | 
 |                         tool to handle patches, which number in the thousands | 
 |                         for every release. | 
 |                         </para></listitem> | 
 |                     <listitem><para> | 
 |                         <emphasis>AutoBuilder:</emphasis> | 
 |                         AutoBuilder is a project that automates build tests | 
 |                         and quality assurance (QA). | 
 |                         By using the public AutoBuilder, anyone can determine | 
 |                         the status of the current "master" branch of Poky. | 
 |                         <note> | 
 |                             AutoBuilder is based on | 
 |                             <ulink url='https://buildbot.net/'>buildbot</ulink>. | 
 |                         </note></para> | 
 |  | 
 |                         <para>A goal of the Yocto Project is to lead the | 
 |                         open source industry with a project that automates | 
 |                         testing and QA procedures. | 
 |                         In doing so, the project encourages a development | 
 |                         community that publishes QA and test plans, publicly | 
 |                         demonstrates QA and test plans, and encourages | 
 |                         development of tools that automate and test and QA | 
 |                         procedures for the benefit of the development | 
 |                         community.</para> | 
 |  | 
 |                         <para>You can learn more about the AutoBuilder used | 
 |                         by the Yocto Project | 
 |                         <ulink url='&YOCTO_AB_URL;'>here</ulink>. | 
 |                         </para></listitem> | 
 |                     <listitem><para> | 
 |                         <emphasis>Cross-Prelink:</emphasis> | 
 |                         Prelinking is the process of pre-computing the load | 
 |                         addresses and link tables generated by the dynamic | 
 |                         linker as compared to doing this at runtime. | 
 |                         Doing this ahead of time results in performance | 
 |                         improvements when the application is launched and | 
 |                         reduced memory usage for libraries shared by many | 
 |                         applications.</para> | 
 |  | 
 |                         <para>Historically, cross-prelink is a variant of | 
 |                         prelink, which was conceived by | 
 |                         <ulink url='http://people.redhat.com/jakub/prelink.pdf'>Jakub Jelínek</ulink> | 
 |                         a number of years ago. | 
 |                         Both prelink and cross-prelink are maintained in the | 
 |                         same repository albeit on separate branches. | 
 |                         By providing an emulated runtime dynamic linker | 
 |                         (i.e. <filename>glibc</filename>-derived | 
 |                         <filename>ld.so</filename> emulation), the | 
 |                         cross-prelink project extends the prelink software’s | 
 |                         ability to prelink a sysroot environment. | 
 |                         Additionally, the cross-prelink software enables the | 
 |                         ability to work in sysroot style environments.</para> | 
 |  | 
 |                         <para>The dynamic linker determines standard load | 
 |                         address calculations based on a variety of factors | 
 |                         such as mapping addresses, library usage, and library | 
 |                         function conflicts. | 
 |                         The prelink tool uses this information, from the | 
 |                         dynamic linker, to determine unique load addresses | 
 |                         for executable and linkable format (ELF) binaries | 
 |                         that are shared libraries and dynamically linked. | 
 |                         The prelink tool modifies these ELF binaries with the | 
 |                         pre-computed information. | 
 |                         The result is faster loading and often lower memory | 
 |                         consumption because more of the library code can | 
 |                         be re-used from shared Copy-On-Write (COW) pages. | 
 |                         </para> | 
 |  | 
 |                         <para>The original upstream prelink project only | 
 |                         supports running prelink on the end target device | 
 |                         due to the reliance on the target device’s dynamic | 
 |                         linker. | 
 |                         This restriction causes issues when developing a | 
 |                         cross-compiled system. | 
 |                         The cross-prelink adds a synthesized dynamic loader | 
 |                         that runs on the host, thus permitting cross-prelinking | 
 |                         without ever having to run on a read-write target | 
 |                         filesystem. | 
 |                         </para></listitem> | 
 |                     <listitem><para> | 
 |                         <emphasis>Pseudo:</emphasis> | 
 |                         Pseudo is the Yocto Project implementation of | 
 |                         <ulink url='http://man.he.net/man1/fakeroot'>fakeroot</ulink>, | 
 |                         which is used to run commands in an environment | 
 |                         that seemingly has root privileges.</para> | 
 |  | 
 |                         <para>During a build, it can be necessary to perform | 
 |                         operations that require system administrator | 
 |                         privileges. | 
 |                         For example, file ownership or permissions might need | 
 |                         definition. | 
 |                         Pseudo is a tool that you can either use directly or | 
 |                         through the environment variable | 
 |                         <filename>LD_PRELOAD</filename>. | 
 |                         Either method allows these operations to succeed as | 
 |                         if system administrator privileges exist even | 
 |                         when they do not.</para> | 
 |  | 
 |                         <para>You can read more about Pseudo in the | 
 |                         "<link linkend='fakeroot-and-pseudo'>Fakeroot and Pseudo</link>" | 
 |                         section. | 
 |                         </para></listitem> | 
 |                 </itemizedlist> | 
 |             </para> | 
 |         </section> | 
 |  | 
 |         <section id='gs-openembedded-build-system'> | 
 |             <title>Open-Embedded Build System Components</title> | 
 |  | 
 |             <para> | 
 |                 The following list consists of components associated with the | 
 |                 <ulink url='&YOCTO_DOCS_REF_URL;#build-system-term'>OpenEmbedded build system</ulink>: | 
 |                 <itemizedlist> | 
 |                     <listitem><para> | 
 |                         <emphasis>BitBake:</emphasis> | 
 |                         BitBake is a core component of the Yocto Project and is | 
 |                         used by the OpenEmbedded build system to build images. | 
 |                         While BitBake is key to the build system, BitBake | 
 |                         is maintained separately from the Yocto Project.</para> | 
 |  | 
 |                         <para>BitBake is a generic task execution engine that | 
 |                         allows shell and Python tasks to be run efficiently | 
 |                         and in parallel while working within complex inter-task | 
 |                         dependency constraints. | 
 |                         In short, BitBake is a build engine that works | 
 |                         through recipes written in a specific format in order | 
 |                         to perform sets of tasks.</para> | 
 |  | 
 |                         <para>You can learn more about BitBake in the | 
 |                         <ulink url='&YOCTO_DOCS_BB_URL;'>BitBake User Manual</ulink>. | 
 |                         </para></listitem> | 
 |                     <listitem><para> | 
 |                         <emphasis>OpenEmbedded-Core:</emphasis> | 
 |                         OpenEmbedded-Core (OE-Core) is a common layer of | 
 |                         metadata (i.e. recipes, classes, and associated files) | 
 |                         used by OpenEmbedded-derived systems, which includes | 
 |                         the Yocto Project. | 
 |                         The Yocto Project and the OpenEmbedded Project both | 
 |                         maintain the OpenEmbedded-Core. | 
 |                         You can find the OE-Core metadata in the Yocto Project | 
 |                         <ulink url='&YOCTO_GIT_URL;/cgit/cgit.cgi/poky/tree/meta'>Source Repositories</ulink>. | 
 |                         </para> | 
 |  | 
 |                         <para>Historically, the Yocto Project integrated the | 
 |                         OE-Core metadata throughout the Yocto Project | 
 |                         source repository reference system (Poky). | 
 |                         After Yocto Project Version 1.0, the Yocto Project | 
 |                         and OpenEmbedded agreed to work together and share a | 
 |                         common core set of metadata (OE-Core), which contained | 
 |                         much of the functionality previously found in Poky. | 
 |                         This collaboration achieved a long-standing | 
 |                         OpenEmbedded objective for having a more tightly | 
 |                         controlled and quality-assured core. | 
 |                         The results also fit well with the Yocto Project | 
 |                         objective of achieving a smaller number of fully | 
 |                         featured tools as compared to many different ones. | 
 |                         </para> | 
 |  | 
 |                         <para>Sharing a core set of metadata results in Poky | 
 |                         as an integration layer on top of OE-Core. | 
 |                         You can see that in this | 
 |                         <link linkend='yp-key-dev-elements'>figure</link>. | 
 |                         The Yocto Project combines various components such as | 
 |                         BitBake, OE-Core, script “glue”, and documentation | 
 |                         for its build system. | 
 |                         </para></listitem> | 
 |                 </itemizedlist> | 
 |             </para> | 
 |         </section> | 
 |  | 
 |         <section id='gs-reference-distribution-poky'> | 
 |             <title>Reference Distribution (Poky)</title> | 
 |  | 
 |             <para> | 
 |                 Poky is the Yocto Project reference distribution. | 
 |                 It contains the | 
 |                 <ulink url='&YOCTO_DOCS_REF_URL;#build-system-term'>Open-Embedded build system</ulink> | 
 |                 (BitBake and OE-Core) as well as a set of metadata to get you | 
 |                 started building your own distribution. | 
 |                 See the | 
 |                 <link linkend='what-is-the-yocto-project'>figure</link> in | 
 |                 "What is the Yocto Project?" section for an illustration | 
 |                 that shows Poky and its relationship with other parts of the | 
 |                 Yocto Project.</para> | 
 |  | 
 |                 <para>To use the Yocto Project tools and components, you | 
 |                 can download (<filename>clone</filename>) Poky and use it | 
 |                 to bootstrap your own distribution. | 
 |                 <note> | 
 |                     Poky does not contain binary files. | 
 |                     It is a working example of how to build your own custom | 
 |                     Linux distribution from source. | 
 |                 </note> | 
 |                 You can read more about Poky in the | 
 |                 "<link linkend='reference-embedded-distribution'>Reference Embedded Distribution (Poky)</link>" | 
 |                 section. | 
 |             </para> | 
 |         </section> | 
 |  | 
 |         <section id='gs-packages-for-finished-targets'> | 
 |             <title>Packages for Finished Targets</title> | 
 |  | 
 |             <para> | 
 |                 The following lists components associated with packages | 
 |                 for finished targets: | 
 |                 <itemizedlist> | 
 |                     <listitem><para> | 
 |                         <emphasis>Matchbox:</emphasis> | 
 |                         Matchbox is an Open Source, base environment for the | 
 |                         X Window System running on non-desktop, embedded | 
 |                         platforms such as handhelds, set-top boxes, kiosks, | 
 |                         and anything else for which screen space, input | 
 |                         mechanisms, or system resources are limited.</para> | 
 |  | 
 |                         <para>Matchbox consists of a number of interchangeable | 
 |                         and optional applications that you can tailor to a | 
 |                         specific, non-desktop platform to enhance usability | 
 |                         in constrained environments.</para> | 
 |  | 
 |                         <para>You can find the Matchbox source in the Yocto | 
 |                         Project | 
 |                         <ulink url='&YOCTO_GIT_URL;'>Source Repositories</ulink>. | 
 |                         </para></listitem> | 
 |                     <listitem><para> | 
 |                         <emphasis>Opkg</emphasis> | 
 |                         Open PacKaGe management (opkg) is a lightweight | 
 |                         package management system based on the itsy package | 
 |                         (ipkg) management system. | 
 |                         Opkg is written in C and resembles Advanced Package | 
 |                         Tool (APT) and Debian Package (dpkg) in operation. | 
 |                         </para> | 
 |  | 
 |                         <para>Opkg is intended for use on embedded Linux | 
 |                         devices and is used in this capacity in the | 
 |                         <ulink url='http://www.openembedded.org/wiki/Main_Page'>OpenEmbedded</ulink> | 
 |                         and | 
 |                         <ulink url='https://openwrt.org/'>OpenWrt</ulink> | 
 |                         projects, as well as the Yocto Project. | 
 |                         <note> | 
 |                             As best it can, opkg maintains backwards | 
 |                             compatibility with ipkg and conforms to a subset | 
 |                             of Debian’s policy manual regarding control files. | 
 |                         </note> | 
 |                         </para></listitem> | 
 |                 </itemizedlist> | 
 |             </para> | 
 |         </section> | 
 |  | 
 |         <section id='gs-archived-components'> | 
 |             <title>Archived Components</title> | 
 |  | 
 |             <para> | 
 |                 The Build Appliance is a virtual machine image that enables | 
 |                 you to build and boot a custom embedded Linux image with | 
 |                 the Yocto Project using a non-Linux development system. | 
 |             </para> | 
 |  | 
 |             <para> | 
 |                 Historically, the Build Appliance was the second of three | 
 |                 methods by which you could use the Yocto Project on a system | 
 |                 that was not native to Linux. | 
 |                 <orderedlist> | 
 |                     <listitem><para> | 
 |                         <emphasis>Hob:</emphasis> | 
 |                         Hob, which is now deprecated and is no longer available | 
 |                         since the 2.1 release of the Yocto Project provided | 
 |                         a rudimentary, GUI-based interface to the Yocto | 
 |                         Project. | 
 |                         Toaster has fully replaced Hob. | 
 |                         </para></listitem> | 
 |                     <listitem><para> | 
 |                         <emphasis>Build Appliance:</emphasis> | 
 |                         Post Hob, the Build Appliance became available. | 
 |                         It was never recommended that you use the Build | 
 |                         Appliance as a day-to-day production development | 
 |                         environment with the Yocto Project. | 
 |                         Build Appliance was useful as a way to try out | 
 |                         development in the Yocto Project environment. | 
 |                         </para></listitem> | 
 |                     <listitem><para> | 
 |                         <emphasis>CROPS:</emphasis> | 
 |                         The final and best solution available now for | 
 |                         developing using the Yocto Project on a system | 
 |                         not native to Linux is with | 
 |                         <link linkend='gs-crops-overview'>CROPS</link>. | 
 |                         </para></listitem> | 
 |                 </orderedlist> | 
 |             </para> | 
 |         </section> | 
 |     </section> | 
 |  | 
 |     <section id='gs-development-methods'> | 
 |         <title>Development Methods</title> | 
 |  | 
 |         <para> | 
 |             The Yocto Project development environment usually involves a | 
 |             <ulink url='&YOCTO_DOCS_REF_URL;#hardware-build-system-term'>Build Host</ulink> | 
 |             and target hardware. | 
 |             You use the Build Host to build images and develop applications, | 
 |             while you use the target hardware to test deployed software. | 
 |         </para> | 
 |  | 
 |         <para> | 
 |             This section provides an introduction to the choices or | 
 |             development methods you have when setting up your Build Host. | 
 |             Depending on the your particular workflow preference and the | 
 |             type of operating system your Build Host runs, several choices | 
 |             exist that allow you to use the Yocto Project. | 
 |             <note> | 
 |                 For additional detail about the Yocto Project development | 
 |                 environment, see the | 
 |                 "<link linkend='overview-development-environment'>The Yocto Project Development Environment</link>" | 
 |                 chapter. | 
 |             </note> | 
 |             <itemizedlist> | 
 |                 <listitem><para> | 
 |                     <emphasis>Native Linux Host:</emphasis> | 
 |                     By far the best option for a Build Host. | 
 |                     A system running Linux as its native operating system | 
 |                     allows you to develop software by directly using the | 
 |                     <ulink url='&YOCTO_DOCS_REF_URL;#bitbake-term'>BitBake</ulink> | 
 |                     tool. | 
 |                     You can accomplish all aspects of development from a | 
 |                     familiar shell of a supported Linux distribution.</para> | 
 |  | 
 |                     <para>For information on how to set up a Build Host on | 
 |                     a system running Linux as its native operating system, | 
 |                     see the | 
 |                     "<ulink url='&YOCTO_DOCS_DEV_URL;#setting-up-a-native-linux-host'>Setting Up a Native Linux Host</ulink>" | 
 |                     section in the Yocto Project Development Tasks Manual. | 
 |                     </para></listitem> | 
 |                 <listitem><para> | 
 |                     <emphasis>CROss PlatformS (CROPS):</emphasis> | 
 |                     Typically, you use | 
 |                     <ulink url='https://git.yoctoproject.org/cgit/cgit.cgi/crops/about/'>CROPS</ulink>, | 
 |                     which leverages | 
 |                     <ulink url='https://www.docker.com/'>Docker Containers</ulink>, | 
 |                     to set up a Build Host that is not running Linux (e.g. | 
 |                     <trademark class='registered'>Microsoft</trademark> | 
 |                     <trademark class='trademark'>Windows</trademark> | 
 |                     or | 
 |                     <trademark class='registered'>macOS</trademark>). | 
 |                     <note> | 
 |                         You can, however, use CROPS on a Linux-based system. | 
 |                     </note> | 
 |                     CROPS is an open source, cross-platform development | 
 |                     framework that provides an easily managed, extensible | 
 |                     environment for building binaries targeted for a variety | 
 |                     of architectures on Windows, macOS, or Linux hosts. | 
 |                     Once the Build Host is set up using CROPS, you can prepare | 
 |                     a shell environment to mimic that of a shell being used | 
 |                     on a system natively running Linux.</para> | 
 |  | 
 |                     <para>For information on how to set up a Build Host with | 
 |                     CROPS, see the | 
 |                     "<ulink url='&YOCTO_DOCS_DEV_URL;#setting-up-to-use-crops'>Setting Up to Use CROss PlatformS (CROPS)</ulink>" | 
 |                     section in the Yocto Project Development Tasks Manual. | 
 |                     </para></listitem> | 
 |                 <listitem><para> | 
 |                     <emphasis>Toaster:</emphasis> | 
 |                     Regardless of what your Build Host is running, you can | 
 |                     use Toaster to develop software using the Yocto Project. | 
 |                     Toaster is a web interface to the Yocto Project's | 
 |                     <ulink url='&YOCTO_DOCS_REF_URL;#build-system-term'>Open-Embedded build system</ulink>. | 
 |                     The interface enables you to configure and run your | 
 |                     builds. | 
 |                     Information about builds is collected and stored in a | 
 |                     database. | 
 |                     You can use Toaster to configure and start builds on | 
 |                     multiple remote build servers.</para> | 
 |  | 
 |                     <para>For information about and how to use Toaster, | 
 |                     see the | 
 |                     <ulink url='&YOCTO_DOCS_TOAST_URL;'>Toaster User Manual</ulink>. | 
 |                     </para></listitem> | 
 |                 <listitem><para> | 
 |                     <emphasis><trademark class='trade'>Eclipse</trademark> IDE:</emphasis> | 
 |                     If your Build Host supports and runs the popular | 
 |                     Eclipse IDE, you can install the Yocto Project Eclipse | 
 |                     plug-in and use the Yocto Project to develop software. | 
 |                     The plug-in integrates the Yocto Project functionality | 
 |                     into Eclipse development practices.</para> | 
 |  | 
 |                     <para>For information about how to install and use the | 
 |                     Yocto Project Eclipse plug-in, see the | 
 |                     "<ulink url='&YOCTO_DOCS_SDK_URL;#sdk-eclipse-project'>Developing Applications Using Eclipse</ulink>" | 
 |                     chapter in the Yocto Project Application Development and | 
 |                     the Extensible Software Development Kit (eSDK) Manual. | 
 |                     </para></listitem> | 
 |             </itemizedlist> | 
 |         </para> | 
 |     </section> | 
 |  | 
 |     <section id='reference-embedded-distribution'> | 
 |         <title>Reference Embedded Distribution (Poky)</title> | 
 |  | 
 |         <para> | 
 |             "Poky", which is pronounced <emphasis>Pock</emphasis>-ee, is the | 
 |             name of the Yocto Project's reference distribution or Reference OS | 
 |             Kit. | 
 |             Poky contains the | 
 |             <ulink url='&YOCTO_DOCS_REF_URL;#build-system-term'>OpenEmbedded Build System</ulink> | 
 |             (<ulink url='&YOCTO_DOCS_REF_URL;#bitbake-term'>BitBake</ulink> and | 
 |             <ulink url='&YOCTO_DOCS_REF_URL;#oe-core'>OpenEmbedded-Core</ulink>) | 
 |             as well as a set of | 
 |             <ulink url='&YOCTO_DOCS_REF_URL;#metadata'>metadata</ulink> to get | 
 |             you started building your own distro. | 
 |             In other words, Poky is a base specification of the functionality | 
 |             needed for a typical embedded system as well as the components | 
 |             from the Yocto Project that allow you to build a distribution into | 
 |             a usable binary image. | 
 |         </para> | 
 |  | 
 |         <para> | 
 |             Poky is a combined repository of BitBake, OpenEmbedded-Core | 
 |             (which is found in <filename>meta</filename>), | 
 |             <filename>meta-poky</filename>, | 
 |             <filename>meta-yocto-bsp</filename>, and documentation provided | 
 |             all together and known to work well together. | 
 |             You can view these items that make up the Poky repository in the | 
 |             <ulink url='&YOCTO_GIT_URL;/cgit/cgit.cgi/poky/tree/'>Source Repositories</ulink>. | 
 |             <note> | 
 |                 If you are interested in all the contents of the | 
 |                 <filename>poky</filename> Git repository, see the | 
 |                 "<ulink url='&YOCTO_DOCS_REF_URL;#structure-core'>Top-Level Core Components</ulink>" | 
 |                 section in the Yocto Project Reference Manual. | 
 |             </note> | 
 |         </para> | 
 |  | 
 |         <para id='gs-poky-reference-distribution'> | 
 |             The following figure illustrates what generally comprises Poky: | 
 |             <imagedata fileref="figures/poky-reference-distribution.png" format="PNG" align='center' width="8in"/> | 
 |             <itemizedlist> | 
 |                 <listitem><para> | 
 |                     BitBake is a task executor and scheduler that is the heart of | 
 |                     the OpenEmbedded build system. | 
 |                     </para></listitem> | 
 |                 <listitem><para> | 
 |                     <filename>meta-poky</filename>, which is Poky-specific | 
 |                     metadata. | 
 |                     </para></listitem> | 
 |                 <listitem><para> | 
 |                     <filename>meta-yocto-bsp</filename>, which are Yocto | 
 |                     Project-specific Board Support Packages (BSPs). | 
 |                     </para></listitem> | 
 |                 <listitem><para> | 
 |                     OpenEmbedded-Core (OE-Core) metadata, which includes | 
 |                     shared configurations, global variable definitions, | 
 |                     shared classes, packaging, and recipes. | 
 |                     Classes define the encapsulation and inheritance of build | 
 |                     logic. | 
 |                     Recipes are the logical units of software and images | 
 |                     to be built. | 
 |                     </para></listitem> | 
 |                 <listitem><para> | 
 |                     Documentation, which contains the Yocto Project source | 
 |                     files used to make the set of user manuals. | 
 |                     </para></listitem> | 
 |             </itemizedlist> | 
 |             <note> | 
 |                 While Poky is a "complete" distribution specification and is | 
 |                 tested and put through QA, you cannot use it as a product | 
 |                 "out of the box" in its current form. | 
 |             </note> | 
 |         </para> | 
 |  | 
 |         <para> | 
 |             To use the Yocto Project tools, you can use Git to clone (download) | 
 |             the Poky repository then use your local copy of the reference | 
 |             distribution to bootstrap your own distribution. | 
 |             <note> | 
 |                 Poky does not contain binary files. | 
 |                 It is a working example of how to build your own custom Linux distribution | 
 |                 from source. | 
 |             </note> | 
 |         </para> | 
 |  | 
 |         <para> | 
 |             Poky has a regular, well established, six-month release cycle | 
 |             under its own version. | 
 |             Major releases occur at the same time major releases (point | 
 |             releases) occur for the Yocto Project, which are typically in the | 
 |             Spring and Fall. | 
 |             For more information on the Yocto Project release schedule and | 
 |             cadence, see the | 
 |             "<ulink url='&YOCTO_DOCS_REF_URL;#ref-release-process'>Yocto Project Releases and the Stable Release Process</ulink>" | 
 |             chapter in the Yocto Project Reference Manual. | 
 |         </para> | 
 |  | 
 |         <para> | 
 |             Much has been said about Poky being a "default configuration." | 
 |             A default configuration provides a starting image footprint. | 
 |             You can use Poky out of the box to create an image ranging from a | 
 |             shell-accessible minimal image all the way up to a Linux | 
 |             Standard Base-compliant image that uses a GNOME Mobile and | 
 |             Embedded (GMAE) based reference user interface called Sato. | 
 |         </para> | 
 |  | 
 |         <para> | 
 |             One of the most powerful properties of Poky is that every aspect | 
 |             of a build is controlled by the metadata. | 
 |             You can use metadata to augment these base image types by | 
 |             adding metadata | 
 |             <link linkend='the-yocto-project-layer-model'>layers</link> | 
 |             that extend functionality. | 
 |             These layers can provide, for example, an additional software | 
 |             stack for an image type, add a board support package (BSP) for | 
 |             additional hardware, or even create a new image type. | 
 |         </para> | 
 |  | 
 |         <para> | 
 |             Metadata is loosely grouped into configuration files or package | 
 |             recipes. | 
 |             A recipe is a collection of non-executable metadata used by | 
 |             BitBake to set variables or define additional build-time tasks. | 
 |             A recipe contains fields such as the recipe description, the recipe | 
 |             version, the license of the package and the upstream source | 
 |             repository. | 
 |             A recipe might also indicate that the build process uses autotools, | 
 |             make, distutils or any other build process, in which case the basic | 
 |             functionality can be defined by the classes it inherits from | 
 |             the OE-Core layer's class definitions in | 
 |             <filename>./meta/classes</filename>. | 
 |             Within a recipe you can also define additional tasks as well as | 
 |             task prerequisites. | 
 |             Recipe syntax through BitBake also supports both | 
 |             <filename>_prepend</filename> and <filename>_append</filename> | 
 |             operators as a method of extending task functionality. | 
 |             These operators inject code into the beginning or end of a task. | 
 |             For information on these BitBake operators, see the | 
 |             "<ulink url='&YOCTO_DOCS_BB_URL;#appending-and-prepending-override-style-syntax'>Appending and Prepending (Override Style Syntax)</ulink>" | 
 |             section in the BitBake User's Manual. | 
 |         </para> | 
 |     </section> | 
 |  | 
 |     <section id='openembedded-build-system-workflow'> | 
 |         <title>The OpenEmbedded Build System Workflow</title> | 
 |  | 
 |         <para> | 
 |             The | 
 |             <ulink url='&YOCTO_DOCS_REF_URL;#build-system-term'>OpenEmbedded build system</ulink> | 
 |             uses a "workflow" to accomplish image and SDK generation. | 
 |             The following figure overviews that workflow: | 
 |             <imagedata fileref="figures/YP-flow-diagram.png" | 
 |                 format="PNG" align='center' width="8in"/> | 
 |             Following is a brief summary of the "workflow": | 
 |             <orderedlist> | 
 |                 <listitem><para> | 
 |                     Developers specify architecture, policies, patches and | 
 |                     configuration details. | 
 |                     </para></listitem> | 
 |                 <listitem><para> | 
 |                     The build system fetches and downloads the source code | 
 |                     from the specified location. | 
 |                     The build system supports standard methods such as tarballs | 
 |                     or source code repositories systems such as Git. | 
 |                     </para></listitem> | 
 |                 <listitem><para> | 
 |                     Once source code is downloaded, the build system extracts | 
 |                     the sources into a local work area where patches are | 
 |                     applied and common steps for configuring and compiling | 
 |                     the software are run. | 
 |                     </para></listitem> | 
 |                 <listitem><para> | 
 |                     The build system then installs the software into a | 
 |                     temporary staging area where the binary package format you | 
 |                     select (DEB, RPM, or IPK) is used to roll up the software. | 
 |                     </para></listitem> | 
 |                 <listitem><para> | 
 |                     Different QA and sanity checks run throughout entire | 
 |                     build process. | 
 |                     </para></listitem> | 
 |                 <listitem><para> | 
 |                     After the binaries are created, the build system | 
 |                     generates a binary package feed that is used to create | 
 |                     the final root file image. | 
 |                     </para></listitem> | 
 |                 <listitem><para> | 
 |                     The build system generates the file system image and a | 
 |                     customized Extensible SDK (eSDK) for application | 
 |                     development in parallel. | 
 |                     </para></listitem> | 
 |             </orderedlist> | 
 |         </para> | 
 |  | 
 |         <para> | 
 |             For a very detailed look at this workflow, see the | 
 |             "<link linkend='openembedded-build-system-build-concepts'>OpenEmbedded Build System Concepts</link>" | 
 |             section. | 
 |         </para> | 
 |     </section> | 
 |  | 
 |  | 
 |     <section id='some-basic-terms'> | 
 |         <title>Some Basic Terms</title> | 
 |  | 
 |         <para> | 
 |             It helps to understand some basic fundamental terms when | 
 |             learning the Yocto Project. | 
 |             Although a list of terms exists in the | 
 |             "<ulink url='&YOCTO_DOCS_REF_URL;#ref-terms'>Yocto Project Terms</ulink>" | 
 |             section of the Yocto Project Reference Manual, this section | 
 |             provides the definitions of some terms helpful for getting started: | 
 |             <itemizedlist> | 
 |                 <listitem><para> | 
 |                     <emphasis>Configuration Files:</emphasis> | 
 |                     Files that hold global definitions of variables, | 
 |                     user-defined variables, and hardware configuration | 
 |                     information. | 
 |                     These files tell the | 
 |                     <ulink url='&YOCTO_DOCS_REF_URL;#build-system-term'>Open-Embedded build system</ulink> | 
 |                     what to build and what to put into the image to support a | 
 |                     particular platform. | 
 |                     </para></listitem> | 
 |                 <listitem><para> | 
 |                     <emphasis>Extensible Software Development Kit (eSDK):</emphasis> | 
 |                     A custom SDK for application developers. | 
 |                     This eSDK allows developers to incorporate their library | 
 |                     and programming changes back into the image to make | 
 |                     their code available to other application developers. | 
 |                     For information on the eSDK, see the | 
 |                     <ulink url='&YOCTO_DOCS_SDK_URL;'>Yocto Project Application Development and the Extensible Software Development Kit (eSDK)</ulink> | 
 |                     manual. | 
 |                     </para></listitem> | 
 |                 <listitem><para> | 
 |                     <emphasis>Layer:</emphasis> | 
 |                     A collection of related recipes. | 
 |                     Layers allow you to consolidate related metadata to | 
 |                     customize your build. | 
 |                     Layers also isolate information used when building | 
 |                     for multiple architectures. | 
 |                     Layers are hierarchical in their ability to override | 
 |                     previous specifications. | 
 |                     You can include any number of available layers from the | 
 |                     Yocto Project and customize the build by adding your | 
 |                     layers after them. | 
 |                     You can search the Layer Index for layers used within | 
 |                     Yocto Project.</para> | 
 |  | 
 |                     <para>For more detailed information on layers, see the | 
 |                     "<ulink url='&YOCTO_DOCS_DEV_URL;#understanding-and-creating-layers'>Understanding and Creating Layers</ulink>" | 
 |                     section in the Yocto Project Development Tasks Manual. | 
 |                     For a discussion specifically on BSP Layers, see the | 
 |                     "<ulink url='&YOCTO_DOCS_BSP_URL;#bsp-layers'>BSP Layers</ulink>" | 
 |                     section in the Yocto Project Board Support Packages (BSP) | 
 |                     Developer's Guide. | 
 |                     </para></listitem> | 
 |                 <listitem><para> | 
 |                     <emphasis>Metadata:</emphasis> | 
 |                     A key element of the Yocto Project is the Metadata that | 
 |                     is used to construct a Linux distribution and is contained | 
 |                     in the files that the OpenEmbedded build system parses | 
 |                     when building an image. | 
 |                     In general, Metadata includes recipes, configuration | 
 |                     files, and other information that refers to the build | 
 |                     instructions themselves, as well as the data used to | 
 |                     control what things get built and the effects of the | 
 |                     build. | 
 |                     Metadata also includes commands and data used to | 
 |                     indicate what versions of software are used, from | 
 |                     where they are obtained, and changes or additions to the | 
 |                     software itself (patches or auxiliary files) that | 
 |                     are used to fix bugs or customize the software for use | 
 |                     in a particular situation. | 
 |                     OpenEmbedded-Core is an important set of validated | 
 |                     metadata. | 
 |                     </para></listitem> | 
 |                 <listitem><para id='gs-term-openembedded-build-system'> | 
 |                     <emphasis>OpenEmbedded Build System:</emphasis> | 
 |                     The terms "BitBake" and "build system" are sometimes | 
 |                     used for the OpenEmbedded Build System.</para> | 
 |  | 
 |                     <para>BitBake is a task scheduler and execution engine | 
 |                     that parses instructions (i.e. recipes) and configuration | 
 |                     data. | 
 |                     After a parsing phase, BitBake creates a dependency tree | 
 |                     to order the compilation, schedules the compilation of | 
 |                     the included code, and finally executes the building | 
 |                     of the specified custom Linux image (distribution). | 
 |                     BitBake is similar to the <filename>make</filename> | 
 |                     tool.</para> | 
 |  | 
 |                     <para>During a build process, the build system tracks | 
 |                     dependencies and performs a native or cross-compilation | 
 |                     of the package. | 
 |                     As a first step in a cross-build setup, the framework | 
 |                     attempts to create a cross-compiler toolchain | 
 |                     (i.e. Extensible SDK) suited for the target platform. | 
 |                     </para></listitem> | 
 |                 <listitem><para> | 
 |                     <emphasis>OpenEmbedded-Core (OE-Core):</emphasis> | 
 |                     OE-Core is metadata comprised of foundation recipes, | 
 |                     classes, and associated files that are meant to be | 
 |                     common among many different OpenEmbedded-derived systems, | 
 |                     including the Yocto Project. | 
 |                     OE-Core is a curated subset of an original repository | 
 |                     developed by the OpenEmbedded community that has been | 
 |                     pared down into a smaller, core set of continuously | 
 |                     validated recipes. | 
 |                     The result is a tightly controlled and quality-assured | 
 |                     core set of recipes.</para> | 
 |  | 
 |                     <para>You can see the Metadata in the | 
 |                     <filename>meta</filename> directory of the Yocto Project | 
 |                     <ulink url='http://git.yoctoproject.org/cgit/cgit.cgi'>Source Repositories</ulink>. | 
 |                     </para></listitem> | 
 |                 <listitem><para> | 
 |                     <emphasis>Packages:</emphasis> | 
 |                     In the context of the Yocto Project, this term refers to a | 
 |                     recipe's packaged output produced by BitBake (i.e. a | 
 |                     "baked recipe"). | 
 |                     A package is generally the compiled binaries produced from the | 
 |                     recipe's sources. | 
 |                     You "bake" something by running it through BitBake.</para> | 
 |  | 
 |                     <para>It is worth noting that the term "package" can, | 
 |                     in general, have subtle meanings. | 
 |                     For example, the packages referred to in the | 
 |                     "<ulink url='&YOCTO_DOCS_REF_URL;#required-packages-for-the-build-host'>Required Packages for the Build Host</ulink>" | 
 |                     section in the Yocto Project Reference Manual are compiled | 
 |                     binaries that, when installed, add functionality to your | 
 |                     Linux distribution.</para> | 
 |  | 
 |                     <para>Another point worth noting is that historically within | 
 |                     the Yocto Project, recipes were referred to as packages - thus, | 
 |                     the existence of several BitBake variables that are seemingly | 
 |                     mis-named, | 
 |                     (e.g. <ulink url='&YOCTO_DOCS_REF_URL;#var-PR'><filename>PR</filename></ulink>, | 
 |                     <ulink url='&YOCTO_DOCS_REF_URL;#var-PV'><filename>PV</filename></ulink>, | 
 |                     and | 
 |                     <ulink url='&YOCTO_DOCS_REF_URL;#var-PE'><filename>PE</filename></ulink>). | 
 |                     </para></listitem> | 
 |                 <listitem><para> | 
 |                     <emphasis>Poky:</emphasis> | 
 |                     Poky is a reference embedded distribution and a reference | 
 |                     test configuration. | 
 |                     Poky provides the following: | 
 |                     <itemizedlist> | 
 |                         <listitem><para> | 
 |                             A base-level functional distro used to illustrate | 
 |                             how to customize a distribution. | 
 |                             </para></listitem> | 
 |                         <listitem><para> | 
 |                             A means by which to test the Yocto Project | 
 |                             components (i.e. Poky is used to validate | 
 |                             the Yocto Project). | 
 |                             </para></listitem> | 
 |                         <listitem><para> | 
 |                             A vehicle through which you can download | 
 |                             the Yocto Project. | 
 |                             </para></listitem> | 
 |                     </itemizedlist> | 
 |                     Poky is not a product level distro. | 
 |                     Rather, it is a good starting point for customization. | 
 |                     <note> | 
 |                         Poky is an integration layer on top of OE-Core. | 
 |                     </note> | 
 |                     </para></listitem> | 
 |                 <listitem><para> | 
 |                     <emphasis>Recipe:</emphasis> | 
 |                     The most common form of metadata. | 
 |                     A recipe contains a list of settings and tasks | 
 |                     (i.e. instructions) for building packages that are then | 
 |                     used to build the binary image. | 
 |                     A recipe describes where you get source code and which | 
 |                     patches to apply. | 
 |                     Recipes describe dependencies for libraries or for other | 
 |                     recipes as well as configuration and compilation options. | 
 |                     Related recipes are consolidated into a layer. | 
 |                     </para></listitem> | 
 |             </itemizedlist> | 
 |         </para> | 
 |     </section> | 
 | </chapter> | 
 | <!-- | 
 | vim: expandtab tw=80 ts=4 | 
 | --> |