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