mirror of
https://git.yoctoproject.org/poky
synced 2026-01-29 21:08:42 +01:00
Initial content in and the formatting complete. Some bad links fixed also. (From yocto-docs rev: 2461522b77c8240476a14aef8f3e94336419af56) Signed-off-by: Scott Rifenbark <scott.m.rifenbark@intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
780 lines
44 KiB
XML
780 lines
44 KiB
XML
<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
|
||
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
|
||
|
||
<chapter id='dev-manual-cases'>
|
||
|
||
<title>Development Cases</title>
|
||
|
||
<para>
|
||
For the purposes of this manual we are going to focus on two common development cases or groupings:
|
||
System Development and User Application Development.
|
||
System Development covers Board Support Package (BSP) development and kernel image modification.
|
||
User Application Development covers development of applications that you intend to run on some
|
||
target hardware.
|
||
</para>
|
||
|
||
<para>
|
||
[WRITERS NOTE: What is undetermined at this point is how much of the entire development process
|
||
we include in this particular chapter.
|
||
In other words, do we cover debugging and emulation steps here on a case-specific basis?
|
||
Or, do we capture that information in the appropriate subsequent chapter by case?]
|
||
</para>
|
||
|
||
<section id='system-development'>
|
||
<title>System Development</title>
|
||
|
||
<para>
|
||
System development involves modification or creation of an image that you want to run on
|
||
a specific hardware target.
|
||
Usually when you want to create an image that runs on embedded hardware the image does
|
||
not require the same amount of features that a full-fledged Linux distribution provides.
|
||
Thus, you can create a much smaller image that is designed to just use the hardware
|
||
features for your particular hardware.
|
||
</para>
|
||
|
||
<para>
|
||
To help you understand how system development works in the Yocto Project, this section
|
||
covers two types of image development: BSP creation and kernel modification.
|
||
</para>
|
||
|
||
<section id='developing-a-board-support-package-bsp'>
|
||
<title>Developing a Board Support Package (BSP)</title>
|
||
|
||
<para>
|
||
A BSP is a package of recipes that when applied while building an image results in
|
||
an image you can run on a particular board.
|
||
Thus, the package, when compiled into the new image, supports the operation of the board.
|
||
</para>
|
||
|
||
<para>
|
||
Packages consist of recipes.
|
||
Recipes are sets of instructions for building a package.
|
||
The recipes describe where to get source code and what patches to apply.
|
||
Recipes also describe dependencies for libraries or for other recipes.
|
||
They also contain configuration and compilation options.
|
||
Recipes are logical units of execution.
|
||
</para>
|
||
|
||
<para>
|
||
Here are the basic steps involved in creating a BSP:
|
||
<orderedlist>
|
||
<listitem><para>Be sure you are set up to use Yocto Project (see
|
||
<xref linkend='dev-manual-start'>Getting Started with the Yocto Project</xref>).</para></listitem>
|
||
<listitem><para>Choose a BSP available with Yocto Project that most closely represents
|
||
your hardware.</para></listitem>
|
||
<listitem><para>Get set up with a base BSP.</para></listitem>
|
||
<listitem><para>Make a copy of the existing BSP and isolate your work by creating a layer
|
||
for your recipes.</para></listitem>
|
||
<listitem><para>Make configuration and recipe changes to your new BSP layer.</para></listitem>
|
||
<listitem><para>Prepare for the build.</para></listitem>
|
||
<listitem><para>Select and configure the kernel. (WRITER'S NOTE: Not sure on this step).</para></listitem>
|
||
<listitem><para>Identify the machine branch in the Git repository.</para></listitem>
|
||
<listitem><para>Build the image.</para></listitem>
|
||
</orderedlist>
|
||
You can view a video presentation of the BSP creation process
|
||
<ulink url='http://free-electrons.com/blog/elc-2011-videos'>here</ulink>.
|
||
You can also find supplemental information in the
|
||
<ulink url='http://yoctoproject.org/docs/1.1/bsp-guide/bsp-guide.html'>
|
||
Board Support Package (BSP) Development Guide</ulink>.
|
||
Finally, there is wiki page write up of the example located
|
||
<ulink url='https://wiki.yoctoproject.org/wiki/Transcript:_creating_one_generic_Atom_BSP_from_another'>
|
||
here</ulink> you might find helpful.
|
||
</para>
|
||
|
||
<section id='setting-up-yocto-project'>
|
||
<title>Setting Up Yocto Project</title>
|
||
|
||
<para>
|
||
For general host development system preparation such as package requirements and
|
||
operating system requirements, see
|
||
<xref linkend='dev-manual-start'>Getting Started with the Yocto Project</xref>)Chapter 2 of
|
||
this manual or the
|
||
<ulink url='http://www.yoctoproject.org/docs/1.1/yocto-project-qs/yocto-project-qs.html'>
|
||
Yocto Project Quick Start</ulink>.
|
||
</para>
|
||
|
||
<para>
|
||
You need to have the Yocto Project source tree available on your host system.
|
||
You can get that through tarball extraction or by initializing and checking out the
|
||
Yocto Project Git repository.
|
||
Typically, checking out the Git repository is the method to use.
|
||
This allows you to maintain a complete history of changes and facilitates you
|
||
contributing back to the Yocto Project.
|
||
However, if you just want the source you can download the Yocto Project Release
|
||
tarball from the
|
||
<ulink url='http://yoctoproject.org/download'>download page</ulink>.
|
||
If you download the tarball you can extract it into any directory you want using the
|
||
tar command.
|
||
For example, the following commands extract the 1.0.1 release tarball into
|
||
<filename>/usr/local/yocto</filename> with the Yocto Project source directory as
|
||
<filename>poky.bernard.5.0.1.tar.bz2</filename>:
|
||
<literallayout class='monospaced'>
|
||
/usr/local/yocto$ tar xfj poky.bernard.5.0.1.tar.bz2
|
||
</literallayout>
|
||
</para>
|
||
|
||
<para>
|
||
The following transcript shows how to initialize a Git repository and checkout the
|
||
Yocto Project source tree:
|
||
<literallayout class='monospaced'>
|
||
/usr/local/yocto$ git init
|
||
Initialized empty Git repository in /usr/local/yocto/.git
|
||
/usr/local/yocto$ git remote add poky git://git.yoctoproject.org/poky.git
|
||
/usr/local/yocto$ git remote update
|
||
Fetching poky
|
||
remote: Counting objects: 106111, done.
|
||
remote: Compressing objects: 100% (36106/36106), done.
|
||
remote: Total 106111 (delta 72275), reused 99193 (delta 66808)
|
||
Receiving objects: 100% (106111/106111), 69.51 MiB | 518 KiB/s, done.
|
||
Resolving deltas: 100% (72275/72275), done.
|
||
From git://git.yoctoproject.org/poky
|
||
* [new branch] 1.1_M1 -> poky/1.1_M1
|
||
* [new branch] 1.1_M2 -> poky/1.1_M2
|
||
* [new branch] bernard -> poky/bernard
|
||
* [new branch] blinky -> poky/blinky
|
||
* [new branch] clyde -> poky/clyde
|
||
* [new branch] elroy -> poky/elroy
|
||
* [new branch] green -> poky/green
|
||
* [new branch] laverne -> poky/laverne
|
||
* [new branch] master -> poky/master
|
||
* [new branch] pinky -> poky/pinky
|
||
* [new branch] purple -> poky/purple
|
||
* [new tag] 1.1_M1.final -> 1.1_M1.final
|
||
* [new tag] 1.1_M2.rc1 -> 1.1_M2.rc1
|
||
* [new tag] bernard-5.0.1 -> bernard-5.0.1
|
||
* [new tag] pinky-3.1.2 -> pinky-3.1.2
|
||
From git://git.yoctoproject.org/poky
|
||
* [new tag] 1.1_M1.rc1 -> 1.1_M1.rc1
|
||
* [new tag] 1.1_M1.rc2 -> 1.1_M1.rc2
|
||
* [new tag] bernard-1.0rc1 -> bernard-1.0rc1
|
||
* [new tag] bernard-5.0 -> bernard-5.0
|
||
* [new tag] bernard-5.0-alpha -> bernard-5.0-alpha
|
||
* [new tag] bernard-5.0rc1 -> bernard-5.0rc1
|
||
* [new tag] bernard-5.0rc2 -> bernard-5.0rc2
|
||
* [new tag] laverne-4.0 -> laverne-4.0
|
||
* [new tag] laverne-4.0.1 -> laverne-4.0.1
|
||
* [new tag] m4 -> m4
|
||
* [new tag] purple-3.2 -> purple-3.2
|
||
* [new tag] purple-3.2.1 -> purple-3.2.1
|
||
</literallayout>
|
||
</para>
|
||
|
||
<para>
|
||
Once you have the repository set up, you have many development branches from which
|
||
you can work.
|
||
For this example we are going to use the Yocto Project 1.0.1 Release,
|
||
which maps to the <filename>Bernard 5.0.1</filename> tag in Git.
|
||
<literallayout class='monospaced'>
|
||
/usr/local/yocto$ git checkout -b Bernard-5.0.1 bernard-5.0.1
|
||
Switched to a new branch 'bernard-5.0.1'
|
||
</literallayout>
|
||
</para>
|
||
</section>
|
||
|
||
<section id='choosing-a-base-bsp'>
|
||
<title>Choosing a Base BSP</title>
|
||
|
||
<para>
|
||
The Yocto Project ships with several BSPs that support various hardware.
|
||
It is best to base your new BSP on an existing BSP rather than create all the
|
||
recipes and configuration files from scratch.
|
||
While it is possible to create everything from scratch, basing your new BSP
|
||
on something that is close is much easier.
|
||
Or, at a minimum, it gives you some structure with which to start.
|
||
</para>
|
||
|
||
<para>
|
||
At this point you need to understand your target hardware well enough to determine which
|
||
existing BSP most closely matches it.
|
||
Things to consider are your hardware’s on-board features such as CPU type and graphics support.
|
||
You should look at the README files for supported BSPs to get an idea of which one
|
||
you could use.
|
||
A generic Atom-based BSP to consider is the Crown Bay with no Intel® Embedded Media
|
||
Graphics Driver (EMGD) support.
|
||
That is the BSP that this example is going to use.
|
||
</para>
|
||
|
||
<para>
|
||
To see the supported BSPs, go to the Yocto Project
|
||
<ulink url='http://www.yoctoproject.org/download'>download page</ulink> and click on “BSP Downloads.”
|
||
</para>
|
||
</section>
|
||
|
||
<section id='getting-your-base-bsp'>
|
||
<title>Getting Your Base BSP</title>
|
||
|
||
<para>
|
||
You need to have the base BSP layer on your development system.
|
||
Like the Yocto Project source tree you can get the BSP layer one of two ways:
|
||
download the tarball and extract it, or initialize a Git repository and check out the BSP.
|
||
You should use the same method that you used for the Yocto Project source tree.
|
||
</para>
|
||
|
||
<para>
|
||
If you are using tarball extraction then simply download the tarball for the base
|
||
BSP you chose in the previous step and then extract it into any directory
|
||
you choose using the tar command.
|
||
Upon extraction, the BSP source directory (layer) will be named
|
||
<filename>meta-<BSP_name></filename>.
|
||
The following command extracts the Crown Bay BSP into a directory named
|
||
<filename>meta-crownbay</filename>:
|
||
<literallayout class='monospaced'>
|
||
/usr/local$ tar xjf crownbay-noemgd-bernard-5.0.1.tar.bz2
|
||
</literallayout>
|
||
</para>
|
||
|
||
<para>
|
||
If you initialized a Yocto Project Git repository then you need to do the same for the
|
||
BSP, which is located in the meta-intel Git repository.
|
||
The meta-intel repository contains all the metadata that supports BSP creation.
|
||
</para>
|
||
|
||
<para>
|
||
The following transcript shows the steps to create and set up the meta-intel Git
|
||
repository inside the Yocto Project Git repository:
|
||
<literallayout class='monospaced'>
|
||
/usr/local/yocto$ mkdir meta-intel
|
||
/usr/local/yocto$ cd meta-intel
|
||
/usr/local/yocto/meta-intel$ git init
|
||
Initialized empty Git repository in /usr/local/yocto/meta-intel/.git/
|
||
/usr/local/yocto/meta-intel$ git remote add meta-intel \ git://git.yoctoproject.org/meta-intel.git
|
||
/usr/local/yocto/meta-intel$ git remote update
|
||
Fetching meta-intel
|
||
remote: Counting objects: 1240, done.
|
||
remote: Compressing objects: 100% (1008/1008), done.
|
||
remote: Total 1240 (delta 513), reused 85 (delta 27)
|
||
Receiving objects: 100% (1240/1240), 1.55 MiB | 510 KiB/s, done.
|
||
Resolving deltas: 100% (513/513), done.
|
||
From git://git.yoctoproject.org/meta-intel
|
||
* [new branch] 1.1_M1 -> meta-intel/1.1_M1
|
||
* [new branch] 1.1_M2 -> meta-intel/1.1_M2
|
||
* [new branch] bernard -> meta-intel/bernard
|
||
* [new branch] dvhart/n450 -> meta-intel/dvhart/n450
|
||
* [new branch] laverne -> meta-intel/laverne
|
||
* [new branch] master -> meta-intel/master
|
||
</literallayout>
|
||
</para>
|
||
|
||
<para>
|
||
Once you have the repository set up, you have many development branches from
|
||
which you can work.
|
||
For this example we are going to use Bernard 5.0.
|
||
<literallayout class='monospaced'>
|
||
/usr/local/yocto/meta-intel$ git checkout -b Bernard-5.0.1 meta-intel/bernard
|
||
Branch Bernard-5.0.1 set up to track remote branch bernard from meta-intel.
|
||
Switched to a new branch 'bernard-5.0.1'
|
||
</literallayout>
|
||
</para>
|
||
</section>
|
||
|
||
<section id='making-a-copy-of-the-base bsp-to-create-your-new-bsp-layer'>
|
||
<title>Making a Copy of the Base BSP to Create Your New BSP Layer</title>
|
||
|
||
<para>
|
||
Now that you have the Yocto Project and base BSP source you need to create a
|
||
new layer for your BSP.
|
||
</para>
|
||
|
||
<para>
|
||
Layers are ideal for isolating and storing work for a given piece of hardware.
|
||
A layer is really just a location or area in which you place the recipes for your BSP.
|
||
In fact, a BSP is, in itself, a special type of layer.
|
||
Consider an application as another example that illustrates a layer.
|
||
Suppose you are creating an application that has library or other dependencies in
|
||
order for it to compile and run.
|
||
The layer, in this case, would be where all the recipes that define those dependencies
|
||
are kept. The key point for a layer is that it is an isolated area that contains
|
||
all the relevant information for the project that the Yocto Project build system knows about.
|
||
</para>
|
||
|
||
<note>
|
||
The Yocto Project supports four BSPs that are part of the
|
||
Yocto Project release: <filename>atom-pc</filename>, <filename>beagleboard</filename>,
|
||
<filename>mpc8315e</filename>, and <filename>routerstationpro</filename>.
|
||
The recipes and configurations for these four BSPs are located and dispersed
|
||
within <filename>meta</filename>, which can be found in the Yocto Project source directory.
|
||
Consequently, they are not totally isolated in the spirit of layers unless you think
|
||
of <filename>meta</filename> as a layer itself.
|
||
On the other hand, the Yocto Project has isolated BSP layers within
|
||
<filename>meta-intel</filename> for the Crown Bay, Emenlow, Jasper Forest, N450, and
|
||
Sugar Bay.
|
||
[WRITER'S NOTE: <filename>meta-yocto</filename>, <filename>meta</filename>, and
|
||
<filename>meta-intel</filename> need some explanation.
|
||
Not sure about the relationship of meta-yocto as compared to meta-intel.]
|
||
</note>
|
||
|
||
<para>
|
||
When you set up a layer for a new BSP you should follow a standard layout.
|
||
This layout is described in
|
||
<ulink url='http://www.yoctoproject.org/docs/1.1/bsp-guide/bsp-guide.html#bsp-filelayout'>
|
||
Example Filesystem Layout</ulink> section of the Board Support Package (BSP) Development
|
||
Guide.
|
||
In the standard layout you will notice a suggested hierarchy for BSP kernel recipes,
|
||
graphics recipes, and configuration information.
|
||
You can see the standard layout for the Crown Bay BSP in this example by examining the
|
||
directory structure of <filename>meta-crownbay</filename>.
|
||
</para>
|
||
|
||
<para>
|
||
To create your BSP layer you simply copy the <filename>meta-crownbay</filename>
|
||
layer to a new layer.
|
||
For this example the new layer is named <filename>meta-mymachine</filename>.
|
||
The name must follow the BSP layer naming convention, which is
|
||
<filename>meta-<name></filename>.
|
||
The following example assumes a meta-intel Git repository.
|
||
If you downloaded and expanded a Crown Bay tarball then you simply copy the resulting
|
||
<filename>meta-crownbay</filename> directory structure to a location of your choice:
|
||
<literallayout class='monospaced'>
|
||
/usr/local/yocto/meta-intel$ cp -a meta-crownbay/ meta-mymachine
|
||
</literallayout>
|
||
</para>
|
||
</section>
|
||
|
||
<section id='making-changes-to-your-bsp'>
|
||
<title>Making Changes to Your BSP</title>
|
||
|
||
<para>
|
||
Right now you have two identical BSP layers with different names:
|
||
<filename>meta-crownbay</filename> and <filename>meta-mymachine</filename>.
|
||
You need to change your configurations so that they work for your new BSP and
|
||
your particular hardware.
|
||
We will look first at the configurations, which are all done in the layer’s
|
||
<filename>conf</filename> directory.
|
||
</para>
|
||
|
||
<para>
|
||
First, since in this example the new BSP will not support EMGD we will get rid of the
|
||
<filename>crownbay.conf</filename> file and then rename the
|
||
<filename>crownbay-noemgd.conf</filename> file to <filename>mymachine.conf</filename>.
|
||
Much of what we do in the configuration directory is designed to help the Yocto Project
|
||
build system work with the new layer and to be able to find and use the right software.
|
||
The following two commands result in a single machine configuration file named
|
||
<filename>mymachine.conf</filename>.
|
||
<literallayout class='monospaced'>
|
||
/usr/local/yocto/meta-intel$ rm meta-mymachine/conf/machine/crownbay.conf
|
||
/usr/local/yocto/meta-intel$ mv meta-mymachine/conf/machine/crownbay-noemgd.conf \
|
||
meta-mymachine/conf/machine/mymachine.conf
|
||
</literallayout>
|
||
</para>
|
||
|
||
<para>
|
||
The next step makes changes to <filename>mymachine.conf</filename> itself.
|
||
The only changes needed for this example are changes to the comment lines and to the
|
||
Source Revision (<filename>SRCREV</filename>) lines at the bottom of the file.
|
||
</para>
|
||
|
||
<para>
|
||
For the comments the string <filename>crownbay-noemgd</filename> needs to be changed to
|
||
<filename>mymachine</filename>.
|
||
</para>
|
||
|
||
<para>
|
||
To understand how to complete the changes to the <filename>SRCREV</filename>
|
||
statements we need to know which kernel we are using.
|
||
The <filename>PREFERRED_PROVIDER_virtual/kernel</filename> statement in the file specifies
|
||
the kernel we are going to use.
|
||
We are going to use <filename>linux-yocto-stable</filename>.
|
||
The <filename>SRCREV</filename> statement pairs point to the exact machine branch
|
||
(commit) and <filename>meta</filename> branch in the Git repository.
|
||
Right now the <filename>SRCREV</filename> variables are as follows in
|
||
<filename>mymachine.conf</filename>:
|
||
<literallayout class='monospaced'>
|
||
SRCREV_machine_pn-linux-yocto_crownbay-noemgd ?= \ "56fe215d3f1a2cc3a5a26482ac9809ba44495695"
|
||
SRCREV_meta_pn-linux-yocto_crownbay-noemgd ?= \ "e1f85a470934a0cf6abde5d95533e74501822c6b"
|
||
|
||
SRCREV_machine_pn-linux-yocto-stable_crownbay-noemgd ?= \ "56fe215d3f1a2cc3a5a26482ac9809ba44495695"
|
||
SRCREV_meta_pn-linux-yocto-stable_crownbay-noemgd ?= \ "e1f85a470934a0cf6abde5d95533e74501822c6b"
|
||
</literallayout>
|
||
</para>
|
||
|
||
<para>
|
||
You will notice that there are two pairs of <filename>SRCREV</filename> statements.
|
||
The first pair points to a current development kernel, which we don’t care about
|
||
in this example.
|
||
The bottom pair points to the stable kernel that we will use:
|
||
<filename>linux-yocto-stable</filename>.
|
||
At this point though, the unique commit strings all are still associated with
|
||
Crown Bay.
|
||
So the next changes we make to the configuration file gets rid of the pair that points
|
||
to the development kernel and provides new commit strings that points to the
|
||
<filename>atom-pc-standard</filename>, which we are choosing for the initial build of this BSP.
|
||
Here are the final <filename>SRCREV</filename> statements:
|
||
<literallayout class='monospaced'>
|
||
SRCREV_machine_pn-linux-yocto-stable_mymachine ?= \ "72ca49ab08b8eb475cec82a10049503602325791"
|
||
SRCREV_meta_pn-linux-yocto-stable_mymachine ?= \ "ec26387cb168e9e0976999b528b5a9dd62e3157a"
|
||
</literallayout>
|
||
</para>
|
||
|
||
<para>
|
||
If you are familiar with Git repositories you probably won’t have trouble locating the
|
||
exact commit strings you need to change the <filename>SRCREV</filename> statements.
|
||
You can find all the <filename>machine</filename> and <filename>meta</filename>
|
||
branch points (commits) for the <filename>linux-yocto-2.6.34</filename> kernel
|
||
<ulink url='http://git.yoctoproject.org/cgit/cgit.cgi/linux-yocto-2.6.34'>here</ulink>.
|
||
</para>
|
||
|
||
<para>
|
||
If you need a little more assistance after going to the link then do the following:
|
||
<orderedlist>
|
||
<listitem><para>Expand the list of branches by clicking <filename>[…]</filename></para></listitem>
|
||
<listitem><para>Click on the <filename>atom-pc-standard</filename> branch</para></listitem>
|
||
<listitem><para>Click on the commit column header to view the top commit</para></listitem>
|
||
<listitem><para>Copy the commit string for use in the <filename>mymachine.conf</filename>
|
||
file</para></listitem>
|
||
</orderedlist>
|
||
</para>
|
||
|
||
<para>
|
||
For the <filename>SRCREV</filename> statement that points to the <filename>meta</filename>
|
||
branch use the same procedure except expand the <filename>wrs_meta</filename>
|
||
branch in step 2 above.
|
||
</para>
|
||
|
||
<para>
|
||
The next configuration file in the new BSP layer we need to edit is <filename>layer.conf</filename>.
|
||
This file identifies build information needed for the new layer.
|
||
You can see the
|
||
<ulink url='http://www.yoctoproject.org/docs/1.1/bsp-guide/bsp-guide.html#bsp-filelayout-layer'>
|
||
Layer Configuration File</ulink> section in the Board Support Packages (BSP) Development Guide
|
||
for more information on this configuration file.
|
||
Basically, we are removing statements that support EMGD and changing the ones that support no EMGD.
|
||
</para>
|
||
|
||
<para>
|
||
First, remove these statements from the file:
|
||
<literallayout class='monospaced'>
|
||
BBFILE_COLLECTIONS_crownbayd += "crownbay"
|
||
BBFILE_PATTERN_crownbay := "^${LAYERDIR}/"
|
||
BBFILE_PRIORITY_crownbay = "6"
|
||
</literallayout>
|
||
</para>
|
||
|
||
<para>
|
||
This leaves three similar statements that we care about:
|
||
<literallayout class='monospaced'>
|
||
BBFILE_COLLECTIONS_crownbay-noemgd += "crownbay-noemgd"
|
||
BBFILE_PATTERN_crownbay-noemgd := "^${LAYERDIR}/"
|
||
BBFILE_PRIORITY_crownbay-noemgd = "6"
|
||
</literallayout>
|
||
</para>
|
||
|
||
<para>
|
||
Simply substitute the machine string name <filename>crownbay-noemgd</filename>
|
||
with the new machine name <filename>mymachine</filename> to get the following:
|
||
<literallayout class='monospaced'>
|
||
BBFILE_COLLECTIONS_mymachine += "mymachine"
|
||
BBFILE_PATTERN_mymachine := "^${LAYERDIR}/"
|
||
BBFILE_PRIORITY_mymachine = "6"
|
||
</literallayout>
|
||
</para>
|
||
|
||
<para>
|
||
Now we will take a look at the recipes in your new layer.
|
||
The standard BSP structure has areas for BSP, graphics, and kernel recipes.
|
||
When you create a BSP you use these areas for appropriate recipes and append files.
|
||
Recipes take the form of <filename>.bb</filename> files.
|
||
If you want to leverage off of existing recipes elsewhere in the Yocto Project
|
||
source tree but change them you can use <filename>.bbappend</filename> files.
|
||
All new recipes and append files for your layer go in the layer’s
|
||
<filename>recipes-bsp</filename>, <filename>recipes-kernel</filename>, and
|
||
<filename>recipes-graphics</filename> directories.
|
||
</para>
|
||
|
||
<para>
|
||
For this example we are not adding any new BSP recipes.
|
||
And, we only need to remove the formfactor we do not want and change the name of
|
||
the remaining one that supports no EMGD.
|
||
These commands take care of the new layer’s BSP recipes:
|
||
<literallayout class='monospaced'>
|
||
/usr/local/yocto/meta-intel$ rm -rf \
|
||
meta-mymachine/recipes-bsp/formfactor/formfactor/crownbay
|
||
/usr/local/yocto/meta-intel$ mv \
|
||
meta-mymachine/recipes-bsp/formfactor/formfactor/crownbay-noemgd/ \
|
||
meta-mymachine/recipes-bsp/formfactor/formfactor/mymachine
|
||
</literallayout>
|
||
</para>
|
||
|
||
<para>
|
||
For this example we want to remove anything that supports EMGD.
|
||
The following command cleans up the <filename>recipes-graphics</filename> directory:
|
||
<literallayout class='monospaced'>
|
||
/usr/local/yocto/meta-intel$ rm –rf \
|
||
meta-mymachine/recipes-graphics/xorg-xserver/xserver-xf86-emgd*
|
||
</literallayout>
|
||
</para>
|
||
|
||
<para>
|
||
At this point the <filename>recipes-graphics</filename> directory just has files that
|
||
support Video Electronics Standards Association (VESA) graphics modes.
|
||
However, we still need to rename a directory in the layer.
|
||
This command applies the final change to the <filename>recipes-graphics</filename> directory:
|
||
<literallayout class='monospaced'>
|
||
/usr/local/yocto/meta-intel$ mv \
|
||
meta-mymachine/recipes-graphics/xorg-xserver/xserver-xf86-config/crownbay-noemgd \
|
||
meta-mymachine/recipes-graphics/xorg-xserver/xserver-xf86-config/mymachine
|
||
</literallayout>
|
||
</para>
|
||
|
||
<para>
|
||
Finally, let us look at the <filename>recipes-kernel</filename> directory in the example.
|
||
The only file we are concerned with for the example is
|
||
<filename>linux-yocto-stable_git.bbappend</filename>.
|
||
The other files all support the EMGD feature of Crown Bay.
|
||
These commands clean up the directory:
|
||
<literallayout class='monospaced'>
|
||
/usr/local/yocto/meta-intel$ rm –rf meta-mymachine/recipes-kernel/linux/linux-yocto
|
||
/usr/local/yocto/meta-intel$ rm –rf \
|
||
meta-mymachine/recipes-kernel/linux/linux-yocto-stable
|
||
/usr/local/yocto/meta-intel$ rm \
|
||
meta-mymachine/recipes-kernel/linux/linux-yocto_git.bbappend
|
||
</literallayout>
|
||
</para>
|
||
|
||
<para>
|
||
The <filename>linux-yocto-stable_git.bbappend</filename> file appends a Yocto Project
|
||
recipe having the same name.
|
||
The changes we need to make are to remove the statements that support EMGD
|
||
and change the remaining Crown Bay strings to be <filename>mymachine</filename>.
|
||
We also do not need to include the pointer to the EMGD licenses patch at the end of
|
||
the file.
|
||
Here is the original file:
|
||
<literallayout class='monospaced'>
|
||
FILESEXTRAPATHS := “${THISDIR}/${PN}”
|
||
COMPATIBLE_MACHINE_crownbay = “crownbay”
|
||
KMACHINE_CROWNBAY = “CROWNBAY”
|
||
COMPATIBLE_MACHINE_crownbay-noemgd = “crownbay-noemgd”
|
||
KMACHINE_crownbay-noemgd = “crownbay”
|
||
SRC_URI += file://0001-crownbay-update-a-handful-of-EMGD-licenses.patch
|
||
</literallayout>
|
||
</para>
|
||
|
||
<para>
|
||
After editing the file it looks like this:
|
||
<literallayout class='monospaced'>
|
||
FILESEXTRAPATHS := “${THISDIR}/${PN}”
|
||
COMPATIBLE_MACHINE_mymachine = “mymachine”
|
||
KMACHINE_mymachine = “mymachine
|
||
</literallayout>
|
||
</para>
|
||
|
||
<para>
|
||
In summary, the edits to the layer’s recipe files result in removal of any files and
|
||
statements that do not support your targeted hardware in addition to the inclusion
|
||
of any new recipes you might need.
|
||
In this example, it was simply a matter of ridding the new layer <filename>meta-machine</filename>
|
||
of any code that supported the EMGD features.
|
||
We did not introduce any new recipes to the layer.
|
||
</para>
|
||
|
||
<para>
|
||
Finally, it is also important to update the layer’s <filename>README</filename>
|
||
file so that the information in it reflects your BSP.
|
||
</para>
|
||
</section>
|
||
|
||
<section id='preparing-for-the-build'>
|
||
<title>Preparing for the Build</title>
|
||
|
||
<para>
|
||
Once you have made all the changes to your BSP layer there remains a few things
|
||
you need to do for the Yocto Project build system in order for it to create your image.
|
||
You need to get the build environment ready by sourcing an environment setup script
|
||
and you need to be sure two key configuration files are configured appropriately.
|
||
</para>
|
||
|
||
<para>
|
||
The entire process for building an image is overviewed in the
|
||
<ulink url='http://www.yoctoproject.org/docs/1.1/yocto-project-qs/yocto-project-qs.html#building-image'>
|
||
Building an Image</ulink> section of the Yocto Project Quick Start.
|
||
You might want to reference this information.
|
||
The remainder of this section will apply to our example of the <filename>meta-mymachine</filename> layer.
|
||
</para>
|
||
|
||
<para>
|
||
To get ready to build your new layer you need to do the following:
|
||
<orderedlist>
|
||
<listitem><para>Get the environment ready for the build by sourcing the environment
|
||
script.
|
||
The environment script is in the Yocto Project source directory and has the string
|
||
<filename>init-build-env</filename> in the file’s name.
|
||
For this example, the following command gets the build environment ready:
|
||
<literallayout class='monospaced'>
|
||
/usr/local/yocto$ source oe-init-build-env yocto-build
|
||
</literallayout>
|
||
When you source the script a build directory is created in the current
|
||
working directory.
|
||
In our example we were in the Yocto Project source directory.
|
||
Thus, entering the previous command created the <filename>yocto-build</filename> directory.
|
||
If you do not provide a name for the build directory it defaults to build.
|
||
The build directory contains a <filename>conf</filename> directory that contains
|
||
two configuration files you will need to check: <filename>bblayers.conf</filename>
|
||
and <filename>local.conf</filename>.</para></listitem>
|
||
<listitem><para>Check and edit the resulting <filename>local.conf</filename> file.
|
||
This file minimally identifies the machine for which to build the image by
|
||
configuring the <filename>MACHINE</filename> variable.
|
||
For this example you must set the variable to mymachine as follows:
|
||
<literallayout class='monospaced'>
|
||
MACHINE ??= “mymachine”
|
||
</literallayout>
|
||
You should also be sure any other variables in which you are interested are set.
|
||
Some variables to consider are <filename>BB_NUMBER_THREADS</filename>
|
||
and <filename>PARALLEL_MAKE</filename>, both of which can greatly reduce your build time
|
||
if you are using a multi-threaded development system (e.g. values of
|
||
<filename>8</filename> and <filename>j 6</filename>, respectively are optimal
|
||
for a development machine that has four available cores).</para></listitem>
|
||
<listitem><para>Update the <filename>bblayers.conf</filename> file so that it includes
|
||
the path to your new BSP layer.
|
||
In this example you need to include the pathname to <filename>meta-mymachine</filename>.
|
||
For example, if you created a Yocto Project Git repository named
|
||
<filename>yocto</filename> in <filename>/usr/local</filename> then the
|
||
<filename>BBLAYERS</filename> variable in the file would need to include the following path:
|
||
<literallayout class='monospaced'>
|
||
/usr/local/yocto/meta-intel/meta-mymachine
|
||
</literallayout></para></listitem>
|
||
</orderedlist>
|
||
</para>
|
||
|
||
<para>
|
||
The appendix
|
||
<ulink url='http://www.yoctoproject.org/docs/1.1/poky-ref-manual/poky-ref-manual.html#ref-variables-glos'>
|
||
Reference: Variables Glossary</ulink> in the Yocto Project Reference Manual has more information
|
||
on configuration variables.
|
||
</para>
|
||
</section>
|
||
|
||
<section id='building-the-image'>
|
||
<title>Building the Image</title>
|
||
|
||
<para>
|
||
The Yocto Project uses the BitBake tool to build images based on the type of image
|
||
you want to create.
|
||
You can find more information on BitBake
|
||
<ulink url='http://bitbake.berlios.de/manual/'>here</ulink>.
|
||
</para>
|
||
|
||
<para>
|
||
The build process supports several types of images to satisfy different needs.
|
||
When you issue the BitBake command you provide a “top-level” recipe that essentially
|
||
starts the process off of building the type of image you want.
|
||
</para>
|
||
|
||
<para>
|
||
You can find these recipes in the <filename>meta/recipes-core/images</filename> and
|
||
<filename>meta/recipes-sato/images</filename> directories of the Yocto Project source
|
||
tree or Git repository.
|
||
Although the recipe names are somewhat explanatory, here is a list that describes them:
|
||
<itemizedlist>
|
||
<listitem><para><emphasis>Base</emphasis> – A foundational basic image without support
|
||
for X that can be reasonably used for customization.</para></listitem>
|
||
<listitem><para><emphasis>Core</emphasis> – A foundational basic image with support for
|
||
X that can be reasonably used for customization.</para></listitem>
|
||
<listitem><para><emphasis>Direct Disk</emphasis> – An image that you can copy directory to
|
||
the disk of the target device.</para></listitem>
|
||
<listitem><para><emphasis>Live</emphasis> – An image you can run from a USB device or from
|
||
a CD without having to first install something.</para></listitem>
|
||
<listitem><para><emphasis>Minimal</emphasis> – A small image without a GUI.
|
||
This image is not much more than a kernel with a shell.</para></listitem>
|
||
<listitem><para><emphasis>Minimal Development</emphasis> – A Minimal image suitable for
|
||
development work.</para></listitem>
|
||
<listitem><para><emphasis>Minimal Direct Disk</emphasis> – A Minimal Direct Disk image.</para></listitem>
|
||
<listitem><para><emphasis>Minimal RAM-based Initial Root Filesystem</emphasis> – A minimal image
|
||
that has the <filename>initramfs</filename> as part of the kernel, which allows the
|
||
system to find the first “init” program more efficiently.</para></listitem>
|
||
<listitem><para><emphasis>Minimal Live</emphasis> – A Minimal Live image.</para></listitem>
|
||
<listitem><para><emphasis>Minimal MTD Utilities</emphasis> – A minimal image that has support
|
||
for the MTD utilities, which let the user interact with the MTD subsystem in
|
||
the kernel to perform operations on flash devices.</para></listitem>
|
||
<listitem><para><emphasis>Sato</emphasis> – An image with Sato support, a mobile environment
|
||
and visual style that works well with mobile devices.</para></listitem>
|
||
<listitem><para><emphasis>Sato Development</emphasis> – A Sato image suitable for
|
||
development work.</para></listitem>
|
||
<listitem><para><emphasis>Sato Direct Disk</emphasis> – A Sato Direct Disk image.</para></listitem>
|
||
<listitem><para><emphasis>Sato Live</emphasis> – A Sato Live image.</para></listitem>
|
||
<listitem><para><emphasis>Sato SDK</emphasis> – A Sato image that includes the Yocto Project
|
||
toolchain and development libraries.</para></listitem>
|
||
<listitem><para><emphasis>Sato SDK Direct Disk</emphasis> – A Sato SDK Direct
|
||
Disk image.</para></listitem>
|
||
<listitem><para><emphasis>Sato SDK Live</emphasis> – A Sato SDK Live image.</para></listitem>
|
||
</itemizedlist>
|
||
</para>
|
||
|
||
<para>
|
||
The remainder of this section applies to our example of the <filename>meta-mymachine</filename> layer.
|
||
</para>
|
||
|
||
<para>
|
||
To build the image for our <filename>meta-mymachine</filename> BSP enter the following command
|
||
from the same shell from which you ran the setup script.
|
||
You should run the <filename>bitbake</filename> command without any intervening shell commands.
|
||
For example, moving your working directory around could cause problems.
|
||
Here is the command for this example:
|
||
<literallayout class='monospaced'>
|
||
/usr/local/yocto/yocto-build$ bitbake –k poky-image-sato-live
|
||
</literallayout>
|
||
</para>
|
||
|
||
<para>
|
||
This command requests an image that has Sato support and can be run from a USB device or
|
||
from a CD without having to first install anything.
|
||
The build process takes significant time and includes thousands of tasks, which are reported
|
||
at the console.
|
||
If the build results in any type of error you should check for misspellings in the
|
||
files you changed or problems with your host development environment such as missing packages.
|
||
</para>
|
||
</section>
|
||
</section>
|
||
|
||
<section id='modifying-a-kernel'>
|
||
<title>Modifying a Kernel</title>
|
||
|
||
<para>
|
||
[WRITER'S NOTE: This section is a second example that focuses on just modifying the kernel.
|
||
I don't have any information on this yet.
|
||
</para>
|
||
|
||
<para>
|
||
Here are some points to consider though:
|
||
<itemizedlist>
|
||
<listitem><para>Reference Darren's presentation
|
||
<ulink url='http://events.linuxfoundation.org/events/embedded-linux-conference/hart'>
|
||
here</ulink></para></listitem>
|
||
<listitem><para>Reference <xref linkend='dev-manual-start'>Getting Started with the Yocto Project</xref>
|
||
section to get set up at minimum.</para></listitem>
|
||
<listitem><para>Are there extra steps I need specific to kernel development to get started?</para></listitem>
|
||
<listitem><para>What do I do to get set up?
|
||
Is it a matter of just installing YP and having some pieces together?
|
||
What are the pieces?</para></listitem>
|
||
<listitem><para>Where do I get the base kernel to start with?</para></listitem>
|
||
<listitem><para>Do I install the appropriate toolchain?</para></listitem>
|
||
<listitem><para>What kernel git repository do I use?</para></listitem>
|
||
<listitem><para>What is the conversion script?
|
||
What does it do?</para></listitem>
|
||
<listitem><para>What do I have to do to integrate the kernel layer?</para></listitem>
|
||
<listitem><para>What do I use to integrate the kernel layer?
|
||
HOB?
|
||
Do I just Bitbake it?</para></listitem>
|
||
<listitem><para>Using the System Image Creator.]</para></listitem>
|
||
</itemizedlist>
|
||
</para>
|
||
</section>
|
||
</section>
|
||
|
||
<section id='user-application-development'>
|
||
<title>User Application Development</title>
|
||
|
||
<para>
|
||
[WRITER'S NOTE: This section is the second major development case - developing an application.
|
||
Here are points to consider:
|
||
<itemizedlist>
|
||
<listitem><para>User-space Application Development scenario overview.</para></listitem>
|
||
<listitem><para>Using the Yocto Eclipse Plug-in.</para></listitem>
|
||
<listitem><para>Back-door support.</para></listitem>
|
||
<listitem><para>I feel there is more to this area than we have captured during our two review meetings.]</para></listitem>
|
||
</itemizedlist>
|
||
</para>
|
||
</section>
|
||
</chapter>
|
||
<!--
|
||
vim: expandtab tw=80 ts=4
|
||
-->
|