summaryrefslogtreecommitdiffstats
path: root/documentation/dev-manual
diff options
context:
space:
mode:
authorScott Rifenbark <scott.m.rifenbark@intel.com>2013-12-19 16:53:45 -0600
committerRichard Purdie <richard.purdie@linuxfoundation.org>2014-01-02 13:16:12 +0000
commitfac99a49df61504ddc5d887892d72a0004473987 (patch)
tree2d7bd47636756c0bfd99ffac6782e9a04fd08a3c /documentation/dev-manual
parent3b908ee6a8fb920b73ea1974ba62693fb575b7bd (diff)
downloadpoky-fac99a49df61504ddc5d887892d72a0004473987.tar.gz
dev-manual: First complete draft of the "Writing a New Recipe" section.
(From yocto-docs rev: fe5ca883364c1edbbcd13aacfa972ebdfc3122b9) Signed-off-by: Scott Rifenbark <scott.m.rifenbark@intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'documentation/dev-manual')
-rw-r--r--documentation/dev-manual/dev-manual-common-tasks.xml365
1 files changed, 306 insertions, 59 deletions
diff --git a/documentation/dev-manual/dev-manual-common-tasks.xml b/documentation/dev-manual/dev-manual-common-tasks.xml
index 2356b9fc36..f6184cec32 100644
--- a/documentation/dev-manual/dev-manual-common-tasks.xml
+++ b/documentation/dev-manual/dev-manual-common-tasks.xml
@@ -1183,9 +1183,19 @@
1183 <listitem><para><emphasis>Use and modify the following 1183 <listitem><para><emphasis>Use and modify the following
1184 skeleton recipe:</emphasis> 1184 skeleton recipe:</emphasis>
1185 <literallayout class='monospaced'> 1185 <literallayout class='monospaced'>
1186 I need a simple 1186 inherit &lt;stuff&gt;
1187 skeleton recipe 1187
1188 here 1188 SUMMARY = ""
1189 HOMEPAGE = ""
1190 LICENSE = ""
1191
1192 LIC_FILES_CHKSUM = ""
1193
1194 SRC_URI = ""
1195 SRC_URI[md5sum] = ""
1196 SRC_URI[sha256sum] = ""
1197
1198 S = ${WORKDIR}/${PN}-${PV}
1189 </literallayout> 1199 </literallayout>
1190 Modifying this recipe is the recommended method for 1200 Modifying this recipe is the recommended method for
1191 creating a new recipe. 1201 creating a new recipe.
@@ -1335,16 +1345,48 @@
1335 </literallayout></para></listitem> 1345 </literallayout></para></listitem>
1336 </itemizedlist> 1346 </itemizedlist>
1337 </para> 1347 </para>
1348
1349 <para>
1350 Also part of the <filename>SRC_URI</filename> variable are the
1351 <filename>SRC_URI[md5sum] = ""</filename> and
1352 <filename>SRC_URI[sha256sum] = ""</filename> statements.
1353 These two checksums ensure that the remote file (and hence
1354 the source code you are building) has not changed since the
1355 recipe was written.
1356 You must provide these two checksums whenever you fetch
1357 source from anywhere other than an SCM or a local file.
1358 </para>
1359
1360 <para>
1361 To find these checksums, you can comment the statements out
1362 and then attempt to build the software.
1363 The build will produce an error for each missing checksum
1364 and as part of the error message provide the correct checksum
1365 string.
1366 Once you have the correct checksums, simply copy them into your
1367 recipe for a subsequent build.
1368 </para>
1338 </section> 1369 </section>
1339 1370
1340 <section id='new-recipe-unpacking-code'> 1371 <section id='new-recipe-unpacking-code'>
1341 <title>Unpacking Code</title> 1372 <title>Unpacking Code</title>
1342 1373
1343 <para> 1374 <para>
1344 unpacking: ensure S matches the directory that contains the source. Often the 1375 During the build, source code that is fetched needs to be
1345default will work for a source archive, but it depends on how the upstream 1376 unpacked.
1346project structures their archive. If SRC_URI specifies to fetch the source from 1377 The OpenEmbedded build system uses the
1347an SCM such as git or svn you'll definitely need to set S. 1378 <filename>do_unpack</filename> task to organize the source
1379 files into the temporary work directory pointed to by
1380 <filename>${</filename><ulink url='&YOCTO_DOCS_REF_URL;#var-S'><filename>S</filename></ulink><filename>}</filename>.
1381 </para>
1382
1383 <para>
1384 If you are fetching your source files from an upstream source
1385 archived tarball then you normally do not need to set
1386 <filename>S</filename>.
1387 However, if <filename>SRC_URI</filename> specifies to fetch
1388 source from an SCM like Git or Subversion, your recipe needs
1389 to define <filename>S</filename>.
1348 </para> 1390 </para>
1349 </section> 1391 </section>
1350 1392
@@ -1352,33 +1394,193 @@ an SCM such as git or svn you'll definitely need to set S.
1352 <title>Licensing</title> 1394 <title>Licensing</title>
1353 1395
1354 <para> 1396 <para>
1355 licensing: set correct values for LICENSE and LIC_FILES_CHKSUM, i.e. look for 1397 Your recipe needs to have both the
1356a license statement somewhere (COPYING, LICENSE, part of a README, top of a 1398 <ulink url='&YOCTO_DOCS_REF_URL;#var-LICENSE'><filename>LICENSE</filename></ulink>
1357source file etc.) and then set the two variables accordingly. You need to go 1399 and
1358through this several steps, i.e. look in the directory containing the 1400 <ulink url='&YOCTO_DOCS_REF_URL;#var-LIC_FILES_CHKSUM'><filename>LIC_FILES_CHKSUM</filename></ulink>
1359extracted source, then set LIC_FILES_CHKSUM to point to the file without the 1401 variables:
1360md5 value specified, and then run bitbake on the recipe again and it will error 1402 <itemizedlist>
1361out with the actual md5 value which you can then put into the recipe. I notice 1403 <listitem><para><emphasis><filename>LICENSE</filename>:</emphasis>
1362we don't necessarily have a list anywhere of the common values for LICENSE 1404 If you do not know the license under which the software
1363either, so maybe we need to add this to the variable reference entry for this 1405 you are building is distributed, you can go to the
1364variable. We should also cover what to do if there is no file specifying the 1406 source code and look for that information.
1365license shipped with the source. 1407 Places that hold this information are the
1408 <filename>COPYING</filename>,
1409 <filename>LICENSE</filename>, and
1410 <filename>README</filename> files.
1411 You could also find the information near the top of
1412 a source file.
1413 The key is to find something that states the public
1414 license needed for the software.
1415 For example, the
1416 <ulink url='http://sourceforge.net/p/htop/code/HEAD/tree/trunk/COPYING'><filename>COPYING</filename></ulink>
1417 file for the <filename>htop</filename> software states
1418 clearly that the software is licensed under the
1419 "GNU GENERAL PUBLIC LICENSE Version 2, June 1991".
1420 Consequently, if you were writing a recipe to build
1421 <filename>htop</filename>, you would include the
1422 following:
1423 <literallayout class='monospaced'>
1424 LICENSE = "GPLv2"
1425 </literallayout></para></listitem>
1426 <listitem><para><emphasis><filename>LIC_FILES_CHKSUM</filename>:</emphasis>
1427 The OpenEmbedded build system uses this variable to
1428 make sure the license text has not changed.
1429 If it has, the build produces an error and it affords
1430 you the chance to figure it out and correct the problem.
1431 </para>
1432 <para>You need to specify all applicable licensing
1433 files for the software.
1434 At the end of the configuration step, the build process
1435 will compare the checksums of the files to be sure
1436 the text has not changed.
1437 Any differences result in an error with the message
1438 containing the proper checksum.
1439 For more explanation and examples of how to set the
1440 <filename>LIC_FILES_CHKSUM</filename> variable, see the
1441 "<ulink url='&YOCTO_DOCS_REF_URL;#usingpoky-configuring-LIC_FILES_CHKSUM'>Tracking License Changes</ulink>"
1442 section in the Yocto Project Reference Manual.</para>
1443 <para>To determine the correct checksum string, you
1444 can list the appropriate files in the
1445 <filename>LIC_FILES_CHKSUM</filename> variable with
1446 incorrect md5 strings, attempt to build the software,
1447 and then note the resulting error messages that will
1448 report the correct md5 strings.
1449 Here is an example that assumes the software has a
1450 <filename>COPYING</filename> file:
1451 <literallayout class='monospaced'>
1452 LIC_FILES_CHKSUM = "file://COPYING;md5=xxx"
1453 </literallayout>
1454 When you try to build the software, the build system
1455 will produce an error and give you the correct string
1456 that you can substitute into the recipe file for a
1457 subsequent build.
1458 </para></listitem>
1459 </itemizedlist>
1460 </para>
1461
1462<!--
1463
1464 <para>
1465 For trying this out I created a new recipe named
1466 <filename>htop_1.0.2.bb</filename> and put it in
1467 <filename>poky/meta/recipes-extended/htop</filename>.
1468 There are two license type statements in my very simple
1469 recipe:
1470 <literallayout class='monospaced'>
1471 LICENSE = ""
1472
1473 LIC_FILES_CHKSUM = ""
1474
1475 SRC_URI[md5sum] = ""
1476 SRC_URI[sha256sum] = ""
1477 </literallayout>
1478 Evidently, you need to run a <filename>bitbake -c cleanall htop</filename>.
1479 Next, you delete or comment out the two <filename>SRC_URI</filename>
1480 lines at the end and then attempt to build the software with
1481 <filename>bitbake htop</filename>.
1482 Doing so causes BitBake to report some errors and and give
1483 you the actual strings you need for the last two
1484 <filename>SRC_URI</filename> lines.
1485 Prior to this, you have to dig around in the home page of the
1486 source for <filename>htop</filename> and determine that the
1487 software is released under GPLv2.
1488 You can provide that in the <filename>LICENSE</filename>
1489 statement.
1490 Now you edit your recipe to have those two strings for
1491 the <filename>SRC_URI</filename> statements:
1492 <literallayout class='monospaced'>
1493 LICENSE = "GPLv2"
1494
1495 LIC_FILES_CHKSUM = ""
1496
1497 SRC_URI = "${SOURCEFORGE_MIRROR}/htop/htop-${PV}.tar.gz"
1498 SRC_URI[md5sum] = "0d01cca8df3349c74569cefebbd9919e"
1499 SRC_URI[sha256sum] = "ee60657b044ece0df096c053060df7abf3cce3a568ab34d260049e6a37ccd8a1"
1500 </literallayout>
1501 At this point, you can build the software again using the
1502 <filename>bitbake htop</filename> command.
1503 There is just a set of errors now associated with the
1504 empty <filename>LIC_FILES_CHKSUM</filename> variable now.
1366 </para> 1505 </para>
1506-->
1507
1367 </section> 1508 </section>
1368 1509
1369 <section id='new-recipe-configuring-the-recipe'> 1510 <section id='new-recipe-configuring-the-recipe'>
1370 <title>Configuring the Recipe</title> 1511 <title>Configuring the Recipe</title>
1371 1512
1372 <para> 1513 <para>
1373 configure: this depends on whether you're using autotools or not; if you are 1514 Configurations for your recipe might include passing in
1374then you should set EXTRA_OECONF to pass any needed configure options specific 1515 configuration options in the case of an Autotools or CMake
1375to this recipe. If you are not using autotools, you need to define your own 1516 enabled software or tweaking with the
1376do_configure function, assuming there is anything to configure. At this point 1517 <ulink url='&YOCTO_DOCS_REF_URL;#var-DEPENDS'><filename>DEPENDS</filename></ulink>
1377you may also need to tweak DEPENDS if the configure scripts complain about any 1518 situation.
1378required dependencies being missing, assuming it's not just looking in the 1519 Regardless, you need to consider this part of the recipe.
1379wrong place for the dependency in which case it's usually a matter of 1520 </para>
1380supplying the appropriate configure options to point to the correct location 1521
1381within the sysroot. 1522 <para>
1523 If the software you are building uses Autotools or CMake to
1524 get built, you do not have to create a
1525 <filename>do_configure</filename> task in your recipe.
1526 You might still want to make some adjustments however.
1527 For example, you can set
1528 <ulink url='&YOCTO_DOCS_REF_URL;#var-EXTRA_OECONF'><filename>EXTRA_OECONF</filename></ulink>
1529 to pass any needed configure options that are specific to the
1530 recipe.
1531 </para>
1532
1533 <para>
1534 If the source files have a <filename>configure.ac</filename>
1535 or <filename>CMakeLists.txt</filename> file, then your software
1536 is built using Autotools or CMake, respectively.
1537 For either of these cases, you just need to worry about
1538 tweaking the configuration.
1539 However, if you don't have these files then your software is
1540 being built by some other system and you need to provide a
1541 <filename>do_configure</filename> task in your recipe.
1542 </para>
1543
1544 <para>
1545 Even if you are using Autotools or CMake and configuration
1546 succeeds during the build, it is always good practice to look
1547 at the <filename>log.do_configure</filename> file to ensure
1548 that nothing needs to be added to
1549 <filename>DEPENDS</filename>.
1550 For example, if the configure script reports that it found
1551 something not mentioned in <filename>DEPENDS</filename>, or that
1552 it did not find something that it needed for some desired
1553 optional functionality, then you would need to add
1554 those to <filename>DEPENDS</filename>.
1555 Looking at the log might also reveal items being checked for
1556 and/or enabled that you do not want, or items not being found
1557 that are in <filename>DEPENDS</filename>, in which case
1558 you would need to look at passing extra options to the
1559 configure script as needed using
1560 <filename>EXTRA_OECONF</filename>.
1561 </para>
1562
1563 <para>
1564 You should also realize that required build-time or runtime
1565 dependencies might or might not be noted in the software's
1566 documentation.
1567 </para>
1568
1569 <para>
1570 Even if your software is not being built by Autotools or CMake,
1571 you still might not need to deal with any configuration issues.
1572 You to determine if configuration is even a required step.
1573 You might need to modify a Makefile or some configuration file
1574 used for the build to specify necessary build options.
1575 Or, perhaps you might need to run a hand-written configuration
1576 script as opposed to something that
1577 <filename>autoconf</filename> would run.
1578 </para>
1579
1580 <para>
1581 For the case involving a hand-written configuration script, you
1582 would run <filename>./configure --help</filename> and look for
1583 the options you need to set.
1382 </para> 1584 </para>
1383 </section> 1585 </section>
1384 1586
@@ -1386,10 +1588,18 @@ within the sysroot.
1386 <title>Compiling the Recipe</title> 1588 <title>Compiling the Recipe</title>
1387 1589
1388 <para> 1590 <para>
1389 compile: if the recipe passes through do_compile successfully, nothing needs 1591 During a build, the <filename>do_compile</filename> task
1390to be done. If not, diagnose the failure. We might be able to highlight common 1592 happens after source is fetched, unpacked, and configured.
1391issues here such as parallel build failures, host path usage when building for 1593 If the recipe passes through <filename>do_compile</filename>
1392the target, etc. 1594 successfully, nothing needs to be done.
1595 </para>
1596
1597 <para>
1598 However, if the compile step fails, you need to diagnose the
1599 failure.
1600 Some common issues for failure are parallel build failures,
1601 improper host path usage when building for the target, and
1602 so forth.
1393 </para> 1603 </para>
1394 </section> 1604 </section>
1395 1605
@@ -1397,9 +1607,9 @@ the target, etc.
1397 <title>Installing</title> 1607 <title>Installing</title>
1398 1608
1399 <para> 1609 <para>
1400 During installation, files your recipe builds are copied from 1610 During <filename>do_install</filename>, files your recipe builds
1401 locations where work is being done to locations on the target 1611 are copied from locations where work is being done to locations
1402 device. 1612 on the target device.
1403 The installation process moves the 1613 The installation process moves the
1404 <filename>${</filename><ulink url='&YOCTO_DOCS_REF_URL;#var-S'><filename>S</filename></ulink><filename>}</filename>, 1614 <filename>${</filename><ulink url='&YOCTO_DOCS_REF_URL;#var-S'><filename>S</filename></ulink><filename>}</filename>,
1405 <filename>${</filename><ulink url='&YOCTO_DOCS_REF_URL;#var-B'><filename>B</filename></ulink><filename>}</filename>, 1615 <filename>${</filename><ulink url='&YOCTO_DOCS_REF_URL;#var-B'><filename>B</filename></ulink><filename>}</filename>,
@@ -1409,28 +1619,26 @@ the target, etc.
1409 <filename>${</filename><ulink url='&YOCTO_DOCS_REF_URL;#var-D'><filename>D</filename></ulink><filename>}</filename> 1619 <filename>${</filename><ulink url='&YOCTO_DOCS_REF_URL;#var-D'><filename>D</filename></ulink><filename>}</filename>
1410 to create the structure as it should appear on the target 1620 to create the structure as it should appear on the target
1411 system. 1621 system.
1412 <note>
1413 During the installation process, some of the files might also
1414 be modified to suit the target layout as well.
1415 </note>
1416 </para> 1622 </para>
1417 1623
1418 <para> 1624 <para>
1419 How your software is built affects what you must do to be 1625 How your software is built affects what you must do to be
1420 sure your software is installed correctly. 1626 sure your software is installed correctly.
1421 The following list describes what you must do for installation 1627 The following list describes what you must do for installation
1422 depending on how your recipe builds your software: 1628 depending on the type of build system used by the software
1629 being built:
1423 <itemizedlist> 1630 <itemizedlist>
1424 <listitem><para><emphasis>Autotools and <filename>cmake</filename>:</emphasis> 1631 <listitem><para><emphasis>Autotools and CMake:</emphasis>
1425 If the software your recipe is building uses Autotools 1632 If the software your recipe is building uses Autotools
1426 or <filename>cmake</filename>, the OpenEmbedded build 1633 or CMake, the OpenEmbedded build
1427 system understands how to install the software. 1634 system understands how to install the software.
1428 Consequently, you do not have to have a 1635 Consequently, you do not have to have a
1429 <filename>do_install</filename> task as part of your 1636 <filename>do_install</filename> task as part of your
1430 recipe. 1637 recipe.
1431 You just need to make sure the install portion of the 1638 You just need to make sure the install portion of the
1432 build completes with no issues.</para></listitem> 1639 build completes with no issues.</para></listitem>
1433 <listitem><para><emphasis><filename>make install</filename>:</emphasis> 1640 <listitem><para><emphasis>Other (using
1641 <filename>make install</filename>):</emphasis>
1434 You need to define a 1642 You need to define a
1435 <filename>do_install</filename> function in your 1643 <filename>do_install</filename> function in your
1436 recipe. 1644 recipe.
@@ -1443,7 +1651,7 @@ the target, etc.
1443 <filename>PREFIX=${D}</filename>, 1651 <filename>PREFIX=${D}</filename>,
1444 <filename>INSTALLROOT=${D}</filename>, and so forth). 1652 <filename>INSTALLROOT=${D}</filename>, and so forth).
1445 </para></listitem> 1653 </para></listitem>
1446 <listitem><para><emphasis><filename>install</filename>:</emphasis> 1654 <listitem><para><emphasis>Manual:</emphasis>
1447 You need to define a 1655 You need to define a
1448 <filename>do_install</filename> function in your 1656 <filename>do_install</filename> function in your
1449 recipe. 1657 recipe.
@@ -1462,7 +1670,7 @@ the target, etc.
1462 1670
1463 <para> 1671 <para>
1464 For the scenarios that do not use Autotools or 1672 For the scenarios that do not use Autotools or
1465 <filename>cmake</filename>, you need to track the installation 1673 CMake, you need to track the installation
1466 and diagnose and fix any issues until everything installs 1674 and diagnose and fix any issues until everything installs
1467 correctly. 1675 correctly.
1468 You need to look in the default location of 1676 You need to look in the default location of
@@ -1470,20 +1678,39 @@ the target, etc.
1470 <filename>${WORKDIR}/image</filename>, to be sure your 1678 <filename>${WORKDIR}/image</filename>, to be sure your
1471 files have been installed correctly. 1679 files have been installed correctly.
1472 </para> 1680 </para>
1681
1682 <note>
1683 During the installation process, you might need to modify
1684 some of the installed files to suit the target layout.
1685 For example, you might need to replace hard-coded paths in an
1686 initscript with values of variables provided by the build
1687 system, such as replacing <filename>/usr/bin/</filename> with
1688 <filename>${bindir}</filename>.
1689 If you do perform such modifications during
1690 <filename>do_install</filename>, be sure to modify the
1691 destination file after copying rather than before copying.
1692 Modifying after copying ensures that the build system can
1693 re-execute <filename>do_install</filename> if needed.
1694 </note>
1695
1696 <note>
1697 <filename>oe_runmake install</filename>, which can be run
1698 directly or can be run indirectly by the autotools and CMake
1699 classes, runs make install in parallel.
1700 Sometimes, a Makefile can have missing dependencies between
1701 targets that can result in race conditions.
1702 If you experience intermittent failures during
1703 <filename>do_install</filename>, you might be able to work
1704 around them by setting
1705 <ulink url='&YOCTO_DOCS_REF_URL;#var-PARALLEL_MAKEINST'><filename>PARALLEL_MAKEINST</filename></ulink>
1706 to and empty string in the recipe.
1707 </note>
1473 </section> 1708 </section>
1474 1709
1475 <section id='new-recipe-optionally-supporting-services'> 1710 <section id='new-recipe-optionally-supporting-services'>
1476 <title>Supporting Services</title> 1711 <title>Supporting Services</title>
1477 1712
1478 <para> 1713 <para>
1479 We'll probably also need some subsections on specific extra functions needed in
1480some recipes e.g. how to add support for services (sysvinit and systemd),
1481adding PACKAGECONFIG options, dealing with alternatives, etc. There's a
1482question in my mind on how some of these will overlap with the class reference
1483section though.
1484 </para>
1485
1486 <para>
1487 If you are adding services and the service initialization 1714 If you are adding services and the service initialization
1488 script or the service file itself is not installed, you must 1715 script or the service file itself is not installed, you must
1489 provide for that installation in your recipe using a 1716 provide for that installation in your recipe using a
@@ -1491,6 +1718,9 @@ section though.
1491 If your recipe already has a <filename>do_install</filename> 1718 If your recipe already has a <filename>do_install</filename>
1492 function, you will need to be sure to change it so that it 1719 function, you will need to be sure to change it so that it
1493 handles the installation of your services. 1720 handles the installation of your services.
1721 </para>
1722
1723 <para>
1494 When you create the installation for your services, you need 1724 When you create the installation for your services, you need
1495 to accomplish what is normally done by "make install". 1725 to accomplish what is normally done by "make install".
1496 In other words, make sure your installation puts the output 1726 In other words, make sure your installation puts the output
@@ -1498,17 +1728,32 @@ section though.
1498 target system. 1728 target system.
1499 </para> 1729 </para>
1500 1730
1731 <para>
1732 <emphasis>Paul</emphasis> - We need to get some detail here on specific extra
1733 functions needed in some recipes (e.g. how to add support for
1734 services like sysvinit and systemd, how to add
1735 <filename>PACKAGECONFIG</filename> options, how to
1736 deal with alternatives, and so forth).
1737 </para>
1501 </section> 1738 </section>
1502 1739
1503 <section id='new-recipe-packaging'> 1740 <section id='new-recipe-packaging'>
1504 <title>Packaging</title> 1741 <title>Packaging</title>
1505 1742
1506 <para> 1743 <para>
1507 packaging: ensure that the files are packaged correctly. Resolve any package QA 1744 The <filename>do_package</filename> task ensures that files
1508issues (we need to have more detailed docs on this, probably as its own 1745 are packaged correctly.
1509section). This can also involve looking at packages-split under the work 1746 To be sure your packages are correct, examine the
1510directory and checking if files are where they need to be; if not, set 1747 <filename>${</filename><ulink url='&YOCTO_DOCS_REF_URL;#var-WORKDIR'><filename>WORKDIR</filename></ulink><filename>}/packages-split</filename>
1511PACKAGES, FILES, do_install(_append) etc. as needed. 1748 directory and make sure files are where you expect them to be.
1749 </para>
1750
1751 <para>
1752 If you discover problems, you can set
1753 <ulink url='&YOCTO_DOCS_REF_URL;#var-PACKAGES'><filename>PACKAGES</filename></ulink>,
1754 <ulink url='&YOCTO_DOCS_REF_URL;#var-FILES'><filename>FILES</filename></ulink>,
1755 <filename>do_install(_append)</filename>, and so forth as
1756 needed.
1512 </para> 1757 </para>
1513 </section> 1758 </section>
1514 1759
@@ -1516,8 +1761,10 @@ PACKAGES, FILES, do_install(_append) etc. as needed.
1516 <title>Testing</title> 1761 <title>Testing</title>
1517 1762
1518 <para> 1763 <para>
1519 runtime testing: add the output package(s) to your image and ensure that they 1764 The final step for completing your recipe is to be sure that
1520work at runtime. 1765 the software you built runs correctly.
1766 To accomplish runtime testing, add the build's output
1767 packages to your image and test them on the target.
1521 </para> 1768 </para>
1522 </section> 1769 </section>
1523 </section> 1770 </section>