blob: cb9533ff5dffe8ade24f53e4f91c7bb1be325b00 [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
412``.diff`` or compressed versions of these suffixes (e.g. ``diff.gz`` are
413treated as patches. The
414: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
1039convention is to set :term:`PV` within the
1040recipe to "previous_version+current_version". You can use an additional
1041variable so that you can use the current version elsewhere. Here is an
1042example::
1043
1044 REALPV = "0.8.16-rc1"
1045 PV = "0.8.15+${REALPV}"
1046
1047Post-Installation Scripts
1048=========================
1049
1050Post-installation scripts run immediately after installing a package on
1051the target or during image creation when a package is included in an
1052image. To add a post-installation script to a package, add a
1053``pkg_postinst:``\ `PACKAGENAME`\ ``()`` function to the recipe file
1054(``.bb``) and replace `PACKAGENAME` with the name of the package you want
1055to attach to the ``postinst`` script. To apply the post-installation
1056script to the main package for the recipe, which is usually what is
1057required, specify
1058``${``\ :term:`PN`\ ``}`` in place of
1059PACKAGENAME.
1060
1061A post-installation function has the following structure::
1062
1063 pkg_postinst:PACKAGENAME() {
1064 # Commands to carry out
1065 }
1066
1067The script defined in the post-installation function is called when the
1068root filesystem is created. If the script succeeds, the package is
1069marked as installed.
1070
1071.. note::
1072
1073 Any RPM post-installation script that runs on the target should
1074 return a 0 exit code. RPM does not allow non-zero exit codes for
1075 these scripts, and the RPM package manager will cause the package to
1076 fail installation on the target.
1077
1078Sometimes it is necessary for the execution of a post-installation
1079script to be delayed until the first boot. For example, the script might
1080need to be executed on the device itself. To delay script execution
1081until boot time, you must explicitly mark post installs to defer to the
1082target. You can use ``pkg_postinst_ontarget()`` or call
1083``postinst_intercept delay_to_first_boot`` from ``pkg_postinst()``. Any
1084failure of a ``pkg_postinst()`` script (including exit 1) triggers an
1085error during the
1086:ref:`ref-tasks-rootfs` task.
1087
1088If you have recipes that use ``pkg_postinst`` function and they require
1089the use of non-standard native tools that have dependencies during
1090root filesystem construction, you need to use the
1091:term:`PACKAGE_WRITE_DEPS`
1092variable in your recipe to list these tools. If you do not use this
1093variable, the tools might be missing and execution of the
1094post-installation script is deferred until first boot. Deferring the
1095script to the first boot is undesirable and impossible for read-only
1096root filesystems.
1097
1098.. note::
1099
1100 There is equivalent support for pre-install, pre-uninstall, and post-uninstall
1101 scripts by way of ``pkg_preinst``, ``pkg_prerm``, and ``pkg_postrm``,
1102 respectively. These scrips work in exactly the same way as does
1103 ``pkg_postinst`` with the exception that they run at different times. Also,
1104 because of when they run, they are not applicable to being run at image
1105 creation time like ``pkg_postinst``.
1106
1107Testing
1108=======
1109
1110The final step for completing your recipe is to be sure that the
1111software you built runs correctly. To accomplish runtime testing, add
1112the build's output packages to your image and test them on the target.
1113
1114For information on how to customize your image by adding specific
1115packages, see ":ref:`dev-manual/customizing-images:customizing images`" section.
1116
1117Examples
1118========
1119
1120To help summarize how to write a recipe, this section provides some
Andrew Geissler6aa7eec2023-03-03 12:41:14 -06001121recipe examples given various scenarios:
Andrew Geissler517393d2023-01-13 08:55:19 -06001122
Andrew Geissler6aa7eec2023-03-03 12:41:14 -06001123- `Building a single .c file package`_
Andrew Geissler517393d2023-01-13 08:55:19 -06001124
Andrew Geissler6aa7eec2023-03-03 12:41:14 -06001125- `Building a Makefile-based package`_
Andrew Geissler517393d2023-01-13 08:55:19 -06001126
Andrew Geissler6aa7eec2023-03-03 12:41:14 -06001127- `Building an Autotooled package`_
Andrew Geissler517393d2023-01-13 08:55:19 -06001128
Andrew Geissler6aa7eec2023-03-03 12:41:14 -06001129- `Building a Meson package`_
Andrew Geissler517393d2023-01-13 08:55:19 -06001130
Andrew Geissler6aa7eec2023-03-03 12:41:14 -06001131- `Splitting an application into multiple packages`_
Andrew Geissler517393d2023-01-13 08:55:19 -06001132
Andrew Geissler6aa7eec2023-03-03 12:41:14 -06001133- `Packaging externally produced binaries`_
Andrew Geissler517393d2023-01-13 08:55:19 -06001134
Andrew Geissler6aa7eec2023-03-03 12:41:14 -06001135Building a Single .c File Package
1136---------------------------------
1137
1138Building an application from a single file that is stored locally (e.g. under
1139``files``) requires a recipe that has the file listed in the :term:`SRC_URI`
1140variable. Additionally, you need to manually write the :ref:`ref-tasks-compile`
1141and :ref:`ref-tasks-install` tasks. The :term:`S` variable defines the
1142directory containing the source code, which is set to :term:`WORKDIR` in this
1143case --- the directory BitBake uses for the build::
Andrew Geissler517393d2023-01-13 08:55:19 -06001144
1145 SUMMARY = "Simple helloworld application"
1146 SECTION = "examples"
1147 LICENSE = "MIT"
1148 LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
1149
1150 SRC_URI = "file://helloworld.c"
1151
1152 S = "${WORKDIR}"
1153
1154 do_compile() {
1155 ${CC} ${LDFLAGS} helloworld.c -o helloworld
1156 }
1157
1158 do_install() {
1159 install -d ${D}${bindir}
1160 install -m 0755 helloworld ${D}${bindir}
1161 }
1162
Andrew Geissler6aa7eec2023-03-03 12:41:14 -06001163By default, the ``helloworld``, ``helloworld-dbg``, and ``helloworld-dev`` packages
1164are built. For information on how to customize the packaging process, see the
Andrew Geissler517393d2023-01-13 08:55:19 -06001165":ref:`dev-manual/new-recipe:splitting an application into multiple packages`"
1166section.
1167
Andrew Geissler6aa7eec2023-03-03 12:41:14 -06001168Building a Makefile-Based Package
1169---------------------------------
Andrew Geissler517393d2023-01-13 08:55:19 -06001170
Andrew Geissler6aa7eec2023-03-03 12:41:14 -06001171Applications built with GNU ``make`` require a recipe that has the source archive
1172listed in :term:`SRC_URI`. You do not need to add a :ref:`ref-tasks-compile`
1173step since by default BitBake starts the ``make`` command to compile the
1174application. If you need additional ``make`` options, you should store them in
1175the :term:`EXTRA_OEMAKE` or :term:`PACKAGECONFIG_CONFARGS` variables. BitBake
1176passes these options into the GNU ``make`` invocation. Note that a
1177:ref:`ref-tasks-install` task is still required. Otherwise, BitBake runs an
1178empty :ref:`ref-tasks-install` task by default.
Andrew Geissler517393d2023-01-13 08:55:19 -06001179
1180Some applications might require extra parameters to be passed to the
1181compiler. For example, the application might need an additional header
1182path. You can accomplish this by adding to the :term:`CFLAGS` variable. The
1183following example shows this::
1184
1185 CFLAGS:prepend = "-I ${S}/include "
1186
1187In the following example, ``lz4`` is a makefile-based package::
1188
1189 SUMMARY = "Extremely Fast Compression algorithm"
1190 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."
1191 HOMEPAGE = "https://github.com/lz4/lz4"
1192
1193 LICENSE = "BSD-2-Clause | GPL-2.0-only"
1194 LIC_FILES_CHKSUM = "file://lib/LICENSE;md5=ebc2ea4814a64de7708f1571904b32cc \
1195 file://programs/COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263 \
1196 file://LICENSE;md5=d57c0d21cb917fb4e0af2454aa48b956 \
1197 "
1198
1199 PE = "1"
1200
1201 SRCREV = "d44371841a2f1728a3f36839fd4b7e872d0927d3"
1202
1203 SRC_URI = "git://github.com/lz4/lz4.git;branch=release;protocol=https \
1204 file://CVE-2021-3520.patch \
1205 "
1206 UPSTREAM_CHECK_GITTAGREGEX = "v(?P<pver>.*)"
1207
1208 S = "${WORKDIR}/git"
1209
Patrick Williams2a254922023-08-11 09:48:11 -05001210 CVE_STATUS[CVE-2014-4715] = "fixed-version: Fixed in r118, which is larger than the current version"
Andrew Geissler517393d2023-01-13 08:55:19 -06001211
1212 EXTRA_OEMAKE = "PREFIX=${prefix} CC='${CC}' CFLAGS='${CFLAGS}' DESTDIR=${D} LIBDIR=${libdir} INCLUDEDIR=${includedir} BUILD_STATIC=no"
1213
1214 do_install() {
1215 oe_runmake install
1216 }
1217
1218 BBCLASSEXTEND = "native nativesdk"
1219
Andrew Geissler6aa7eec2023-03-03 12:41:14 -06001220Building an Autotooled Package
1221------------------------------
1222
1223Applications built with the Autotools such as ``autoconf`` and ``automake``
1224require a recipe that has a source archive listed in :term:`SRC_URI` and also
1225inherit the :ref:`ref-classes-autotools` class, which contains the definitions
1226of all the steps needed to build an Autotool-based application. The result of
1227the build is automatically packaged. And, if the application uses NLS for
1228localization, packages with local information are generated (one package per
1229language). Following is one example: (``hello_2.3.bb``)::
1230
1231 SUMMARY = "GNU Helloworld application"
1232 SECTION = "examples"
1233 LICENSE = "GPL-2.0-or-later"
1234 LIC_FILES_CHKSUM = "file://COPYING;md5=751419260aa954499f7abaabaa882bbe"
1235
1236 SRC_URI = "${GNU_MIRROR}/hello/hello-${PV}.tar.gz"
1237
1238 inherit autotools gettext
1239
1240The variable :term:`LIC_FILES_CHKSUM` is used to track source license changes
1241as described in the ":ref:`dev-manual/licenses:tracking license changes`"
1242section in the Yocto Project Overview and Concepts Manual. You can quickly
1243create Autotool-based recipes in a manner similar to the previous example.
1244
Patrick Williamsb542dec2023-06-09 01:26:37 -05001245.. _ref-building-meson-package:
1246
Andrew Geissler6aa7eec2023-03-03 12:41:14 -06001247Building a Meson Package
1248------------------------
1249
1250Applications built with the `Meson build system <https://mesonbuild.com/>`__
1251just need a recipe that has sources described in :term:`SRC_URI` and inherits
1252the :ref:`ref-classes-meson` class.
1253
1254The :oe_git:`ipcalc recipe </meta-openembedded/tree/meta-networking/recipes-support/ipcalc>`
1255is a simple example of an application without dependencies::
1256
1257 SUMMARY = "Tool to assist in network address calculations for IPv4 and IPv6."
1258 HOMEPAGE = "https://gitlab.com/ipcalc/ipcalc"
1259
1260 SECTION = "net"
1261
1262 LICENSE = "GPL-2.0-only"
1263 LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263"
1264
1265 SRC_URI = "git://gitlab.com/ipcalc/ipcalc.git;protocol=https;branch=master"
1266 SRCREV = "4c4261a47f355946ee74013d4f5d0494487cc2d6"
1267
1268 S = "${WORKDIR}/git"
1269
1270 inherit meson
1271
1272Applications with dependencies are likely to inherit the
1273:ref:`ref-classes-pkgconfig` class, as ``pkg-config`` is the default method
1274used by Meson to find dependencies and compile applications against them.
1275
Andrew Geissler517393d2023-01-13 08:55:19 -06001276Splitting an Application into Multiple Packages
1277-----------------------------------------------
1278
1279You can use the variables :term:`PACKAGES` and :term:`FILES` to split an
1280application into multiple packages.
1281
1282Following is an example that uses the ``libxpm`` recipe. By default,
1283this recipe generates a single package that contains the library along
1284with a few binaries. You can modify the recipe to split the binaries
1285into separate packages::
1286
1287 require xorg-lib-common.inc
1288
1289 SUMMARY = "Xpm: X Pixmap extension library"
1290 LICENSE = "MIT"
1291 LIC_FILES_CHKSUM = "file://COPYING;md5=51f4270b012ecd4ab1a164f5f4ed6cf7"
1292 DEPENDS += "libxext libsm libxt"
1293 PE = "1"
1294
1295 XORG_PN = "libXpm"
1296
1297 PACKAGES =+ "sxpm cxpm"
1298 FILES:cxpm = "${bindir}/cxpm"
1299 FILES:sxpm = "${bindir}/sxpm"
1300
1301In the previous example, we want to ship the ``sxpm`` and ``cxpm``
1302binaries in separate packages. Since ``bindir`` would be packaged into
1303the main :term:`PN` package by default, we prepend the :term:`PACKAGES` variable
1304so additional package names are added to the start of list. This results
1305in the extra ``FILES:*`` variables then containing information that
1306define which files and directories go into which packages. Files
1307included by earlier packages are skipped by latter packages. Thus, the
1308main :term:`PN` package does not include the above listed files.
1309
1310Packaging Externally Produced Binaries
1311--------------------------------------
1312
1313Sometimes, you need to add pre-compiled binaries to an image. For
1314example, suppose that there are binaries for proprietary code,
1315created by a particular division of a company. Your part of the company
1316needs to use those binaries as part of an image that you are building
1317using the OpenEmbedded build system. Since you only have the binaries
1318and not the source code, you cannot use a typical recipe that expects to
1319fetch the source specified in
1320:term:`SRC_URI` and then compile it.
1321
1322One method is to package the binaries and then install them as part of
1323the image. Generally, it is not a good idea to package binaries since,
1324among other things, it can hinder the ability to reproduce builds and
1325could lead to compatibility problems with ABI in the future. However,
1326sometimes you have no choice.
1327
1328The easiest solution is to create a recipe that uses the
1329:ref:`ref-classes-bin-package` class and to be sure that you are using default
1330locations for build artifacts. In most cases, the
1331:ref:`ref-classes-bin-package` class handles "skipping" the configure and
1332compile steps as well as sets things up to grab packages from the appropriate
1333area. In particular, this class sets ``noexec`` on both the
1334:ref:`ref-tasks-configure` and :ref:`ref-tasks-compile` tasks, sets
1335``FILES:${PN}`` to "/" so that it picks up all files, and sets up a
1336:ref:`ref-tasks-install` task, which effectively copies all files from ``${S}``
1337to ``${D}``. The :ref:`ref-classes-bin-package` class works well when the files
1338extracted into ``${S}`` are already laid out in the way they should be laid out
1339on the target. For more information on these variables, see the :term:`FILES`,
1340:term:`PN`, :term:`S`, and :term:`D` variables in the Yocto Project Reference
1341Manual's variable glossary.
1342
1343.. note::
1344
1345 - Using :term:`DEPENDS` is a good
1346 idea even for components distributed in binary form, and is often
1347 necessary for shared libraries. For a shared library, listing the
1348 library dependencies in :term:`DEPENDS` makes sure that the libraries
1349 are available in the staging sysroot when other recipes link
1350 against the library, which might be necessary for successful
1351 linking.
1352
1353 - Using :term:`DEPENDS` also allows runtime dependencies between
1354 packages to be added automatically. See the
1355 ":ref:`overview-manual/concepts:automatically added runtime dependencies`"
1356 section in the Yocto Project Overview and Concepts Manual for more
1357 information.
1358
1359If you cannot use the :ref:`ref-classes-bin-package` class, you need to be sure you are
1360doing the following:
1361
1362- Create a recipe where the
1363 :ref:`ref-tasks-configure` and
1364 :ref:`ref-tasks-compile` tasks do
1365 nothing: It is usually sufficient to just not define these tasks in
1366 the recipe, because the default implementations do nothing unless a
1367 Makefile is found in
1368 ``${``\ :term:`S`\ ``}``.
1369
1370 If ``${S}`` might contain a Makefile, or if you inherit some class
1371 that replaces :ref:`ref-tasks-configure` and :ref:`ref-tasks-compile` with custom
1372 versions, then you can use the
1373 ``[``\ :ref:`noexec <bitbake-user-manual/bitbake-user-manual-metadata:variable flags>`\ ``]``
1374 flag to turn the tasks into no-ops, as follows::
1375
1376 do_configure[noexec] = "1"
1377 do_compile[noexec] = "1"
1378
Andrew Geisslerfc113ea2023-03-31 09:59:46 -05001379 Unlike :ref:`bitbake-user-manual/bitbake-user-manual-metadata:deleting a task`,
1380 using the flag preserves the dependency chain from the :ref:`ref-tasks-fetch`,
1381 :ref:`ref-tasks-unpack`, and :ref:`ref-tasks-patch` tasks to the
Andrew Geissler517393d2023-01-13 08:55:19 -06001382 :ref:`ref-tasks-install` task.
1383
1384- Make sure your :ref:`ref-tasks-install` task installs the binaries
1385 appropriately.
1386
1387- Ensure that you set up :term:`FILES`
1388 (usually
1389 ``FILES:${``\ :term:`PN`\ ``}``) to
1390 point to the files you have installed, which of course depends on
1391 where you have installed them and whether those files are in
1392 different locations than the defaults.
1393
1394Following Recipe Style Guidelines
1395=================================
1396
1397When writing recipes, it is good to conform to existing style
1398guidelines. The :oe_wiki:`OpenEmbedded Styleguide </Styleguide>` wiki page
1399provides rough guidelines for preferred recipe style.
1400
1401It is common for existing recipes to deviate a bit from this style.
1402However, aiming for at least a consistent style is a good idea. Some
1403practices, such as omitting spaces around ``=`` operators in assignments
1404or ordering recipe components in an erratic way, are widely seen as poor
1405style.
1406
1407Recipe Syntax
1408=============
1409
1410Understanding recipe file syntax is important for writing recipes. The
1411following list overviews the basic items that make up a BitBake recipe
1412file. For more complete BitBake syntax descriptions, see the
1413":doc:`bitbake:bitbake-user-manual/bitbake-user-manual-metadata`"
1414chapter of the BitBake User Manual.
1415
1416- *Variable Assignments and Manipulations:* Variable assignments allow
1417 a value to be assigned to a variable. The assignment can be static
1418 text or might include the contents of other variables. In addition to
1419 the assignment, appending and prepending operations are also
1420 supported.
1421
1422 The following example shows some of the ways you can use variables in
1423 recipes::
1424
1425 S = "${WORKDIR}/postfix-${PV}"
1426 CFLAGS += "-DNO_ASM"
1427 CFLAGS:append = " --enable-important-feature"
1428
1429- *Functions:* Functions provide a series of actions to be performed.
1430 You usually use functions to override the default implementation of a
1431 task function or to complement a default function (i.e. append or
1432 prepend to an existing function). Standard functions use ``sh`` shell
1433 syntax, although access to OpenEmbedded variables and internal
1434 methods are also available.
1435
1436 Here is an example function from the ``sed`` recipe::
1437
1438 do_install () {
1439 autotools_do_install
1440 install -d ${D}${base_bindir}
1441 mv ${D}${bindir}/sed ${D}${base_bindir}/sed
1442 rmdir ${D}${bindir}/
1443 }
1444
1445 It is
1446 also possible to implement new functions that are called between
1447 existing tasks as long as the new functions are not replacing or
1448 complementing the default functions. You can implement functions in
1449 Python instead of shell. Both of these options are not seen in the
1450 majority of recipes.
1451
1452- *Keywords:* BitBake recipes use only a few keywords. You use keywords
1453 to include common functions (``inherit``), load parts of a recipe
1454 from other files (``include`` and ``require``) and export variables
1455 to the environment (``export``).
1456
1457 The following example shows the use of some of these keywords::
1458
1459 export POSTCONF = "${STAGING_BINDIR}/postconf"
1460 inherit autoconf
1461 require otherfile.inc
1462
1463- *Comments (#):* Any lines that begin with the hash character (``#``)
1464 are treated as comment lines and are ignored::
1465
1466 # This is a comment
1467
1468This next list summarizes the most important and most commonly used
1469parts of the recipe syntax. For more information on these parts of the
1470syntax, you can reference the
1471":doc:`bitbake:bitbake-user-manual/bitbake-user-manual-metadata`" chapter
1472in the BitBake User Manual.
1473
1474- *Line Continuation (\\):* Use the backward slash (``\``) character to
1475 split a statement over multiple lines. Place the slash character at
1476 the end of the line that is to be continued on the next line::
1477
1478 VAR = "A really long \
1479 line"
1480
1481 .. note::
1482
1483 You cannot have any characters including spaces or tabs after the
1484 slash character.
1485
1486- *Using Variables (${VARNAME}):* Use the ``${VARNAME}`` syntax to
1487 access the contents of a variable::
1488
1489 SRC_URI = "${SOURCEFORGE_MIRROR}/libpng/zlib-${PV}.tar.gz"
1490
1491 .. note::
1492
1493 It is important to understand that the value of a variable
1494 expressed in this form does not get substituted automatically. The
1495 expansion of these expressions happens on-demand later (e.g.
1496 usually when a function that makes reference to the variable
1497 executes). This behavior ensures that the values are most
1498 appropriate for the context in which they are finally used. On the
1499 rare occasion that you do need the variable expression to be
1500 expanded immediately, you can use the
1501 :=
1502 operator instead of
1503 =
1504 when you make the assignment, but this is not generally needed.
1505
1506- *Quote All Assignments ("value"):* Use double quotes around values in
1507 all variable assignments (e.g. ``"value"``). Following is an example::
1508
1509 VAR1 = "${OTHERVAR}"
1510 VAR2 = "The version is ${PV}"
1511
1512- *Conditional Assignment (?=):* Conditional assignment is used to
1513 assign a value to a variable, but only when the variable is currently
1514 unset. Use the question mark followed by the equal sign (``?=``) to
1515 make a "soft" assignment used for conditional assignment. Typically,
1516 "soft" assignments are used in the ``local.conf`` file for variables
1517 that are allowed to come through from the external environment.
1518
1519 Here is an example where ``VAR1`` is set to "New value" if it is
1520 currently empty. However, if ``VAR1`` has already been set, it
1521 remains unchanged::
1522
1523 VAR1 ?= "New value"
1524
1525 In this next example, ``VAR1`` is left with the value "Original value"::
1526
1527 VAR1 = "Original value"
1528 VAR1 ?= "New value"
1529
1530- *Appending (+=):* Use the plus character followed by the equals sign
1531 (``+=``) to append values to existing variables.
1532
1533 .. note::
1534
1535 This operator adds a space between the existing content of the
1536 variable and the new content.
1537
1538 Here is an example::
1539
1540 SRC_URI += "file://fix-makefile.patch"
1541
1542- *Prepending (=+):* Use the equals sign followed by the plus character
1543 (``=+``) to prepend values to existing variables.
1544
1545 .. note::
1546
1547 This operator adds a space between the new content and the
1548 existing content of the variable.
1549
1550 Here is an example::
1551
1552 VAR =+ "Starts"
1553
1554- *Appending (:append):* Use the ``:append`` operator to append values
1555 to existing variables. This operator does not add any additional
1556 space. Also, the operator is applied after all the ``+=``, and ``=+``
1557 operators have been applied and after all ``=`` assignments have
1558 occurred. This means that if ``:append`` is used in a recipe, it can
Patrick Williams520786c2023-06-25 16:20:36 -05001559 only be overridden by another layer using the special ``:remove``
Andrew Geissler517393d2023-01-13 08:55:19 -06001560 operator, which in turn will prevent further layers from adding it back.
1561
1562 The following example shows the space being explicitly added to the
1563 start to ensure the appended value is not merged with the existing
1564 value::
1565
1566 CFLAGS:append = " --enable-important-feature"
1567
1568 You can also use
1569 the ``:append`` operator with overrides, which results in the actions
1570 only being performed for the specified target or machine::
1571
1572 CFLAGS:append:sh4 = " --enable-important-sh4-specific-feature"
1573
1574- *Prepending (:prepend):* Use the ``:prepend`` operator to prepend
1575 values to existing variables. This operator does not add any
1576 additional space. Also, the operator is applied after all the ``+=``,
1577 and ``=+`` operators have been applied and after all ``=``
1578 assignments have occurred.
1579
1580 The following example shows the space being explicitly added to the
1581 end to ensure the prepended value is not merged with the existing
1582 value::
1583
1584 CFLAGS:prepend = "-I${S}/myincludes "
1585
1586 You can also use the
1587 ``:prepend`` operator with overrides, which results in the actions
1588 only being performed for the specified target or machine::
1589
1590 CFLAGS:prepend:sh4 = "-I${S}/myincludes "
1591
1592- *Overrides:* You can use overrides to set a value conditionally,
1593 typically based on how the recipe is being built. For example, to set
1594 the :term:`KBRANCH` variable's
1595 value to "standard/base" for any target
1596 :term:`MACHINE`, except for
1597 qemuarm where it should be set to "standard/arm-versatile-926ejs",
1598 you would do the following::
1599
1600 KBRANCH = "standard/base"
1601 KBRANCH:qemuarm = "standard/arm-versatile-926ejs"
1602
1603 Overrides are also used to separate
1604 alternate values of a variable in other situations. For example, when
1605 setting variables such as
1606 :term:`FILES` and
1607 :term:`RDEPENDS` that are
1608 specific to individual packages produced by a recipe, you should
1609 always use an override that specifies the name of the package.
1610
1611- *Indentation:* Use spaces for indentation rather than tabs. For
1612 shell functions, both currently work. However, it is a policy
1613 decision of the Yocto Project to use tabs in shell functions. Realize
1614 that some layers have a policy to use spaces for all indentation.
1615
1616- *Using Python for Complex Operations:* For more advanced processing,
1617 it is possible to use Python code during variable assignments (e.g.
1618 search and replacement on a variable).
1619
1620 You indicate Python code using the ``${@python_code}`` syntax for the
1621 variable assignment::
1622
1623 SRC_URI = "ftp://ftp.info-zip.org/pub/infozip/src/zip${@d.getVar('PV',1).replace('.', '')}.tgz
1624
1625- *Shell Function Syntax:* Write shell functions as if you were writing
1626 a shell script when you describe a list of actions to take. You
1627 should ensure that your script works with a generic ``sh`` and that
1628 it does not require any ``bash`` or other shell-specific
1629 functionality. The same considerations apply to various system
1630 utilities (e.g. ``sed``, ``grep``, ``awk``, and so forth) that you
1631 might wish to use. If in doubt, you should check with multiple
1632 implementations --- including those from BusyBox.
1633