mirror of
https://git.yoctoproject.org/poky
synced 2026-02-11 03:03:02 +01:00
dev-manual, kernel-dev: Working kernel flow process using devtool
A work-in-progress of an example that modifies the kernel using the devtool. The procedure is not complete yet as it does not run properly. (From yocto-docs rev: 462ba2e46f237c294f05805ad5044291a085975d) Signed-off-by: Scott Rifenbark <srifenbark@gmail.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
committed by
Richard Purdie
parent
2a1bdf7416
commit
ea256df2a8
@@ -45,6 +45,67 @@
|
||||
information.
|
||||
</note>
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Following is a detailed example showing how to create a layer
|
||||
without the aid of tools for building the kernel:
|
||||
<orderedlist>
|
||||
<listitem><para>
|
||||
<emphasis>Create additional structure</emphasis>:
|
||||
Create the additional layer structure:
|
||||
<literallayout class='monospaced'>
|
||||
$ cd ~/poky/meta-mylayer
|
||||
$ mkdir conf
|
||||
$ mkdir recipes-kernel
|
||||
$ mkdir recipes-kernel/linux
|
||||
$ mkdir 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
|
||||
your patch file.
|
||||
</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 <filename>linux-yocto_3.4.bbappend</filename> file as follows:
|
||||
<literallayout class='monospaced'>
|
||||
FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
|
||||
|
||||
SRC_URI += "file://0001-calibrate-Add-printk-example.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.
|
||||
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 Manual.
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
<emphasis>Put the patch file in your layer</emphasis>:
|
||||
Move the <filename>0001-calibrate-Add-printk-example.patch</filename> file to
|
||||
the <filename>meta-mylayer/recipes-kernel/linux/linux-yocto</filename>
|
||||
directory.</para></listitem>
|
||||
</orderedlist>
|
||||
</para>
|
||||
</section>
|
||||
|
||||
<section id='modifying-an-existing-recipe'>
|
||||
@@ -72,11 +133,9 @@
|
||||
<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
|
||||
"<link linkend='set-up-your-layer-for-the-build'>Set Up Your Layer for the Build</link>"
|
||||
section for a detailed example.
|
||||
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'>
|
||||
@@ -452,63 +511,51 @@
|
||||
<section id="using-devtool-to-patch-the-kernel">
|
||||
<title>Using <filename>devtool</filename> to Patch the Kernel</title>
|
||||
|
||||
|
||||
<para role='writernotes'>
|
||||
Some stuff here for the using devtool from the wiki.
|
||||
This whole section is WIP.
|
||||
<orderedlist>
|
||||
<listitem><para role='writernotes'>
|
||||
If you are dealing with real hardware, you can flash the
|
||||
new kernel image to a USB stick and boot the hardware to
|
||||
see it run.
|
||||
</para></listitem>
|
||||
<listitem><para role='writernotes'>
|
||||
Checkout and modify the kernel source.
|
||||
This is where you make your changes to the image.
|
||||
</para></listitem>
|
||||
<listitem><para role='writernotes'>
|
||||
Create a new image that uses the altered kernel.
|
||||
</para></listitem>
|
||||
<listitem><para role='writernotes'>
|
||||
If you are working with actual hardware, you can flash
|
||||
the new image to a USB stick and use it to boot up the
|
||||
hardware.
|
||||
You can see your changes in action.
|
||||
</para></listitem>
|
||||
</orderedlist>
|
||||
This procedure currently does not work.
|
||||
It is WIP.
|
||||
</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.
|
||||
The steps in this procedure show you how you can patch the
|
||||
kernel using the extensible SDK and <filename>devtool</filename>.
|
||||
<note>
|
||||
You can use the <filename>yocto-kernel</filename> script
|
||||
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.
|
||||
<note>
|
||||
You can also use the <filename>yocto-kernel</filename> script
|
||||
found in the <ulink url='&YOCTO_DOCS_REF_URL;#source-directory'>Source Directory</ulink>
|
||||
under <filename>scripts</filename> to manage kernel patches and configuration.
|
||||
See the "<ulink url='&YOCTO_DOCS_BSP_URL;#managing-kernel-patches-and-config-items-with-yocto-kernel'>Managing kernel Patches and Config Items with yocto-kernel</ulink>"
|
||||
section in the Yocto Project Board Support Packages (BSP) Developer's Guide for
|
||||
more information.</note>
|
||||
section in the Yocto Project Board Support Packages (BSP)
|
||||
Developer's Guide for more information.
|
||||
</note>
|
||||
</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.
|
||||
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.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
The example builds an extensible SDK, which is then used to
|
||||
build, using <filename>devtool</filename>, a clean image for the
|
||||
default <filename>qemux86</filename> machine in a
|
||||
<ulink url='&YOCTO_DOCS_REF_URL;#source-directory'>Source Directory</ulink>
|
||||
named <filename>poky</filename>.
|
||||
In the example, the
|
||||
<ulink url='&YOCTO_DOCS_REF_URL;#build-directory'>Build Directory</ulink>
|
||||
is <filename>build</filename> and is located in the default
|
||||
<filename>poky_sdk</filename> directory.
|
||||
<note>
|
||||
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.
|
||||
</note>
|
||||
</para>
|
||||
|
||||
<para>
|
||||
@@ -517,159 +564,93 @@
|
||||
section.
|
||||
</para>
|
||||
|
||||
<section id='patch-kernel-set-up-the-build-host'>
|
||||
<title>Set Up the Build Host</title>
|
||||
|
||||
<para>
|
||||
Prior to creating any actual patches for your kernel, you
|
||||
need to prepare the build host.
|
||||
This example builds an extensible SDK.
|
||||
Follow these steps:
|
||||
<itemizedlist>
|
||||
<listitem><para>
|
||||
<emphasis>Set Up the Build Environment:</emphasis>
|
||||
Be sure you are set up to use BitBake in a shell.
|
||||
See the
|
||||
"<ulink url='&YOCTO_DOCS_DEV_URL;#setting-up-the-development-host-to-use-the-yocto-project'>Setting Up the Development Host to Use the Yocto Project</ulink>"
|
||||
section in the Yocto Project Development Manual for information
|
||||
on how to get a build host ready that is either a native
|
||||
Linux machine or a machine that uses CROPS.
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
<emphasis>Clone the <filename>poky</filename> Repository:</emphasis>
|
||||
You need to have a local copy of the Yocto Project
|
||||
<ulink url='&YOCTO_DOCS_REF_URL;#source-directory'>Source Directory</ulink>
|
||||
(i.e. a local <filename>poky</filename> repository).
|
||||
See the
|
||||
"<ulink url='&YOCTO_DOCS_DEV_URL;#cloning-the-poky-repository'>Cloning the <filename>poky</filename> Repository</ulink>"
|
||||
and possibly 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 all in the Yocto Project Development Manual for
|
||||
information on how to clone the <filename>poky</filename>
|
||||
repository and check out the appropriate branch for your work.
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
<emphasis>Initialize the Build Environment:</emphasis>
|
||||
While in the root directory of the Source Directory (i.e.
|
||||
<filename>poky</filename>), run the
|
||||
<ulink url='&YOCTO_DOCS_REF_URL;#structure-core-script'><filename>&OE_INIT_FILE;</filename></ulink>
|
||||
environment setup script to define the OpenEmbedded
|
||||
build environment on your build host.
|
||||
<literallayout class='monospaced'>
|
||||
$ source &OE_INIT_FILE;
|
||||
</literallayout>
|
||||
Among other things, the script creates the
|
||||
<ulink url='&YOCTO_DOCS_REF_URL;#build-directory'>Build Directory</ulink>,
|
||||
which is <filename>build</filename> in this case
|
||||
and is located in the
|
||||
<ulink url='&YOCTO_DOCS_REF_URL;#source-directory'>Source Directory</ulink>.
|
||||
After the script runs, your current working directory
|
||||
is set to the <filename>build</filename> directory.
|
||||
<note>
|
||||
For information on running a memory-resident
|
||||
<ulink url='&YOCTO_DOCS_REF_URL;#usingpoky-components-bitbake'>BitBake</ulink>,
|
||||
see the
|
||||
<ulink url='&YOCTO_DOCS_REF_URL;#structure-memres-core-script'><filename>oe-init-build-env-memres</filename></ulink>
|
||||
setup script.
|
||||
</note>
|
||||
</para></listitem>
|
||||
</itemizedlist>
|
||||
</para>
|
||||
</section>
|
||||
|
||||
<section id='create-a-layer-for-your-changes'>
|
||||
<title>Create a Layer for your Changes</title>
|
||||
|
||||
<para>
|
||||
The first step is to create a layer so you can isolate your
|
||||
changes to the kernel.
|
||||
Rather than use the <filename>yocto-layer</filename> script
|
||||
to create the layer, this example steps through the process
|
||||
by hand.
|
||||
If you want information on the script that creates a general
|
||||
layer, see the
|
||||
"<ulink url='&YOCTO_DOCS_DEV_URL;#creating-a-general-layer-using-the-yocto-layer-script'>Creating a General Layer Using the yocto-layer Script</ulink>"
|
||||
section in the Yocto Project Development Manual.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
These two commands create a directory you can use for your
|
||||
layer:
|
||||
<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'>
|
||||
$ cd ~/poky
|
||||
$ mkdir meta-mylayer
|
||||
$ devtool modify linux-yocto
|
||||
Loading cache: 100% |#######################################################################| Time: 0:00:00
|
||||
Loaded 1300 entries from dependency cache.
|
||||
WARNING: No bb files matched BBFILE_PATTERN_my-kernel '^/home/scottrif/poky_sdk/layers/meta-my-kernel/'
|
||||
WARNING: No bb files matched BBFILE_PATTERN_my-kernel '^/home/scottrif/poky_sdk/layers/meta-my-kernel/'
|
||||
WARNING: No bb files matched BBFILE_PATTERN_my-kernel '^/home/scottrif/poky_sdk/layers/meta-my-kernel/'
|
||||
|
||||
Summary: There was 1 WARNING message shown.
|
||||
Loading cache: 100% |########################################################################| Time: 0:00:00
|
||||
Loaded 1300 entries from dependency cache.
|
||||
WARNING: No bb files matched BBFILE_PATTERN_my-kernel '^/home/scottrif/poky_sdk/layers/meta-my-kernel/'
|
||||
WARNING: No bb files matched BBFILE_PATTERN_my-kernel '^/home/scottrif/poky_sdk/layers/meta-my-kernel/'
|
||||
WARNING: No bb files matched BBFILE_PATTERN_my-kernel '^/home/scottrif/poky_sdk/layers/meta-my-kernel/'
|
||||
|
||||
Summary: There was 1 WARNING message shown.
|
||||
NOTE: Executing RunQueue Tasks
|
||||
NOTE: Executing do_fetch...
|
||||
NOTE: Executing do_unpack...
|
||||
NOTE: Tasks Summary: Attempted 2 tasks of which 0 didn't need to be rerun and all succeeded.
|
||||
NOTE: Executing RunQueue Tasks
|
||||
NOTE: Executing do_kernel_checkout...
|
||||
NOTE: Tasks Summary: Attempted 3 tasks of which 2 didn't need to be rerun and all succeeded.
|
||||
NOTE: Patching...
|
||||
NOTE: Executing RunQueue Tasks
|
||||
NOTE: Executing do_validate_branches...
|
||||
NOTE: Executing do_kernel_metadata...
|
||||
NOTE: Executing do_patch...
|
||||
NOTE: Tasks Summary: Attempted 6 tasks of which 3 didn't need to be rerun and all succeeded.
|
||||
NOTE: Generating kernel config
|
||||
NOTE: Executing RunQueue Tasks
|
||||
NOTE: Executing do_kernel_configme...
|
||||
NOTE: Executing do_prepare_recipe_sysroot...
|
||||
NOTE: Executing do_configure...
|
||||
NOTE: Tasks Summary: Attempted 9 tasks of which 6 didn't need to be rerun and all succeeded.
|
||||
NOTE: Copying kernel config to srctree
|
||||
NOTE: Source tree extracted to /home/scottrif/poky_sdk/workspace/sources/linux-yocto
|
||||
NOTE: Recipe linux-yocto now set up to build from /home/scottrif/poky_sdk/workspace/sources/linux-yocto
|
||||
</literallayout>
|
||||
Creating a directory that follows the Yocto Project layer naming
|
||||
conventions sets up the layer for your changes.
|
||||
The layer is where you place your configuration files, append
|
||||
files, and patch files.
|
||||
To learn more about creating a layer and filling it with the
|
||||
files you need, see the
|
||||
"<ulink url='&YOCTO_DOCS_DEV_URL;#understanding-and-creating-layers'>Understanding and Creating Layers</ulink>"
|
||||
section in the Yocto Project Development Manual.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
<section id='finding-the-kernel-source-code'>
|
||||
<title>Finding the Kernel Source Code</title>
|
||||
|
||||
<para>
|
||||
Each time you build a kernel image, the kernel source code
|
||||
is fetched and unpacked into the following directory:
|
||||
<literallayout class='monospaced'>
|
||||
${S}/linux
|
||||
</literallayout>
|
||||
See the "<ulink url='&YOCTO_DOCS_DEV_URL;#finding-the-temporary-source-code'>Finding Temporary Source Code</ulink>"
|
||||
section in the Yocto Project Development Manual and the
|
||||
<ulink url='&YOCTO_DOCS_REF_URL;#var-S'><filename>S</filename></ulink>
|
||||
variable for more information about where source is kept
|
||||
during a build.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
For this example, we are going to patch the
|
||||
<filename>init/calibrate.c</filename> file
|
||||
by adding some simple console <filename>printk</filename> statements that we can
|
||||
see when we boot the image using QEMU.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
<section id='creating-the-patch'>
|
||||
<title>Creating the Patch</title>
|
||||
|
||||
<para>
|
||||
Two methods exist by which you can create the patch:
|
||||
<ulink url='&YOCTO_DOCS_SDK_URL;#using-devtool-in-your-sdk-workflow'><filename>devtool</filename></ulink>
|
||||
and
|
||||
<ulink url='&YOCTO_DOCS_DEV_URL;#using-a-quilt-workflow'>Quilt</ulink>.
|
||||
For kernel patches, the Git workflow is more appropriate.
|
||||
This section assumes the Git workflow and shows the steps
|
||||
specific to this example.
|
||||
<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/build/tmp/work/qemux86-poky-linux/linux-yocto-${PV}-${PR}/linux
|
||||
$ cd ~/poky_sdk/workspace/sources/linux-yocto
|
||||
</literallayout>
|
||||
Because you are working in an established Git repository,
|
||||
you must be in this directory in order to commit your changes
|
||||
and create the patch file.
|
||||
<note>The <ulink url='&YOCTO_DOCS_REF_URL;#var-PV'><filename>PV</filename></ulink> and
|
||||
<ulink url='&YOCTO_DOCS_REF_URL;#var-PR'><filename>PR</filename></ulink> variables
|
||||
represent the version and revision for the
|
||||
<filename>linux-yocto</filename> recipe.
|
||||
The <filename>PV</filename> variable includes the Git meta and machine
|
||||
hashes, which make the directory name longer than you might
|
||||
expect.
|
||||
</note></para></listitem>
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
<emphasis>Edit the source file</emphasis>:
|
||||
Edit the <filename>init/calibrate.c</filename> file to have the
|
||||
following changes:
|
||||
Edit the <filename>init/calibrate.c</filename> file to have
|
||||
the following changes:
|
||||
<literallayout class='monospaced'>
|
||||
void calibrate_delay(void)
|
||||
{
|
||||
@@ -687,202 +668,239 @@
|
||||
.
|
||||
.
|
||||
.
|
||||
</literallayout></para></listitem>
|
||||
<listitem><para><emphasis>Stage and commit your changes</emphasis>:
|
||||
These Git commands display the modified file, stage it, and then
|
||||
commit the file:
|
||||
<literallayout class='monospaced'>
|
||||
$ git status
|
||||
$ git add init/calibrate.c
|
||||
$ git commit -m "calibrate: Add printk example"
|
||||
</literallayout></para></listitem>
|
||||
<listitem><para><emphasis>Generate the patch file</emphasis>:
|
||||
This Git command creates the a patch file named
|
||||
<filename>0001-calibrate-Add-printk-example.patch</filename>
|
||||
in the current directory.
|
||||
<literallayout class='monospaced'>
|
||||
$ git format-patch -1
|
||||
</literallayout>
|
||||
</para></listitem>
|
||||
</orderedlist>
|
||||
</para>
|
||||
</section>
|
||||
</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
|
||||
Parsing recipes: 100% |####################################################################################| Time: 0:00:31
|
||||
Parsing of 831 .bb files complete (0 cached, 831 parsed). 1300 targets, 48 skipped, 0 masked, 0 errors.
|
||||
WARNING: No bb files matched BBFILE_PATTERN_my-kernel '^/home/scottrif/poky_sdk/layers/meta-my-kernel/'
|
||||
NOTE: There are 1 recipes to be removed from sysroot qemux86, removing...
|
||||
NOTE: Resolving any missing task queue dependencies
|
||||
Initialising tasks: 100% |#################################################################################| Time: 0:00:00
|
||||
Checking sstate mirror object availability: 100% |#########################################################| Time: 0:00:00
|
||||
NOTE: Executing SetScene Tasks
|
||||
NOTE: Executing RunQueue Tasks
|
||||
linux-yocto-4.10.17+git999-r0 do_compile: NOTE: linux-yocto: compiling from external source tree /home/scottrif/poky_sdk/workspace/sources/linux-yocto
|
||||
NOTE: Tasks Summary: Attempted 471 tasks of which 454 didn't need to be rerun and all succeeded.
|
||||
|
||||
<section id='set-up-your-layer-for-the-build'>
|
||||
<title>Set Up Your Layer for the Build</title>
|
||||
Summary: There was 1 WARNING message shown.
|
||||
</literallayout>
|
||||
</para></listitem>
|
||||
<!--
|
||||
<listitem><para>
|
||||
|
||||
<para>These steps get your layer set up for the build:
|
||||
NOTE: This stuff is how it would have been if a *.wic file was created
|
||||
when the image was built earlier. That is the method used by the
|
||||
example in the wiki (https://wiki.yoctoproject.org/wiki/TipsAndTricks/KernelDevelopmentWithEsdk).
|
||||
I am leaving it here for now.
|
||||
|
||||
<emphasis>Create the Image With the New Kernel:</emphasis>
|
||||
Normally, you would create a new image using the
|
||||
<filename>devtool build-image</filename> command.
|
||||
However, this method can take some time and alters the
|
||||
kernel source folder.
|
||||
A faster option is to use
|
||||
<ulink url='https://linux.die.net/man/8/kpartx'><filename>kpartx</filename></ulink>
|
||||
to splice the new kernel into the image you have already built.
|
||||
<note>
|
||||
You might have to install <filename>kpartx</filename>
|
||||
onto your build host.
|
||||
</note>
|
||||
Follow these steps to create the image with the new kernel:
|
||||
<orderedlist>
|
||||
<listitem><para><emphasis>Create additional structure</emphasis>:
|
||||
Create the additional layer structure:
|
||||
<literallayout class='monospaced'>
|
||||
$ cd ~/poky/meta-mylayer
|
||||
$ mkdir conf
|
||||
$ mkdir recipes-kernel
|
||||
$ mkdir recipes-kernel/linux
|
||||
$ mkdir 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
|
||||
your patch file.</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 <filename>linux-yocto_3.4.bbappend</filename> file as follows:
|
||||
<literallayout class='monospaced'>
|
||||
FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
|
||||
|
||||
SRC_URI += "file://0001-calibrate-Add-printk-example.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.
|
||||
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 Manual.
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
<emphasis>Put the patch file in your layer</emphasis>:
|
||||
Move the <filename>0001-calibrate-Add-printk-example.patch</filename> file to
|
||||
the <filename>meta-mylayer/recipes-kernel/linux/linux-yocto</filename>
|
||||
directory.</para></listitem>
|
||||
</orderedlist>
|
||||
</para>
|
||||
</section>
|
||||
|
||||
<section id='set-up-for-the-build'>
|
||||
<title>Set Up for the Build</title>
|
||||
|
||||
<para>
|
||||
Do the following to make sure the build parameters are set up for the example.
|
||||
Once you set up these build parameters, they do not have to change unless you
|
||||
change the target architecture of the machine you are building:
|
||||
<itemizedlist>
|
||||
<listitem><para><emphasis>Build for the correct target architecture:</emphasis> Your
|
||||
selected <ulink url='&YOCTO_DOCS_REF_URL;#var-MACHINE'><filename>MACHINE</filename></ulink>
|
||||
definition within the <filename>local.conf</filename> file in the
|
||||
<ulink url='&YOCTO_DOCS_REF_URL;#build-directory'>Build Directory</ulink>
|
||||
specifies the target architecture used when building the Linux kernel.
|
||||
By default, <filename>MACHINE</filename> is set to
|
||||
<filename>qemux86</filename>, which specifies a 32-bit
|
||||
<trademark class='registered'>Intel</trademark> Architecture
|
||||
target machine suitable for the QEMU emulator.</para></listitem>
|
||||
<listitem><para><emphasis>Identify your <filename>meta-mylayer</filename>
|
||||
layer:</emphasis> The
|
||||
<ulink url='&YOCTO_DOCS_REF_URL;#var-BBLAYERS'><filename>BBLAYERS</filename></ulink>
|
||||
variable in the
|
||||
<filename>bblayers.conf</filename> file found in the
|
||||
<filename>poky/build/conf</filename> directory needs to have the path to your local
|
||||
<filename>meta-mylayer</filename> layer.
|
||||
By default, the <filename>BBLAYERS</filename> variable contains paths to
|
||||
<filename>meta</filename>, <filename>meta-poky</filename>, and
|
||||
<filename>meta-yocto-bsp</filename> in the
|
||||
<filename>poky</filename> Git repository.
|
||||
Add the path to your <filename>meta-mylayer</filename> location:
|
||||
<emphasis>Make a Copy of Your Wic File:</emphasis>
|
||||
Create a copy of your Wic from into the
|
||||
<filename>/tmp</filename> directory:
|
||||
<literallayout class='monospaced'>
|
||||
BBLAYERS ?= " \
|
||||
$HOME/poky/meta \
|
||||
$HOME/poky/meta-poky \
|
||||
$HOME/poky/meta-yocto-bsp \
|
||||
$HOME/poky/meta-mylayer \
|
||||
"
|
||||
</literallayout></para></listitem>
|
||||
</itemizedlist>
|
||||
</para>
|
||||
</section>
|
||||
|
||||
<section id='build-the-modified-qemu-kernel-image'>
|
||||
<title>Build the Modified QEMU Kernel Image</title>
|
||||
|
||||
<para>
|
||||
The following steps build your modified kernel image:
|
||||
<orderedlist>
|
||||
<listitem><para><emphasis>Be sure your build environment is initialized</emphasis>:
|
||||
Your environment should be set up since you previously sourced
|
||||
the
|
||||
<ulink url='&YOCTO_DOCS_REF_URL;#structure-core-script'><filename>&OE_INIT_FILE;</filename></ulink>
|
||||
script.
|
||||
If it is not, source the script again from <filename>poky</filename>.
|
||||
<literallayout class='monospaced'>
|
||||
$ cd ~/poky
|
||||
$ source &OE_INIT_FILE;
|
||||
$ cp tmp/deploy/images/qemux86/core-image-minimal-qemux86.wic /tmp
|
||||
</literallayout>
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
<emphasis>Clean up</emphasis>:
|
||||
Be sure to clean the shared state out by using BitBake
|
||||
to run from within the Build Directory the
|
||||
<ulink url='&YOCTO_DOCS_REF_URL;#ref-tasks-cleansstate'><filename>do_cleansstate</filename></ulink>
|
||||
task as follows:
|
||||
<emphasis>Create Loopback Devices for Partitions:</emphasis>
|
||||
Next, create loopback devices for each partition in
|
||||
the Wic file.
|
||||
<note>
|
||||
The first unused loopback device is automatically
|
||||
allocated.
|
||||
</note>
|
||||
In this example, the command's output uses a variable
|
||||
"<replaceable>X</replaceable>" to indicate the loopback
|
||||
device.
|
||||
The actual output you get when you run the command lists
|
||||
the actual loopback devices (e.g. "loop0p1", "loop0p2",
|
||||
and "loop0p3"):
|
||||
<literallayout class='monospaced'>
|
||||
$ bitbake -c cleansstate linux-yocto
|
||||
</literallayout></para>
|
||||
<para>
|
||||
<note>
|
||||
Never remove any files by hand from the
|
||||
<filename>tmp/deploy</filename>
|
||||
directory inside the
|
||||
<ulink url='&YOCTO_DOCS_REF_URL;#build-directory'>Build Directory</ulink>.
|
||||
Always use the various BitBake clean tasks to
|
||||
clear out previous build artifacts.
|
||||
For information on the clean tasks, see the
|
||||
"<ulink url='&YOCTO_DOCS_REF_URL;#ref-tasks-clean'><filename>do_clean</filename></ulink>",
|
||||
"<ulink url='&YOCTO_DOCS_REF_URL;#ref-tasks-cleanall'><filename>do_cleanall</filename></ulink>",
|
||||
and
|
||||
"<ulink url='&YOCTO_DOCS_REF_URL;#ref-tasks-cleansstate'><filename>do_cleansstate</filename></ulink>"
|
||||
sections all in the Yocto Project Reference
|
||||
Manual.
|
||||
</note>
|
||||
$ sudo kpartx -v -a /tmp/core-image-minimal-qemux86.wic
|
||||
add map loop<replaceable>X</replaceable>p1 (253:6): 0 47446 linear /dev/loopX 2048
|
||||
add map loop<replaceable>X</replaceable>p2 (253:7): 0 119356 linear /dev/loopX 51200
|
||||
add map loop<replaceable>X</replaceable>p3 (253:8): 0 90112 linear /dev/loopX 170556
|
||||
</literallayout>
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
<emphasis>Build the image</emphasis>:
|
||||
Next, build the kernel image using this command:
|
||||
<emphasis>Mount the First Device:</emphasis>
|
||||
The kernel is in the first device, so mount
|
||||
<filename>/dev/mapper/loop</filename><replaceable>X</replaceable><filename>p1</filename>:
|
||||
<note>
|
||||
Be sure to replace the "<replaceable>X</replaceable>"
|
||||
in "loop<replaceable>X</replaceable>p1" with the
|
||||
automatically allocated loopback device
|
||||
(e.g loop0p1).
|
||||
</note>
|
||||
<literallayout class='monospaced'>
|
||||
$ bitbake -k linux-yocto
|
||||
</literallayout></para></listitem>
|
||||
$ sudo mkdir /mnt/wic-p1
|
||||
$ sudo mount /dev/mapper/loop<replaceable>X</replaceable>p1 /mnt/wic-p1
|
||||
</literallayout>
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
<emphasis>Copy Over the New Kernel:</emphasis>
|
||||
Now copy over new kernel using the following:
|
||||
<literallayout class='monospaced'>
|
||||
$ sudo cp workspace/sources/linux-yocto/arch/x86/boot/bzImage /mnt/wic-p1
|
||||
</literallayout>
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
Finally, unmount the device and use
|
||||
<filename>kpartx</filename> to delete the partition
|
||||
mappings:
|
||||
<note>
|
||||
Replace the "<replaceable>X</replaceable>" in
|
||||
"loop<replaceable>X</replaceable>" with the
|
||||
automatically allocated loopback device from
|
||||
earlier (e.g "loop0").
|
||||
</note>
|
||||
<literallayout class='monospaced'>
|
||||
$ sudo umount /mnt/wic-p1
|
||||
$ sudo kpartx -d /dev/loop<replaceable>X</replaceable>
|
||||
</literallayout>
|
||||
</para></listitem>
|
||||
</orderedlist>
|
||||
</para>
|
||||
</section>
|
||||
</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
|
||||
Loading cache: 100% |###########################################################################| Time: 0:00:00
|
||||
Loaded 1299 entries from dependency cache.
|
||||
Parsing recipes: 100% |#########################################################################| Time: 0:00:00
|
||||
Parsing of 831 .bb files complete (830 cached, 1 parsed). 1300 targets, 48 skipped, 0 masked, 0 errors.
|
||||
WARNING: No bb files matched BBFILE_PATTERN_my-kernel '^/home/scottrif/poky_sdk/layers/meta-my-kernel/'
|
||||
WARNING: No bb files matched BBFILE_PATTERN_my-kernel '^/home/scottrif/poky_sdk/layers/meta-my-kernel/'
|
||||
WARNING: No bb files matched BBFILE_PATTERN_my-kernel '^/home/scottrif/poky_sdk/layers/meta-my-kernel/'
|
||||
|
||||
<section id='boot-the-image-and-verify-your-changes'>
|
||||
<title>Boot the Image and Verify Your Changes</title>
|
||||
Summary: There was 1 WARNING message shown.
|
||||
WARNING: Skipping recipe linux-yocto as it doesn't produce a package with the same name
|
||||
WARNING: No recipes in workspace, building image core-image-minimal unmodified
|
||||
Loading cache: 100% |###########################################################################| Time: 0:00:00
|
||||
Loaded 1299 entries from dependency cache.
|
||||
Parsing recipes: 100% |#########################################################################| Time: 0:00:00
|
||||
Parsing of 831 .bb files complete (830 cached, 1 parsed). 1300 targets, 48 skipped, 0 masked, 0 errors.
|
||||
WARNING: No bb files matched BBFILE_PATTERN_my-kernel '^/home/scottrif/poky_sdk/layers/meta-my-kernel/'
|
||||
NOTE: Resolving any missing task queue dependencies
|
||||
Initialising tasks: 100% |######################################################################| Time: 0:00:06
|
||||
Checking sstate mirror object availability: 100% |##############################################| Time: 0:00:00
|
||||
NOTE: Executing SetScene Tasks
|
||||
NOTE: Executing RunQueue Tasks
|
||||
NOTE: Tasks Summary: Attempted 2393 tasks of which 2375 didn't need to be rerun and all succeeded.
|
||||
|
||||
<para>
|
||||
These steps boot the image and allow you to see the changes
|
||||
Summary: There was 1 WARNING message shown.
|
||||
NOTE: Successfully built core-image-minimal. You can find output files in /home/scottrif/poky_sdk/tmp/deploy/images/qemux86
|
||||
</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>:
|
||||
<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>
|
||||
</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.</para></listitem>
|
||||
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>
|
||||
</section>
|
||||
</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 a <filename>.bbappend</filename>:</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-my-kernel</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 /path/to/meta-my-kernel
|
||||
</literallayout>
|
||||
Once the command finishes, the patches and the
|
||||
<filename>.bbappend</filename> file are located in the
|
||||
<filename>~/meta-my-kernel/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>
|
||||
</section>
|
||||
|
||||
<section id='using-an-iterative-development-process'>
|
||||
@@ -1174,7 +1192,7 @@
|
||||
are very time consuming.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
<para role='writernotes'>
|
||||
Once you are satisfied with your source code modifications,
|
||||
you can make them permanent by generating patches and
|
||||
applying them to the
|
||||
@@ -1183,7 +1201,7 @@
|
||||
"<link linkend='applying-patches'>Applying Patches</link>"
|
||||
section.
|
||||
If you are not familiar with generating patches, refer to the
|
||||
"<link linkend='creating-the-patch'>Creating the Patch</link>"
|
||||
"I need a linked section here for the patch stuff"
|
||||
section.
|
||||
</para>
|
||||
</section>
|
||||
|
||||
Reference in New Issue
Block a user