1177 lines
59 KiB
XML
1177 lines
59 KiB
XML
<!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 a layer, modifying an existing recipe,
|
|
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
|
|
1.2.2 Release and forward.
|
|
</note>
|
|
</para>
|
|
|
|
<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_DEV_URL;#bitbake-term'>BitBake</ulink>
|
|
append files
|
|
(<filename>.bbappend</filename>) and provides a convenient
|
|
mechanism to create your own recipe files
|
|
(<filename>.bb</filename>).
|
|
For details on how to create and work with layers, see the following
|
|
sections in the Yocto Project Development Manual:
|
|
<itemizedlist>
|
|
<listitem><para>"<ulink url='&YOCTO_DOCS_DEV_URL;#understanding-and-creating-layers'>Understanding and Creating Layers</ulink>" for
|
|
general information on layers and how to create layers.</para></listitem>
|
|
<listitem><para>"<ulink url='&YOCTO_DOCS_DEV_URL;#set-up-your-layer-for-the-build'>Set Up Your Layer for the Build</ulink>" for
|
|
specific instructions on setting up a layer for kernel
|
|
development.</para></listitem>
|
|
</itemizedlist>
|
|
</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_DEV_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 some general resources.
|
|
You can also see the
|
|
"<ulink url='&YOCTO_DOCS_DEV_URL;#set-up-your-layer-for-the-build'>Set Up Your Layer for the Build</ulink>" section
|
|
of the Yocto Project Development Manual for a detailed
|
|
example.
|
|
</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_3.19.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_3.19.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>
|
|
</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, see the
|
|
"<ulink url='&YOCTO_DOCS_DEV_URL;#patching-the-kernel'>Patching the Kernel</ulink>"
|
|
section in the Yocto Project Development Manual.
|
|
</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
|
|
"<ulink url='&YOCTO_DOCS_DEV_URL;#configuring-the-kernel'>Configuring the Kernel</ulink>"
|
|
section in the Yocto Project Development Manual.
|
|
</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,
|
|
edit the recipe that builds your kernel so that it has the
|
|
following command form:
|
|
<literallayout class='monospaced'>
|
|
KBUILD_DEFCONFIG_KMACHINE ?= <replaceable>defconfig_file</replaceable>
|
|
</literallayout>
|
|
You need to append the variable with
|
|
<ulink url='&YOCTO_DOCS_REF_URL;#var-KMACHINE'><filename>KMACHINE</filename></ulink>
|
|
and then supply the path to your "in-tree"
|
|
<filename>defconfig</filename> file.
|
|
</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-an-iterative-development-process'>
|
|
<title>Using an Iterative Development Process</title>
|
|
|
|
<para>
|
|
If you do not have existing patches or configuration files,
|
|
you can iteratively generate them from within the BitBake build
|
|
environment as described within this section.
|
|
During an iterative workflow, running a previously completed BitBake
|
|
task causes BitBake to invalidate the tasks that follow the
|
|
completed task in the build sequence.
|
|
Invalidated tasks rebuild the next time you run the build using
|
|
BitBake.
|
|
</para>
|
|
|
|
<para>
|
|
As you read this section, be sure to substitute the name
|
|
of your Linux kernel recipe for the term
|
|
"linux-yocto".
|
|
</para>
|
|
|
|
<section id='tip-dirty-string'>
|
|
<title>"-dirty" String</title>
|
|
|
|
<!--
|
|
<para>
|
|
<emphasis>AR - Darren Hart:</emphasis> This section
|
|
originated from the old Yocto Project Kernel Architecture
|
|
and Use Manual.
|
|
It was decided we need to put it in this section here.
|
|
Darren needs to figure out where we want it and what part
|
|
of it we want (all, revision???)
|
|
</para>
|
|
-->
|
|
|
|
<para>
|
|
If kernel images are being built with "-dirty" on the
|
|
end of the version string, this simply means that
|
|
modifications in the source directory have not been committed.
|
|
<literallayout class='monospaced'>
|
|
$ git status
|
|
</literallayout>
|
|
</para>
|
|
|
|
<para>
|
|
You can use the above Git command to report modified,
|
|
removed, or added files.
|
|
You should commit those changes to the tree regardless of
|
|
whether they will be saved, exported, or used.
|
|
Once you commit the changes, you need to rebuild the kernel.
|
|
</para>
|
|
|
|
<para>
|
|
To force a pickup and commit of all such pending changes,
|
|
enter the following:
|
|
<literallayout class='monospaced'>
|
|
$ git add .
|
|
$ git commit -s -a -m "getting rid of -dirty"
|
|
</literallayout>
|
|
</para>
|
|
|
|
<para>
|
|
Next, rebuild the kernel.
|
|
</para>
|
|
</section>
|
|
|
|
<section id='generating-configuration-files'>
|
|
<title>Generating Configuration Files</title>
|
|
|
|
<para>
|
|
You can manipulate the <filename>.config</filename> file
|
|
used to build a linux-yocto recipe with the
|
|
<filename>menuconfig</filename> command as follows:
|
|
<literallayout class='monospaced'>
|
|
$ bitbake linux-yocto -c menuconfig
|
|
</literallayout>
|
|
This command starts the Linux kernel configuration tool,
|
|
which allows you to prepare a new
|
|
<filename>.config</filename> file for the build.
|
|
When you exit the tool, be sure to save your changes
|
|
at the prompt.
|
|
</para>
|
|
|
|
<para>
|
|
The resulting <filename>.config</filename> file is
|
|
located in the build directory,
|
|
<filename>${</filename><ulink url='&YOCTO_DOCS_REF_URL;#var-B'><filename>B</filename></ulink><filename>}</filename>,
|
|
which expands to
|
|
<filename>${</filename><ulink url='&YOCTO_DOCS_REF_URL;#var-WORKDIR'><filename>WORKDIR</filename></ulink><filename>}</filename><filename>/linux-</filename><filename>${</filename><ulink url='&YOCTO_DOCS_REF_URL;#var-PACKAGE_ARCH'><filename>PACKAGE_ARCH</filename></ulink><filename>}-${</filename><ulink url='&YOCTO_DOCS_REF_URL;#var-LINUX_KERNEL_TYPE'><filename>LINUX_KERNEL_TYPE</filename></ulink><filename>}-build</filename>.
|
|
You can use the entire <filename>.config</filename> file as the
|
|
<filename>defconfig</filename> file as described in the
|
|
"<link linkend='changing-the-configuration'>Changing the Configuration</link>" section.
|
|
For more information on the <filename>.config</filename> file,
|
|
see the
|
|
"<ulink url='&YOCTO_DOCS_DEV_URL;#using-menuconfig'>Using <filename>menuconfig</filename></ulink>"
|
|
section in the Yocto Project Development Manual.
|
|
<note>
|
|
You can determine what a variable expands to by looking
|
|
at the output of the <filename>bitbake -e</filename>
|
|
command:
|
|
<literallayout class='monospaced'>
|
|
$ bitbake -e virtual/kernel
|
|
</literallayout>
|
|
Search the output for the variable in which you are
|
|
interested to see exactly how it is expanded and used.
|
|
</note>
|
|
</para>
|
|
|
|
<para>
|
|
A better 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>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 will be creating a
|
|
<filename>.config</filename> file from a known state.
|
|
Because situations exist where your build state might
|
|
become unknown, it is best to run the previous
|
|
command prior to starting up
|
|
<filename>menuconfig</filename>.
|
|
</para></listitem>
|
|
<listitem><para>Run the <filename>menuconfig</filename>
|
|
command:
|
|
<literallayout class='monospaced'>
|
|
$ bitbake linux-yocto -c menuconfig
|
|
</literallayout></para></listitem>
|
|
<listitem><para>Run the <filename>diffconfig</filename>
|
|
command to prepare a configuration fragment.
|
|
The resulting file <filename>fragment.cfg</filename>
|
|
will be 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 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>
|
|
The kernel tools also provide configuration validation.
|
|
You can use these tools to produce 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.
|
|
Here is an example with some sample output of the command
|
|
that runs these tools:
|
|
<literallayout class='monospaced'>
|
|
$ bitbake linux-yocto -c kernel_configcheck -f
|
|
|
|
...
|
|
|
|
NOTE: validating kernel configuration
|
|
This BSP sets 3 invalid/obsolete kernel options.
|
|
These config options are not offered anywhere within this kernel.
|
|
The full list can be found in your kernel src dir at:
|
|
meta/cfg/standard/mybsp/invalid.cfg
|
|
|
|
This BSP sets 21 kernel options that are possibly non-hardware related.
|
|
The full list can be found in your kernel src dir at:
|
|
meta/cfg/standard/mybsp/specified_non_hdw.cfg
|
|
|
|
WARNING: There were 2 hardware options requested that do not
|
|
have a corresponding value present in the final ".config" file.
|
|
This probably means you are not getting the config you wanted.
|
|
The full list can be found in your kernel src dir at:
|
|
meta/cfg/standard/mybsp/mismatch.cfg
|
|
</literallayout>
|
|
</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
|
|
<filename>kernel_configme</filename> and
|
|
<filename>kernel_configcheck</filename> commands until
|
|
they produce no warnings.
|
|
</para>
|
|
|
|
<para>
|
|
For more information on how to use the
|
|
<filename>menuconfig</filename> tool, see the
|
|
"<ulink url='&YOCTO_DOCS_DEV_URL;#using-menuconfig'>Using <filename>menuconfig</filename></ulink>"
|
|
section in the Yocto Project Development Manual.
|
|
</para>
|
|
</section>
|
|
|
|
<section id='modifying-source-code'>
|
|
<title>Modifying Source Code</title>
|
|
|
|
<para>
|
|
You can experiment with source code changes and create a
|
|
simple patch without leaving the BitBake environment.
|
|
To get started, be sure to complete a build at
|
|
least through the kernel configuration task:
|
|
<literallayout class='monospaced'>
|
|
$ bitbake linux-yocto -c kernel_configme -f
|
|
</literallayout>
|
|
Taking this step ensures you have the sources prepared
|
|
and the configuration completed.
|
|
You can find the sources in the build directory within the
|
|
<filename>source/</filename> directory, which is a symlink
|
|
(i.e. <filename>${</filename><ulink url='&YOCTO_DOCS_REF_URL;#var-B'><filename>B</filename></ulink><filename>}/source</filename>).
|
|
The <filename>source/</filename> directory expands to
|
|
<filename>${</filename><ulink url='&YOCTO_DOCS_REF_URL;#var-WORKDIR'><filename>WORKDIR</filename></ulink><filename>}</filename><filename>/linux-</filename><filename>${</filename><ulink url='&YOCTO_DOCS_REF_URL;#var-PACKAGE_ARCH'><filename>PACKAGE_ARCH</filename></ulink><filename>}-${</filename><ulink url='&YOCTO_DOCS_REF_URL;#var-LINUX_KERNEL_TYPE'><filename>LINUX_KERNEL_TYPE</filename></ulink><filename>}-build/source</filename>.
|
|
The directory pointed to by the
|
|
<filename>source/</filename> symlink is also known as
|
|
<filename>${</filename><ulink url='&YOCTO_DOCS_REF_URL;#var-STAGING_KERNEL_DIR'><filename>STAGING_KERNEL_DIR</filename></ulink><filename>}</filename>.
|
|
</para>
|
|
|
|
<para>
|
|
You can edit the sources as you would any other Linux source
|
|
tree.
|
|
However, keep in mind that you will lose changes if you
|
|
trigger the
|
|
<ulink url='&YOCTO_DOCS_REF_URL;#ref-tasks-fetch'><filename>do_fetch</filename></ulink>
|
|
task for the recipe.
|
|
You can avoid triggering this task by not using BitBake to
|
|
run the
|
|
<ulink url='&YOCTO_DOCS_REF_URL;#ref-tasks-cleanall'><filename>cleanall</filename></ulink>,
|
|
<ulink url='&YOCTO_DOCS_REF_URL;#ref-tasks-cleansstate'><filename>cleansstate</filename></ulink>,
|
|
or forced
|
|
<ulink url='&YOCTO_DOCS_REF_URL;#ref-tasks-fetch'><filename>fetch</filename></ulink>
|
|
commands.
|
|
Also, do not modify the recipe itself while working
|
|
with temporary changes or BitBake might run the
|
|
<filename>fetch</filename> command depending on the
|
|
changes to the recipe.
|
|
</para>
|
|
|
|
<para>
|
|
To test your temporary changes, instruct BitBake to run the
|
|
<filename>compile</filename> again.
|
|
The <filename>-f</filename> option forces the command to run
|
|
even though BitBake might think it has already done so:
|
|
<literallayout class='monospaced'>
|
|
$ bitbake linux-yocto -c compile -f
|
|
</literallayout>
|
|
If the compile fails, you can update the sources and repeat
|
|
the <filename>compile</filename>.
|
|
Once compilation is successful, you can inspect and test
|
|
the resulting build (i.e. kernel, modules, and so forth) from
|
|
the following build directory:
|
|
<literallayout class='monospaced'>
|
|
${WORKDIR}/linux-${PACKAGE_ARCH}-${LINUX_KERNEL_TYPE}-build
|
|
</literallayout>
|
|
Alternatively, you can run the <filename>deploy</filename>
|
|
command to place the kernel image in the
|
|
<filename>tmp/deploy/images</filename> directory:
|
|
<literallayout class='monospaced'>
|
|
$ bitbake linux-yocto -c deploy
|
|
</literallayout>
|
|
And, of course, you can perform the remaining installation and
|
|
packaging steps by issuing:
|
|
<literallayout class='monospaced'>
|
|
$ bitbake linux-yocto
|
|
</literallayout>
|
|
</para>
|
|
|
|
<para>
|
|
For rapid iterative development, the edit-compile-repeat loop
|
|
described in this section is preferable to rebuilding the
|
|
entire recipe because the installation and packaging tasks
|
|
are very time consuming.
|
|
</para>
|
|
|
|
<para>
|
|
Once you are satisfied with your source code modifications,
|
|
you can make them permanent by generating patches and
|
|
applying them to the
|
|
<ulink url='&YOCTO_DOCS_REF_URL;#var-SRC_URI'><filename>SRC_URI</filename></ulink>
|
|
statement as described in the
|
|
"<link linkend='applying-patches'>Applying Patches</link>"
|
|
section.
|
|
If you are not familiar with generating patches, refer to the
|
|
"<ulink url='&YOCTO_DOCS_DEV_URL;#creating-the-patch'>Creating the Patch</ulink>"
|
|
section in the Yocto Project Development Manual.
|
|
</para>
|
|
</section>
|
|
</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_DEV_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>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 Linux kernel you
|
|
are using (e.g.
|
|
<filename>linux-yocto-myproject_3.19.bb</filename>,
|
|
where "3.19" is the base version of the Linux kernel
|
|
with which you would be working).</para></listitem>
|
|
<listitem><para>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>Make sure you have either a
|
|
<filename>defconfig</filename> file or configuration
|
|
fragment files.
|
|
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> to the
|
|
<filename>files</filename> directory 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.
|
|
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>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.
|
|
"3.19").</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>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='http://git.yoctoproject.org/cgit.cgi'></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.
|
|
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>
|
|
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>
|
|
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>
|
|
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
|
|
-->
|