.. SPDX-License-Identifier: CC-BY-SA-2.0-UK

*******************
Yocto Project Terms
*******************

Here is a list of terms and definitions users new to the Yocto Project
development environment might find helpful. While some of these terms are
universal, the list includes them just in case:

.. glossary::

   :term:`Append Files`
      Files that append build information to a recipe file.  Append files are
      known as BitBake append files and ``.bbappend`` files. The OpenEmbedded
      build system expects every append file to have a corresponding recipe
      (``.bb``) file. Furthermore, the append file and corresponding recipe file
      must use the same root filename.  The filenames can differ only in the
      file type suffix used (e.g. ``formfactor_0.0.bb`` and
      ``formfactor_0.0.bbappend``).

      Information in append files extends or overrides the information in the
      similarly-named recipe file. For an example of an append file in use, see
      the    ":ref:`dev-manual/layers:appending other layers metadata with your layer`"
      section in the Yocto Project Development Tasks Manual.

      When you name an append file, you can use the "``%``" wildcard character
      to allow for matching recipe names. For example, suppose you have an
      append file named as follows::

         busybox_1.21.%.bbappend

      That append file
      would match any ``busybox_1.21.x.bb`` version of the recipe. So,
      the append file would match any of the following recipe names:

      .. code-block:: shell

         busybox_1.21.1.bb
         busybox_1.21.2.bb
         busybox_1.21.3.bb
         busybox_1.21.10.bb
         busybox_1.21.25.bb

      .. note::

         The use of the "%" character is limited in that it only works
         directly in front of the .bbappend portion of the append file's
         name. You cannot use the wildcard character in any other location of
         the name.

   :term:`BitBake`
      The task executor and scheduler used by the OpenEmbedded build system to
      build images. For more information on BitBake, see the :doc:`BitBake User
      Manual <bitbake:index>`.

   :term:`Board Support Package (BSP)`
      A group of drivers, definitions, and other components that provide support
      for a specific hardware configuration. For more information on BSPs, see
      the :doc:`/bsp-guide/index`.

   :term:`Build Directory`
      This term refers to the area used by the OpenEmbedded build system for
      builds. The area is created when you ``source`` the setup environment
      script that is found in the Source Directory
      (i.e. :ref:`ref-manual/structure:\`\`oe-init-build-env\`\``). The
      :term:`TOPDIR` variable points to the :term:`Build Directory`.

      You have a lot of flexibility when creating the :term:`Build Directory`.
      Here are some examples that show how to create the directory.  The
      examples assume your :term:`Source Directory` is named ``poky``:

         -  Create the :term:`Build Directory` inside your Source Directory and let
            the name of the :term:`Build Directory` default to ``build``:

            .. code-block:: shell

               $ cd poky
               $ source oe-init-build-env

         -  Create the :term:`Build Directory` inside your home directory and
            specifically name it ``test-builds``:

            .. code-block:: shell

               $ source poky/oe-init-build-env test-builds

         -  Provide a directory path and specifically name the
            :term:`Build Directory`. Any intermediate folders in the pathname
            must exist.  This next example creates a :term:`Build Directory`
            named ``YP-&DISTRO;`` within the existing directory ``mybuilds``:

            .. code-block:: shell

               $ source poky/oe-init-build-env mybuilds/YP-&DISTRO;

      .. note::

         By default, the :term:`Build Directory` contains :term:`TMPDIR`, which is a
         temporary directory the build system uses for its work. :term:`TMPDIR` cannot
         be under NFS. Thus, by default, the :term:`Build Directory` cannot be under
         NFS. However, if you need the :term:`Build Directory` to be under NFS, you can
         set this up by setting :term:`TMPDIR` in your ``local.conf`` file to use a local
         drive. Doing so effectively separates :term:`TMPDIR` from :term:`TOPDIR`, which is the
         :term:`Build Directory`.

   :term:`Build Host`
      The system used to build images in a Yocto Project Development
      environment. The build system is sometimes referred to as the development
      host.

   :term:`buildtools`
      Build tools in binary form, providing required versions of development
      tools (such as Git, GCC, Python and make), to run the OpenEmbedded build
      system on a development host without such minimum versions.

      See the ":ref:`system-requirements-buildtools`" paragraph in the
      Reference Manual for details about downloading or building an archive
      of such tools.

   :term:`buildtools-extended`
      A set of :term:`buildtools` binaries extended with additional development
      tools, such as a required version of the GCC compiler to run the
      OpenEmbedded build system.

      See the ":ref:`system-requirements-buildtools`" paragraph in the
      Reference Manual for details about downloading or building an archive
      of such tools.

   :term:`buildtools-make`
      A variant of :term:`buildtools`, just providing the required
      version of ``make`` to run the OpenEmbedded build system.

   :term:`Classes`
      Files that provide for logic encapsulation and inheritance so that
      commonly used patterns can be defined once and then easily used in
      multiple recipes. For reference information on the Yocto Project classes,
      see the ":ref:`ref-manual/classes:Classes`" chapter. Class files end with the
      ``.bbclass`` filename extension.

   :term:`Configuration File`
      Files that hold global definitions of variables, user-defined variables,
      and hardware configuration information. These files tell the OpenEmbedded
      build system what to build and what to put into the image to support a
      particular platform.

      Configuration files end with a ``.conf`` filename extension. The
      :file:`conf/local.conf` configuration file in the :term:`Build Directory`
      contains user-defined variables that affect every build. The
      :file:`meta-poky/conf/distro/poky.conf` configuration file defines Yocto
      "distro" configuration variables used only when building with this
      policy. Machine configuration files, which are located throughout the
      :term:`Source Directory`, define variables for specific hardware and are
      only used when building for that target (e.g. the
      :file:`machine/beaglebone.conf` configuration file defines variables for
      the Texas Instruments ARM Cortex-A8 development board).

   :term:`Container Layer`
      A flexible definition that typically refers to a single Git checkout
      which contains multiple (and typically related) sub-layers which can
      be included independently in your project's ``bblayers.conf`` file.

      In some cases, such as with OpenEmbedded's :oe_git:`meta-openembedded </meta-openembedded>`
      layer, the top level ``meta-openembedded/`` directory is not itself an actual layer,
      so you would never explicitly include it in a ``bblayers.conf`` file;
      rather, you would include any number of its layer subdirectories, such as
      :oe_git:`meta-oe </meta-openembedded/tree/meta-oe>`, :oe_git:`meta-python
      </meta-openembedded/tree/meta-python>` and so on.

      On the other hand, some container layers (such as
      :yocto_git:`meta-security </meta-security>`)
      have a top-level directory that is itself an actual layer, as well as
      a variety of sub-layers, both of which could be included in your
      ``bblayers.conf`` file.

      In either case, the phrase "container layer" is simply used to describe
      a directory structure which contains multiple valid OpenEmbedded layers.

   :term:`Cross-Development Toolchain`
      In general, a cross-development toolchain is a collection of software
      development tools and utilities that run on one architecture and allow you
      to develop software for a different, or targeted, architecture. These
      toolchains contain cross-compilers, linkers, and debuggers that are
      specific to the target architecture.

      The Yocto Project supports two different cross-development toolchains:

      - A toolchain only used by and within BitBake when building an image for a
        target architecture.

      - A relocatable toolchain used outside of BitBake by developers when
        developing applications that will run on a targeted device.

      Creation of these toolchains is simple and automated. For information on
      toolchain concepts as they apply to the Yocto Project, see the
      ":ref:`overview-manual/concepts:Cross-Development
      Toolchain Generation`" section in the Yocto Project Overview and Concepts
      Manual. You can also find more information on using the relocatable
      toolchain in the :doc:`/sdk-manual/index` manual.

   :term:`Extensible Software Development Kit (eSDK)`
      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 :doc:`/sdk-manual/index` manual.

   :term:`Image`
      An image is an artifact of the BitBake build process given a collection of
      recipes and related Metadata. Images are the binary output that run on
      specific hardware or QEMU and are used for specific use-cases. For a list
      of the supported image types that the Yocto Project provides, see the
      ":ref:`ref-manual/images:Images`" chapter.

   :term:`Initramfs`
      An Initial RAM Filesystem (:term:`Initramfs`) is an optionally compressed
      :wikipedia:`cpio <Cpio>` archive which is extracted
      by the Linux kernel into RAM in a special :wikipedia:`tmpfs <Tmpfs>`
      instance, used as the initial root filesystem.

      This is a replacement for the legacy init RAM disk ("initrd")
      technique, booting on an emulated block device in RAM, but being less
      efficient because of the overhead of going through a filesystem and
      having to duplicate accessed file contents in the file cache in RAM,
      as for any block device.

      .. note::

         As far as bootloaders are concerned, :term:`Initramfs` and "initrd"
         images are still copied to RAM in the same way. That's why most
	 most bootloaders refer to :term:`Initramfs` images as "initrd"
	 or "init RAM disk".

      This kind of mechanism is typically used for two reasons:

      -  For booting the same kernel binary on multiple systems requiring
         different device drivers. The :term:`Initramfs` image is then customized
	 for each type of system, to include the specific kernel modules
         necessary to access the final root filesystem. This technique
	 is used on all GNU / Linux distributions for desktops and servers.

      -  For booting faster. As the root filesystem is extracted into RAM,
         accessing the first user-space applications is very fast, compared
         to having to initialize a block device, to access multiple blocks
         from it, and to go through a filesystem having its own overhead.
         For example, this allows to display a splashscreen very early,
	 and to later take care of mounting the final root filesystem and
         loading less time-critical kernel drivers.

      This cpio archive can either be loaded to RAM by the bootloader,
      or be included in the kernel binary.

      For information on creating and using an :term:`Initramfs`, see the
      ":ref:`dev-manual/building:building an initial ram filesystem (Initramfs) image`"
      section in the Yocto Project Development Tasks Manual.

   :term:`Layer`
      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.

      For introductory information on layers, see the
      ":ref:`overview-manual/yp-intro:The Yocto Project Layer
      Model`" section in the Yocto Project Overview and Concepts Manual. For
      more detailed information on layers, see the
      ":ref:`dev-manual/layers:Understanding and Creating
      Layers`" section in the Yocto Project Development Tasks Manual. For a
      discussion specifically on BSP Layers, see the ":ref:`bsp-guide/bsp:BSP
      Layers`" section in the Yocto Project Board Support Packages (BSP)
      Developer's Guide.

   :term:`LTS`
      This term means "Long Term Support", and in the context of the Yocto
      Project, it corresponds to selected stable releases for which bug and
      security fixes are provided for at least four years. See
      the :ref:`ref-long-term-support-releases` section for details.

   :term:`Metadata`
      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 :term:`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.

      In the context of the kernel ("kernel Metadata"), the term refers to
      the kernel config fragments and features contained in the
      :yocto_git:`yocto-kernel-cache </yocto-kernel-cache>`
      Git repository.

   :term:`Mixin`
      A :term:`Mixin` layer is a layer which can be created by the community to
      add a specific feature or support a new version of some package for an
      :term:`LTS` release. See the :ref:`ref-long-term-support-releases`
      section for details.

   :term:`OpenEmbedded-Core (OE-Core)`
      OE-Core is metadata comprised of
      foundational 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 an quality-assured
      core set of recipes.

      You can see the Metadata in the ``meta`` directory of the Yocto
      Project :yocto_git:`Source Repositories </poky>`.

   :term:`OpenEmbedded Build System`
      The build system specific to the Yocto
      Project. The OpenEmbedded build system is based on another project
      known as "Poky", which uses :term:`BitBake` as the task
      executor. Throughout the Yocto Project documentation set, the
      OpenEmbedded build system is sometimes referred to simply as "the
      build system". If other build systems, such as a host or target build
      system are referenced, the documentation clearly states the
      difference.

      .. note::

         For some historical information about Poky, see the :term:`Poky` term.

   :term:`Package`
      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.

      It is worth noting that the term "package" can, in general, have
      subtle meanings. For example, the packages referred to in the
      ":ref:`ref-manual/system-requirements:required packages for the build host`"
      section are compiled binaries that, when installed, add functionality to
      your Linux distribution.

      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.
      :term:`PR`, :term:`PV`, and
      :term:`PE`).

   :term:`Package Groups`
      Arbitrary groups of software Recipes. You use
      package groups to hold recipes that, when built, usually accomplish a
      single task. For example, a package group could contain the recipes
      for a company's proprietary or value-add software. Or, the package
      group could contain the recipes that enable graphics. A package group
      is really just another recipe. Because package group files are
      recipes, they end with the ``.bb`` filename extension.

   :term:`Poky`
      Poky, which is pronounced *Pock*-ee, is a reference embedded
      distribution and a reference test configuration. Poky provides the
      following:

      -  A base-level functional distro used to illustrate how to customize
         a distribution.

      -  A means by which to test the Yocto Project components (i.e. Poky
         is used to validate the Yocto Project).

      -  A vehicle through which you can download the Yocto Project.

      Poky is not a product level distro. Rather, it is a good starting
      point for customization.

      .. note::

         Poky began as an open-source project initially developed by
         OpenedHand. OpenedHand developed Poky from the existing
         OpenEmbedded build system to create a commercially supportable
         build system for embedded Linux. After Intel Corporation acquired
         OpenedHand, the poky project became the basis for the Yocto
         Project's build system.

   :term:`Recipe`
      A set of instructions for building packages. A recipe
      describes where you get source code, which patches to apply, how to
      configure the source, how to compile it and so on. Recipes also
      describe dependencies for libraries or for other recipes. Recipes
      represent the logical unit of execution, the software to build, the
      images to build, and use the ``.bb`` file extension.

   :term:`Reference Kit`
      A working example of a system, which includes a
      :term:`BSP<Board Support Package (BSP)>` as well as a
      :term:`build host<Build Host>` and other components, that can
      work on specific hardware.

   :term:`SBOM`
      This term means *Software Bill of Materials*. When you distribute
      software, it offers a description of all the components you used,
      their corresponding licenses, their dependencies, the changes that were
      applied and the known vulnerabilities that were fixed.

      This can be used by the recipients of the software to assess
      their exposure to license compliance and security vulnerability issues.

      See the :wikipedia:`Software Supply Chain <Software_supply_chain>`
      article on Wikipedia for more details.

      The OpenEmbedded Build System can generate such documentation for your
      project, in :term:`SPDX` format, based on all the metadata it used to
      build the software images. See the ":ref:`dev-manual/sbom:creating
      a software bill of materials`" section of the Development Tasks manual.

   :term:`Source Directory`
     This term refers to the directory structure
     created as a result of creating a local copy of the ``poky`` Git
     repository ``git://git.yoctoproject.org/poky`` or expanding a
     released ``poky`` tarball.

     .. note::

        Creating a local copy of the
        poky
        Git repository is the recommended method for setting up your
        Source Directory.

     Sometimes you might hear the term "poky directory" used to refer to
     this directory structure.

     .. note::

        The OpenEmbedded build system does not support file or directory
        names that contain spaces. Be sure that the Source Directory you
        use does not contain these types of names.

     The Source Directory contains BitBake, Documentation, Metadata and
     other files that all support the Yocto Project. Consequently, you
     must have the Source Directory in place on your development system in
     order to do any development using the Yocto Project.

     When you create a local copy of the Git repository, you can name the
     repository anything you like. Throughout much of the documentation,
     "poky" is used as the name of the top-level folder of the local copy
     of the poky Git repository. So, for example, cloning the ``poky`` Git
     repository results in a local Git repository whose top-level folder
     is also named "poky".

     While it is not recommended that you use tarball extraction to set up
     the Source Directory, if you do, the top-level directory name of the
     Source Directory is derived from the Yocto Project release tarball.
     For example, downloading and unpacking poky tarballs from
     :yocto_dl:`/releases/yocto/&DISTRO_REL_TAG;/`
     results in a Source Directory whose root folder is named poky.


     It is important to understand the differences between the Source
     Directory created by unpacking a released tarball as compared to
     cloning ``git://git.yoctoproject.org/poky``. When you unpack a
     tarball, you have an exact copy of the files based on the time of
     release --- a fixed release point. Any changes you make to your local
     files in the Source Directory are on top of the release and will
     remain local only. On the other hand, when you clone the ``poky`` Git
     repository, you have an active development repository with access to
     the upstream repository's branches and tags. In this case, any local
     changes you make to the local Source Directory can be later applied
     to active development branches of the upstream ``poky`` Git
     repository.

     For more information on concepts related to Git repositories,
     branches, and tags, see the
     ":ref:`overview-manual/development-environment:repositories, tags, and branches`"
     section in the Yocto Project Overview and Concepts Manual.

   :term:`SPDX`
      This term means *Software Package Data Exchange*, and is used as an open
      standard for providing a *Software Bill of Materials* (:term:`SBOM`).
      This standard is developed through a `Linux Foundation project
      <https://spdx.dev/>`__ and is used by the OpenEmbedded Build System to
      provide an :term:`SBOM` associated to each software image.

      For details, see Wikipedia's :wikipedia:`SPDX page <Software_Package_Data_Exchange>`
      and the ":ref:`dev-manual/sbom:creating a software bill of materials`"
      section of the Development Tasks manual.

   :term:`Sysroot`
      When cross-compiling, the target file system may be differently laid
      out and contain different things compared to the host system. The concept
      of a *sysroot* is directory which looks like the target filesystem and
      can be used to cross-compile against.

      In the context of cross-compiling toolchains, a *sysroot*
      typically contains C library and kernel headers, plus the
      compiled binaries for the C library. A *multilib toolchain*
      can contain multiple variants of the C library binaries,
      each compiled for a target instruction set (such as ``armv5``,
      ``armv7`` and ``armv8``), and possibly optimized for a specific CPU core.

      In the more specific context of the OpenEmbedded build System and
      of the Yocto Project, each recipe has two sysroots:

      -  A *target sysroot* contains all the **target** libraries and headers
         needed to build the recipe.

      -  A *native sysroot* contains all the **host** files and executables
         needed to build the recipe.

      See the :term:`SYSROOT_* <SYSROOT_DESTDIR>` variables controlling
      how sysroots are created and stored.

   :term:`Task`
      A per-recipe unit of execution for BitBake (e.g.
      :ref:`ref-tasks-compile`,
      :ref:`ref-tasks-fetch`,
      :ref:`ref-tasks-patch`, and so forth).
      One of the major benefits of the build system is that, since each
      recipe will typically spawn the execution of numerous tasks,
      it is entirely possible that many tasks can execute in parallel,
      either tasks from separate recipes or independent tasks within
      the same recipe, potentially up to the parallelism of your
      build system.

   :term:`Toaster`
      A web interface to the Yocto Project's :term:`OpenEmbedded Build System`.
      The interface enables you to
      configure and run your builds. Information about builds is collected
      and stored in a database. For information on Toaster, see the
      :doc:`/toaster-manual/index`.

   :term:`Upstream`
      A reference to source code or repositories that are not
      local to the development system but located in a remote area that is
      controlled by the maintainer of the source code. For example, in
      order for a developer to work on a particular piece of code, they
      need to first get a copy of it from an "upstream" source.
