blob: e741cef0e8e87c874e59415cac916d3bae8f9aa6 [file] [log] [blame]
Andrew Geissler517393d2023-01-13 08:55:19 -06001.. SPDX-License-Identifier: CC-BY-SA-2.0-UK
2
3Writing a New Recipe
4********************
5
6Recipes (``.bb`` files) are fundamental components in the Yocto Project
7environment. Each software component built by the OpenEmbedded build
8system requires a recipe to define the component. This section describes
9how to create, write, and test a new recipe.
10
11.. note::
12
13 For information on variables that are useful for recipes and for
14 information about recipe naming issues, see the
15 ":ref:`ref-manual/varlocality:recipes`" section of the Yocto Project
16 Reference Manual.
17
18Overview
19========
20
21The following figure shows the basic process for creating a new recipe.
22The remainder of the section provides details for the steps.
23
24.. image:: figures/recipe-workflow.png
25 :align: center
26 :width: 50%
27
28Locate or Automatically Create a Base Recipe
29============================================
30
31You can always write a recipe from scratch. However, there are three choices
32that can help you quickly get started with a new recipe:
33
34- ``devtool add``: A command that assists in creating a recipe and an
35 environment conducive to development.
36
37- ``recipetool create``: A command provided by the Yocto Project that
38 automates creation of a base recipe based on the source files.
39
40- *Existing Recipes:* Location and modification of an existing recipe
41 that is similar in function to the recipe you need.
42
43.. note::
44
45 For information on recipe syntax, see the
46 ":ref:`dev-manual/new-recipe:recipe syntax`" section.
47
48Creating the Base Recipe Using ``devtool add``
49----------------------------------------------
50
51The ``devtool add`` command uses the same logic for auto-creating the
52recipe as ``recipetool create``, which is listed below. Additionally,
53however, ``devtool add`` sets up an environment that makes it easy for
54you to patch the source and to make changes to the recipe as is often
55necessary when adding a recipe to build a new piece of software to be
56included in a build.
57
58You can find a complete description of the ``devtool add`` command in
59the ":ref:`sdk-manual/extensible:a closer look at \`\`devtool add\`\``" section
60in the Yocto Project Application Development and the Extensible Software
61Development Kit (eSDK) manual.
62
63Creating the Base Recipe Using ``recipetool create``
64----------------------------------------------------
65
66``recipetool create`` automates creation of a base recipe given a set of
67source code files. As long as you can extract or point to the source
68files, the tool will construct a recipe and automatically configure all
69pre-build information into the recipe. For example, suppose you have an
70application that builds using Autotools. Creating the base recipe using
71``recipetool`` results in a recipe that has the pre-build dependencies,
72license requirements, and checksums configured.
73
74To run the tool, you just need to be in your :term:`Build Directory` and
75have sourced the build environment setup script (i.e.
76:ref:`structure-core-script`). To get help on the tool, use the following
77command::
78
79 $ recipetool -h
80 NOTE: Starting bitbake server...
81 usage: recipetool [-d] [-q] [--color COLOR] [-h] <subcommand> ...
82
83 OpenEmbedded recipe tool
84
85 options:
86 -d, --debug Enable debug output
87 -q, --quiet Print only errors
88 --color COLOR Colorize output (where COLOR is auto, always, never)
89 -h, --help show this help message and exit
90
91 subcommands:
92 create Create a new recipe
93 newappend Create a bbappend for the specified target in the specified
94 layer
95 setvar Set a variable within a recipe
96 appendfile Create/update a bbappend to replace a target file
97 appendsrcfiles Create/update a bbappend to add or replace source files
98 appendsrcfile Create/update a bbappend to add or replace a source file
99 Use recipetool <subcommand> --help to get help on a specific command
100
101Running ``recipetool create -o OUTFILE`` creates the base recipe and
102locates it properly in the layer that contains your source files.
103Following are some syntax examples:
104
105 - Use this syntax to generate a recipe based on source. Once generated,
106 the recipe resides in the existing source code layer::
107
108 recipetool create -o OUTFILE source
109
110 - Use this syntax to generate a recipe using code that
111 you extract from source. The extracted code is placed in its own layer
112 defined by :term:`EXTERNALSRC`::
113
114 recipetool create -o OUTFILE -x EXTERNALSRC source
115
116 - Use this syntax to generate a recipe based on source. The options
117 direct ``recipetool`` to generate debugging information. Once generated,
118 the recipe resides in the existing source code layer::
119
120 recipetool create -d -o OUTFILE source
121
122Locating and Using a Similar Recipe
123-----------------------------------
124
125Before writing a recipe from scratch, it is often useful to discover
126whether someone else has already written one that meets (or comes close
127to meeting) your needs. The Yocto Project and OpenEmbedded communities
128maintain many recipes that might be candidates for what you are doing.
129You can find a good central index of these recipes in the
130:oe_layerindex:`OpenEmbedded Layer Index <>`.
131
132Working from an existing recipe or a skeleton recipe is the best way to
133get started. Here are some points on both methods:
134
135- *Locate and modify a recipe that is close to what you want to do:*
136 This method works when you are familiar with the current recipe
137 space. The method does not work so well for those new to the Yocto
138 Project or writing recipes.
139
140 Some risks associated with this method are using a recipe that has
141 areas totally unrelated to what you are trying to accomplish with
142 your recipe, not recognizing areas of the recipe that you might have
143 to add from scratch, and so forth. All these risks stem from
144 unfamiliarity with the existing recipe space.
145
146- *Use and modify the following skeleton recipe:* If for some reason
147 you do not want to use ``recipetool`` and you cannot find an existing
148 recipe that is close to meeting your needs, you can use the following
149 structure to provide the fundamental areas of a new recipe::
150
151 DESCRIPTION = ""
152 HOMEPAGE = ""
153 LICENSE = ""
154 SECTION = ""
155 DEPENDS = ""
156 LIC_FILES_CHKSUM = ""
157
158 SRC_URI = ""
159
160Storing and Naming the Recipe
161=============================
162
163Once you have your base recipe, you should put it in your own layer and
164name it appropriately. Locating it correctly ensures that the
165OpenEmbedded build system can find it when you use BitBake to process
166the recipe.
167
168- *Storing Your Recipe:* The OpenEmbedded build system locates your
169 recipe through the layer's ``conf/layer.conf`` file and the
170 :term:`BBFILES` variable. This
171 variable sets up a path from which the build system can locate
172 recipes. Here is the typical use::
173
174 BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \
175 ${LAYERDIR}/recipes-*/*/*.bbappend"
176
177 Consequently, you need to be sure you locate your new recipe inside
178 your layer such that it can be found.
179
180 You can find more information on how layers are structured in the
181 ":ref:`dev-manual/layers:understanding and creating layers`" section.
182
183- *Naming Your Recipe:* When you name your recipe, you need to follow
184 this naming convention::
185
186 basename_version.bb
187
188 Use lower-cased characters and do not include the reserved suffixes
189 ``-native``, ``-cross``, ``-initial``, or ``-dev`` casually (i.e. do not use
190 them as part of your recipe name unless the string applies). Here are some
191 examples:
192
193 .. code-block:: none
194
195 cups_1.7.0.bb
196 gawk_4.0.2.bb
197 irssi_0.8.16-rc1.bb
198
199Running a Build on the Recipe
200=============================
201
202Creating a new recipe is usually an iterative process that requires
203using BitBake to process the recipe multiple times in order to
204progressively discover and add information to the recipe file.
205
206Assuming you have sourced the build environment setup script (i.e.
207:ref:`structure-core-script`) and you are in the :term:`Build Directory`, use
208BitBake to process your recipe. All you need to provide is the
209``basename`` of the recipe as described in the previous section::
210
211 $ bitbake basename
212
213During the build, the OpenEmbedded build system creates a temporary work
214directory for each recipe
215(``${``\ :term:`WORKDIR`\ ``}``)
216where it keeps extracted source files, log files, intermediate
217compilation and packaging files, and so forth.
218
219The path to the per-recipe temporary work directory depends on the
220context in which it is being built. The quickest way to find this path
221is to have BitBake return it by running the following::
222
223 $ bitbake -e basename | grep ^WORKDIR=
224
225As an example, assume a Source Directory
226top-level folder named ``poky``, a default :term:`Build Directory` at
227``poky/build``, and a ``qemux86-poky-linux`` machine target system.
228Furthermore, suppose your recipe is named ``foo_1.3.0.bb``. In this
229case, the work directory the build system uses to build the package
230would be as follows::
231
232 poky/build/tmp/work/qemux86-poky-linux/foo/1.3.0-r0
233
234Inside this directory you can find sub-directories such as ``image``,
235``packages-split``, and ``temp``. After the build, you can examine these
236to determine how well the build went.
237
238.. note::
239
240 You can find log files for each task in the recipe's ``temp``
241 directory (e.g. ``poky/build/tmp/work/qemux86-poky-linux/foo/1.3.0-r0/temp``).
242 Log files are named ``log.taskname`` (e.g. ``log.do_configure``,
243 ``log.do_fetch``, and ``log.do_compile``).
244
245You can find more information about the build process in
246":doc:`/overview-manual/development-environment`"
247chapter of the Yocto Project Overview and Concepts Manual.
248
249Fetching Code
250=============
251
252The first thing your recipe must do is specify how to fetch the source
253files. Fetching is controlled mainly through the
254:term:`SRC_URI` variable. Your recipe
255must have a :term:`SRC_URI` variable that points to where the source is
256located. For a graphical representation of source locations, see the
257":ref:`overview-manual/concepts:sources`" section in
258the Yocto Project Overview and Concepts Manual.
259
Andrew Geisslerfc113ea2023-03-31 09:59:46 -0500260The :ref:`ref-tasks-fetch` task uses the prefix of each entry in the
261:term:`SRC_URI` variable value to determine which
262:ref:`fetcher <bitbake-user-manual/bitbake-user-manual-fetching:fetchers>`
263to use to get your source files. It is the :term:`SRC_URI` variable that triggers
264the fetcher. The :ref:`ref-tasks-patch` task uses the variable after source is
265fetched to apply patches. The OpenEmbedded build system uses
266:term:`FILESOVERRIDES` for scanning directory locations for local files in
267:term:`SRC_URI`.
Andrew Geissler517393d2023-01-13 08:55:19 -0600268
269The :term:`SRC_URI` variable in your recipe must define each unique location
270for your source files. It is good practice to not hard-code version
271numbers in a URL used in :term:`SRC_URI`. Rather than hard-code these
272values, use ``${``\ :term:`PV`\ ``}``,
273which causes the fetch process to use the version specified in the
274recipe filename. Specifying the version in this manner means that
275upgrading the recipe to a future version is as simple as renaming the
276recipe to match the new version.
277
278Here is a simple example from the
279``meta/recipes-devtools/strace/strace_5.5.bb`` recipe where the source
280comes from a single tarball. Notice the use of the
281:term:`PV` variable::
282
283 SRC_URI = "https://strace.io/files/${PV}/strace-${PV}.tar.xz \
284
285Files mentioned in :term:`SRC_URI` whose names end in a typical archive
286extension (e.g. ``.tar``, ``.tar.gz``, ``.tar.bz2``, ``.zip``, and so
287forth), are automatically extracted during the
288:ref:`ref-tasks-unpack` task. For
289another example that specifies these types of files, see the
Andrew Geissler6aa7eec2023-03-03 12:41:14 -0600290":ref:`dev-manual/new-recipe:building an autotooled package`" section.
Andrew Geissler517393d2023-01-13 08:55:19 -0600291
292Another way of specifying source is from an SCM. For Git repositories,
293you must specify :term:`SRCREV` and you should specify :term:`PV` to include
294the revision with :term:`SRCPV`. Here is an example from the recipe
295``meta/recipes-core/musl/gcompat_git.bb``::
296
297 SRC_URI = "git://git.adelielinux.org/adelie/gcompat.git;protocol=https;branch=current"
298
299 PV = "1.0.0+1.1+git${SRCPV}"
300 SRCREV = "af5a49e489fdc04b9cf02547650d7aeaccd43793"
301
302If your :term:`SRC_URI` statement includes URLs pointing to individual files
303fetched from a remote server other than a version control system,
304BitBake attempts to verify the files against checksums defined in your
305recipe to ensure they have not been tampered with or otherwise modified
306since the recipe was written. Two checksums are used:
307``SRC_URI[md5sum]`` and ``SRC_URI[sha256sum]``.
308
309If your :term:`SRC_URI` variable points to more than a single URL (excluding
310SCM URLs), you need to provide the ``md5`` and ``sha256`` checksums for
311each URL. For these cases, you provide a name for each URL as part of
312the :term:`SRC_URI` and then reference that name in the subsequent checksum
313statements. Here is an example combining lines from the files
314``git.inc`` and ``git_2.24.1.bb``::
315
316 SRC_URI = "${KERNELORG_MIRROR}/software/scm/git/git-${PV}.tar.gz;name=tarball \
317 ${KERNELORG_MIRROR}/software/scm/git/git-manpages-${PV}.tar.gz;name=manpages"
318
319 SRC_URI[tarball.md5sum] = "166bde96adbbc11c8843d4f8f4f9811b"
320 SRC_URI[tarball.sha256sum] = "ad5334956301c86841eb1e5b1bb20884a6bad89a10a6762c958220c7cf64da02"
321 SRC_URI[manpages.md5sum] = "31c2272a8979022497ba3d4202df145d"
322 SRC_URI[manpages.sha256sum] = "9a7ae3a093bea39770eb96ca3e5b40bff7af0b9f6123f089d7821d0e5b8e1230"
323
324Proper values for ``md5`` and ``sha256`` checksums might be available
325with other signatures on the download page for the upstream source (e.g.
326``md5``, ``sha1``, ``sha256``, ``GPG``, and so forth). Because the
327OpenEmbedded build system only deals with ``sha256sum`` and ``md5sum``,
328you should verify all the signatures you find by hand.
329
330If no :term:`SRC_URI` checksums are specified when you attempt to build the
331recipe, or you provide an incorrect checksum, the build will produce an
332error for each missing or incorrect checksum. As part of the error
333message, the build system provides the checksum string corresponding to
334the fetched file. Once you have the correct checksums, you can copy and
335paste them into your recipe and then run the build again to continue.
336
337.. note::
338
339 As mentioned, if the upstream source provides signatures for
340 verifying the downloaded source code, you should verify those
341 manually before setting the checksum values in the recipe and
342 continuing with the build.
343
344This final example is a bit more complicated and is from the
345``meta/recipes-sato/rxvt-unicode/rxvt-unicode_9.20.bb`` recipe. The
346example's :term:`SRC_URI` statement identifies multiple files as the source
347files for the recipe: a tarball, a patch file, a desktop file, and an icon::
348
349 SRC_URI = "http://dist.schmorp.de/rxvt-unicode/Attic/rxvt-unicode-${PV}.tar.bz2 \
350 file://xwc.patch \
351 file://rxvt.desktop \
352 file://rxvt.png"
353
354When you specify local files using the ``file://`` URI protocol, the
355build system fetches files from the local machine. The path is relative
356to the :term:`FILESPATH` variable
357and searches specific directories in a certain order:
358``${``\ :term:`BP`\ ``}``,
359``${``\ :term:`BPN`\ ``}``, and
360``files``. The directories are assumed to be subdirectories of the
361directory in which the recipe or append file resides. For another
362example that specifies these types of files, see the
Andrew Geissler6aa7eec2023-03-03 12:41:14 -0600363"`building a single .c file package`_" section.
Andrew Geissler517393d2023-01-13 08:55:19 -0600364
365The previous example also specifies a patch file. Patch files are files
366whose names usually end in ``.patch`` or ``.diff`` but can end with
367compressed suffixes such as ``diff.gz`` and ``patch.bz2``, for example.
368The build system automatically applies patches as described in the
369":ref:`dev-manual/new-recipe:patching code`" section.
370
371Fetching Code Through Firewalls
372-------------------------------
373
374Some users are behind firewalls and need to fetch code through a proxy.
375See the ":doc:`/ref-manual/faq`" chapter for advice.
376
377Limiting the Number of Parallel Connections
378-------------------------------------------
379
380Some users are behind firewalls or use servers where the number of parallel
381connections is limited. In such cases, you can limit the number of fetch
382tasks being run in parallel by adding the following to your ``local.conf``
383file::
384
385 do_fetch[number_threads] = "4"
386
387Unpacking Code
388==============
389
390During the build, the
391:ref:`ref-tasks-unpack` task unpacks
392the source with ``${``\ :term:`S`\ ``}``
393pointing to where it is unpacked.
394
395If you are fetching your source files from an upstream source archived
396tarball and the tarball's internal structure matches the common
397convention of a top-level subdirectory named
398``${``\ :term:`BPN`\ ``}-${``\ :term:`PV`\ ``}``,
399then you do not need to set :term:`S`. However, if :term:`SRC_URI` specifies to
400fetch source from an archive that does not use this convention, or from
401an SCM like Git or Subversion, your recipe needs to define :term:`S`.
402
403If processing your recipe using BitBake successfully unpacks the source
404files, you need to be sure that the directory pointed to by ``${S}``
405matches the structure of the source.
406
407Patching Code
408=============
409
410Sometimes it is necessary to patch code after it has been fetched. Any
411files mentioned in :term:`SRC_URI` whose names end in ``.patch`` or
Patrick Williamsac13d5f2023-11-24 18:59:46 -0600412``.diff`` or compressed versions of these suffixes (e.g. ``diff.gz``,
413``patch.bz2``, etc.) are treated as patches. The
Andrew Geissler517393d2023-01-13 08:55:19 -0600414:ref:`ref-tasks-patch` task
415automatically applies these patches.
416
417The build system should be able to apply patches with the "-p1" option
418(i.e. one directory level in the path will be stripped off). If your
419patch needs to have more directory levels stripped off, specify the
420number of levels using the "striplevel" option in the :term:`SRC_URI` entry
421for the patch. Alternatively, if your patch needs to be applied in a
422specific subdirectory that is not specified in the patch file, use the
423"patchdir" option in the entry.
424
425As with all local files referenced in
426:term:`SRC_URI` using ``file://``,
427you should place patch files in a directory next to the recipe either
428named the same as the base name of the recipe
429(:term:`BP` and
430:term:`BPN`) or "files".
431
432Licensing
433=========
434
Andrew Geissler5082cc72023-09-11 08:41:39 -0400435Your recipe needs to define variables related to the license
436under whith the software is distributed. See the
437:ref:`contributor-guide/recipe-style-guide:recipe license fields`
438section in the Contributor Guide for details.
Andrew Geissler517393d2023-01-13 08:55:19 -0600439
440Dependencies
441============
442
443Most software packages have a short list of other packages that they
444require, which are called dependencies. These dependencies fall into two
445main categories: build-time dependencies, which are required when the
446software is built; and runtime dependencies, which are required to be
447installed on the target in order for the software to run.
448
449Within a recipe, you specify build-time dependencies using the
450:term:`DEPENDS` variable. Although there are nuances,
451items specified in :term:`DEPENDS` should be names of other
452recipes. It is important that you specify all build-time dependencies
453explicitly.
454
455Another consideration is that configure scripts might automatically
456check for optional dependencies and enable corresponding functionality
457if those dependencies are found. If you wish to make a recipe that is
458more generally useful (e.g. publish the recipe in a layer for others to
459use), instead of hard-disabling the functionality, you can use the
460:term:`PACKAGECONFIG` variable to allow functionality and the
461corresponding dependencies to be enabled and disabled easily by other
462users of the recipe.
463
464Similar to build-time dependencies, you specify runtime dependencies
465through a variable -
466:term:`RDEPENDS`, which is
467package-specific. All variables that are package-specific need to have
468the name of the package added to the end as an override. Since the main
469package for a recipe has the same name as the recipe, and the recipe's
470name can be found through the
471``${``\ :term:`PN`\ ``}`` variable, then
472you specify the dependencies for the main package by setting
473``RDEPENDS:${PN}``. If the package were named ``${PN}-tools``, then you
474would set ``RDEPENDS:${PN}-tools``, and so forth.
475
476Some runtime dependencies will be set automatically at packaging time.
477These dependencies include any shared library dependencies (i.e. if a
478package "example" contains "libexample" and another package "mypackage"
479contains a binary that links to "libexample" then the OpenEmbedded build
480system will automatically add a runtime dependency to "mypackage" on
481"example"). See the
482":ref:`overview-manual/concepts:automatically added runtime dependencies`"
483section in the Yocto Project Overview and Concepts Manual for further
484details.
485
486Configuring the Recipe
487======================
488
489Most software provides some means of setting build-time configuration
490options before compilation. Typically, setting these options is
491accomplished by running a configure script with options, or by modifying
492a build configuration file.
493
494.. note::
495
496 As of Yocto Project Release 1.7, some of the core recipes that
497 package binary configuration scripts now disable the scripts due to
498 the scripts previously requiring error-prone path substitution. The
499 OpenEmbedded build system uses ``pkg-config`` now, which is much more
500 robust. You can find a list of the ``*-config`` scripts that are disabled
501 in the ":ref:`migration-1.7-binary-configuration-scripts-disabled`" section
502 in the Yocto Project Reference Manual.
503
504A major part of build-time configuration is about checking for
505build-time dependencies and possibly enabling optional functionality as
506a result. You need to specify any build-time dependencies for the
507software you are building in your recipe's
508:term:`DEPENDS` value, in terms of
509other recipes that satisfy those dependencies. You can often find
510build-time or runtime dependencies described in the software's
511documentation.
512
513The following list provides configuration items of note based on how
514your software is built:
515
516- *Autotools:* If your source files have a ``configure.ac`` file, then
517 your software is built using Autotools. If this is the case, you just
518 need to modify the configuration.
519
520 When using Autotools, your recipe needs to inherit the
521 :ref:`ref-classes-autotools` class and it does not have to
522 contain a :ref:`ref-tasks-configure` task. However, you might still want to
523 make some adjustments. For example, you can set :term:`EXTRA_OECONF` or
524 :term:`PACKAGECONFIG_CONFARGS` to pass any needed configure options that
525 are specific to the recipe.
526
527- *CMake:* If your source files have a ``CMakeLists.txt`` file, then
528 your software is built using CMake. If this is the case, you just
529 need to modify the configuration.
530
531 When you use CMake, your recipe needs to inherit the
532 :ref:`ref-classes-cmake` class and it does not have to contain a
533 :ref:`ref-tasks-configure` task. You can make some adjustments by setting
534 :term:`EXTRA_OECMAKE` to pass any needed configure options that are
535 specific to the recipe.
536
537 .. note::
538
539 If you need to install one or more custom CMake toolchain files
540 that are supplied by the application you are building, install the
541 files to ``${D}${datadir}/cmake/Modules`` during :ref:`ref-tasks-install`.
542
543- *Other:* If your source files do not have a ``configure.ac`` or
544 ``CMakeLists.txt`` file, then your software is built using some
545 method other than Autotools or CMake. If this is the case, you
546 normally need to provide a
547 :ref:`ref-tasks-configure` task
548 in your recipe unless, of course, there is nothing to configure.
549
550 Even if your software is not being built by Autotools or CMake, you
551 still might not need to deal with any configuration issues. You need
552 to determine if configuration is even a required step. You might need
553 to modify a Makefile or some configuration file used for the build to
554 specify necessary build options. Or, perhaps you might need to run a
555 provided, custom configure script with the appropriate options.
556
557 For the case involving a custom configure script, you would run
558 ``./configure --help`` and look for the options you need to set.
559
560Once configuration succeeds, it is always good practice to look at the
561``log.do_configure`` file to ensure that the appropriate options have
562been enabled and no additional build-time dependencies need to be added
563to :term:`DEPENDS`. For example, if the configure script reports that it
564found something not mentioned in :term:`DEPENDS`, or that it did not find
565something that it needed for some desired optional functionality, then
566you would need to add those to :term:`DEPENDS`. Looking at the log might
567also reveal items being checked for, enabled, or both that you do not
568want, or items not being found that are in :term:`DEPENDS`, in which case
569you would need to look at passing extra options to the configure script
570as needed. For reference information on configure options specific to
571the software you are building, you can consult the output of the
572``./configure --help`` command within ``${S}`` or consult the software's
573upstream documentation.
574
575Using Headers to Interface with Devices
576=======================================
577
578If your recipe builds an application that needs to communicate with some
579device or needs an API into a custom kernel, you will need to provide
580appropriate header files. Under no circumstances should you ever modify
581the existing
582``meta/recipes-kernel/linux-libc-headers/linux-libc-headers.inc`` file.
583These headers are used to build ``libc`` and must not be compromised
584with custom or machine-specific header information. If you customize
585``libc`` through modified headers all other applications that use
586``libc`` thus become affected.
587
588.. note::
589
590 Never copy and customize the ``libc`` header file (i.e.
591 ``meta/recipes-kernel/linux-libc-headers/linux-libc-headers.inc``).
592
593The correct way to interface to a device or custom kernel is to use a
594separate package that provides the additional headers for the driver or
595other unique interfaces. When doing so, your application also becomes
596responsible for creating a dependency on that specific provider.
597
598Consider the following:
599
600- Never modify ``linux-libc-headers.inc``. Consider that file to be
601 part of the ``libc`` system, and not something you use to access the
602 kernel directly. You should access ``libc`` through specific ``libc``
603 calls.
604
605- Applications that must talk directly to devices should either provide
606 necessary headers themselves, or establish a dependency on a special
607 headers package that is specific to that driver.
608
609For example, suppose you want to modify an existing header that adds I/O
610control or network support. If the modifications are used by a small
611number programs, providing a unique version of a header is easy and has
612little impact. When doing so, bear in mind the guidelines in the
613previous list.
614
615.. note::
616
617 If for some reason your changes need to modify the behavior of the ``libc``,
618 and subsequently all other applications on the system, use a ``.bbappend``
619 to modify the ``linux-kernel-headers.inc`` file. However, take care to not
620 make the changes machine specific.
621
622Consider a case where your kernel is older and you need an older
623``libc`` ABI. The headers installed by your recipe should still be a
624standard mainline kernel, not your own custom one.
625
626When you use custom kernel headers you need to get them from
627:term:`STAGING_KERNEL_DIR`,
628which is the directory with kernel headers that are required to build
629out-of-tree modules. Your recipe will also need the following::
630
631 do_configure[depends] += "virtual/kernel:do_shared_workdir"
632
633Compilation
634===========
635
636During a build, the :ref:`ref-tasks-compile` task happens after source is fetched,
637unpacked, and configured. If the recipe passes through :ref:`ref-tasks-compile`
638successfully, nothing needs to be done.
639
640However, if the compile step fails, you need to diagnose the failure.
641Here are some common issues that cause failures.
642
643.. note::
644
645 For cases where improper paths are detected for configuration files
646 or for when libraries/headers cannot be found, be sure you are using
647 the more robust ``pkg-config``. See the note in section
648 ":ref:`dev-manual/new-recipe:Configuring the Recipe`" for additional information.
649
650- *Parallel build failures:* These failures manifest themselves as
651 intermittent errors, or errors reporting that a file or directory
652 that should be created by some other part of the build process could
653 not be found. This type of failure can occur even if, upon
654 inspection, the file or directory does exist after the build has
655 failed, because that part of the build process happened in the wrong
656 order.
657
658 To fix the problem, you need to either satisfy the missing dependency
659 in the Makefile or whatever script produced the Makefile, or (as a
660 workaround) set :term:`PARALLEL_MAKE` to an empty string::
661
662 PARALLEL_MAKE = ""
663
664 For information on parallel Makefile issues, see the
665 ":ref:`dev-manual/debugging:debugging parallel make races`" section.
666
667- *Improper host path usage:* This failure applies to recipes building
668 for the target or ":ref:`ref-classes-nativesdk`" only. The
669 failure occurs when the compilation process uses improper headers,
670 libraries, or other files from the host system when cross-compiling for
671 the target.
672
673 To fix the problem, examine the ``log.do_compile`` file to identify
674 the host paths being used (e.g. ``/usr/include``, ``/usr/lib``, and
675 so forth) and then either add configure options, apply a patch, or do
676 both.
677
678- *Failure to find required libraries/headers:* If a build-time
679 dependency is missing because it has not been declared in
680 :term:`DEPENDS`, or because the
681 dependency exists but the path used by the build process to find the
682 file is incorrect and the configure step did not detect it, the
683 compilation process could fail. For either of these failures, the
684 compilation process notes that files could not be found. In these
685 cases, you need to go back and add additional options to the
686 configure script as well as possibly add additional build-time
687 dependencies to :term:`DEPENDS`.
688
689 Occasionally, it is necessary to apply a patch to the source to
690 ensure the correct paths are used. If you need to specify paths to
691 find files staged into the sysroot from other recipes, use the
692 variables that the OpenEmbedded build system provides (e.g.
693 :term:`STAGING_BINDIR`, :term:`STAGING_INCDIR`, :term:`STAGING_DATADIR`, and so
694 forth).
695
696Installing
697==========
698
699During :ref:`ref-tasks-install`, the task copies the built files along with their
700hierarchy to locations that would mirror their locations on the target
701device. The installation process copies files from the
702``${``\ :term:`S`\ ``}``,
703``${``\ :term:`B`\ ``}``, and
704``${``\ :term:`WORKDIR`\ ``}``
705directories to the ``${``\ :term:`D`\ ``}``
706directory to create the structure as it should appear on the target
707system.
708
709How your software is built affects what you must do to be sure your
710software is installed correctly. The following list describes what you
711must do for installation depending on the type of build system used by
712the software being built:
713
714- *Autotools and CMake:* If the software your recipe is building uses
715 Autotools or CMake, the OpenEmbedded build system understands how to
716 install the software. Consequently, you do not have to have a
717 :ref:`ref-tasks-install` task as part of your recipe. You just need to make
718 sure the install portion of the build completes with no issues.
719 However, if you wish to install additional files not already being
720 installed by ``make install``, you should do this using a
721 ``do_install:append`` function using the install command as described
722 in the "Manual" bulleted item later in this list.
723
724- *Other (using* ``make install``\ *)*: You need to define a :ref:`ref-tasks-install`
725 function in your recipe. The function should call
726 ``oe_runmake install`` and will likely need to pass in the
727 destination directory as well. How you pass that path is dependent on
728 how the ``Makefile`` being run is written (e.g. ``DESTDIR=${D}``,
729 ``PREFIX=${D}``, ``INSTALLROOT=${D}``, and so forth).
730
731 For an example recipe using ``make install``, see the
Andrew Geissler6aa7eec2023-03-03 12:41:14 -0600732 ":ref:`dev-manual/new-recipe:building a makefile-based package`" section.
Andrew Geissler517393d2023-01-13 08:55:19 -0600733
734- *Manual:* You need to define a :ref:`ref-tasks-install` function in your
735 recipe. The function must first use ``install -d`` to create the
736 directories under
737 ``${``\ :term:`D`\ ``}``. Once the
738 directories exist, your function can use ``install`` to manually
739 install the built software into the directories.
740
741 You can find more information on ``install`` at
742 https://www.gnu.org/software/coreutils/manual/html_node/install-invocation.html.
743
744For the scenarios that do not use Autotools or CMake, you need to track
745the installation and diagnose and fix any issues until everything
746installs correctly. You need to look in the default location of
747``${D}``, which is ``${WORKDIR}/image``, to be sure your files have been
748installed correctly.
749
750.. note::
751
752 - During the installation process, you might need to modify some of
753 the installed files to suit the target layout. For example, you
754 might need to replace hard-coded paths in an initscript with
755 values of variables provided by the build system, such as
756 replacing ``/usr/bin/`` with ``${bindir}``. If you do perform such
757 modifications during :ref:`ref-tasks-install`, be sure to modify the
758 destination file after copying rather than before copying.
759 Modifying after copying ensures that the build system can
760 re-execute :ref:`ref-tasks-install` if needed.
761
762 - ``oe_runmake install``, which can be run directly or can be run
763 indirectly by the :ref:`ref-classes-autotools` and
764 :ref:`ref-classes-cmake` classes, runs ``make install`` in parallel.
765 Sometimes, a Makefile can have missing dependencies between targets that
766 can result in race conditions. If you experience intermittent failures
767 during :ref:`ref-tasks-install`, you might be able to work around them by
768 disabling parallel Makefile installs by adding the following to the
769 recipe::
770
771 PARALLEL_MAKEINST = ""
772
773 See :term:`PARALLEL_MAKEINST` for additional information.
774
775 - If you need to install one or more custom CMake toolchain files
776 that are supplied by the application you are building, install the
777 files to ``${D}${datadir}/cmake/Modules`` during
778 :ref:`ref-tasks-install`.
779
780Enabling System Services
781========================
782
783If you want to install a service, which is a process that usually starts
784on boot and runs in the background, then you must include some
785additional definitions in your recipe.
786
787If you are adding services and the service initialization script or the
788service file itself is not installed, you must provide for that
789installation in your recipe using a ``do_install:append`` function. If
790your recipe already has a :ref:`ref-tasks-install` function, update the function
791near its end rather than adding an additional ``do_install:append``
792function.
793
794When you create the installation for your services, you need to
795accomplish what is normally done by ``make install``. In other words,
796make sure your installation arranges the output similar to how it is
797arranged on the target system.
798
799The OpenEmbedded build system provides support for starting services two
800different ways:
801
802- *SysVinit:* SysVinit is a system and service manager that manages the
803 init system used to control the very basic functions of your system.
804 The init program is the first program started by the Linux kernel
805 when the system boots. Init then controls the startup, running and
806 shutdown of all other programs.
807
808 To enable a service using SysVinit, your recipe needs to inherit the
809 :ref:`ref-classes-update-rc.d` class. The class helps
810 facilitate safely installing the package on the target.
811
812 You will need to set the
813 :term:`INITSCRIPT_PACKAGES`,
814 :term:`INITSCRIPT_NAME`,
815 and
816 :term:`INITSCRIPT_PARAMS`
817 variables within your recipe.
818
819- *systemd:* System Management Daemon (systemd) was designed to replace
820 SysVinit and to provide enhanced management of services. For more
821 information on systemd, see the systemd homepage at
822 https://freedesktop.org/wiki/Software/systemd/.
823
824 To enable a service using systemd, your recipe needs to inherit the
825 :ref:`ref-classes-systemd` class. See the ``systemd.bbclass`` file
826 located in your :term:`Source Directory` section for more information.
827
828Packaging
829=========
830
831Successful packaging is a combination of automated processes performed
832by the OpenEmbedded build system and some specific steps you need to
833take. The following list describes the process:
834
835- *Splitting Files*: The :ref:`ref-tasks-package` task splits the files produced
836 by the recipe into logical components. Even software that produces a
837 single binary might still have debug symbols, documentation, and
838 other logical components that should be split out. The :ref:`ref-tasks-package`
839 task ensures that files are split up and packaged correctly.
840
841- *Running QA Checks*: The :ref:`ref-classes-insane` class adds a
842 step to the package generation process so that output quality
843 assurance checks are generated by the OpenEmbedded build system. This
844 step performs a range of checks to be sure the build's output is free
845 of common problems that show up during runtime. For information on
846 these checks, see the :ref:`ref-classes-insane` class and
847 the ":ref:`ref-manual/qa-checks:qa error and warning messages`"
848 chapter in the Yocto Project Reference Manual.
849
850- *Hand-Checking Your Packages*: After you build your software, you
851 need to be sure your packages are correct. Examine the
852 ``${``\ :term:`WORKDIR`\ ``}/packages-split``
853 directory and make sure files are where you expect them to be. If you
854 discover problems, you can set
855 :term:`PACKAGES`,
856 :term:`FILES`,
857 ``do_install(:append)``, and so forth as needed.
858
859- *Splitting an Application into Multiple Packages*: If you need to
860 split an application into several packages, see the
861 ":ref:`dev-manual/new-recipe:splitting an application into multiple packages`"
862 section for an example.
863
864- *Installing a Post-Installation Script*: For an example showing how
865 to install a post-installation script, see the
866 ":ref:`dev-manual/new-recipe:post-installation scripts`" section.
867
868- *Marking Package Architecture*: Depending on what your recipe is
869 building and how it is configured, it might be important to mark the
870 packages produced as being specific to a particular machine, or to
871 mark them as not being specific to a particular machine or
872 architecture at all.
873
874 By default, packages apply to any machine with the same architecture
875 as the target machine. When a recipe produces packages that are
876 machine-specific (e.g. the
877 :term:`MACHINE` value is passed
878 into the configure script or a patch is applied only for a particular
879 machine), you should mark them as such by adding the following to the
880 recipe::
881
882 PACKAGE_ARCH = "${MACHINE_ARCH}"
883
884 On the other hand, if the recipe produces packages that do not
885 contain anything specific to the target machine or architecture at
886 all (e.g. recipes that simply package script files or configuration
887 files), you should use the :ref:`ref-classes-allarch` class to
888 do this for you by adding this to your recipe::
889
890 inherit allarch
891
892 Ensuring that the package architecture is correct is not critical
893 while you are doing the first few builds of your recipe. However, it
894 is important in order to ensure that your recipe rebuilds (or does
895 not rebuild) appropriately in response to changes in configuration,
896 and to ensure that you get the appropriate packages installed on the
897 target machine, particularly if you run separate builds for more than
898 one target machine.
899
900Sharing Files Between Recipes
901=============================
902
903Recipes often need to use files provided by other recipes on the build
904host. For example, an application linking to a common library needs
905access to the library itself and its associated headers. The way this
906access is accomplished is by populating a sysroot with files. Each
907recipe has two sysroots in its work directory, one for target files
908(``recipe-sysroot``) and one for files that are native to the build host
909(``recipe-sysroot-native``).
910
911.. note::
912
913 You could find the term "staging" used within the Yocto project
914 regarding files populating sysroots (e.g. the :term:`STAGING_DIR`
915 variable).
916
917Recipes should never populate the sysroot directly (i.e. write files
918into sysroot). Instead, files should be installed into standard
919locations during the
920:ref:`ref-tasks-install` task within
921the ``${``\ :term:`D`\ ``}`` directory. The
922reason for this limitation is that almost all files that populate the
923sysroot are cataloged in manifests in order to ensure the files can be
924removed later when a recipe is either modified or removed. Thus, the
925sysroot is able to remain free from stale files.
926
927A subset of the files installed by the :ref:`ref-tasks-install` task are
928used by the :ref:`ref-tasks-populate_sysroot` task as defined by the
929:term:`SYSROOT_DIRS` variable to automatically populate the sysroot. It
930is possible to modify the list of directories that populate the sysroot.
931The following example shows how you could add the ``/opt`` directory to
932the list of directories within a recipe::
933
934 SYSROOT_DIRS += "/opt"
935
936.. note::
937
938 The `/sysroot-only` is to be used by recipes that generate artifacts
939 that are not included in the target filesystem, allowing them to share
940 these artifacts without needing to use the :term:`DEPLOY_DIR`.
941
942For a more complete description of the :ref:`ref-tasks-populate_sysroot`
943task and its associated functions, see the
944:ref:`staging <ref-classes-staging>` class.
945
946Using Virtual Providers
947=======================
948
949Prior to a build, if you know that several different recipes provide the
950same functionality, you can use a virtual provider (i.e. ``virtual/*``)
951as a placeholder for the actual provider. The actual provider is
952determined at build-time.
953
954A common scenario where a virtual provider is used would be for the kernel
955recipe. Suppose you have three kernel recipes whose :term:`PN` values map to
956``kernel-big``, ``kernel-mid``, and ``kernel-small``. Furthermore, each of
957these recipes in some way uses a :term:`PROVIDES` statement that essentially
958identifies itself as being able to provide ``virtual/kernel``. Here is one way
959through the :ref:`ref-classes-kernel` class::
960
961 PROVIDES += "virtual/kernel"
962
963Any recipe that inherits the :ref:`ref-classes-kernel` class is
964going to utilize a :term:`PROVIDES` statement that identifies that recipe as
965being able to provide the ``virtual/kernel`` item.
966
967Now comes the time to actually build an image and you need a kernel
968recipe, but which one? You can configure your build to call out the
969kernel recipe you want by using the :term:`PREFERRED_PROVIDER` variable. As
970an example, consider the :yocto_git:`x86-base.inc
971</poky/tree/meta/conf/machine/include/x86/x86-base.inc>` include file, which is a
972machine (i.e. :term:`MACHINE`) configuration file. This include file is the
973reason all x86-based machines use the ``linux-yocto`` kernel. Here are the
974relevant lines from the include file::
975
976 PREFERRED_PROVIDER_virtual/kernel ??= "linux-yocto"
977 PREFERRED_VERSION_linux-yocto ??= "4.15%"
978
979When you use a virtual provider, you do not have to "hard code" a recipe
980name as a build dependency. You can use the
981:term:`DEPENDS` variable to state the
982build is dependent on ``virtual/kernel`` for example::
983
984 DEPENDS = "virtual/kernel"
985
986During the build, the OpenEmbedded build system picks
987the correct recipe needed for the ``virtual/kernel`` dependency based on
988the :term:`PREFERRED_PROVIDER` variable. If you want to use the small kernel
989mentioned at the beginning of this section, configure your build as
990follows::
991
992 PREFERRED_PROVIDER_virtual/kernel ??= "kernel-small"
993
994.. note::
995
996 Any recipe that :term:`PROVIDES` a ``virtual/*`` item that is ultimately not
997 selected through :term:`PREFERRED_PROVIDER` does not get built. Preventing these
998 recipes from building is usually the desired behavior since this mechanism's
999 purpose is to select between mutually exclusive alternative providers.
1000
1001The following lists specific examples of virtual providers:
1002
1003- ``virtual/kernel``: Provides the name of the kernel recipe to use
1004 when building a kernel image.
1005
1006- ``virtual/bootloader``: Provides the name of the bootloader to use
1007 when building an image.
1008
1009- ``virtual/libgbm``: Provides ``gbm.pc``.
1010
1011- ``virtual/egl``: Provides ``egl.pc`` and possibly ``wayland-egl.pc``.
1012
1013- ``virtual/libgl``: Provides ``gl.pc`` (i.e. libGL).
1014
1015- ``virtual/libgles1``: Provides ``glesv1_cm.pc`` (i.e. libGLESv1_CM).
1016
1017- ``virtual/libgles2``: Provides ``glesv2.pc`` (i.e. libGLESv2).
1018
1019.. note::
1020
1021 Virtual providers only apply to build time dependencies specified with
1022 :term:`PROVIDES` and :term:`DEPENDS`. They do not apply to runtime
1023 dependencies specified with :term:`RPROVIDES` and :term:`RDEPENDS`.
1024
1025Properly Versioning Pre-Release Recipes
1026=======================================
1027
1028Sometimes the name of a recipe can lead to versioning problems when the
1029recipe is upgraded to a final release. For example, consider the
1030``irssi_0.8.16-rc1.bb`` recipe file in the list of example recipes in
1031the ":ref:`dev-manual/new-recipe:storing and naming the recipe`" section.
1032This recipe is at a release candidate stage (i.e. "rc1"). When the recipe is
1033released, the recipe filename becomes ``irssi_0.8.16.bb``. The version
1034change from ``0.8.16-rc1`` to ``0.8.16`` is seen as a decrease by the
1035build system and package managers, so the resulting packages will not
1036correctly trigger an upgrade.
1037
1038In order to ensure the versions compare properly, the recommended
Andrew Geissler220dafd2023-10-04 10:18:08 -05001039convention is to use a tilde (``~``) character as follows::
Andrew Geissler517393d2023-01-13 08:55:19 -06001040
Andrew Geissler220dafd2023-10-04 10:18:08 -05001041 PV = 0.8.16~rc1
1042
1043This way ``0.8.16~rc1`` sorts before ``0.8.16``. See the
1044":ref:`contributor-guide/recipe-style-guide:version policy`" section in the
1045Yocto Project and OpenEmbedded Contributor Guide for more details about
1046versioning code corresponding to a pre-release or to a specific Git commit.
Andrew Geissler517393d2023-01-13 08:55:19 -06001047
1048Post-Installation Scripts
1049=========================
1050
1051Post-installation scripts run immediately after installing a package on
1052the target or during image creation when a package is included in an
1053image. To add a post-installation script to a package, add a
1054``pkg_postinst:``\ `PACKAGENAME`\ ``()`` function to the recipe file
1055(``.bb``) and replace `PACKAGENAME` with the name of the package you want
1056to attach to the ``postinst`` script. To apply the post-installation
1057script to the main package for the recipe, which is usually what is
1058required, specify
1059``${``\ :term:`PN`\ ``}`` in place of
1060PACKAGENAME.
1061
1062A post-installation function has the following structure::
1063
1064 pkg_postinst:PACKAGENAME() {
1065 # Commands to carry out
1066 }
1067
1068The script defined in the post-installation function is called when the
1069root filesystem is created. If the script succeeds, the package is
1070marked as installed.
1071
1072.. note::
1073
1074 Any RPM post-installation script that runs on the target should
1075 return a 0 exit code. RPM does not allow non-zero exit codes for
1076 these scripts, and the RPM package manager will cause the package to
1077 fail installation on the target.
1078
1079Sometimes it is necessary for the execution of a post-installation
1080script to be delayed until the first boot. For example, the script might
1081need to be executed on the device itself. To delay script execution
1082until boot time, you must explicitly mark post installs to defer to the
1083target. You can use ``pkg_postinst_ontarget()`` or call
1084``postinst_intercept delay_to_first_boot`` from ``pkg_postinst()``. Any
1085failure of a ``pkg_postinst()`` script (including exit 1) triggers an
1086error during the
1087:ref:`ref-tasks-rootfs` task.
1088
1089If you have recipes that use ``pkg_postinst`` function and they require
1090the use of non-standard native tools that have dependencies during
1091root filesystem construction, you need to use the
1092:term:`PACKAGE_WRITE_DEPS`
1093variable in your recipe to list these tools. If you do not use this
1094variable, the tools might be missing and execution of the
1095post-installation script is deferred until first boot. Deferring the
1096script to the first boot is undesirable and impossible for read-only
1097root filesystems.
1098
1099.. note::
1100
1101 There is equivalent support for pre-install, pre-uninstall, and post-uninstall
1102 scripts by way of ``pkg_preinst``, ``pkg_prerm``, and ``pkg_postrm``,
1103 respectively. These scrips work in exactly the same way as does
1104 ``pkg_postinst`` with the exception that they run at different times. Also,
1105 because of when they run, they are not applicable to being run at image
1106 creation time like ``pkg_postinst``.
1107
1108Testing
1109=======
1110
1111The final step for completing your recipe is to be sure that the
1112software you built runs correctly. To accomplish runtime testing, add
1113the build's output packages to your image and test them on the target.
1114
1115For information on how to customize your image by adding specific
1116packages, see ":ref:`dev-manual/customizing-images:customizing images`" section.
1117
1118Examples
1119========
1120
1121To help summarize how to write a recipe, this section provides some
Andrew Geissler6aa7eec2023-03-03 12:41:14 -06001122recipe examples given various scenarios:
Andrew Geissler517393d2023-01-13 08:55:19 -06001123
Andrew Geissler6aa7eec2023-03-03 12:41:14 -06001124- `Building a single .c file package`_
Andrew Geissler517393d2023-01-13 08:55:19 -06001125
Andrew Geissler6aa7eec2023-03-03 12:41:14 -06001126- `Building a Makefile-based package`_
Andrew Geissler517393d2023-01-13 08:55:19 -06001127
Andrew Geissler6aa7eec2023-03-03 12:41:14 -06001128- `Building an Autotooled package`_
Andrew Geissler517393d2023-01-13 08:55:19 -06001129
Andrew Geissler6aa7eec2023-03-03 12:41:14 -06001130- `Building a Meson package`_
Andrew Geissler517393d2023-01-13 08:55:19 -06001131
Andrew Geissler6aa7eec2023-03-03 12:41:14 -06001132- `Splitting an application into multiple packages`_
Andrew Geissler517393d2023-01-13 08:55:19 -06001133
Andrew Geissler6aa7eec2023-03-03 12:41:14 -06001134- `Packaging externally produced binaries`_
Andrew Geissler517393d2023-01-13 08:55:19 -06001135
Andrew Geissler6aa7eec2023-03-03 12:41:14 -06001136Building a Single .c File Package
1137---------------------------------
1138
1139Building an application from a single file that is stored locally (e.g. under
1140``files``) requires a recipe that has the file listed in the :term:`SRC_URI`
1141variable. Additionally, you need to manually write the :ref:`ref-tasks-compile`
1142and :ref:`ref-tasks-install` tasks. The :term:`S` variable defines the
1143directory containing the source code, which is set to :term:`WORKDIR` in this
1144case --- the directory BitBake uses for the build::
Andrew Geissler517393d2023-01-13 08:55:19 -06001145
1146 SUMMARY = "Simple helloworld application"
1147 SECTION = "examples"
1148 LICENSE = "MIT"
1149 LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
1150
1151 SRC_URI = "file://helloworld.c"
1152
1153 S = "${WORKDIR}"
1154
1155 do_compile() {
1156 ${CC} ${LDFLAGS} helloworld.c -o helloworld
1157 }
1158
1159 do_install() {
1160 install -d ${D}${bindir}
1161 install -m 0755 helloworld ${D}${bindir}
1162 }
1163
Andrew Geissler6aa7eec2023-03-03 12:41:14 -06001164By default, the ``helloworld``, ``helloworld-dbg``, and ``helloworld-dev`` packages
1165are built. For information on how to customize the packaging process, see the
Andrew Geissler517393d2023-01-13 08:55:19 -06001166":ref:`dev-manual/new-recipe:splitting an application into multiple packages`"
1167section.
1168
Andrew Geissler6aa7eec2023-03-03 12:41:14 -06001169Building a Makefile-Based Package
1170---------------------------------
Andrew Geissler517393d2023-01-13 08:55:19 -06001171
Andrew Geissler6aa7eec2023-03-03 12:41:14 -06001172Applications built with GNU ``make`` require a recipe that has the source archive
1173listed in :term:`SRC_URI`. You do not need to add a :ref:`ref-tasks-compile`
1174step since by default BitBake starts the ``make`` command to compile the
1175application. If you need additional ``make`` options, you should store them in
1176the :term:`EXTRA_OEMAKE` or :term:`PACKAGECONFIG_CONFARGS` variables. BitBake
1177passes these options into the GNU ``make`` invocation. Note that a
1178:ref:`ref-tasks-install` task is still required. Otherwise, BitBake runs an
1179empty :ref:`ref-tasks-install` task by default.
Andrew Geissler517393d2023-01-13 08:55:19 -06001180
1181Some applications might require extra parameters to be passed to the
1182compiler. For example, the application might need an additional header
1183path. You can accomplish this by adding to the :term:`CFLAGS` variable. The
1184following example shows this::
1185
1186 CFLAGS:prepend = "-I ${S}/include "
1187
1188In the following example, ``lz4`` is a makefile-based package::
1189
1190 SUMMARY = "Extremely Fast Compression algorithm"
1191 DESCRIPTION = "LZ4 is a very fast lossless compression algorithm, providing compression speed at 400 MB/s per core, scalable with multi-cores CPU. It also features an extremely fast decoder, with speed in multiple GB/s per core, typically reaching RAM speed limits on multi-core systems."
1192 HOMEPAGE = "https://github.com/lz4/lz4"
1193
1194 LICENSE = "BSD-2-Clause | GPL-2.0-only"
1195 LIC_FILES_CHKSUM = "file://lib/LICENSE;md5=ebc2ea4814a64de7708f1571904b32cc \
1196 file://programs/COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263 \
1197 file://LICENSE;md5=d57c0d21cb917fb4e0af2454aa48b956 \
1198 "
1199
1200 PE = "1"
1201
1202 SRCREV = "d44371841a2f1728a3f36839fd4b7e872d0927d3"
1203
1204 SRC_URI = "git://github.com/lz4/lz4.git;branch=release;protocol=https \
1205 file://CVE-2021-3520.patch \
1206 "
1207 UPSTREAM_CHECK_GITTAGREGEX = "v(?P<pver>.*)"
1208
1209 S = "${WORKDIR}/git"
1210
Patrick Williams2a254922023-08-11 09:48:11 -05001211 CVE_STATUS[CVE-2014-4715] = "fixed-version: Fixed in r118, which is larger than the current version"
Andrew Geissler517393d2023-01-13 08:55:19 -06001212
1213 EXTRA_OEMAKE = "PREFIX=${prefix} CC='${CC}' CFLAGS='${CFLAGS}' DESTDIR=${D} LIBDIR=${libdir} INCLUDEDIR=${includedir} BUILD_STATIC=no"
1214
1215 do_install() {
1216 oe_runmake install
1217 }
1218
1219 BBCLASSEXTEND = "native nativesdk"
1220
Andrew Geissler6aa7eec2023-03-03 12:41:14 -06001221Building an Autotooled Package
1222------------------------------
1223
1224Applications built with the Autotools such as ``autoconf`` and ``automake``
1225require a recipe that has a source archive listed in :term:`SRC_URI` and also
1226inherit the :ref:`ref-classes-autotools` class, which contains the definitions
1227of all the steps needed to build an Autotool-based application. The result of
1228the build is automatically packaged. And, if the application uses NLS for
1229localization, packages with local information are generated (one package per
1230language). Following is one example: (``hello_2.3.bb``)::
1231
1232 SUMMARY = "GNU Helloworld application"
1233 SECTION = "examples"
1234 LICENSE = "GPL-2.0-or-later"
1235 LIC_FILES_CHKSUM = "file://COPYING;md5=751419260aa954499f7abaabaa882bbe"
1236
1237 SRC_URI = "${GNU_MIRROR}/hello/hello-${PV}.tar.gz"
1238
1239 inherit autotools gettext
1240
1241The variable :term:`LIC_FILES_CHKSUM` is used to track source license changes
1242as described in the ":ref:`dev-manual/licenses:tracking license changes`"
1243section in the Yocto Project Overview and Concepts Manual. You can quickly
1244create Autotool-based recipes in a manner similar to the previous example.
1245
Patrick Williamsb542dec2023-06-09 01:26:37 -05001246.. _ref-building-meson-package:
1247
Andrew Geissler6aa7eec2023-03-03 12:41:14 -06001248Building a Meson Package
1249------------------------
1250
1251Applications built with the `Meson build system <https://mesonbuild.com/>`__
1252just need a recipe that has sources described in :term:`SRC_URI` and inherits
1253the :ref:`ref-classes-meson` class.
1254
1255The :oe_git:`ipcalc recipe </meta-openembedded/tree/meta-networking/recipes-support/ipcalc>`
1256is a simple example of an application without dependencies::
1257
1258 SUMMARY = "Tool to assist in network address calculations for IPv4 and IPv6."
1259 HOMEPAGE = "https://gitlab.com/ipcalc/ipcalc"
1260
1261 SECTION = "net"
1262
1263 LICENSE = "GPL-2.0-only"
1264 LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263"
1265
1266 SRC_URI = "git://gitlab.com/ipcalc/ipcalc.git;protocol=https;branch=master"
1267 SRCREV = "4c4261a47f355946ee74013d4f5d0494487cc2d6"
1268
1269 S = "${WORKDIR}/git"
1270
1271 inherit meson
1272
1273Applications with dependencies are likely to inherit the
1274:ref:`ref-classes-pkgconfig` class, as ``pkg-config`` is the default method
1275used by Meson to find dependencies and compile applications against them.
1276
Andrew Geissler517393d2023-01-13 08:55:19 -06001277Splitting an Application into Multiple Packages
1278-----------------------------------------------
1279
1280You can use the variables :term:`PACKAGES` and :term:`FILES` to split an
1281application into multiple packages.
1282
1283Following is an example that uses the ``libxpm`` recipe. By default,
1284this recipe generates a single package that contains the library along
1285with a few binaries. You can modify the recipe to split the binaries
1286into separate packages::
1287
1288 require xorg-lib-common.inc
1289
1290 SUMMARY = "Xpm: X Pixmap extension library"
1291 LICENSE = "MIT"
1292 LIC_FILES_CHKSUM = "file://COPYING;md5=51f4270b012ecd4ab1a164f5f4ed6cf7"
1293 DEPENDS += "libxext libsm libxt"
1294 PE = "1"
1295
1296 XORG_PN = "libXpm"
1297
1298 PACKAGES =+ "sxpm cxpm"
1299 FILES:cxpm = "${bindir}/cxpm"
1300 FILES:sxpm = "${bindir}/sxpm"
1301
1302In the previous example, we want to ship the ``sxpm`` and ``cxpm``
1303binaries in separate packages. Since ``bindir`` would be packaged into
1304the main :term:`PN` package by default, we prepend the :term:`PACKAGES` variable
1305so additional package names are added to the start of list. This results
1306in the extra ``FILES:*`` variables then containing information that
1307define which files and directories go into which packages. Files
1308included by earlier packages are skipped by latter packages. Thus, the
1309main :term:`PN` package does not include the above listed files.
1310
1311Packaging Externally Produced Binaries
1312--------------------------------------
1313
1314Sometimes, you need to add pre-compiled binaries to an image. For
1315example, suppose that there are binaries for proprietary code,
1316created by a particular division of a company. Your part of the company
1317needs to use those binaries as part of an image that you are building
1318using the OpenEmbedded build system. Since you only have the binaries
1319and not the source code, you cannot use a typical recipe that expects to
1320fetch the source specified in
1321:term:`SRC_URI` and then compile it.
1322
1323One method is to package the binaries and then install them as part of
1324the image. Generally, it is not a good idea to package binaries since,
1325among other things, it can hinder the ability to reproduce builds and
1326could lead to compatibility problems with ABI in the future. However,
1327sometimes you have no choice.
1328
1329The easiest solution is to create a recipe that uses the
1330:ref:`ref-classes-bin-package` class and to be sure that you are using default
1331locations for build artifacts. In most cases, the
1332:ref:`ref-classes-bin-package` class handles "skipping" the configure and
1333compile steps as well as sets things up to grab packages from the appropriate
1334area. In particular, this class sets ``noexec`` on both the
1335:ref:`ref-tasks-configure` and :ref:`ref-tasks-compile` tasks, sets
1336``FILES:${PN}`` to "/" so that it picks up all files, and sets up a
1337:ref:`ref-tasks-install` task, which effectively copies all files from ``${S}``
1338to ``${D}``. The :ref:`ref-classes-bin-package` class works well when the files
1339extracted into ``${S}`` are already laid out in the way they should be laid out
1340on the target. For more information on these variables, see the :term:`FILES`,
1341:term:`PN`, :term:`S`, and :term:`D` variables in the Yocto Project Reference
1342Manual's variable glossary.
1343
1344.. note::
1345
1346 - Using :term:`DEPENDS` is a good
1347 idea even for components distributed in binary form, and is often
1348 necessary for shared libraries. For a shared library, listing the
1349 library dependencies in :term:`DEPENDS` makes sure that the libraries
1350 are available in the staging sysroot when other recipes link
1351 against the library, which might be necessary for successful
1352 linking.
1353
1354 - Using :term:`DEPENDS` also allows runtime dependencies between
1355 packages to be added automatically. See the
1356 ":ref:`overview-manual/concepts:automatically added runtime dependencies`"
1357 section in the Yocto Project Overview and Concepts Manual for more
1358 information.
1359
1360If you cannot use the :ref:`ref-classes-bin-package` class, you need to be sure you are
1361doing the following:
1362
1363- Create a recipe where the
1364 :ref:`ref-tasks-configure` and
1365 :ref:`ref-tasks-compile` tasks do
1366 nothing: It is usually sufficient to just not define these tasks in
1367 the recipe, because the default implementations do nothing unless a
1368 Makefile is found in
1369 ``${``\ :term:`S`\ ``}``.
1370
1371 If ``${S}`` might contain a Makefile, or if you inherit some class
1372 that replaces :ref:`ref-tasks-configure` and :ref:`ref-tasks-compile` with custom
1373 versions, then you can use the
1374 ``[``\ :ref:`noexec <bitbake-user-manual/bitbake-user-manual-metadata:variable flags>`\ ``]``
1375 flag to turn the tasks into no-ops, as follows::
1376
1377 do_configure[noexec] = "1"
1378 do_compile[noexec] = "1"
1379
Andrew Geisslerfc113ea2023-03-31 09:59:46 -05001380 Unlike :ref:`bitbake-user-manual/bitbake-user-manual-metadata:deleting a task`,
1381 using the flag preserves the dependency chain from the :ref:`ref-tasks-fetch`,
1382 :ref:`ref-tasks-unpack`, and :ref:`ref-tasks-patch` tasks to the
Andrew Geissler517393d2023-01-13 08:55:19 -06001383 :ref:`ref-tasks-install` task.
1384
1385- Make sure your :ref:`ref-tasks-install` task installs the binaries
1386 appropriately.
1387
1388- Ensure that you set up :term:`FILES`
1389 (usually
1390 ``FILES:${``\ :term:`PN`\ ``}``) to
1391 point to the files you have installed, which of course depends on
1392 where you have installed them and whether those files are in
1393 different locations than the defaults.
1394
1395Following Recipe Style Guidelines
1396=================================
1397
Andrew Geissler220dafd2023-10-04 10:18:08 -05001398When writing recipes, it is good to conform to existing style guidelines.
1399See the ":doc:`../contributor-guide/recipe-style-guide`" in the Yocto Project
1400and OpenEmbedded Contributor Guide for reference.
Andrew Geissler517393d2023-01-13 08:55:19 -06001401
1402It is common for existing recipes to deviate a bit from this style.
1403However, aiming for at least a consistent style is a good idea. Some
1404practices, such as omitting spaces around ``=`` operators in assignments
1405or ordering recipe components in an erratic way, are widely seen as poor
1406style.
1407
1408Recipe Syntax
1409=============
1410
1411Understanding recipe file syntax is important for writing recipes. The
1412following list overviews the basic items that make up a BitBake recipe
1413file. For more complete BitBake syntax descriptions, see the
1414":doc:`bitbake:bitbake-user-manual/bitbake-user-manual-metadata`"
1415chapter of the BitBake User Manual.
1416
1417- *Variable Assignments and Manipulations:* Variable assignments allow
1418 a value to be assigned to a variable. The assignment can be static
1419 text or might include the contents of other variables. In addition to
1420 the assignment, appending and prepending operations are also
1421 supported.
1422
1423 The following example shows some of the ways you can use variables in
1424 recipes::
1425
1426 S = "${WORKDIR}/postfix-${PV}"
1427 CFLAGS += "-DNO_ASM"
1428 CFLAGS:append = " --enable-important-feature"
1429
1430- *Functions:* Functions provide a series of actions to be performed.
1431 You usually use functions to override the default implementation of a
1432 task function or to complement a default function (i.e. append or
1433 prepend to an existing function). Standard functions use ``sh`` shell
1434 syntax, although access to OpenEmbedded variables and internal
1435 methods are also available.
1436
1437 Here is an example function from the ``sed`` recipe::
1438
1439 do_install () {
1440 autotools_do_install
1441 install -d ${D}${base_bindir}
1442 mv ${D}${bindir}/sed ${D}${base_bindir}/sed
1443 rmdir ${D}${bindir}/
1444 }
1445
1446 It is
1447 also possible to implement new functions that are called between
1448 existing tasks as long as the new functions are not replacing or
1449 complementing the default functions. You can implement functions in
1450 Python instead of shell. Both of these options are not seen in the
1451 majority of recipes.
1452
1453- *Keywords:* BitBake recipes use only a few keywords. You use keywords
1454 to include common functions (``inherit``), load parts of a recipe
1455 from other files (``include`` and ``require``) and export variables
1456 to the environment (``export``).
1457
1458 The following example shows the use of some of these keywords::
1459
1460 export POSTCONF = "${STAGING_BINDIR}/postconf"
1461 inherit autoconf
1462 require otherfile.inc
1463
1464- *Comments (#):* Any lines that begin with the hash character (``#``)
1465 are treated as comment lines and are ignored::
1466
1467 # This is a comment
1468
1469This next list summarizes the most important and most commonly used
1470parts of the recipe syntax. For more information on these parts of the
1471syntax, you can reference the
1472":doc:`bitbake:bitbake-user-manual/bitbake-user-manual-metadata`" chapter
1473in the BitBake User Manual.
1474
1475- *Line Continuation (\\):* Use the backward slash (``\``) character to
1476 split a statement over multiple lines. Place the slash character at
1477 the end of the line that is to be continued on the next line::
1478
1479 VAR = "A really long \
1480 line"
1481
1482 .. note::
1483
1484 You cannot have any characters including spaces or tabs after the
1485 slash character.
1486
1487- *Using Variables (${VARNAME}):* Use the ``${VARNAME}`` syntax to
1488 access the contents of a variable::
1489
1490 SRC_URI = "${SOURCEFORGE_MIRROR}/libpng/zlib-${PV}.tar.gz"
1491
1492 .. note::
1493
1494 It is important to understand that the value of a variable
1495 expressed in this form does not get substituted automatically. The
1496 expansion of these expressions happens on-demand later (e.g.
1497 usually when a function that makes reference to the variable
1498 executes). This behavior ensures that the values are most
1499 appropriate for the context in which they are finally used. On the
1500 rare occasion that you do need the variable expression to be
1501 expanded immediately, you can use the
1502 :=
1503 operator instead of
1504 =
1505 when you make the assignment, but this is not generally needed.
1506
1507- *Quote All Assignments ("value"):* Use double quotes around values in
1508 all variable assignments (e.g. ``"value"``). Following is an example::
1509
1510 VAR1 = "${OTHERVAR}"
1511 VAR2 = "The version is ${PV}"
1512
1513- *Conditional Assignment (?=):* Conditional assignment is used to
1514 assign a value to a variable, but only when the variable is currently
1515 unset. Use the question mark followed by the equal sign (``?=``) to
1516 make a "soft" assignment used for conditional assignment. Typically,
1517 "soft" assignments are used in the ``local.conf`` file for variables
1518 that are allowed to come through from the external environment.
1519
1520 Here is an example where ``VAR1`` is set to "New value" if it is
1521 currently empty. However, if ``VAR1`` has already been set, it
1522 remains unchanged::
1523
1524 VAR1 ?= "New value"
1525
1526 In this next example, ``VAR1`` is left with the value "Original value"::
1527
1528 VAR1 = "Original value"
1529 VAR1 ?= "New value"
1530
1531- *Appending (+=):* Use the plus character followed by the equals sign
1532 (``+=``) to append values to existing variables.
1533
1534 .. note::
1535
1536 This operator adds a space between the existing content of the
1537 variable and the new content.
1538
1539 Here is an example::
1540
1541 SRC_URI += "file://fix-makefile.patch"
1542
1543- *Prepending (=+):* Use the equals sign followed by the plus character
1544 (``=+``) to prepend values to existing variables.
1545
1546 .. note::
1547
1548 This operator adds a space between the new content and the
1549 existing content of the variable.
1550
1551 Here is an example::
1552
1553 VAR =+ "Starts"
1554
1555- *Appending (:append):* Use the ``:append`` operator to append values
1556 to existing variables. This operator does not add any additional
1557 space. Also, the operator is applied after all the ``+=``, and ``=+``
1558 operators have been applied and after all ``=`` assignments have
1559 occurred. This means that if ``:append`` is used in a recipe, it can
Patrick Williams520786c2023-06-25 16:20:36 -05001560 only be overridden by another layer using the special ``:remove``
Andrew Geissler517393d2023-01-13 08:55:19 -06001561 operator, which in turn will prevent further layers from adding it back.
1562
1563 The following example shows the space being explicitly added to the
1564 start to ensure the appended value is not merged with the existing
1565 value::
1566
1567 CFLAGS:append = " --enable-important-feature"
1568
1569 You can also use
1570 the ``:append`` operator with overrides, which results in the actions
1571 only being performed for the specified target or machine::
1572
1573 CFLAGS:append:sh4 = " --enable-important-sh4-specific-feature"
1574
1575- *Prepending (:prepend):* Use the ``:prepend`` operator to prepend
1576 values to existing variables. This operator does not add any
1577 additional space. Also, the operator is applied after all the ``+=``,
1578 and ``=+`` operators have been applied and after all ``=``
1579 assignments have occurred.
1580
1581 The following example shows the space being explicitly added to the
1582 end to ensure the prepended value is not merged with the existing
1583 value::
1584
1585 CFLAGS:prepend = "-I${S}/myincludes "
1586
1587 You can also use the
1588 ``:prepend`` operator with overrides, which results in the actions
1589 only being performed for the specified target or machine::
1590
1591 CFLAGS:prepend:sh4 = "-I${S}/myincludes "
1592
1593- *Overrides:* You can use overrides to set a value conditionally,
1594 typically based on how the recipe is being built. For example, to set
1595 the :term:`KBRANCH` variable's
1596 value to "standard/base" for any target
1597 :term:`MACHINE`, except for
1598 qemuarm where it should be set to "standard/arm-versatile-926ejs",
1599 you would do the following::
1600
1601 KBRANCH = "standard/base"
1602 KBRANCH:qemuarm = "standard/arm-versatile-926ejs"
1603
1604 Overrides are also used to separate
1605 alternate values of a variable in other situations. For example, when
1606 setting variables such as
1607 :term:`FILES` and
1608 :term:`RDEPENDS` that are
1609 specific to individual packages produced by a recipe, you should
1610 always use an override that specifies the name of the package.
1611
1612- *Indentation:* Use spaces for indentation rather than tabs. For
1613 shell functions, both currently work. However, it is a policy
1614 decision of the Yocto Project to use tabs in shell functions. Realize
1615 that some layers have a policy to use spaces for all indentation.
1616
1617- *Using Python for Complex Operations:* For more advanced processing,
1618 it is possible to use Python code during variable assignments (e.g.
1619 search and replacement on a variable).
1620
1621 You indicate Python code using the ``${@python_code}`` syntax for the
1622 variable assignment::
1623
1624 SRC_URI = "ftp://ftp.info-zip.org/pub/infozip/src/zip${@d.getVar('PV',1).replace('.', '')}.tgz
1625
1626- *Shell Function Syntax:* Write shell functions as if you were writing
1627 a shell script when you describe a list of actions to take. You
1628 should ensure that your script works with a generic ``sh`` and that
1629 it does not require any ``bash`` or other shell-specific
1630 functionality. The same considerations apply to various system
1631 utilities (e.g. ``sed``, ``grep``, ``awk``, and so forth) that you
1632 might wish to use. If in doubt, you should check with multiple
1633 implementations --- including those from BusyBox.
1634