dev-manual: Updates to "Writing a Recipe" section.

Updated the recipe creation figure.  I had to re-order the flow
and also generalize the supporting services installation part of the
diagram.

Fleshed out the "Fecthing" section with SRC_URI examples and much
more detail.

(From yocto-docs rev: 6a23ab2beb90376c11c426ac8bf5618994585a9d)

Signed-off-by: Scott Rifenbark <scott.m.rifenbark@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Scott Rifenbark 2013-12-16 14:27:50 -06:00 committed by Richard Purdie
parent 4abc384f25
commit b55ffe7356
2 changed files with 157 additions and 36 deletions

View File

@ -1155,7 +1155,7 @@
The following figure shows the basic process for creating a
new recipe.
Subsequent sections provide details for each step.
<imagedata fileref="figures/recipe-workflow.png" width="4in" depth="7in" align="center" scalefit="1" />
<imagedata fileref="figures/recipe-workflow.png" width="6in" depth="7in" align="center" scalefit="1" />
</para>
</section>
@ -1180,14 +1180,17 @@
have to add from scratch, and so forth.
All these risks stem from unfamiliarity with the
existing recipe space.</para></listitem>
<listitem><para><emphasis>Use and modify a skeleton
recipe:</emphasis>
Using the skeleton recipe located at
&lt;Need some path for a good recipe to use&gt; is the
recommended method for creating a new recipe.
The skeleton recipe provides the fundamental areas
that you need to include, exclude, or alter to fit
your needs.
<listitem><para><emphasis>Use and modify the following
skeleton recipe:</emphasis>
<literallayout class='monospaced'>
I need a simple
skeleton recipe
here
</literallayout>
Modifying this recipe is the recommended method for
creating a new recipe.
The recipe provides the fundamental areas that you need
to include, exclude, or alter to fit your needs.
</para></listitem>
</itemizedlist>
</para>
@ -1197,40 +1200,140 @@
<title>Fetching Code</title>
<para>
The first thing your recipe must do is fetch the source files.
The first thing your recipe must do is specify how to fetch
the source files.
Fetching is controlled mainly through the
<ulink url='&YOCTO_DOCS_REF_URL;#var-SRC_URI'><filename>SRC_URI</filename></ulink>
variable.
Your recipe must have a <filename>SRC_URI</filename> variable
that points to where the source is located.
For a graphical representation of source locations, see the
"<ulink url='&YOCTO_DOCS_REF_URL;#sources-dev-environment'>Sources</ulink>"
section in the Yocto Project Reference Manual.
</para>
<para>
The <filename>do_fetch</filename> task uses the
variable and its prefix to determine what fetcher to use to
get your source files.
<filename>SRC_URI</filename> variable and its prefix to
determine what fetcher to use to get your source files.
It is the <filename>SRC_URI</filename> variable that triggers
the fetcher.
The <filename>do_patch</filename> task uses the variable after
source is fetched to apply patches.
The OpenEmbedded build system uses
<ulink url='&YOCOT_DOCS_REF_URL;#var-FILESOVERRIDES'><filename>FILESOVERRIDES</filename></ulink>
<ulink url='&YOCTO_DOCS_REF_URL;#var-FILESOVERRIDES'><filename>FILESOVERRIDES</filename></ulink>
when scanning directory names for files in
<filename>SRC_URI</filename>.
</para>
<para>
The instance (or instances) of the <filename>SRC_URI</filename>
The instance of the <filename>SRC_URI</filename>
variable in your recipe must define each unique location
for your source files.
For example, if you need a tarball, and two patches, then your
<filename>SRC_URI</filename> statement(s) must point to the
tarball and the patches.
Here is a simple example from the
<filename>meta/recipes-devtools/cdrtools/cdrtools-native_3.01a17.bb</filename>
recipe where the source comes from a single tarball:
<literallayout class='monospaced'>
SRC_URI = "ftp://ftp.berlios.de/pub/cdrecord/alpha/cdrtools-${PV}.tar.bz2"
</literallayout>
</para>
<para>
I need some good examples here.
I also need some sample error messages you get when you don't
have the correct <filename>SRC_URI</filename> locations.
We can describe how you can copy and past the lines from the
error message and use the correct values.
This next example is more complicated and is from the
<filename>meta/recipes-sato/rxvt-unicode/rxvt-unicode_9.19.bb</filename>
recipe.
The example uses a <filename>SRC_URI</filename> statement
that identifies a tarball, a patch file, a desktop file, and a
figure all as source code.
<literallayout class='monospaced'>
SRC_URI = "http://dist.schmorp.de/rxvt-unicode/Attic/rxvt-unicode-${PV}.tar.bz2 \
file://xwc.patch \
file://rxvt.desktop \
file://rxvt.png"
</literallayout>
</para>
<para>
The following list discusses some information worth noting when
you provide the <filename>SRC_URI</filename> variable in your
recipe:
<itemizedlist>
<listitem><para>
Rather than hard-coding the version in an URL, it is
good practice to use
<filename>${</filename><ulink url='&YOCTO_DOCS_REF_URL;#var-PV'><filename>PV</filename></ulink><filename>}</filename>,
which causes the fetch process to use the version
specified in the recipe filename.
Specifying the version in this manner means that
upgrading the recipe to a future version is as simple
as renaming the recipe to match the new version.
Notice that the two examples in the previous paragraph
both use <filename>${PV}</filename>.</para></listitem>
<listitem><para>
When you specify local files using the
<filename>file://</filename> URI protocol, the build
system fetches files from the local machine.
The path is relative to the
<ulink url='&YOCTO_DOCS_REF_URL;#var-FILESPATH'><filename>FILESPATH</filename></ulink>
variable and searches specific directories in a
certain order:
<filename>${</filename><ulink url='&YOCTO_DOCS_REF_URL;#var-BPN'><filename>BPN</filename></ulink><filename>}</filename>,
<filename>${</filename><ulink url='&YOCTO_DOCS_REF_URL;#var-BP'><filename>BP</filename></ulink><filename>}</filename>,
and
<filename>files</filename>.
The directories are assumed to be subdirectories of
the directory in which the recipe or append file
resides.
For more information, see the
<ulink url='&YOCTO_DOCS_REF_URL;#var-SRC_URI'><filename>SRC_URI</filename></ulink>
variable.</para></listitem>
<listitem><para>
Files mentioned in <filename>SRC_URI</filename> whose
names end in a typical archive extension
(e.g. <filename>.tar</filename>,
<filename>.tar.gz</filename>,
<filename>.tar.bz2</filename>,
<filename>.zip</filename>, and so forth),
are automatically extracted during
the <filename>do_unpack</filename> task.
</para></listitem>
<listitem><para>
Files mentioned in <filename>SRC_URI</filename> whose
names end in <filename>.patch</filename> or
<filename>.diff</filename> are treated as patches and
are automatically applied during the
<filename>do_patch</filename> task.</para></listitem>
<listitem><para>
Patches should be applicable with the "-p1" option to
patch (i.e. one directory level in the path will be
stripped off.)
If your patch needs to have more directory levels
stripped off, specify the number of levels using the
"striplevel" option in the <filename>SRC_URI</filename>
entry for the patch.
Alternatively, if your patch needs to be applied in a
specific subdirectory that is not specified in the patch
file, use the "patchdir" option in the entry.
</para></listitem>
<listitem><para>
For Git repositories, you must specify
<ulink url='&YOCTO_DOCS_REF_URL;#var-SRCREV'><filename>SRCREV</filename></ulink>
and you should specify
<ulink url='&YOCTO_DOCS_REF_URL;#var-PV'><filename>PV</filename></ulink>
to include the revision with
<ulink url='&YOCTO_DOCS_REF_URL;#var-SRCPV'><filename>SRCPV</filename></ulink>.
Here is an example from the recipe
<filename>meta/recipes-kernel/blktrace/blktrace_git.bb</filename>:
<literallayout class='monospaced'>
SRCREV = "d6918c8832793b4205ed3bfede78c2f915c23385"
PR = "r6"
PV = "1.0.5+git${SRCPV}"
SRC_URI = "git://git.kernel.dk/blktrace.git \
file://ldflags.patch"
</literallayout></para></listitem>
</itemizedlist>
</para>
</section>
@ -1263,18 +1366,6 @@ license shipped with the source.
</para>
</section>
<section id='new-recipe-optionally-supporting-services'>
<title>Supporting Services</title>
<para>
We'll probably also need some subsections on specific extra functions needed in
some recipes e.g. how to add support for services (sysvinit and systemd),
adding PACKAGECONFIG options, dealing with alternatives, etc. There's a
question in my mind on how some of these will overlap with the class reference
section though.
</para>
</section>
<section id='new-recipe-configuring-the-recipe'>
<title>Configuring the Recipe</title>
@ -1302,8 +1393,8 @@ the target, etc.
</para>
</section>
<section id='new-recipe-optionally-installing'>
<title>Optionally Installing</title>
<section id='new-recipe-installing'>
<title>Installing</title>
<para>
install: for autotools/cmake recipes, if the recipe passes through do_install
@ -1313,6 +1404,36 @@ failure. For non-autotools recipes you need to define your own do_install
</para>
</section>
<section id='new-recipe-optionally-supporting-services'>
<title>Supporting Services</title>
<para>
We'll probably also need some subsections on specific extra functions needed in
some recipes e.g. how to add support for services (sysvinit and systemd),
adding PACKAGECONFIG options, dealing with alternatives, etc. There's a
question in my mind on how some of these will overlap with the class reference
section though.
</para>
<para>
If you are adding services and the service initialization
script or the service file itself is not installed, you must
provide for that installation in your recipe.
If your recipe already has a <filename>do_install</filename>
function, you will need to create a
<filename>do_install_append</filename> function to handle the
installation of your services.
</para>
<para>
When you create the installation for your services, you need
to accomplish what is normally done by "make install".
In other words, make sure your installation puts the output
in a layout that is similar to how they will be laid out on the
target system.
</para>
</section>
<section id='new-recipe-packaging'>
<title>Packaging</title>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 38 KiB