diff options
author | Dave Cobbley <david.j.cobbley@linux.intel.com> | 2018-08-14 20:05:37 +0300 |
---|---|---|
committer | Brad Bishop <bradleyb@fuzziesquirrel.com> | 2018-08-23 04:26:31 +0300 |
commit | eb8dc40360f0cfef56fb6947cc817a547d6d9bc6 (patch) | |
tree | de291a73dc37168da6370e2cf16c347d1eba9df8 /poky/documentation/kernel-dev/kernel-dev-common.xml | |
parent | 9c3cf826d853102535ead04cebc2d6023eff3032 (diff) | |
download | openbmc-eb8dc40360f0cfef56fb6947cc817a547d6d9bc6.tar.xz |
[Subtree] Removing import-layers directory
As part of the move to subtrees, need to bring all the import layers
content to the top level.
Change-Id: I4a163d10898cbc6e11c27f776f60e1a470049d8f
Signed-off-by: Dave Cobbley <david.j.cobbley@linux.intel.com>
Signed-off-by: Brad Bishop <bradleyb@fuzziesquirrel.com>
Diffstat (limited to 'poky/documentation/kernel-dev/kernel-dev-common.xml')
-rw-r--r-- | poky/documentation/kernel-dev/kernel-dev-common.xml | 2706 |
1 files changed, 2706 insertions, 0 deletions
diff --git a/poky/documentation/kernel-dev/kernel-dev-common.xml b/poky/documentation/kernel-dev/kernel-dev-common.xml new file mode 100644 index 000000000..299bac407 --- /dev/null +++ b/poky/documentation/kernel-dev/kernel-dev-common.xml @@ -0,0 +1,2706 @@ +<!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='kernel-dev-common'> +<title>Common Tasks</title> + + <para> + This chapter presents several common tasks you perform when you + work with the Yocto Project Linux kernel. + These tasks include preparing your host development system for + kernel development, preparing a layer, modifying an existing recipe, + patching the kernel, configuring the kernel, iterative development, + working with your own sources, and incorporating out-of-tree modules. + <note> + The examples presented in this chapter work with the Yocto Project + 2.4 Release and forward. + </note> + </para> + + <section id='preparing-the-build-host-to-work-on-the-kernel'> + <title>Preparing the Build Host to Work on the Kernel</title> + + <para> + Before you can do any kernel development, you need to be + sure your build host is set up to use the Yocto Project. + For information on how to get set up, see the + "<ulink url='&YOCTO_DOCS_DEV_URL;#setting-up-the-development-host-to-use-the-yocto-project'>Preparing the Build Host</ulink>" + section in the Yocto Project Development Tasks Manual. + Part of preparing the system is creating a local Git + repository of the + <ulink url='&YOCTO_DOCS_REF_URL;#source-directory'>Source Directory</ulink> + (<filename>poky</filename>) on your system. + Follow the steps in the + "<ulink url='&YOCTO_DOCS_DEV_URL;#cloning-the-poky-repository'>Cloning the <filename>poky</filename> Repository</ulink>" + section in the Yocto Project Development Tasks Manual to set up your + Source Directory. + <note> + Be sure you check out the appropriate development branch or + you create your local branch by checking out a specific tag + to get the desired version of Yocto Project. + See the + "<ulink url='&YOCTO_DOCS_DEV_URL;#checking-out-by-branch-in-poky'>Checking Out by Branch in Poky</ulink>" + and + "<ulink url='&YOCTO_DOCS_DEV_URL;#checkout-out-by-tag-in-poky'>Checking Out by Tag in Poky</ulink>" + sections in the Yocto Project Development Tasks Manual for more + information. + </note> + </para> + + <para> + Kernel development is best accomplished using + <ulink url='&YOCTO_DOCS_SDK_URL;#using-devtool-in-your-sdk-workflow'><filename>devtool</filename></ulink> + and not through traditional kernel workflow methods. + The remainder of this section provides information for both + scenarios. + </para> + + <section id='getting-ready-to-develop-using-devtool'> + <title>Getting Ready to Develop Using <filename>devtool</filename></title> + + <para> + Follow these steps to prepare to update the kernel image using + <filename>devtool</filename>. + Completing this procedure leaves you with a clean kernel image + and ready to make modifications as described in the + "<link linkend='using-devtool-to-patch-the-kernel'>Using <filename>devtool</filename> to Patch the Kernel</link>" + section: + <orderedlist> + <listitem><para> + <emphasis>Initialize the BitBake Environment:</emphasis> + Before building an extensible SDK, you need to + initialize the BitBake build environment by sourcing the + build environment script + (i.e. <ulink url='&YOCTO_DOCS_REF_URL;#structure-core-script'><filename>oe-init-build-env</filename></ulink>): + <literallayout class='monospaced'> + $ cd ~/poky + $ source oe-init-build-env + </literallayout> + <note> + The previous commands assume the + <ulink url='&YOCTO_DOCS_OM_URL;#source-repositories'>Source Repositories</ulink> + (i.e. <filename>poky</filename>) have been cloned + using Git and the local repository is named + "poky". + </note> + </para></listitem> + <listitem><para> + <emphasis>Prepare Your <filename>local.conf</filename> File:</emphasis> + By default, the + <ulink url='&YOCTO_DOCS_REF_URL;#var-MACHINE'><filename>MACHINE</filename></ulink> + variable is set to "qemux86", which is fine if you are + building for the QEMU emulator in 32-bit mode. + However, if you are not, you need to set the + <filename>MACHINE</filename> variable appropriately in + your <filename>conf/local.conf</filename> file found in + the + <ulink url='&YOCTO_DOCS_REF_URL;#build-directory'>Build Directory</ulink> + (i.e. <filename>~/poky/build</filename> in this + example).</para> + + <para>Also, since you are preparing to work on the + kernel image, you need to set the + <ulink url='&YOCTO_DOCS_REF_URL;#var-MACHINE_ESSENTIAL_EXTRA_RRECOMMENDS'><filename>MACHINE_ESSENTIAL_EXTRA_RRECOMMENDS</filename></ulink> + variable to include kernel modules.</para> + + <para>This example uses the default "qemux86" for the + <filename>MACHINE</filename> variable but needs to + add the "kernel-modules": + <literallayout class='monospaced'> + MACHINE_ESSENTIAL_EXTRA_RRECOMMENDS += "kernel-modules" + </literallayout> + </para></listitem> + <listitem><para> + <emphasis>Create a Layer for Patches:</emphasis> + You need to create a layer to hold patches created + for the kernel image. + You can use the + <filename>bitbake-layers create-layer</filename> + command as follows: + <literallayout class='monospaced'> + $ cd ~/poky/build + $ bitbake-layers create-layer ../../meta-mylayer + NOTE: Starting bitbake server... + Add your new layer with 'bitbake-layers add-layer ../../meta-mylayer' + $ + </literallayout> + <note> + For background information on working with + common and BSP 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 and the + "<ulink url='&YOCTO_DOCS_BSP_URL;#bsp-layers'>BSP Layers</ulink>" + section in the Yocto Project Board Support (BSP) + Developer's Guide, respectively. + For information on how to use the + <filename>bitbake-layers create-layer</filename> + command to quickly set up a layer, see the + "<ulink url='&YOCTO_DOCS_DEV_URL;#creating-a-general-layer-using-the-bitbake-layers-script'>Creating a General Layer Using the <filename>bitbake-layers</filename> Script</ulink>" + section in the Yocto Project Development Tasks + Manual. + </note> + </para></listitem> + <listitem><para> + <emphasis>Inform the BitBake Build Environment About + Your Layer:</emphasis> + As directed when you created your layer, you need to + add the layer to the + <ulink url='&YOCTO_DOCS_REF_URL;#var-BBLAYERS'><filename>BBLAYERS</filename></ulink> + variable in the <filename>bblayers.conf</filename> file + as follows: + <literallayout class='monospaced'> + $ cd ~/poky/build + $ bitbake-layers add-layer ../../meta-mylayer + NOTE: Starting bitbake server... + $ + </literallayout> + </para></listitem> + <listitem><para> + <emphasis>Build the Extensible SDK:</emphasis> + Use BitBake to build the extensible SDK specifically + for use with images to be run using QEMU: + <literallayout class='monospaced'> + $ cd ~/poky/build + $ bitbake core-image-minimal -c populate_sdk_ext + </literallayout> + Once the build finishes, you can find the SDK installer + file (i.e. <filename>*.sh</filename> file) in the + following directory: + <literallayout class='monospaced'> + ~/poky/build/tmp/deploy/sdk + </literallayout> + For this example, the installer file is named + <filename>poky-glibc-x86_64-core-image-minimal-i586-toolchain-ext-&DISTRO;.sh</filename> + </para></listitem> + <listitem><para> + <emphasis>Install the Extensible SDK:</emphasis> + Use the following command to install the SDK. + For this example, install the SDK in the default + <filename>~/poky_sdk</filename> directory: + <literallayout class='monospaced'> + $ cd ~/poky/build/tmp/deploy/sdk + $ ./poky-glibc-x86_64-core-image-minimal-i586-toolchain-ext-&DISTRO;.sh + Poky (Yocto Project Reference Distro) Extensible SDK installer version &DISTRO; + ============================================================================ + Enter target directory for SDK (default: ~/poky_sdk): + You are about to install the SDK to "/home/scottrif/poky_sdk". Proceed[Y/n]? Y + Extracting SDK......................................done + Setting it up... + Extracting buildtools... + Preparing build system... + Parsing recipes: 100% |#################################################################| Time: 0:00:52 + Initializing tasks: 100% |############## ###############################################| Time: 0:00:04 + Checking sstate mirror object availability: 100% |######################################| Time: 0:00:00 + Parsing recipes: 100% |#################################################################| Time: 0:00:33 + Initializing tasks: 100% |##############################################################| Time: 0:00:00 + done + SDK has been successfully set up and is ready to be used. + Each time you wish to use the SDK in a new shell session, you need to source the environment setup script e.g. + $ . /home/scottrif/poky_sdk/environment-setup-i586-poky-linux + </literallayout> + </para></listitem> + <listitem><para id='setting-up-the-esdk-terminal'> + <emphasis>Set Up a New Terminal to Work With the + Extensible SDK:</emphasis> + You must set up a new terminal to work with the SDK. + You cannot use the same BitBake shell used to build the + installer.</para> + + <para>After opening a new shell, run the SDK environment + setup script as directed by the output from installing + the SDK: + <literallayout class='monospaced'> + $ source ~/poky_sdk/environment-setup-i586-poky-linux + "SDK environment now set up; additionally you may now run devtool to perform development tasks. + Run devtool --help for further details. + </literallayout> + <note> + If you get a warning about attempting to use the + extensible SDK in an environment set up to run + BitBake, you did not use a new shell. + </note> + </para></listitem> + <listitem><para> + <emphasis>Build the Clean Image:</emphasis> + The final step in preparing to work on the kernel is to + build an initial image using + <filename>devtool</filename> in the new terminal you + just set up and initialized for SDK work: + <literallayout class='monospaced'> + $ devtool build-image + Parsing recipes: 100% |##########################################| Time: 0:00:05 + Parsing of 830 .bb files complete (0 cached, 830 parsed). 1299 targets, 47 skipped, 0 masked, 0 errors. + WARNING: No packages to add, building image core-image-minimal unmodified + Loading cache: 100% |############################################| Time: 0:00:00 + Loaded 1299 entries from dependency cache. + NOTE: Resolving any missing task queue dependencies + Initializing tasks: 100% |#######################################| Time: 0:00:07 + Checking sstate mirror object availability: 100% |###############| Time: 0:00:00 + NOTE: Executing SetScene Tasks + NOTE: Executing RunQueue Tasks + NOTE: Tasks Summary: Attempted 2866 tasks of which 2604 didn't need to be rerun and all succeeded. + NOTE: Successfully built core-image-minimal. You can find output files in /home/scottrif/poky_sdk/tmp/deploy/images/qemux86 + </literallayout> + If you were building for actual hardware and not for + emulation, you could flash the image to a USB stick + on <filename>/dev/sdd</filename> and boot your device. + For an example that uses a Minnowboard, see the + <ulink url='https://wiki.yoctoproject.org/wiki/TipsAndTricks/KernelDevelopmentWithEsdk'>TipsAndTricks/KernelDevelopmentWithEsdk</ulink> + Wiki page. + </para></listitem> + </orderedlist> + </para> + + <para> + At this point you have set up to start making modifications to + the kernel by using the extensible SDK. + For a continued example, see the + "<link linkend='using-devtool-to-patch-the-kernel'>Using <filename>devtool</filename> to Patch the Kernel</link>" + section. + </para> + </section> + + <section id='getting-ready-for-traditional-kernel-development'> + <title>Getting Ready for Traditional Kernel Development</title> + + <para> + Getting ready for traditional kernel development using the Yocto + Project involves many of the same steps as described in the + previous section. + However, you need to establish a local copy of the kernel source + since you will be editing these files. + </para> + + <para> + Follow these steps to prepare to update the kernel image using + traditional kernel development flow with the Yocto Project. + Completing this procedure leaves you ready to make modifications + to the kernel source as described in the + "<link linkend='using-traditional-kernel-development-to-patch-the-kernel'>Using Traditional Kernel Development to Patch the Kernel</link>" + section: + <orderedlist> + <listitem><para> + <emphasis>Initialize the BitBake Environment:</emphasis> + Before you can do anything using BitBake, you need to + initialize the BitBake build environment by sourcing the + build environment script + (i.e. <ulink url='&YOCTO_DOCS_REF_URL;#structure-core-script'><filename>oe-init-build-env</filename></ulink>). + Also, for this example, be sure that the local branch + you have checked out for <filename>poky</filename> is + the Yocto Project &DISTRO_NAME; branch. + If you need to checkout out the &DISTRO_NAME; branch, + see the + "<ulink url='&YOCTO_DOCS_DEV_URL;#checking-out-by-branch-in-poky'>Checking out by Branch in Poky</ulink>" + section in the Yocto Project Development Tasks Manual. + <literallayout class='monospaced'> + $ cd ~/poky + $ git branch + master + * &DISTRO_NAME; + $ source oe-init-build-env + </literallayout> + <note> + The previous commands assume the + <ulink url='&YOCTO_DOCS_OM_URL;#source-repositories'>Source Repositories</ulink> + (i.e. <filename>poky</filename>) have been cloned + using Git and the local repository is named + "poky". + </note> + </para></listitem> + <listitem><para> + <emphasis>Prepare Your <filename>local.conf</filename> + File:</emphasis> + By default, the + <ulink url='&YOCTO_DOCS_REF_URL;#var-MACHINE'><filename>MACHINE</filename></ulink> + variable is set to "qemux86", which is fine if you are + building for the QEMU emulator in 32-bit mode. + However, if you are not, you need to set the + <filename>MACHINE</filename> variable appropriately in + your <filename>conf/local.conf</filename> file found + in the + <ulink url='&YOCTO_DOCS_REF_URL;#build-directory'>Build Directory</ulink> + (i.e. <filename>~/poky/build</filename> in this + example).</para> + + <para>Also, since you are preparing to work on the + kernel image, you need to set the + <ulink url='&YOCTO_DOCS_REF_URL;#var-MACHINE_ESSENTIAL_EXTRA_RRECOMMENDS'><filename>MACHINE_ESSENTIAL_EXTRA_RRECOMMENDS</filename></ulink> + variable to include kernel modules.</para> + + <para>This example uses the default "qemux86" for the + <filename>MACHINE</filename> variable but needs to + add the "kernel-modules": + <literallayout class='monospaced'> + MACHINE_ESSENTIAL_EXTRA_RRECOMMENDS += "kernel-modules" + </literallayout> + </para></listitem> + <listitem><para> + <emphasis>Create a Layer for Patches:</emphasis> + You need to create a layer to hold patches created + for the kernel image. + You can use the + <filename>bitbake-layers create-layer</filename> + command as follows: + <literallayout class='monospaced'> + $ cd ~/poky/build + $ bitbake-layers create-layer ../../meta-mylayer + NOTE: Starting bitbake server... + Add your new layer with 'bitbake-layers add-layer ../../meta-mylayer' + </literallayout> + <note> + For background information on working with + common and BSP 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 and the + "<ulink url='&YOCTO_DOCS_BSP_URL;#bsp-layers'>BSP Layers</ulink>" + section in the Yocto Project Board Support (BSP) + Developer's Guide, respectively. + For information on how to use the + <filename>bitbake-layers create-layer</filename> + command to quickly set up a layer, see the + "<ulink url='&YOCTO_DOCS_DEV_URL;#creating-a-general-layer-using-the-bitbake-layers-script'>Creating a General Layer Using the <filename>bitbake-layers</filename> Script</ulink>" + section in the Yocto Project Development Tasks + Manual. + </note> + </para></listitem> + <listitem><para> + <emphasis>Inform the BitBake Build Environment About + Your Layer:</emphasis> + As directed when you created your layer, you need to add + the layer to the + <ulink url='&YOCTO_DOCS_REF_URL;#var-BBLAYERS'><filename>BBLAYERS</filename></ulink> + variable in the <filename>bblayers.conf</filename> file + as follows: + <literallayout class='monospaced'> + $ cd ~/poky/build + $ bitbake-layers add-layer ../../meta-mylayer + NOTE: Starting bitbake server ... + $ + </literallayout> + </para></listitem> + <listitem><para> + <emphasis>Create a Local Copy of the Kernel Git + Repository:</emphasis> + You can find Git repositories of supported Yocto Project + kernels organized under "Yocto Linux Kernel" in the + Yocto Project Source Repositories at + <ulink url='&YOCTO_GIT_URL;'></ulink>. + </para> + + <para> + For simplicity, it is recommended that you create your + copy of the kernel Git repository outside of the + <ulink url='&YOCTO_DOCS_REF_URL;#source-directory'>Source Directory</ulink>, + which is usually named <filename>poky</filename>. + Also, be sure you are in the + <filename>standard/base</filename> branch. + </para> + + <para> + The following commands show how to create a local copy + of the <filename>linux-yocto-4.12</filename> kernel and + be in the <filename>standard/base</filename> branch. + <note> + The <filename>linux-yocto-4.12</filename> kernel + can be used with the Yocto Project 2.4 release + and forward. + You cannot use the + <filename>linux-yocto-4.12</filename> kernel with + releases prior to Yocto Project 2.4: + </note> + <literallayout class='monospaced'> + $ cd ~ + $ git clone git://git.yoctoproject.org/linux-yocto-4.12 --branch standard/base + Cloning into 'linux-yocto-4.12'... + remote: Counting objects: 6097195, done. + remote: Compressing objects: 100% (901026/901026), done. + remote: Total 6097195 (delta 5152604), reused 6096847 (delta 5152256) + Receiving objects: 100% (6097195/6097195), 1.24 GiB | 7.81 MiB/s, done. + Resolving deltas: 100% (5152604/5152604), done. + Checking connectivity... done. + Checking out files: 100% (59846/59846), done. + </literallayout> + </para></listitem> + <listitem><para> + <emphasis>Create a Local Copy of the Kernel Cache Git + Repository:</emphasis> + For simplicity, it is recommended that you create your + copy of the kernel cache Git repository outside of the + <ulink url='&YOCTO_DOCS_REF_URL;#source-directory'>Source Directory</ulink>, + which is usually named <filename>poky</filename>. + Also, for this example, be sure you are in the + <filename>yocto-4.12</filename> branch. + </para> + + <para> + The following commands show how to create a local copy + of the <filename>yocto-kernel-cache</filename> and + be in the <filename>yocto-4.12</filename> branch: + <literallayout class='monospaced'> + $ cd ~ + $ git clone git://git.yoctoproject.org/yocto-kernel-cache --branch yocto-4.12 + Cloning into 'yocto-kernel-cache'... + remote: Counting objects: 22639, done. + remote: Compressing objects: 100% (9761/9761), done. + remote: Total 22639 (delta 12400), reused 22586 (delta 12347) + Receiving objects: 100% (22639/22639), 22.34 MiB | 6.27 MiB/s, done. + Resolving deltas: 100% (12400/12400), done. + Checking connectivity... done. + </literallayout> + </para></listitem> + </orderedlist> + </para> + + <para> + At this point, you are ready to start making modifications to + the kernel using traditional kernel development steps. + For a continued example, see the + "<link linkend='using-traditional-kernel-development-to-patch-the-kernel'>Using Traditional Kernel Development to Patch the Kernel</link>" + section. + </para> + </section> + </section> + + <section id='creating-and-preparing-a-layer'> + <title>Creating and Preparing a Layer</title> + + <para> + If you are going to be modifying kernel recipes, it is recommended + that you create and prepare your own layer in which to do your + work. + Your layer contains its own + <ulink url='&YOCTO_DOCS_REF_URL;#bitbake-term'>BitBake</ulink> + append files (<filename>.bbappend</filename>) and provides a + convenient mechanism to create your own recipe files + (<filename>.bb</filename>) as well as store and use kernel + patch files. + For background information on working with 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. + <note><title>Tip</title> + The Yocto Project comes with many tools that simplify + tasks you need to perform. + One such tool is the + <filename>bitbake-layers create-layer</filename> + command, which simplifies creating a new layer. + See the + "<ulink url='&YOCTO_DOCS_DEV_URL;#creating-a-general-layer-using-the-bitbake-layers-script'>Creating a General Layer Using the <filename>bitbake-layers</filename> Script</ulink>" + section in the Yocto Project Development Tasks Manual for + information on how to use this script to quick set up a + new layer. + </note> + </para> + + <para> + To better understand the layer you create for kernel development, + the following section describes how to create a layer + without the aid of tools. + These steps assume creation of a layer named + <filename>mylayer</filename> in your home directory: + <orderedlist> + <listitem><para> + <emphasis>Create Structure</emphasis>: + Create the layer's structure: + <literallayout class='monospaced'> + $ cd $HOME + $ mkdir meta-mylayer + $ mkdir meta-mylayer/conf + $ mkdir meta-mylayer/recipes-kernel + $ mkdir meta-mylayer/recipes-kernel/linux + $ mkdir meta-mylayer/recipes-kernel/linux/linux-yocto + </literallayout> + The <filename>conf</filename> directory holds your + configuration files, while the + <filename>recipes-kernel</filename> directory holds your + append file and eventual patch files. + </para></listitem> + <listitem><para> + <emphasis>Create the Layer Configuration File</emphasis>: + Move to the <filename>meta-mylayer/conf</filename> + directory and create the <filename>layer.conf</filename> + file as follows: + <literallayout class='monospaced'> + # We have a conf and classes directory, add to BBPATH + BBPATH .= ":${LAYERDIR}" + + # We have recipes-* directories, add to BBFILES + BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \ + ${LAYERDIR}/recipes-*/*/*.bbappend" + + BBFILE_COLLECTIONS += "mylayer" + BBFILE_PATTERN_mylayer = "^${LAYERDIR}/" + BBFILE_PRIORITY_mylayer = "5" + </literallayout> + Notice <filename>mylayer</filename> as part of the last + three statements. + </para></listitem> + <listitem><para> + <emphasis>Create the Kernel Recipe Append File</emphasis>: + Move to the + <filename>meta-mylayer/recipes-kernel/linux</filename> + directory and create the kernel's append file. + This example uses the + <filename>linux-yocto-4.12</filename> kernel. + Thus, the name of the append file is + <filename>linux-yocto_4.12.bbappend</filename>: + <literallayout class='monospaced'> + FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" + + SRC_URI_append += "file://<replaceable>patch-file-one</replaceable>" + SRC_URI_append += "file://<replaceable>patch-file-two</replaceable>" + SRC_URI_append += "file://<replaceable>patch-file-three</replaceable>" + </literallayout> + The + <ulink url='&YOCTO_DOCS_REF_URL;#var-FILESEXTRAPATHS'><filename>FILESEXTRAPATHS</filename></ulink> + and + <ulink url='&YOCTO_DOCS_REF_URL;#var-SRC_URI'><filename>SRC_URI</filename></ulink> + statements enable the OpenEmbedded build system to find + patch files. + For more information on using append files, see the + "<ulink url='&YOCTO_DOCS_DEV_URL;#using-bbappend-files'>Using .bbappend Files in Your Layer</ulink>" + section in the Yocto Project Development Tasks Manual. + </para></listitem> + </orderedlist> + </para> + </section> + + <section id='modifying-an-existing-recipe'> + <title>Modifying an Existing Recipe</title> + + <para> + In many cases, you can customize an existing linux-yocto recipe to + meet the needs of your project. + Each release of the Yocto Project provides a few Linux + kernel recipes from which you can choose. + These are located in the + <ulink url='&YOCTO_DOCS_REF_URL;#source-directory'>Source Directory</ulink> + in <filename>meta/recipes-kernel/linux</filename>. + </para> + + <para> + Modifying an existing recipe can consist of the following: + <itemizedlist> + <listitem><para>Creating the append file</para></listitem> + <listitem><para>Applying patches</para></listitem> + <listitem><para>Changing the configuration</para></listitem> + </itemizedlist> + </para> + + <para> + Before modifying an existing recipe, be sure that you have created + a minimal, custom layer from which you can work. + See the + "<link linkend='creating-and-preparing-a-layer'>Creating and Preparing a Layer</link>" + section for information. + </para> + + <section id='creating-the-append-file'> + <title>Creating the Append File</title> + + <para> + You create this file in your custom layer. + You also name it accordingly based on the linux-yocto recipe + you are using. + For example, if you are modifying the + <filename>meta/recipes-kernel/linux/linux-yocto_4.12.bb</filename> + recipe, the append file will typically be located as follows + within your custom layer: + <literallayout class='monospaced'> + <replaceable>your-layer</replaceable>/recipes-kernel/linux/linux-yocto_4.12.bbappend + </literallayout> + The append file should initially extend the + <ulink url='&YOCTO_DOCS_REF_URL;#var-FILESPATH'><filename>FILESPATH</filename></ulink> + search path by prepending the directory that contains your + files to the + <ulink url='&YOCTO_DOCS_REF_URL;#var-FILESEXTRAPATHS'><filename>FILESEXTRAPATHS</filename></ulink> + variable as follows: + <literallayout class='monospaced'> + FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" + </literallayout> + The path <filename>${</filename><ulink url='&YOCTO_DOCS_REF_URL;#var-THISDIR'><filename>THISDIR</filename></ulink><filename>}/${</filename><ulink url='&YOCTO_DOCS_REF_URL;#var-PN'><filename>PN</filename></ulink><filename>}</filename> + expands to "linux-yocto" in the current directory for this + example. + If you add any new files that modify the kernel recipe and you + have extended <filename>FILESPATH</filename> as + described above, you must place the files in your layer in the + following area: + <literallayout class='monospaced'> + <replaceable>your-layer</replaceable>/recipes-kernel/linux/linux-yocto/ + </literallayout> + <note>If you are working on a new machine Board Support Package + (BSP), be sure to refer to the + <ulink url='&YOCTO_DOCS_BSP_URL;'>Yocto Project Board Support Package (BSP) Developer's Guide</ulink>. + </note> + </para> + + <para> + As an example, consider the following append file + used by the BSPs in <filename>meta-yocto-bsp</filename>: + <literallayout class='monospaced'> + meta-yocto-bsp/recipes-kernel/linux/linux-yocto_4.12.bbappend + </literallayout> + The following listing shows the file. + Be aware that the actual commit ID strings in this + example listing might be different than the actual strings + in the file from the <filename>meta-yocto-bsp</filename> + layer upstream. + <literallayout class='monospaced'> + KBRANCH_genericx86 = "standard/base" + KBRANCH_genericx86-64 = "standard/base" + + KMACHINE_genericx86 ?= "common-pc" + KMACHINE_genericx86-64 ?= "common-pc-64" + KBRANCH_edgerouter = "standard/edgerouter" + KBRANCH_beaglebone = "standard/beaglebone" + KBRANCH_mpc8315e-rdb = "standard/fsl-mpc8315e-rdb" + + SRCREV_machine_genericx86 ?= "d09f2ce584d60ecb7890550c22a80c48b83c2e19" + SRCREV_machine_genericx86-64 ?= "d09f2ce584d60ecb7890550c22a80c48b83c2e19" + SRCREV_machine_edgerouter ?= "b5c8cfda2dfe296410d51e131289fb09c69e1e7d" + SRCREV_machine_beaglebone ?= "b5c8cfda2dfe296410d51e131289fb09c69e1e7d" + SRCREV_machine_mpc8315e-rdb ?= "2d1d010240846d7bff15d1fcc0cb6eb8a22fc78a" + + + COMPATIBLE_MACHINE_genericx86 = "genericx86" + COMPATIBLE_MACHINE_genericx86-64 = "genericx86-64" + COMPATIBLE_MACHINE_edgerouter = "edgerouter" + COMPATIBLE_MACHINE_beaglebone = "beaglebone" + COMPATIBLE_MACHINE_mpc8315e-rdb = "mpc8315e-rdb" + + LINUX_VERSION_genericx86 = "4.12.7" + LINUX_VERSION_genericx86-64 = "4.12.7" + LINUX_VERSION_edgerouter = "4.12.10" + LINUX_VERSION_beaglebone = "4.12.10" + LINUX_VERSION_mpc8315e-rdb = "4.12.10" + </literallayout> + This append file contains statements used to support + several BSPs that ship with the Yocto Project. + The file defines machines using the + <ulink url='&YOCTO_DOCS_REF_URL;#var-COMPATIBLE_MACHINE'><filename>COMPATIBLE_MACHINE</filename></ulink> + variable and uses the + <ulink url='&YOCTO_DOCS_REF_URL;#var-KMACHINE'><filename>KMACHINE</filename></ulink> + variable to ensure the machine name used by the OpenEmbedded + build system maps to the machine name used by the Linux Yocto + kernel. + The file also uses the optional + <ulink url='&YOCTO_DOCS_REF_URL;#var-KBRANCH'><filename>KBRANCH</filename></ulink> + variable to ensure the build process uses the + appropriate kernel branch. + </para> + + <para> + Although this particular example does not use it, the + <ulink url='&YOCTO_DOCS_REF_URL;#var-KERNEL_FEATURES'><filename>KERNEL_FEATURES</filename></ulink> + variable could be used to enable features specific to + the kernel. + The append file points to specific commits in the + <ulink url='&YOCTO_DOCS_REF_URL;#source-directory'>Source Directory</ulink> + Git repository and the <filename>meta</filename> Git repository + branches to identify the exact kernel needed to build the + BSP. + </para> + + <para> + One thing missing in this particular BSP, which you will + typically need when developing a BSP, is the kernel + configuration file (<filename>.config</filename>) for your BSP. + When developing a BSP, you probably have a kernel configuration + file or a set of kernel configuration files that, when taken + together, define the kernel configuration for your BSP. + You can accomplish this definition by putting the configurations + in a file or a set of files inside a directory located at the + same level as your kernel's append file and having the same + name as the kernel's main recipe file. + With all these conditions met, simply reference those files in + the + <ulink url='&YOCTO_DOCS_REF_URL;#var-SRC_URI'><filename>SRC_URI</filename></ulink> + statement in the append file. + </para> + + <para> + For example, suppose you had some configuration options + in a file called <filename>network_configs.cfg</filename>. + You can place that file inside a directory named + <filename>linux-yocto</filename> and then add + a <filename>SRC_URI</filename> statement such as the + following to the append file. + When the OpenEmbedded build system builds the kernel, the + configuration options are picked up and applied. + <literallayout class='monospaced'> + SRC_URI += "file://network_configs.cfg" + </literallayout> + </para> + + <para> + To group related configurations into multiple files, you + perform a similar procedure. + Here is an example that groups separate configurations + specifically for Ethernet and graphics into their own + files and adds the configurations by using a + <filename>SRC_URI</filename> statement like the following + in your append file: + <literallayout class='monospaced'> + SRC_URI += "file://myconfig.cfg \ + file://eth.cfg \ + file://gfx.cfg" + </literallayout> + </para> + + <para> + Another variable you can use in your kernel recipe append + file is the + <ulink url='&YOCTO_DOCS_REF_URL;#var-FILESEXTRAPATHS'><filename>FILESEXTRAPATHS</filename></ulink> + variable. + When you use this statement, you are extending the locations + used by the OpenEmbedded system to look for files and + patches as the recipe is processed. + </para> + + <note> + <para> + Other methods exist to accomplish grouping and defining + configuration options. + For example, if you are working with a local clone of the + kernel repository, you could checkout the kernel's + <filename>meta</filename> branch, make your changes, and + then push the changes to the local bare clone of the + kernel. + The result is that you directly add configuration options + to the <filename>meta</filename> branch for your BSP. + The configuration options will likely end up in that + location anyway if the BSP gets added to the Yocto Project. + </para> + + <para> + In general, however, the Yocto Project maintainers take + care of moving the <filename>SRC_URI</filename>-specified + configuration options to the kernel's + <filename>meta</filename> branch. + Not only is it easier for BSP developers to not have to + worry about putting those configurations in the branch, + but having the maintainers do it allows them to apply + 'global' knowledge about the kinds of common configuration + options multiple BSPs in the tree are typically using. + This allows for promotion of common configurations into + common features. + </para> + </note> + </section> + + <section id='applying-patches'> + <title>Applying Patches</title> + + <para> + If you have a single patch or a small series of patches + that you want to apply to the Linux kernel source, you + can do so just as you would with any other recipe. + You first copy the patches to the path added to + <ulink url='&YOCTO_DOCS_REF_URL;#var-FILESEXTRAPATHS'><filename>FILESEXTRAPATHS</filename></ulink> + in your <filename>.bbappend</filename> file as described in + the previous section, and then reference them in + <ulink url='&YOCTO_DOCS_REF_URL;#var-SRC_URI'><filename>SRC_URI</filename></ulink> + statements. + </para> + + <para> + For example, you can apply a three-patch series by adding the + following lines to your linux-yocto + <filename>.bbappend</filename> file in your layer: + <literallayout class='monospaced'> + SRC_URI += "file://0001-first-change.patch" + SRC_URI += "file://0002-second-change.patch" + SRC_URI += "file://0003-third-change.patch" + </literallayout> + The next time you run BitBake to build the Linux kernel, + BitBake detects the change in the recipe and fetches and + applies the patches before building the kernel. + </para> + + <para> + For a detailed example showing how to patch the kernel using + <filename>devtool</filename>, see the + "<link linkend='using-devtool-to-patch-the-kernel'>Using <filename>devtool</filename> to Patch the Kernel</link>" + and + "<link linkend='using-traditional-kernel-development-to-patch-the-kernel'>Using Traditional Kernel Development to Patch the Kernel</link>" + sections. + </para> + </section> + + <section id='changing-the-configuration'> + <title>Changing the Configuration</title> + + <para> + You can make wholesale or incremental changes to the final + <filename>.config</filename> file used for the eventual + Linux kernel configuration by including a + <filename>defconfig</filename> file and by specifying + configuration fragments in the + <ulink url='&YOCTO_DOCS_REF_URL;#var-SRC_URI'><filename>SRC_URI</filename></ulink> + to be applied to that file. + </para> + + <para> + If you have a complete, working Linux kernel + <filename>.config</filename> + file you want to use for the configuration, as before, copy + that file to the appropriate <filename>${PN}</filename> + directory in your layer's + <filename>recipes-kernel/linux</filename> directory, + and rename the copied file to "defconfig". + Then, add the following lines to the linux-yocto + <filename>.bbappend</filename> file in your layer: + <literallayout class='monospaced'> + FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" + SRC_URI += "file://defconfig" + </literallayout> + The <filename>SRC_URI</filename> tells the build system how to + search for the file, while the + <ulink url='&YOCTO_DOCS_REF_URL;#var-FILESEXTRAPATHS'><filename>FILESEXTRAPATHS</filename></ulink> + extends the + <ulink url='&YOCTO_DOCS_REF_URL;#var-FILESPATH'><filename>FILESPATH</filename></ulink> + variable (search directories) to include the + <filename>${PN}</filename> directory you created to hold the + configuration changes. + </para> + + <note> + The build system applies the configurations from the + <filename>defconfig</filename> file before applying any + subsequent configuration fragments. + The final kernel configuration is a combination of the + configurations in the <filename>defconfig</filename> file and + any configuration fragments you provide. + You need to realize that if you have any configuration + fragments, the build system applies these on top of and + after applying the existing <filename>defconfig</filename> + file configurations. + </note> + + <para> + Generally speaking, the preferred approach is to determine the + incremental change you want to make and add that as a + configuration fragment. + For example, if you want to add support for a basic serial + console, create a file named <filename>8250.cfg</filename> in + the <filename>${PN}</filename> directory with the following + content (without indentation): + <literallayout class='monospaced'> + CONFIG_SERIAL_8250=y + CONFIG_SERIAL_8250_CONSOLE=y + CONFIG_SERIAL_8250_PCI=y + CONFIG_SERIAL_8250_NR_UARTS=4 + CONFIG_SERIAL_8250_RUNTIME_UARTS=4 + CONFIG_SERIAL_CORE=y + CONFIG_SERIAL_CORE_CONSOLE=y + </literallayout> + Next, include this configuration fragment and extend the + <filename>FILESPATH</filename> variable in your + <filename>.bbappend</filename> file: + <literallayout class='monospaced'> + FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" + SRC_URI += "file://8250.cfg" + </literallayout> + The next time you run BitBake to build the Linux kernel, BitBake + detects the change in the recipe and fetches and applies the + new configuration before building the kernel. + </para> + + <para> + For a detailed example showing how to configure the kernel, + see the + "<link linkend='configuring-the-kernel'>Configuring the Kernel</link>" + section. + </para> + </section> + + <section id='using-an-in-tree-defconfig-file'> + <title>Using an "In-Tree" <filename>defconfig</filename> File</title> + + <para> + It might be desirable to have kernel configuration fragment + support through a <filename>defconfig</filename> file that + is pulled from the kernel source tree for the configured + machine. + By default, the OpenEmbedded build system looks for + <filename>defconfig</filename> files in the layer used for + Metadata, which is "out-of-tree", and then configures them + using the following: + <literallayout class='monospaced'> + SRC_URI += "file://defconfig" + </literallayout> + If you do not want to maintain copies of + <filename>defconfig</filename> files in your layer but would + rather allow users to use the default configuration from the + kernel tree and still be able to add configuration fragments + to the + <ulink url='&YOCTO_DOCS_REF_URL;#var-SRC_URI'><filename>SRC_URI</filename></ulink> + through, for example, append files, you can direct the + OpenEmbedded build system to use a + <filename>defconfig</filename> file that is "in-tree". + </para> + + <para> + To specify an "in-tree" <filename>defconfig</filename> file, + use the following statement form: + <literallayout class='monospaced'> + KBUILD_DEFCONFIG_<replaceable>KMACHINE</replaceable> ?= <replaceable>defconfig_file</replaceable> + </literallayout> + Here is an example that appends the + <filename>KBUILD_DEFCONFIG</filename> variable with + "common-pc" and provides the path to the "in-tree" + <filename>defconfig</filename> file: + <literallayout class='monospaced'> + KBUILD_DEFCONFIG_common-pc ?= "/home/scottrif/configfiles/my_defconfig_file" + </literallayout> + </para> + + <para> + Aside from modifying your kernel recipe and providing your own + <filename>defconfig</filename> file, you need to be sure no + files or statements set <filename>SRC_URI</filename> to use a + <filename>defconfig</filename> other than your "in-tree" + file (e.g. a kernel's + <filename>linux-</filename><replaceable>machine</replaceable><filename>.inc</filename> + file). + In other words, if the build system detects a statement + that identifies an "out-of-tree" + <filename>defconfig</filename> file, that statement + will override your + <filename>KBUILD_DEFCONFIG</filename> variable. + </para> + + <para> + See the + <ulink url='&YOCTO_DOCS_REF_URL;#var-KBUILD_DEFCONFIG'><filename>KBUILD_DEFCONFIG</filename></ulink> + variable description for more information. + </para> + </section> + </section> + + <section id="using-devtool-to-patch-the-kernel"> + <title>Using <filename>devtool</filename> to Patch the Kernel</title> + + <para> + The steps in this procedure show you how you can patch the + kernel using the extensible SDK and <filename>devtool</filename>. + <note> + Before attempting this procedure, be sure you have performed + the steps to get ready for updating the kernel as described + in the + "<link linkend='getting-ready-to-develop-using-devtool'>Getting Ready to Develop Using <filename>devtool</filename></link>" + section. + </note> + </para> + + <para> + Patching the kernel involves changing or adding configurations + to an existing kernel, changing or adding recipes to the kernel + that are needed to support specific hardware features, or even + altering the source code itself. + </para> + + <para> + This example creates a simple patch by adding some QEMU emulator + console output at boot time through <filename>printk</filename> + statements in the kernel's <filename>calibrate.c</filename> source + code file. + Applying the patch and booting the modified image causes the added + messages to appear on the emulator's console. + The example is a continuation of the setup procedure found in + the + "<link linkend='getting-ready-to-develop-using-devtool'>Getting Ready to Develop Using <filename>devtool</filename></link>" + Section. + <orderedlist> + <listitem><para> + <emphasis>Check Out the Kernel Source Files:</emphasis> + First you must use <filename>devtool</filename> to checkout + the kernel source code in its workspace. + Be sure you are in the terminal set up to do work + with the extensible SDK. + <note> + See this + <link linkend='setting-up-the-esdk-terminal'>step</link> + in the + "<link linkend='getting-ready-to-develop-using-devtool'>Getting Ready to Develop Using <filename>devtool</filename></link>" + section for more information. + </note> + Use the following <filename>devtool</filename> command + to check out the code: + <literallayout class='monospaced'> + $ devtool modify linux-yocto + </literallayout> + <note> + During the checkout operation, a bug exists that could + cause errors such as the following to appear: + <literallayout class='monospaced'> + ERROR: Taskhash mismatch 2c793438c2d9f8c3681fd5f7bc819efa versus + be3a89ce7c47178880ba7bf6293d7404 for + /path/to/esdk/layers/poky/meta/recipes-kernel/linux/linux-yocto_4.10.bb.do_unpack + </literallayout> + You can safely ignore these messages. + The source code is correctly checked out. + </note> + </para></listitem> + <listitem><para> + <emphasis>Edit the Source Files</emphasis> + Follow these steps to make some simple changes to the source + files: + <orderedlist> + <listitem><para> + <emphasis>Change the working directory</emphasis>: + In the previous step, the output noted where you can find + the source files (e.g. + <filename>~/poky_sdk/workspace/sources/linux-yocto</filename>). + Change to where the kernel source code is before making + your edits to the <filename>calibrate.c</filename> file: + <literallayout class='monospaced'> + $ cd ~/poky_sdk/workspace/sources/linux-yocto + </literallayout> + </para></listitem> + <listitem><para> + <emphasis>Edit the source file</emphasis>: + Edit the <filename>init/calibrate.c</filename> file to have + the following changes: + <literallayout class='monospaced'> + void calibrate_delay(void) + { + unsigned long lpj; + static bool printed; + int this_cpu = smp_processor_id(); + + printk("*************************************\n"); + printk("* *\n"); + printk("* HELLO YOCTO KERNEL *\n"); + printk("* *\n"); + printk("*************************************\n"); + + if (per_cpu(cpu_loops_per_jiffy, this_cpu)) { + . + . + . + </literallayout> + </para></listitem> + </orderedlist> + </para></listitem> + <listitem><para> + <emphasis>Build the Updated Kernel Source:</emphasis> + To build the updated kernel source, use + <filename>devtool</filename>: + <literallayout class='monospaced'> + $ devtool build linux-yocto + </literallayout> + </para></listitem> + <listitem><para> + <emphasis>Create the Image With the New Kernel:</emphasis> + Use the <filename>devtool build-image</filename> command + to create a new image that has the new kernel. + <note> + If the image you originally created resulted in a Wic + file, you can use an alternate method to create the new + image with the updated kernel. + For an example, see the steps in the + <ulink url='https://wiki.yoctoproject.org/wiki/TipsAndTricks/KernelDevelopmentWithEsdk'>TipsAndTricks/KernelDevelopmentWithEsdk</ulink> + Wiki Page. + </note> + <literallayout class='monospaced'> + $ cd ~ + $ devtool build-image core-image-minimal + </literallayout> + </para></listitem> + <listitem><para> + <emphasis>Test the New Image:</emphasis> + For this example, you can run the new image using QEMU + to verify your changes: + <orderedlist> + <listitem><para> + <emphasis>Boot the image</emphasis>: + Boot the modified image in the QEMU emulator + using this command: + <literallayout class='monospaced'> + $ runqemu qemux86 + </literallayout> + </para></listitem> + <listitem><para> + <emphasis>Verify the changes</emphasis>: + Log into the machine using <filename>root</filename> + with no password and then use the following shell + command to scroll through the console's boot output. + <literallayout class='monospaced'> + # dmesg | less + </literallayout> + You should see the results of your + <filename>printk</filename> statements + as part of the output when you scroll down the + console window. + </para></listitem> + </orderedlist> + </para></listitem> + <listitem><para> + <emphasis>Stage and commit your changes</emphasis>: + Within your eSDK terminal, change your working directory to + where you modified the <filename>calibrate.c</filename> + file and use these Git commands to stage and commit your + changes: + <literallayout class='monospaced'> + $ cd ~/poky_sdk/workspace/sources/linux-yocto + $ git status + $ git add init/calibrate.c + $ git commit -m "calibrate: Add printk example" + </literallayout> + </para></listitem> + <listitem><para> + <emphasis>Export the Patches and Create an Append File:</emphasis> + To export your commits as patches and create a + <filename>.bbappend</filename> file, use the following + command in the terminal used to work with the extensible + SDK. + This example uses the previously established layer named + <filename>meta-mylayer</filename>. + <note> + See Step 3 of the + "<link linkend='getting-ready-to-develop-using-devtool'>Getting Ready to Develop Using devtool</link>" + section for information on setting up this layer. + </note> + <literallayout class='monospaced'> + $ devtool finish linux-yocto ~/meta-mylayer + </literallayout> + Once the command finishes, the patches and the + <filename>.bbappend</filename> file are located in the + <filename>~/meta-mylayer/recipes-kernel/linux</filename> + directory. + </para></listitem> + <listitem><para> + <emphasis>Build the Image With Your Modified Kernel:</emphasis> + You can now build an image that includes your kernel + patches. + Execute the following command from your + <ulink url='&YOCTO_DOCS_REF_URL;#build-directory'>Build Directory</ulink> + in the terminal set up to run BitBake: + <literallayout class='monospaced'> + $ cd ~/poky/build + $ bitbake core-image-minimal + </literallayout> + </para></listitem> + </orderedlist> + </para> + </section> + + <section id="using-traditional-kernel-development-to-patch-the-kernel"> + <title>Using Traditional Kernel Development to Patch the Kernel</title> + + <para> + The steps in this procedure show you how you can patch the + kernel using traditional kernel development (i.e. not using + <filename>devtool</filename> and the extensible SDK as + described in the + "<link linkend='using-devtool-to-patch-the-kernel'>Using <filename>devtool</filename> to Patch the Kernel</link>" + section). + <note> + Before attempting this procedure, be sure you have performed + the steps to get ready for updating the kernel as described + in the + "<link linkend='getting-ready-for-traditional-kernel-development'>Getting Ready for Traditional Kernel Development</link>" + section. + </note> + </para> + + <para> + Patching the kernel involves changing or adding configurations + to an existing kernel, changing or adding recipes to the kernel + that are needed to support specific hardware features, or even + altering the source code itself. + </para> + + <para> + The example in this section creates a simple patch by adding some + QEMU emulator console output at boot time through + <filename>printk</filename> statements in the kernel's + <filename>calibrate.c</filename> source code file. + Applying the patch and booting the modified image causes the added + messages to appear on the emulator's console. + The example is a continuation of the setup procedure found in + the + "<link linkend='getting-ready-for-traditional-kernel-development'>Getting Ready for Traditional Kernel Development</link>" + Section. + <orderedlist> + <listitem><para> + <emphasis>Edit the Source Files</emphasis> + Prior to this step, you should have used Git to create a + local copy of the repository for your kernel. + Assuming you created the repository as directed in the + "<link linkend='getting-ready-for-traditional-kernel-development'>Getting Ready for Traditional Kernel Development</link>" + section, use the following commands to edit the + <filename>calibrate.c</filename> file: + <orderedlist> + <listitem><para> + <emphasis>Change the working directory</emphasis>: + You need to locate the source files in the + local copy of the kernel Git repository: + Change to where the kernel source code is before making + your edits to the <filename>calibrate.c</filename> file: + <literallayout class='monospaced'> + $ cd ~/linux-yocto-4.12/init + </literallayout> + </para></listitem> + <listitem><para> + <emphasis>Edit the source file</emphasis>: + Edit the <filename>calibrate.c</filename> file to have + the following changes: + <literallayout class='monospaced'> + void calibrate_delay(void) + { + unsigned long lpj; + static bool printed; + int this_cpu = smp_processor_id(); + + printk("*************************************\n"); + printk("* *\n"); + printk("* HELLO YOCTO KERNEL *\n"); + printk("* *\n"); + printk("*************************************\n"); + + if (per_cpu(cpu_loops_per_jiffy, this_cpu)) { + . + . + . + </literallayout> + </para></listitem> + </orderedlist> + </para></listitem> + <listitem><para> + <emphasis>Stage and Commit Your Changes:</emphasis> + Use standard Git commands to stage and commit the changes + you just made: + <literallayout class='monospaced'> + $ git add calibrate.c + $ git commit -m "calibrate.c - Added some printk statements" + </literallayout> + If you do not stage and commit your changes, the OpenEmbedded + Build System will not pick up the changes. + </para></listitem> + <listitem><para> + <emphasis>Update Your <filename>local.conf</filename> File + to Point to Your Source Files:</emphasis> + In addition to your <filename>local.conf</filename> file + specifying to use "kernel-modules" and the "qemux86" + machine, it must also point to the updated kernel source + files. + Add + <ulink url='&YOCTO_DOCS_REF_URL;#var-SRC_URI'><filename>SRC_URI</filename></ulink> + and + <ulink url='&YOCTO_DOCS_REF_URL;#var-SRCREV'><filename>SRCREV</filename></ulink> + statements similar to the following to your + <filename>local.conf</filename>: + <literallayout class='monospaced'> + $ cd ~/poky/build/conf + </literallayout> + Add the following to the <filename>local.conf</filename>: + <literallayout class='monospaced'> + SRC_URI_pn-linux-yocto = "git:///<replaceable>path-to</replaceable>/linux-yocto-4.12;protocol=file;name=machine;branch=standard/base; \ + git:///<replaceable>path-to</replaceable>/yocto-kernel-cache;protocol=file;type=kmeta;name=meta;branch=yocto-4.12;destsuffix=${KMETA}" + SRCREV_meta_qemux86 = "${AUTOREV}" + SRCREV_machine_qemux86 = "${AUTOREV}" + </literallayout> + <note> + Be sure to replace + <replaceable>path-to</replaceable> with the pathname + to your local Git repositories. + Also, you must be sure to specify the correct branch + and machine types. + For this example, the branch is + <filename>standard/base</filename> and the machine is + "qemux86". + </note> + </para></listitem> + <listitem><para> + <emphasis>Build the Image:</emphasis> + With the source modified, your changes staged and + committed, and the <filename>local.conf</filename> file + pointing to the kernel files, you can now use BitBake to + build the image: + <literallayout class='monospaced'> + $ cd ~/poky/build + $ bitbake core-image-minimal + </literallayout> + </para></listitem> + <listitem><para> + <emphasis>Boot the image</emphasis>: + Boot the modified image in the QEMU emulator + using this command. + When prompted to login to the QEMU console, use "root" + with no password: + <literallayout class='monospaced'> + $ cd ~/poky/build + $ runqemu qemux86 + </literallayout> + </para></listitem> + <listitem><para> + <emphasis>Look for Your Changes:</emphasis> + As QEMU booted, you might have seen your changes rapidly + scroll by. + If not, use these commands to see your changes: + <literallayout class='monospaced'> + # dmesg | less + </literallayout> + You should see the results of your + <filename>printk</filename> statements + as part of the output when you scroll down the + console window. + </para></listitem> + <listitem><para> + <emphasis>Generate the Patch File:</emphasis> + Once you are sure that your patch works correctly, you + can generate a <filename>*.patch</filename> file in the + kernel source repository: + <literallayout class='monospaced'> + $ cd ~/linux-yocto-4.12/init + $ git format-patch -1 + 0001-calibrate.c-Added-some-printk-statements.patch + </literallayout> + </para></listitem> + <listitem><para> + <emphasis>Move the Patch File to Your Layer:</emphasis> + In order for subsequent builds to pick up patches, you + need to move the patch file you created in the previous + step to your layer <filename>meta-mylayer</filename>. + For this example, the layer created earlier is located + in your home directory as <filename>meta-mylayer</filename>. + When the layer was created using the + <filename>yocto-create</filename> script, no additional + hierarchy was created to support patches. + Before moving the patch file, you need to add additional + structure to your layer using the following commands: + <literallayout class='monospaced'> + $ cd ~/meta-mylayer + $ mkdir recipes-kernel + $ mkdir recipes-kernel/linux + $ mkdir recipes-kernel/linux/linux-yocto + </literallayout> + Once you have created this hierarchy in your layer, you can + move the patch file using the following command: + <literallayout class='monospaced'> + $ mv ~/linux-yocto-4.12/init/0001-calibrate.c-Added-some-printk-statements.patch ~/meta-mylayer/recipes-kernel/linux/linux-yocto + </literallayout> + </para></listitem> + <listitem><para> + <emphasis>Create the Append File:</emphasis> + Finally, you need to create the + <filename>linux-yocto_4.12.bbappend</filename> file and + insert statements that allow the OpenEmbedded build + system to find the patch. + The append file needs to be in your layer's + <filename>recipes-kernel/linux</filename> + directory and it must be named + <filename>linux-yocto_4.12.bbappend</filename> and have + the following contents: + <literallayout class='monospaced'> + FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" + + SRC_URI_append = " file://0001-calibrate.c-Added-some-printk-statements.patch" + </literallayout> + The + <ulink url='&YOCTO_DOCS_REF_URL;#var-FILESEXTRAPATHS'><filename>FILESEXTRAPATHS</filename></ulink> + and + <ulink url='&YOCTO_DOCS_REF_URL;#var-SRC_URI'><filename>SRC_URI</filename></ulink> + statements enable the OpenEmbedded build system to find + the patch file.</para> + + <para>For more information on append files and patches, + see the + "<link linkend='creating-the-append-file'>Creating the Append File</link>" + and + "<link linkend='applying-patches'>Applying Patches</link>" + sections. + You can also see the + "<ulink url='&YOCTO_DOCS_DEV_URL;#using-bbappend-files'>Using .bbappend Files in Your Layer"</ulink>" + section in the Yocto Project Development Tasks Manual. + <note> + To build <filename>core-image-minimal</filename> + again and see the effects of your patch, you can + essentially eliminate the temporary source files + saved in <filename>poky/build/tmp/work/...</filename> + and residual effects of the build by entering the + following sequence of commands: + <literallayout class='monospaced'> + $ cd ~/poky/build + $ bitbake -c cleanall yocto-linux + $ bitbake core-image-minimal -c cleanall + $ bitbake core-image-minimal + $ runqemu qemux86 + </literallayout> + </note> + </para></listitem> + </orderedlist> + </para> + </section> + + <section id='configuring-the-kernel'> + <title>Configuring the Kernel</title> + + <para> + Configuring the Yocto Project kernel consists of making sure the + <filename>.config</filename> file has all the right information + in it for the image you are building. + You can use the <filename>menuconfig</filename> tool and + configuration fragments to make sure your + <filename>.config</filename> file is just how you need it. + You can also save known configurations in a + <filename>defconfig</filename> file that the build system can use + for kernel configuration. + </para> + + <para> + This section describes how to use <filename>menuconfig</filename>, + create and use configuration fragments, and how to interactively + modify your <filename>.config</filename> file to create the + leanest kernel configuration file possible. + </para> + + <para> + For more information on kernel configuration, see the + "<link linkend='changing-the-configuration'>Changing the Configuration</link>" + section. + </para> + + <section id='using-menuconfig'> + <title>Using <filename>menuconfig</filename></title> + + <para> + The easiest way to define kernel configurations is to set + them through the <filename>menuconfig</filename> tool. + This tool provides an interactive method with which + to set kernel configurations. + For general information on <filename>menuconfig</filename>, see + <ulink url='http://en.wikipedia.org/wiki/Menuconfig'></ulink>. + </para> + + <para> + To use the <filename>menuconfig</filename> tool in the Yocto + Project development environment, you must launch it using + BitBake. + Thus, the environment must be set up using the + <ulink url='&YOCTO_DOCS_REF_URL;#structure-core-script'><filename>&OE_INIT_FILE;</filename></ulink> + script found in the + <ulink url='&YOCTO_DOCS_REF_URL;#build-directory'>Build Directory</ulink>. + You must also be sure of the state of your build's + configuration in the + <ulink url='&YOCTO_DOCS_REF_URL;#source-directory'>Source Directory</ulink>. + The following commands initialize the BitBake environment, + run the + <ulink url='&YOCTO_DOCS_REF_URL;#ref-tasks-kernel_configme'><filename>do_kernel_configme</filename></ulink> + task, and launch <filename>menuconfig</filename>. + These commands assume the Source Directory's top-level folder + is <filename>~/poky</filename>: + <literallayout class='monospaced'> + $ cd poky + $ source oe-init-build-env + $ bitbake linux-yocto -c kernel_configme -f + $ bitbake linux-yocto -c menuconfig + </literallayout> + Once <filename>menuconfig</filename> comes up, its standard + interface allows you to interactively examine and configure + all the kernel configuration parameters. + After making your changes, simply exit the tool and save your + changes to create an updated version of the + <filename>.config</filename> configuration file. + <note> + You can use the entire <filename>.config</filename> file + as the <filename>defconfig</filename> file. + For information on <filename>defconfig</filename> files, + see the + "<link linkend='changing-the-configuration'>Changing the Configuration</link>", + "<link linkend='using-an-in-tree-defconfig-file'>Using an In-Tree <filename>defconfig</filename> File</link>, + and + "<link linkend='creating-a-defconfig-file'>Creating a <filename>defconfig</filename> File</link>" + sections. + </note> + </para> + + <para> + Consider an example that configures the "CONFIG_SMP" setting + for the <filename>linux-yocto-4.12</filename> kernel. + <note> + The OpenEmbedded build system recognizes this kernel as + <filename>linux-yocto</filename> through Metadata (e.g. + <ulink url='&YOCTO_DOCS_REF_URL;#var-PREFERRED_VERSION'><filename>PREFERRED_VERSION</filename></ulink><filename>_linux-yocto ?= "12.4%"</filename>). + </note> + Once <filename>menuconfig</filename> launches, use the + interface to navigate through the selections to find the + configuration settings in which you are interested. + For this example, you deselect "CONFIG_SMP" by clearing the + "Symmetric Multi-Processing Support" option. + Using the interface, you can find the option under + "Processor Type and Features". + To deselect "CONFIG_SMP", use the arrow keys to + highlight "Symmetric Multi-Processing Support" and enter "N" + to clear the asterisk. + When you are finished, exit out and save the change. + </para> + + <para> + Saving the selections updates the <filename>.config</filename> + configuration file. + This is the file that the OpenEmbedded build system uses to + configure the kernel during the build. + You can find and examine this file in the Build Directory in + <filename>tmp/work/</filename>. + The actual <filename>.config</filename> is located in the + area where the specific kernel is built. + For example, if you were building a Linux Yocto kernel based + on the <filename>linux-yocto-4.12</filename> kernel and you + were building a QEMU image targeted for + <filename>x86</filename> architecture, the + <filename>.config</filename> file would be: + <literallayout class='monospaced'> + poky/build/tmp/work/qemux86-poky-linux/linux-yocto/4.12.12+gitAUTOINC+eda4d18... + ...967-r0/linux-qemux86-standard-build/.config + </literallayout> + <note> + The previous example directory is artificially split and + many of the characters in the actual filename are omitted + in order to make it more readable. + Also, depending on the kernel you are using, the exact + pathname might differ. + </note> + </para> + + <para> + Within the <filename>.config</filename> file, you can see the + kernel settings. + For example, the following entry shows that symmetric + multi-processor support is not set: + <literallayout class='monospaced'> + # CONFIG_SMP is not set + </literallayout> + </para> + + <para> + A good method to isolate changed configurations is to use a + combination of the <filename>menuconfig</filename> tool and + simple shell commands. + Before changing configurations with + <filename>menuconfig</filename>, copy the existing + <filename>.config</filename> and rename it to something else, + use <filename>menuconfig</filename> to make as many changes as + you want and save them, then compare the renamed configuration + file against the newly created file. + You can use the resulting differences as your base to create + configuration fragments to permanently save in your kernel + layer. + <note> + Be sure to make a copy of the <filename>.config</filename> + file and do not just rename it. + The build system needs an existing + <filename>.config</filename> file from which to work. + </note> + </para> + </section> + + <section id='creating-a-defconfig-file'> + <title>Creating a <filename>defconfig</filename> File</title> + + <para> + A <filename>defconfig</filename> file is simply a + <filename>.config</filename> renamed to "defconfig". + You can use a <filename>defconfig</filename> file + to retain a known set of kernel configurations from which the + OpenEmbedded build system can draw to create the final + <filename>.config</filename> file. + <note> + Out-of-the-box, the Yocto Project never ships a + <filename>defconfig</filename> or + <filename>.config</filename> file. + The OpenEmbedded build system creates the final + <filename>.config</filename> file used to configure the + kernel. + </note> + </para> + + <para> + To create a <filename>defconfig</filename>, start with a + complete, working Linux kernel <filename>.config</filename> + file. + Copy that file to the appropriate + <filename>${</filename><ulink url='&YOCTO_DOCS_REF_URL;#var-PN'><filename>PN</filename></ulink><filename>}</filename> + directory in your layer's + <filename>recipes-kernel/linux</filename> directory, and rename + the copied file to "defconfig" (e.g. + <filename>~/meta-mylayer/recipes-kernel/linux/linux-yocto/defconfig</filename>). + Then, add the following lines to the linux-yocto + <filename>.bbappend</filename> file in your layer: + <literallayout class='monospaced'> + FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" + SRC_URI += "file://defconfig" + </literallayout> + The + <ulink url='&YOCTO_DOCS_REF_URL;#var-SRC_URI'><filename>SRC_URI</filename></ulink> + tells the build system how to search for the file, while the + <ulink url='&YOCTO_DOCS_REF_URL;#var-FILESEXTRAPATHS'><filename>FILESEXTRAPATHS</filename></ulink> + extends the + <ulink url='&YOCTO_DOCS_REF_URL;#var-FILESPATH'><filename>FILESPATH</filename></ulink> + variable (search directories) to include the + <filename>${PN}</filename> directory you created to hold the + configuration changes. + <note> + The build system applies the configurations from the + <filename>defconfig</filename> file before applying any + subsequent configuration fragments. + The final kernel configuration is a combination of the + configurations in the <filename>defconfig</filename> + file and any configuration fragments you provide. + You need to realize that if you have any configuration + fragments, the build system applies these on top of and + after applying the existing defconfig file configurations. + </note> + For more information on configuring the kernel, see the + "<link linkend='changing-the-configuration'>Changing the Configuration</link>" + section. + </para> + </section> + + <section id='creating-config-fragments'> + <title>Creating Configuration Fragments</title> + + <para> + Configuration fragments are simply kernel options that + appear in a file placed where the OpenEmbedded build system + can find and apply them. + The build system applies configuration fragments after + applying configurations from a <filename>defconfig</filename> + file. + Thus, the final kernel configuration is a combination of the + configurations in the <filename>defconfig</filename> + file and then any configuration fragments you provide. + The build system applies fragments on top of and + after applying the existing defconfig file configurations. + </para> + + <para> + Syntactically, the configuration statement is identical to + what would appear in the <filename>.config</filename> file, + which is in the + <ulink url='&YOCTO_DOCS_REF_URL;#build-directory'>Build Directory</ulink>. + <note> + For more information about where the + <filename>.config</filename> file is located, see the + example in the + "<link linkend='using-menuconfig'>Using <filename>menuconfig</filename></link>" + section. + </note> + </para> + + <para> + It is simple to create a configuration fragment. + One method is to use shell commands. + For example, issuing the following from the shell creates a + configuration fragment file named + <filename>my_smp.cfg</filename> that enables multi-processor + support within the kernel: + <literallayout class='monospaced'> + $ echo "CONFIG_SMP=y" >> my_smp.cfg + </literallayout> + <note> + All configuration fragment files must use the + <filename>.cfg</filename> extension in order for the + OpenEmbedded build system to recognize them as a + configuration fragment. + </note> + </para> + + <para> + Another method is to create a configuration fragment using the + differences between two configuration files: one previously + created and saved, and one freshly created using the + <filename>menuconfig</filename> tool. + </para> + + <para> + To create a configuration fragment using this method, follow + these steps: + <orderedlist> + <listitem><para> + <emphasis>Complete a Build Through Kernel Configuration:</emphasis> + Complete a build at least through the kernel + configuration task as follows: + <literallayout class='monospaced'> + $ bitbake linux-yocto -c kernel_configme -f + </literallayout> + This step ensures that you create a + <filename>.config</filename> file from a known state. + Because situations exist where your build state might + become unknown, it is best to run this task prior + to starting <filename>menuconfig</filename>. + </para></listitem> + <listitem><para> + <emphasis>Launch <filename>menuconfig</filename>:</emphasis> + Run the <filename>menuconfig</filename> command: + <literallayout class='monospaced'> + $ bitbake linux-yocto -c menuconfig + </literallayout> + </para></listitem> + <listitem><para> + <emphasis>Create the Configuration Fragment:</emphasis> + Run the <filename>diffconfig</filename> + command to prepare a configuration fragment. + The resulting file <filename>fragment.cfg</filename> + is placed in the + <filename>${</filename><ulink url='&YOCTO_DOCS_REF_URL;#var-WORKDIR'><filename>WORKDIR</filename></ulink><filename>}</filename> directory: + <literallayout class='monospaced'> + $ bitbake linux-yocto -c diffconfig + </literallayout> + </para></listitem> + </orderedlist> + </para> + + <para> + The <filename>diffconfig</filename> command creates a file + that is a list of Linux kernel <filename>CONFIG_</filename> + assignments. + See the "<link linkend='changing-the-configuration'>Changing the Configuration</link>" + section for additional information on how to use the output + as a configuration fragment. + <note> + You can also use this method to create configuration + fragments for a BSP. + See the "<link linkend='bsp-descriptions'>BSP Descriptions</link>" + section for more information. + </note> + </para> + + <para> + Where do you put your configuration fragment files? + You can place these files in an area pointed to by + <ulink url='&YOCTO_DOCS_REF_URL;#var-SRC_URI'><filename>SRC_URI</filename></ulink> + as directed by your <filename>bblayers.conf</filename> file, + which is located in your layer. + The OpenEmbedded build system picks up the configuration and + adds it to the kernel's configuration. + For example, suppose you had a set of configuration options + in a file called <filename>myconfig.cfg</filename>. + If you put that file inside a directory named + <filename>linux-yocto</filename> that resides in the same + directory as the kernel's append file within your layer + and then add the following statements to the kernel's append + file, those configuration options will be picked up and applied + when the kernel is built: + <literallayout class='monospaced'> + FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" + SRC_URI += "file://myconfig.cfg" + </literallayout> + </para> + + <para> + As mentioned earlier, you can group related configurations + into multiple files and name them all in the + <filename>SRC_URI</filename> statement as well. + For example, you could group separate configurations + specifically for Ethernet and graphics into their own files + and add those by using a <filename>SRC_URI</filename> statement + like the following in your append file: + <literallayout class='monospaced'> + SRC_URI += "file://myconfig.cfg \ + file://eth.cfg \ + file://gfx.cfg" + </literallayout> + </para> + </section> + + <section id='validating-configuration'> + <title>Validating Configuration</title> + + <para> + You can use the + <ulink url='&YOCTO_DOCS_REF_URL;#ref-tasks-kernel_configcheck'><filename>do_kernel_configcheck</filename></ulink> + task to provide configuration validation: + <literallayout class='monospaced'> + $ bitbake linux-yocto -c kernel_configcheck -f + </literallayout> + Running this task produces warnings for when a + requested configuration does not appear in the final + <filename>.config</filename> file or when you override a + policy configuration in a hardware configuration fragment. + </para> + + <para> + In order to run this task, you must have an existing + <filename>.config</filename> file. + See the + "<link linkend='using-menuconfig'>Using <filename>menuconfig</filename></link>" + section for information on how to create a configuration file. + </para> + + <para> + Following is sample output from the + <filename>do_kernel_configcheck</filename> task: + <literallayout class='monospaced'> + Loading cache: 100% |########################################################| Time: 0:00:00 + Loaded 1275 entries from dependency cache. + NOTE: Resolving any missing task queue dependencies + + Build Configuration: + . + . + . + + NOTE: Executing SetScene Tasks + NOTE: Executing RunQueue Tasks + WARNING: linux-yocto-4.12.12+gitAUTOINC+eda4d18ce4_16de014967-r0 do_kernel_configcheck: + [kernel config]: specified values did not make it into the kernel's final configuration: + + ---------- CONFIG_X86_TSC ----------------- + Config: CONFIG_X86_TSC + From: /home/scottrif/poky/build/tmp/work-shared/qemux86/kernel-source/.kernel-meta/configs/standard/bsp/common-pc/common-pc-cpu.cfg + Requested value: CONFIG_X86_TSC=y + Actual value: + + + ---------- CONFIG_X86_BIGSMP ----------------- + Config: CONFIG_X86_BIGSMP + From: /home/scottrif/poky/build/tmp/work-shared/qemux86/kernel-source/.kernel-meta/configs/standard/cfg/smp.cfg + /home/scottrif/poky/build/tmp/work-shared/qemux86/kernel-source/.kernel-meta/configs/standard/defconfig + Requested value: # CONFIG_X86_BIGSMP is not set + Actual value: + + + ---------- CONFIG_NR_CPUS ----------------- + Config: CONFIG_NR_CPUS + From: /home/scottrif/poky/build/tmp/work-shared/qemux86/kernel-source/.kernel-meta/configs/standard/cfg/smp.cfg + /home/scottrif/poky/build/tmp/work-shared/qemux86/kernel-source/.kernel-meta/configs/standard/bsp/common-pc/common-pc.cfg + /home/scottrif/poky/build/tmp/work-shared/qemux86/kernel-source/.kernel-meta/configs/standard/defconfig + Requested value: CONFIG_NR_CPUS=8 + Actual value: CONFIG_NR_CPUS=1 + + + ---------- CONFIG_SCHED_SMT ----------------- + Config: CONFIG_SCHED_SMT + From: /home/scottrif/poky/build/tmp/work-shared/qemux86/kernel-source/.kernel-meta/configs/standard/cfg/smp.cfg + /home/scottrif/poky/build/tmp/work-shared/qemux86/kernel-source/.kernel-meta/configs/standard/defconfig + Requested value: CONFIG_SCHED_SMT=y + Actual value: + + + + NOTE: Tasks Summary: Attempted 288 tasks of which 285 didn't need to be rerun and all succeeded. + + Summary: There were 3 WARNING messages shown. + </literallayout> + <note> + The previous output example has artificial line breaks + to make it more readable. + </note> + </para> + + <para> + The output describes the various problems that you can + encounter along with where to find the offending configuration + items. + You can use the information in the logs to adjust your + configuration files and then repeat the + <ulink url='&YOCTO_DOCS_REF_URL;#ref-tasks-kernel_configme'><filename>do_kernel_configme</filename></ulink> + and + <ulink url='&YOCTO_DOCS_REF_URL;#ref-tasks-kernel_configcheck'><filename>do_kernel_configcheck</filename></ulink> + tasks until they produce no warnings. + </para> + + <para> + For more information on how to use the + <filename>menuconfig</filename> tool, see the + "<link linkend='using-menuconfig'>Using <filename>menuconfig</filename></link>" + section. + </para> + </section> + + <section id='fine-tuning-the-kernel-configuration-file'> + <title>Fine-Tuning the Kernel Configuration File</title> + + <para> + You can make sure the <filename>.config</filename> file is as + lean or efficient as possible by reading the output of the + kernel configuration fragment audit, noting any issues, making + changes to correct the issues, and then repeating. + </para> + + <para> + As part of the kernel build process, the + <filename>do_kernel_configcheck</filename> task runs. + This task validates the kernel configuration by checking the + final <filename>.config</filename> file against the input + files. + During the check, the task produces warning messages for the + following issues: + <itemizedlist> + <listitem><para> + Requested options that did not make the final + <filename>.config</filename> file. + </para></listitem> + <listitem><para> + Configuration items that appear twice in the same + configuration fragment. + </para></listitem> + <listitem><para> + Configuration items tagged as "required" that were + overridden. + </para></listitem> + <listitem><para> + A board overrides a non-board specific option. + </para></listitem> + <listitem><para> + Listed options not valid for the kernel being + processed. + In other words, the option does not appear anywhere. + </para></listitem> + </itemizedlist> + <note> + The <filename>do_kernel_configcheck</filename> task can + also optionally report if an option is overridden during + processing. + </note> + </para> + + <para> + For each output warning, a message points to the file + that contains a list of the options and a pointer to the + configuration fragment that defines them. + Collectively, the files are the key to streamlining the + configuration. + </para> + + <para> + To streamline the configuration, do the following: + <orderedlist> + <listitem><para> + <emphasis>Use a Working Configuration:</emphasis> + Start with a full configuration that you + know works. + Be sure the configuration builds and boots + successfully. + Use this configuration file as your baseline. + </para></listitem> + <listitem><para> + <emphasis>Run Configure and Check Tasks:</emphasis> + Separately run the + <filename>do_kernel_configme</filename> and + <filename>do_kernel_configcheck</filename> tasks: + <literallayout class='monospaced'> + $ bitbake linux-yocto -c kernel_configme -f + $ bitbake linux-yocto -c kernel_configcheck -f + </literallayout> + </para></listitem> + <listitem><para> + <emphasis>Process the Results:</emphasis> + Take the resulting list of files from the + <filename>do_kernel_configcheck</filename> task + warnings and do the following: + <itemizedlist> + <listitem><para> + Drop values that are redefined in the fragment + but do not change the final + <filename>.config</filename> file. + </para></listitem> + <listitem><para> + Analyze and potentially drop values from the + <filename>.config</filename> file that override + required configurations. + </para></listitem> + <listitem><para> + Analyze and potentially remove non-board + specific options. + </para></listitem> + <listitem><para> + Remove repeated and invalid options. + </para></listitem> + </itemizedlist> + </para></listitem> + <listitem><para> + <emphasis>Re-Run Configure and Check Tasks:</emphasis> + After you have worked through the output of the kernel + configuration audit, you can re-run the + <filename>do_kernel_configme</filename> and + <filename>do_kernel_configcheck</filename> tasks to + see the results of your changes. + If you have more issues, you can deal with them as + described in the previous step. + </para></listitem> + </orderedlist> + </para> + + <para> + Iteratively working through steps two through four eventually + yields a minimal, streamlined configuration file. + Once you have the best <filename>.config</filename>, you can + build the Linux Yocto kernel. + </para> + </section> + </section> + + <section id='expanding-variables'> + <title>Expanding Variables</title> + + <para> + Sometimes it is helpful to determine what a variable expands + to during a build. + You can do examine the values of variables by examining the + output of the <filename>bitbake -e</filename> command. + The output is long and is more easily managed in a text file, + which allows for easy searches: + <literallayout class='monospaced'> + $ bitbake -e virtual/kernel > <replaceable>some_text_file</replaceable> + </literallayout> + Within the text file, you can see exactly how each variable is + expanded and used by the OpenEmbedded build system. + </para> + </section> + + <section id='working-with-a-dirty-kernel-version-string'> + <title>Working with a "Dirty" Kernel Version String</title> + + <para> + If you build a kernel image and the version string has a + "+" or a "-dirty" at the end, uncommitted modifications exist + in the kernel's source directory. + Follow these steps to clean up the version string: + <orderedlist> + <listitem><para> + <emphasis>Discover the Uncommitted Changes:</emphasis> + Go to the kernel's locally cloned Git repository + (source directory) and use the following Git command + to list the files that have been changed, added, or + removed: + <literallayout class='monospaced'> + $ git status + </literallayout> + </para></listitem> + <listitem><para> + <emphasis>Commit the Changes:</emphasis> + You should commit those changes to the kernel source + tree regardless of whether or not you will save, + export, or use the changes: + <literallayout class='monospaced'> + $ git add + $ git commit -s -a -m "getting rid of -dirty" + </literallayout> + </para></listitem> + <listitem><para> + <emphasis>Rebuild the Kernel Image:</emphasis> + Once you commit the changes, rebuild the kernel.</para> + + <para>Depending on your particular kernel development + workflow, the commands you use to rebuild the + kernel might differ. + For information on building the kernel image when + using <filename>devtool</filename>, see the + "<link linkend='using-devtool-to-patch-the-kernel'>Using <filename>devtool</filename> to Patch the Kernel</link>" + section. + For information on building the kernel image when + using Bitbake, see the + "<link linkend='using-traditional-kernel-development-to-patch-the-kernel'>Using Traditional Kernel Development to Patch the Kernel</link>" + section. + </para></listitem> + </orderedlist> + </para> + </section> + + <section id='working-with-your-own-sources'> + <title>Working With Your Own Sources</title> + + <para> + If you cannot work with one of the Linux kernel + versions supported by existing linux-yocto recipes, you can + still make use of the Yocto Project Linux kernel tooling by + working with your own sources. + When you use your own sources, you will not be able to + leverage the existing kernel + <ulink url='&YOCTO_DOCS_REF_URL;#metadata'>Metadata</ulink> and + stabilization work of the linux-yocto sources. + However, you will be able to manage your own Metadata in the same + format as the linux-yocto sources. + Maintaining format compatibility facilitates converging with + linux-yocto on a future, mutually-supported kernel version. + </para> + + <para> + To help you use your own sources, the Yocto Project provides a + linux-yocto custom recipe + (<filename>linux-yocto-custom.bb</filename>) that uses + <filename>kernel.org</filename> sources + and the Yocto Project Linux kernel tools for managing + kernel Metadata. + You can find this recipe in the + <filename>poky</filename> Git repository of the + Yocto Project <ulink url='&YOCTO_GIT_URL;'>Source Repository</ulink> + at: + <literallayout class="monospaced"> + poky/meta-skeleton/recipes-kernel/linux/linux-yocto-custom.bb + </literallayout> + </para> + + <para> + Here are some basic steps you can use to work with your own + sources: + <orderedlist> + <listitem><para> + <emphasis>Create a Copy of the Kernel Recipe:</emphasis> + Copy the <filename>linux-yocto-custom.bb</filename> + recipe to your layer and give it a meaningful name. + The name should include the version of the Yocto Linux + kernel you are using (e.g. + <filename>linux-yocto-myproject_4.12.bb</filename>, + where "4.12" is the base version of the Linux kernel + with which you would be working). + </para></listitem> + <listitem><para> + <emphasis>Create a Directory for Your Patches:</emphasis> + In the same directory inside your layer, create a matching + directory to store your patches and configuration files + (e.g. <filename>linux-yocto-myproject</filename>). + </para></listitem> + <listitem><para> + <emphasis>Ensure You Have Configurations:</emphasis> + Make sure you have either a <filename>defconfig</filename> + file or configuration fragment files in your layer. + When you use the <filename>linux-yocto-custom.bb</filename> + recipe, you must specify a configuration. + If you do not have a <filename>defconfig</filename> file, + you can run the following: + <literallayout class='monospaced'> + $ make defconfig + </literallayout> + After running the command, copy the resulting + <filename>.config</filename> file to the + <filename>files</filename> directory in your layer + as "defconfig" and then add it to the + <ulink url='&YOCTO_DOCS_REF_URL;#var-SRC_URI'><filename>SRC_URI</filename></ulink> + variable in the recipe.</para> + + <para>Running the <filename>make defconfig</filename> + command results in the default configuration for your + architecture as defined by your kernel. + However, no guarantee exists that this configuration is + valid for your use case, or that your board will even boot. + This is particularly true for non-x86 architectures.</para> + + <para>To use non-x86 <filename>defconfig</filename> files, + you need to be more specific and find one that matches your + board (i.e. for arm, you look in + <filename>arch/arm/configs</filename> and use the one that + is the best starting point for your board). + </para></listitem> + <listitem><para> + <emphasis>Edit the Recipe:</emphasis> + Edit the following variables in your recipe as appropriate + for your project: + <itemizedlist> + <listitem><para> + <ulink url='&YOCTO_DOCS_REF_URL;#var-SRC_URI'><filename>SRC_URI</filename></ulink>: + The <filename>SRC_URI</filename> should specify + a Git repository that uses one of the supported Git + fetcher protocols (i.e. <filename>file</filename>, + <filename>git</filename>, <filename>http</filename>, + and so forth). + The <filename>SRC_URI</filename> variable should + also specify either a <filename>defconfig</filename> + file or some configuration fragment files. + The skeleton recipe provides an example + <filename>SRC_URI</filename> as a syntax reference. + </para></listitem> + <listitem><para> + <ulink url='&YOCTO_DOCS_REF_URL;#var-LINUX_VERSION'><filename>LINUX_VERSION</filename></ulink>: + The Linux kernel version you are using (e.g. + "4.12"). + </para></listitem> + <listitem><para> + <ulink url='&YOCTO_DOCS_REF_URL;#var-LINUX_VERSION_EXTENSION'><filename>LINUX_VERSION_EXTENSION</filename></ulink>: + The Linux kernel + <filename>CONFIG_LOCALVERSION</filename> that is + compiled into the resulting kernel and visible + through the <filename>uname</filename> command. + </para></listitem> + <listitem><para> + <ulink url='&YOCTO_DOCS_REF_URL;#var-SRCREV'><filename>SRCREV</filename></ulink>: + The commit ID from which you want to build. + </para></listitem> + <listitem><para> + <ulink url='&YOCTO_DOCS_REF_URL;#var-PR'><filename>PR</filename></ulink>: + Treat this variable the same as you would in any + other recipe. + Increment the variable to indicate to the + OpenEmbedded build system that the recipe has + changed. + </para></listitem> + <listitem><para> + <ulink url='&YOCTO_DOCS_REF_URL;#var-PV'><filename>PV</filename></ulink>: + The default <filename>PV</filename> assignment is + typically adequate. + It combines the <filename>LINUX_VERSION</filename> + with the Source Control Manager (SCM) revision + as derived from the + <ulink url='&YOCTO_DOCS_REF_URL;#var-SRCPV'><filename>SRCPV</filename></ulink> + variable. + The combined results are a string with the + following form: + <literallayout class='monospaced'> + 3.19.11+git1+68a635bf8dfb64b02263c1ac80c948647cc76d5f_1+218bd8d2022b9852c60d32f0d770931e3cf343e2 + </literallayout> + While lengthy, the extra verbosity in + <filename>PV</filename> helps ensure you are using + the exact sources from which you intend to build. + </para></listitem> + <listitem><para> + <ulink url='&YOCTO_DOCS_REF_URL;#var-COMPATIBLE_MACHINE'><filename>COMPATIBLE_MACHINE</filename></ulink>: + A list of the machines supported by your new recipe. + This variable in the example recipe is set + by default to a regular expression that matches + only the empty string, "(^$)". + This default setting triggers an explicit build + failure. + You must change it to match a list of the machines + that your new recipe supports. + For example, to support the + <filename>qemux86</filename> and + <filename>qemux86-64</filename> machines, use + the following form: + <literallayout class='monospaced'> + COMPATIBLE_MACHINE = "qemux86|qemux86-64" + </literallayout> + </para></listitem> + </itemizedlist> + </para></listitem> + <listitem><para> + <emphasis>Customize Your Recipe as Needed:</emphasis> + Provide further customizations to your recipe + as needed just as you would customize an existing + linux-yocto recipe. + See the + "<link linkend='modifying-an-existing-recipe'>Modifying an Existing Recipe</link>" + section for information. + </para></listitem> + </orderedlist> + </para> + </section> + + <section id='working-with-out-of-tree-modules'> + <title>Working with Out-of-Tree Modules</title> + + <para> + This section describes steps to build out-of-tree modules on + your target and describes how to incorporate out-of-tree modules + in the build. + </para> + + <section id='building-out-of-tree-modules-on-the-target'> + <title>Building Out-of-Tree Modules on the Target</title> + + <para> + While the traditional Yocto Project development model would be + to include kernel modules as part of the normal build + process, you might find it useful to build modules on the + target. + This could be the case if your target system is capable + and powerful enough to handle the necessary compilation. + Before deciding to build on your target, however, you should + consider the benefits of using a proper cross-development + environment from your build host. + </para> + + <para> + If you want to be able to build out-of-tree modules on + the target, there are some steps you need to take + on the target that is running your SDK image. + Briefly, the <filename>kernel-dev</filename> package + is installed by default on all + <filename>*.sdk</filename> images and the + <filename>kernel-devsrc</filename> package is installed + on many of the <filename>*.sdk</filename> images. + However, you need to create some scripts prior to + attempting to build the out-of-tree modules on the target + that is running that image. + </para> + + <para> + Prior to attempting to build the out-of-tree modules, + you need to be on the target as root and you need to + change to the <filename>/usr/src/kernel</filename> directory. + Next, <filename>make</filename> the scripts: + <literallayout class='monospaced'> + # cd /usr/src/kernel + # make scripts + </literallayout> + Because all SDK image recipes include + <filename>dev-pkgs</filename>, the + <filename>kernel-dev</filename> packages will be installed + as part of the SDK image and the + <filename>kernel-devsrc</filename> packages will be installed + as part of applicable SDK images. + The SDK uses the scripts when building out-of-tree + modules. + Once you have switched to that directory and created the + scripts, you should be able to build your out-of-tree modules + on the target. + </para> + </section> + + <section id='incorporating-out-of-tree-modules'> + <title>Incorporating Out-of-Tree Modules</title> + + <para> + While it is always preferable to work with sources integrated + into the Linux kernel sources, if you need an external kernel + module, the <filename>hello-mod.bb</filename> recipe is + available as a template from which you can create your + own out-of-tree Linux kernel module recipe. + </para> + + <para> + This template recipe is located in the + <filename>poky</filename> Git repository of the + Yocto Project <ulink url='&YOCTO_GIT_URL;'>Source Repository</ulink> + at: + <literallayout class="monospaced"> + poky/meta-skeleton/recipes-kernel/hello-mod/hello-mod_0.1.bb + </literallayout> + </para> + + <para> + To get started, copy this recipe to your layer and give it a + meaningful name (e.g. <filename>mymodule_1.0.bb</filename>). + In the same directory, create a new directory named + <filename>files</filename> where you can store any source files, + patches, or other files necessary for building + the module that do not come with the sources. + Finally, update the recipe as needed for the module. + Typically, you will need to set the following variables: + <itemizedlist> + <listitem><para><ulink url='&YOCTO_DOCS_REF_URL;#var-DESCRIPTION'><filename>DESCRIPTION</filename></ulink> + </para></listitem> + <listitem><para><ulink url='&YOCTO_DOCS_REF_URL;#var-LICENSE'><filename>LICENSE*</filename></ulink> + </para></listitem> + <listitem><para><ulink url='&YOCTO_DOCS_REF_URL;#var-SRC_URI'><filename>SRC_URI</filename></ulink> + </para></listitem> + <listitem><para><ulink url='&YOCTO_DOCS_REF_URL;#var-PV'><filename>PV</filename></ulink> + </para></listitem> + </itemizedlist> + </para> + + <para> + Depending on the build system used by the module sources, + you might need to make some adjustments. + For example, a typical module <filename>Makefile</filename> + looks much like the one provided with the + <filename>hello-mod</filename> template: + <literallayout class='monospaced'> + obj-m := hello.o + + SRC := $(shell pwd) + + all: + $(MAKE) -C $(KERNEL_SRC) M=$(SRC) + + modules_install: + $(MAKE) -C $(KERNEL_SRC) M=$(SRC) modules_install + ... + </literallayout> + </para> + + <para> + The important point to note here is the + <ulink url='&YOCTO_DOCS_REF_URL;#var-KERNEL_SRC'><filename>KERNEL_SRC</filename></ulink> + variable. + The + <ulink url='&YOCTO_DOCS_REF_URL;#ref-classes-module'><filename>module</filename></ulink> + class sets this variable and the + <ulink url='&YOCTO_DOCS_REF_URL;#var-KERNEL_PATH'><filename>KERNEL_PATH</filename></ulink> + variable to + <filename>${<ulink url='&YOCTO_DOCS_REF_URL;#var-STAGING_KERNEL_DIR'><filename>STAGING_KERNEL_DIR</filename></ulink>}</filename> + with the necessary Linux kernel build information to build + modules. + If your module <filename>Makefile</filename> uses a different + variable, you might want to override the + <ulink url='&YOCTO_DOCS_REF_URL;#ref-tasks-compile'><filename>do_compile</filename></ulink> + step, or create a patch to + the <filename>Makefile</filename> to work with the more typical + <filename>KERNEL_SRC</filename> or + <filename>KERNEL_PATH</filename> variables. + </para> + + <para> + After you have prepared your recipe, you will likely want to + include the module in your images. + To do this, see the documentation for the following variables in + the Yocto Project Reference Manual and set one of them + appropriately for your machine configuration file: + <itemizedlist> + <listitem><para><ulink url='&YOCTO_DOCS_REF_URL;#var-MACHINE_ESSENTIAL_EXTRA_RDEPENDS'><filename>MACHINE_ESSENTIAL_EXTRA_RDEPENDS</filename></ulink> + </para></listitem> + <listitem><para><ulink url='&YOCTO_DOCS_REF_URL;#var-MACHINE_ESSENTIAL_EXTRA_RRECOMMENDS'><filename>MACHINE_ESSENTIAL_EXTRA_RRECOMMENDS</filename></ulink> + </para></listitem> + <listitem><para><ulink url='&YOCTO_DOCS_REF_URL;#var-MACHINE_EXTRA_RDEPENDS'><filename>MACHINE_EXTRA_RDEPENDS</filename></ulink> + </para></listitem> + <listitem><para><ulink url='&YOCTO_DOCS_REF_URL;#var-MACHINE_EXTRA_RRECOMMENDS'><filename>MACHINE_EXTRA_RRECOMMENDS</filename></ulink> + </para></listitem> + </itemizedlist> + </para> + + <para> + Modules are often not required for boot and can be excluded from + certain build configurations. + The following allows for the most flexibility: + <literallayout class='monospaced'> + MACHINE_EXTRA_RRECOMMENDS += "kernel-module-mymodule" + </literallayout> + The value is derived by appending the module filename without + the <filename>.ko</filename> extension to the string + "kernel-module-". + </para> + + <para> + Because the variable is + <ulink url='&YOCTO_DOCS_REF_URL;#var-RRECOMMENDS'><filename>RRECOMMENDS</filename></ulink> + and not a + <ulink url='&YOCTO_DOCS_REF_URL;#var-RDEPENDS'><filename>RDEPENDS</filename></ulink> + variable, the build will not fail if this module is not + available to include in the image. + </para> + </section> + </section> + + + <section id='inspecting-changes-and-commits'> + <title>Inspecting Changes and Commits</title> + + <para> + A common question when working with a kernel is: + "What changes have been applied to this tree?" + Rather than using "grep" across directories to see what has + changed, you can use Git to inspect or search the kernel tree. + Using Git is an efficient way to see what has changed in the tree. + </para> + + <section id='what-changed-in-a-kernel'> + <title>What Changed in a Kernel?</title> + + <para> + Following are a few examples that show how to use Git + commands to examine changes. + These examples are by no means the only way to see changes. + <note> + In the following examples, unless you provide a commit + range, <filename>kernel.org</filename> history is blended + with Yocto Project kernel changes. + You can form ranges by using branch names from the + kernel tree as the upper and lower commit markers with + the Git commands. + You can see the branch names through the web interface + to the Yocto Project source repositories at + <ulink url='&YOCTO_GIT_URL;'></ulink>. + </note> + To see a full range of the changes, use the + <filename>git whatchanged</filename> command and specify a + commit range for the branch + (<replaceable>commit</replaceable><filename>..</filename><replaceable>commit</replaceable>). + </para> + + <para> + Here is an example that looks at what has changed in the + <filename>emenlow</filename> branch of the + <filename>linux-yocto-3.19</filename> kernel. + The lower commit range is the commit associated with the + <filename>standard/base</filename> branch, while + the upper commit range is the commit associated with the + <filename>standard/emenlow</filename> branch. + <literallayout class='monospaced'> + $ git whatchanged origin/standard/base..origin/standard/emenlow + </literallayout> + </para> + + <para> + To see short, one line summaries of changes use the + <filename>git log</filename> command: + <literallayout class='monospaced'> + $ git log --oneline origin/standard/base..origin/standard/emenlow + </literallayout> + </para> + + <para> + Use this command to see code differences for the changes: + <literallayout class='monospaced'> + $ git diff origin/standard/base..origin/standard/emenlow + </literallayout> + </para> + + <para> + Use this command to see the commit log messages and the + text differences: + <literallayout class='monospaced'> + $ git show origin/standard/base..origin/standard/emenlow + </literallayout> + </para> + + <para> + Use this command to create individual patches for + each change. + Here is an example that that creates patch files for each + commit and places them in your <filename>Documents</filename> + directory: + <literallayout class='monospaced'> + $ git format-patch -o $HOME/Documents origin/standard/base..origin/standard/emenlow + </literallayout> + </para> + </section> + + <section id='showing-a-particular-feature-or-branch-change'> + <title>Showing a Particular Feature or Branch Change</title> + + <para> + Tags in the Yocto Project kernel tree divide changes for + significant features or branches. + The <filename>git show</filename> <replaceable>tag</replaceable> + command shows changes based on a tag. + Here is an example that shows <filename>systemtap</filename> + changes: + <literallayout class='monospaced'> + $ git show systemtap + </literallayout> + You can use the + <filename>git branch --contains</filename> <replaceable>tag</replaceable> + command to show the branches that contain a particular feature. + This command shows the branches that contain the + <filename>systemtap</filename> feature: + <literallayout class='monospaced'> + $ git branch --contains systemtap + </literallayout> + </para> + </section> + </section> + + <section id='adding-recipe-space-kernel-features'> + <title>Adding Recipe-Space Kernel Features</title> + + <para> + You can add kernel features in the + <link linkend='recipe-space-metadata'>recipe-space</link> by + using the + <ulink url='&YOCTO_DOCS_REF_URL;#var-KERNEL_FEATURES'><filename>KERNEL_FEATURES</filename></ulink> + variable and by specifying the feature's <filename>.scc</filename> + file path in the + <ulink url='&YOCTO_DOCS_REF_URL;#var-SRC_URI'><filename>SRC_URI</filename></ulink> + statement. + When you add features using this method, the OpenEmbedded build + system checks to be sure the features are present. + If the features are not present, the build stops. + Kernel features are the last elements processed for configuring + and patching the kernel. + Therefore, adding features in this manner is a way + to enforce specific features are present and enabled + without needing to do a full audit of any other layer's additions + to the <filename>SRC_URI</filename> statement. + </para> + + <para> + You add a kernel feature by providing the feature as part of the + <filename>KERNEL_FEATURES</filename> variable and by providing the + path to the feature's <filename>.scc</filename> file, which is + relative to the root of the kernel Metadata. + The OpenEmbedded build system searches all forms of kernel + Metadata on the <filename>SRC_URI</filename> statement regardless + of whether the Metadata is in the "kernel-cache", system kernel + Metadata, or a recipe-space Metadata (i.e. part of the kernel + recipe). + See the + "<link linkend='kernel-metadata-location'>Kernel Metadata Location</link>" + section for additional information. + </para> + + <para> + When you specify the feature's <filename>.scc</filename> file + on the <filename>SRC_URI</filename> statement, the OpenEmbedded + build system adds the directory of that + <filename>.scc</filename> file along with all its subdirectories + to the kernel feature search path. + Because subdirectories are searched, you can reference a single + <filename>.scc</filename> file in the + <filename>SRC_URI</filename> statement to reference multiple kernel + features. + </para> + + <para> + Consider the following example that adds the "test.scc" feature + to the build. + <orderedlist> + <listitem><para> + <emphasis>Create the Feature File:</emphasis> + Create a <filename>.scc</filename> file and locate it + just as you would any other patch file, + <filename>.cfg</filename> file, or fetcher item + you specify in the <filename>SRC_URI</filename> + statement. + <note><title>Notes</title> + <itemizedlist> + <listitem><para> + You must add the directory of the + <filename>.scc</filename> file to the fetcher's + search path in the same manner as you would + add a <filename>.patch</filename> file. + </para></listitem> + <listitem><para> + You can create additional + <filename>.scc</filename> files beneath the + directory that contains the file you are + adding. + All subdirectories are searched during the + build as potential feature directories. + </para></listitem> + </itemizedlist> + </note> + Continuing with the example, suppose the "test.scc" + feature you are adding has a + <filename>test.scc</filename> file in the following + directory: + <literallayout class='monospaced'> + <replaceable>my_recipe</replaceable> + | + +-linux-yocto + | + +-test.cfg + +-test.scc + </literallayout> + In this example, the <filename>linux-yocto</filename> + directory has both the feature + <filename>test.scc</filename> file and a similarly + named configuration fragment file + <filename>test.cfg</filename>. + </para></listitem> + <listitem><para> + <emphasis>Add the Feature File to <filename>SRC_URI</filename>:</emphasis> + Add the <filename>.scc</filename> file to the + recipe's <filename>SRC_URI</filename> statement: + <literallayout class='monospaced'> + SRC_URI_append = " file://test.scc" + </literallayout> + The leading space before the path is important as the + path is appended to the existing path. + </para></listitem> + <listitem><para> + <emphasis>Specify the Feature as a Kernel Feature:</emphasis> + Use the <filename>KERNEL_FEATURES</filename> statement + to specify the feature as a kernel feature: + <literallayout class='monospaced'> + KERNEL_FEATURES_append = " test.scc" + </literallayout> + The OpenEmbedded build system processes the kernel feature + when it builds the kernel. + <note> + If other features are contained below "test.scc", + then their directories are relative to the directory + containing the <filename>test.scc</filename> file. + </note> + </para></listitem> + </orderedlist> + </para> + </section> +</chapter> +<!-- +vim: expandtab tw=80 ts=4 +--> |