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

******************
Kernel Maintenance
******************

Tree Construction
=================

This section describes construction of the Yocto Project kernel source
repositories as accomplished by the Yocto Project team to create Yocto
Linux kernel repositories. These kernel repositories are found under the
heading "Yocto Linux Kernel" at :yocto_git:`/` and
are shipped as part of a Yocto Project release. The team creates these
repositories by compiling and executing the set of feature descriptions
for every BSP and feature in the product. Those feature descriptions
list all necessary patches, configurations, branches, tags, and feature
divisions found in a Yocto Linux kernel. Thus, the Yocto Project Linux
kernel repository (or tree) and accompanying Metadata in the
``yocto-kernel-cache`` are built.

The existence of these repositories allow you to access and clone a
particular Yocto Project Linux kernel repository and use it to build
images based on their configurations and features.

You can find the files used to describe all the valid features and BSPs
in the Yocto Project Linux kernel in any clone of the Yocto Project
Linux kernel source repository and ``yocto-kernel-cache`` Git trees. For
example, the following commands clone the Yocto Project baseline Linux
kernel that branches off ``linux.org`` version 4.12 and the
``yocto-kernel-cache``, which contains stores of kernel Metadata:
::

   $ git clone git://git.yoctoproject.org/linux-yocto-4.12
   $ git clone git://git.yoctoproject.org/linux-kernel-cache

For more information on
how to set up a local Git repository of the Yocto Project Linux kernel
files, see the
":ref:`kernel-dev/kernel-dev-common:preparing the build host to work on the kernel`"
section.

Once you have cloned the kernel Git repository and the cache of Metadata
on your local machine, you can discover the branches that are available
in the repository using the following Git command:
::

   $ git branch -a

Checking out a branch allows you to work with a particular Yocto Linux
kernel. For example, the following commands check out the
"standard/beagleboard" branch of the Yocto Linux kernel repository and
the "yocto-4.12" branch of the ``yocto-kernel-cache`` repository:
::

   $ cd ~/linux-yocto-4.12
   $ git checkout -b my-kernel-4.12 remotes/origin/standard/beagleboard
   $ cd ~/linux-kernel-cache
   $ git checkout -b my-4.12-metadata remotes/origin/yocto-4.12

.. note::

   Branches in the ``yocto-kernel-cache`` repository correspond to Yocto Linux
   kernel versions (e.g. "yocto-4.12", "yocto-4.10", "yocto-4.9", and so forth).

Once you have checked out and switched to appropriate branches, you can
see a snapshot of all the kernel source files used to used to build that
particular Yocto Linux kernel for a particular board.

To see the features and configurations for a particular Yocto Linux
kernel, you need to examine the ``yocto-kernel-cache`` Git repository.
As mentioned, branches in the ``yocto-kernel-cache`` repository
correspond to Yocto Linux kernel versions (e.g. ``yocto-4.12``).
Branches contain descriptions in the form of ``.scc`` and ``.cfg``
files.

You should realize, however, that browsing your local
``yocto-kernel-cache`` repository for feature descriptions and patches
is not an effective way to determine what is in a particular kernel
branch. Instead, you should use Git directly to discover the changes in
a branch. Using Git is an efficient and flexible way to inspect changes
to the kernel.

.. note::

   Ground up reconstruction of the complete kernel tree is an action
   only taken by the Yocto Project team during an active development
   cycle. When you create a clone of the kernel Git repository, you are
   simply making it efficiently available for building and development.

The following steps describe what happens when the Yocto Project Team
constructs the Yocto Project kernel source Git repository (or tree)
found at :yocto_git:`/` given the introduction of a new
top-level kernel feature or BSP. The following actions effectively
provide the Metadata and create the tree that includes the new feature,
patch, or BSP:

1. *Pass Feature to the OpenEmbedded Build System:* A top-level kernel
   feature is passed to the kernel build subsystem. Normally, this
   feature is a BSP for a particular kernel type.

2. *Locate Feature:* The file that describes the top-level feature is
   located by searching these system directories:

   -  The in-tree kernel-cache directories, which are located in the
      :yocto_git:`yocto-kernel-cache </cgit/cgit.cgi/yocto-kernel-cache/tree/bsp>`
      repository organized under the "Yocto Linux Kernel" heading in the
      :yocto_git:`Yocto Project Source Repositories <>`.

   -  Areas pointed to by ``SRC_URI`` statements found in kernel recipes.

   For a typical build, the target of the search is a feature
   description in an ``.scc`` file whose name follows this format (e.g.
   ``beaglebone-standard.scc`` and ``beaglebone-preempt-rt.scc``):
   ::

      bsp_root_name-kernel_type.scc

3. *Expand Feature:* Once located, the feature description is either
   expanded into a simple script of actions, or into an existing
   equivalent script that is already part of the shipped kernel.

4. *Append Extra Features:* Extra features are appended to the top-level
   feature description. These features can come from the
   :term:`KERNEL_FEATURES`
   variable in recipes.

5. *Locate, Expand, and Append Each Feature:* Each extra feature is
   located, expanded and appended to the script as described in step
   three.

6. *Execute the Script:* The script is executed to produce files
   ``.scc`` and ``.cfg`` files in appropriate directories of the
   ``yocto-kernel-cache`` repository. These files are descriptions of
   all the branches, tags, patches and configurations that need to be
   applied to the base Git repository to completely create the source
   (build) branch for the new BSP or feature.

7. *Clone Base Repository:* The base repository is cloned, and the
   actions listed in the ``yocto-kernel-cache`` directories are applied
   to the tree.

8. *Perform Cleanup:* The Git repositories are left with the desired
   branches checked out and any required branching, patching and tagging
   has been performed.

The kernel tree and cache are ready for developer consumption to be
locally cloned, configured, and built into a Yocto Project kernel
specific to some target hardware.

.. note::

   -  The generated ``yocto-kernel-cache`` repository adds to the kernel
      as shipped with the Yocto Project release. Any add-ons and
      configuration data are applied to the end of an existing branch.
      The full repository generation that is found in the official Yocto
      Project kernel repositories at :yocto_git:`/` is the
      combination of all supported boards and configurations.

   -  The technique the Yocto Project team uses is flexible and allows
      for seamless blending of an immutable history with additional
      patches specific to a deployment. Any additions to the kernel
      become an integrated part of the branches.

   -  The full kernel tree that you see on :yocto_git:`/` is
      generated through repeating the above steps for all valid BSPs.
      The end result is a branched, clean history tree that makes up the
      kernel for a given release. You can see the script (``kgit-scc``)
      responsible for this in the
      :yocto_git:`yocto-kernel-tools </cgit.cgi/yocto-kernel-tools/tree/tools>`
      repository.

   -  The steps used to construct the full kernel tree are the same
      steps that BitBake uses when it builds a kernel image.

Build Strategy
==============

Once you have cloned a Yocto Linux kernel repository and the cache
repository (``yocto-kernel-cache``) onto your development system, you
can consider the compilation phase of kernel development, which is
building a kernel image. Some prerequisites exist that are validated by
the build process before compilation starts:

-  The :term:`SRC_URI` points to the
   kernel Git repository.

-  A BSP build branch with Metadata exists in the ``yocto-kernel-cache``
   repository. The branch is based on the Yocto Linux kernel version and
   has configurations and features grouped under the
   ``yocto-kernel-cache/bsp`` directory. For example, features and
   configurations for the BeagleBone Board assuming a
   ``linux-yocto_4.12`` kernel reside in the following area of the
   ``yocto-kernel-cache`` repository: yocto-kernel-cache/bsp/beaglebone

   .. note::

      In the previous example, the "yocto-4.12" branch is checked out in
      the ``yocto-kernel-cache`` repository.

The OpenEmbedded build system makes sure these conditions exist before
attempting compilation. Other means, however, do exist, such as
bootstrapping a BSP.

Before building a kernel, the build process verifies the tree and
configures the kernel by processing all of the configuration "fragments"
specified by feature descriptions in the ``.scc`` files. As the features
are compiled, associated kernel configuration fragments are noted and
recorded in the series of directories in their compilation order. The
fragments are migrated, pre-processed and passed to the Linux Kernel
Configuration subsystem (``lkc``) as raw input in the form of a
``.config`` file. The ``lkc`` uses its own internal dependency
constraints to do the final processing of that information and generates
the final ``.config`` file that is used during compilation.

Using the board's architecture and other relevant values from the
board's template, kernel compilation is started and a kernel image is
produced.

The other thing that you notice once you configure a kernel is that the
build process generates a build tree that is separate from your kernel's
local Git source repository tree. This build tree has a name that uses
the following form, where ``${MACHINE}`` is the metadata name of the
machine (BSP) and "kernel_type" is one of the Yocto Project supported
kernel types (e.g. "standard"):
::

   linux-${MACHINE}-kernel_type-build

The existing support in the ``kernel.org`` tree achieves this default
functionality.

This behavior means that all the generated files for a particular
machine or BSP are now in the build tree directory. The files include
the final ``.config`` file, all the ``.o`` files, the ``.a`` files, and
so forth. Since each machine or BSP has its own separate
:term:`Build Directory` in its own separate
branch of the Git repository, you can easily switch between different
builds.
