1.. SPDX-License-Identifier: CC-BY-SA-2.0-UK
2
3Building
4********
5
6This section describes various build procedures, such as the steps
7needed for a simple build, building a target for multiple configurations,
8generating an image for more than one machine, and so forth.
9
10Building a Simple Image
11=======================
12
13In the development environment, you need to build an image whenever you
14change hardware support, add or change system libraries, or add or
15change services that have dependencies. There are several methods that allow
16you to build an image within the Yocto Project. This section presents
17the basic steps you need to build a simple image using BitBake from a
18build host running Linux.
19
20.. note::
21
22   -  For information on how to build an image using
23      :term:`Toaster`, see the
24      :doc:`/toaster-manual/index`.
25
26   -  For information on how to use ``devtool`` to build images, see the
27      ":ref:`sdk-manual/extensible:using \`\`devtool\`\` in your sdk workflow`"
28      section in the Yocto Project Application Development and the
29      Extensible Software Development Kit (eSDK) manual.
30
31   -  For a quick example on how to build an image using the
32      OpenEmbedded build system, see the
33      :doc:`/brief-yoctoprojectqs/index` document.
34
35   -  You can also use the `Yocto Project BitBake
36      <https://marketplace.visualstudio.com/items?itemName=yocto-project.yocto-bitbake>`__
37      extension for Visual Studio Code to build images.
38
39The build process creates an entire Linux distribution from source and
40places it in your :term:`Build Directory` under ``tmp/deploy/images``. For
41detailed information on the build process using BitBake, see the
42":ref:`overview-manual/concepts:images`" section in the Yocto Project Overview
43and Concepts Manual.
44
45The following figure and list overviews the build process:
46
47.. image:: figures/bitbake-build-flow.png
48   :width: 100%
49
50#. *Set up Your Host Development System to Support Development Using the
51   Yocto Project*: See the ":doc:`start`" section for options on how to get a
52   build host ready to use the Yocto Project.
53
54#. *Initialize the Build Environment:* Initialize the build environment
55   by sourcing the build environment script (i.e.
56   :ref:`structure-core-script`)::
57
58      $ source oe-init-build-env [build_dir]
59
60   When you use the initialization script, the OpenEmbedded build system
61   uses ``build`` as the default :term:`Build Directory` in your current work
62   directory. You can use a `build_dir` argument with the script to
63   specify a different :term:`Build Directory`.
64
65   .. note::
66
67      A common practice is to use a different :term:`Build Directory` for
68      different targets; for example, ``~/build/x86`` for a ``qemux86``
69      target, and ``~/build/arm`` for a ``qemuarm`` target. In any
70      event, it's typically cleaner to locate the :term:`Build Directory`
71      somewhere outside of your source directory.
72
73#. *Make Sure Your* ``local.conf`` *File is Correct*: Ensure the
74   ``conf/local.conf`` configuration file, which is found in the
75   :term:`Build Directory`, is set up how you want it. This file defines many
76   aspects of the build environment including the target machine architecture
77   through the :term:`MACHINE` variable, the packaging format used during
78   the build (:term:`PACKAGE_CLASSES`), and a centralized tarball download
79   directory through the :term:`DL_DIR` variable.
80
81#. *Build the Image:* Build the image using the ``bitbake`` command::
82
83      $ bitbake target
84
85   .. note::
86
87      For information on BitBake, see the :doc:`bitbake:index`.
88
89   The target is the name of the recipe you want to build. Common
90   targets are the images in ``meta/recipes-core/images``,
91   ``meta/recipes-sato/images``, and so forth all found in the
92   :term:`Source Directory`. Alternatively, the target
93   can be the name of a recipe for a specific piece of software such as
94   BusyBox. For more details about the images the OpenEmbedded build
95   system supports, see the
96   ":ref:`ref-manual/images:Images`" chapter in the Yocto
97   Project Reference Manual.
98
99   As an example, the following command builds the
100   ``core-image-minimal`` image::
101
102      $ bitbake core-image-minimal
103
104   Once an
105   image has been built, it often needs to be installed. The images and
106   kernels built by the OpenEmbedded build system are placed in the
107   :term:`Build Directory` in ``tmp/deploy/images``. For information on how to
108   run pre-built images such as ``qemux86`` and ``qemuarm``, see the
109   :doc:`/sdk-manual/index` manual. For
110   information about how to install these images, see the documentation
111   for your particular board or machine.
112
113Building Images for Multiple Targets Using Multiple Configurations
114==================================================================
115
116You can use a single ``bitbake`` command to build multiple images or
117packages for different targets where each image or package requires a
118different configuration (multiple configuration builds). The builds, in
119this scenario, are sometimes referred to as "multiconfigs", and this
120section uses that term throughout.
121
122This section describes how to set up for multiple configuration builds
123and how to account for cross-build dependencies between the
124multiconfigs.
125
126Setting Up and Running a Multiple Configuration Build
127-----------------------------------------------------
128
129To accomplish a multiple configuration build, you must define each
130target's configuration separately using a parallel configuration file in
131the :term:`Build Directory` or configuration directory within a layer, and you
132must follow a required file hierarchy. Additionally, you must enable the
133multiple configuration builds in your ``local.conf`` file.
134
135Follow these steps to set up and execute multiple configuration builds:
136
137-  *Create Separate Configuration Files*: You need to create a single
138   configuration file for each build target (each multiconfig).
139   The configuration definitions are implementation dependent but often
140   each configuration file will define the machine and the
141   temporary directory BitBake uses for the build. Whether the same
142   temporary directory (:term:`TMPDIR`) can be shared will depend on what is
143   similar and what is different between the configurations. Multiple MACHINE
144   targets can share the same (:term:`TMPDIR`) as long as the rest of the
145   configuration is the same, multiple :term:`DISTRO` settings would need separate
146   (:term:`TMPDIR`) directories.
147
148   For example, consider a scenario with two different multiconfigs for the same
149   :term:`MACHINE`: "qemux86" built
150   for two distributions such as "poky" and "poky-lsb". In this case,
151   you would need to use the different :term:`TMPDIR`.
152
153   Here is an example showing the minimal statements needed in a
154   configuration file for a "qemux86" target whose temporary build
155   directory is ``tmpmultix86``::
156
157      MACHINE = "qemux86"
158      TMPDIR = "${TOPDIR}/tmpmultix86"
159
160   The location for these multiconfig configuration files is specific.
161   They must reside in the current :term:`Build Directory` in a sub-directory of
162   ``conf`` named ``multiconfig`` or within a layer's ``conf`` directory
163   under a directory named ``multiconfig``. Here is an example that defines
164   two configuration files for the "x86" and "arm" multiconfigs:
165
166   .. image:: figures/multiconfig_files.png
167      :align: center
168      :width: 50%
169
170   The usual :term:`BBPATH` search path is used to locate multiconfig files in
171   a similar way to other conf files.
172
173-  *Add the BitBake Multi-configuration Variable to the Local
174   Configuration File*: Use the
175   :term:`BBMULTICONFIG`
176   variable in your ``conf/local.conf`` configuration file to specify
177   each multiconfig. Continuing with the example from the previous
178   figure, the :term:`BBMULTICONFIG` variable needs to enable two
179   multiconfigs: "x86" and "arm" by specifying each configuration file::
180
181      BBMULTICONFIG = "x86 arm"
182
183   .. note::
184
185      A "default" configuration already exists by definition. This
186      configuration is named: "" (i.e. empty string) and is defined by
187      the variables coming from your ``local.conf``
188      file. Consequently, the previous example actually adds two
189      additional configurations to your build: "arm" and "x86" along
190      with "".
191
192-  *Launch BitBake*: Use the following BitBake command form to launch
193   the multiple configuration build::
194
195      $ bitbake [mc:multiconfigname:]target [[[mc:multiconfigname:]target] ... ]
196
197   For the example in this section, the following command applies::
198
199      $ bitbake mc:x86:core-image-minimal mc:arm:core-image-sato mc::core-image-base
200
201   The previous BitBake command builds a ``core-image-minimal`` image
202   that is configured through the ``x86.conf`` configuration file, a
203   ``core-image-sato`` image that is configured through the ``arm.conf``
204   configuration file and a ``core-image-base`` that is configured
205   through your ``local.conf`` configuration file.
206
207.. note::
208
209   Support for multiple configuration builds in the Yocto Project &DISTRO;
210   (&DISTRO_NAME;) Release does not include Shared State (sstate)
211   optimizations. Consequently, if a build uses the same object twice
212   in, for example, two different :term:`TMPDIR`
213   directories, the build either loads from an existing sstate cache for
214   that build at the start or builds the object fresh.
215
216Enabling Multiple Configuration Build Dependencies
217--------------------------------------------------
218
219Sometimes dependencies can exist between targets (multiconfigs) in a
220multiple configuration build. For example, suppose that in order to
221build a ``core-image-sato`` image for an "x86" multiconfig, the root
222filesystem of an "arm" multiconfig must exist. This dependency is
223essentially that the
224:ref:`ref-tasks-image` task in the
225``core-image-sato`` recipe depends on the completion of the
226:ref:`ref-tasks-rootfs` task of the
227``core-image-minimal`` recipe.
228
229To enable dependencies in a multiple configuration build, you must
230declare the dependencies in the recipe using the following statement
231form::
232
233   task_or_package[mcdepends] = "mc:from_multiconfig:to_multiconfig:recipe_name:task_on_which_to_depend"
234
235To better show how to use this statement, consider the example scenario
236from the first paragraph of this section. The following statement needs
237to be added to the recipe that builds the ``core-image-sato`` image::
238
239   do_image[mcdepends] = "mc:x86:arm:core-image-minimal:do_rootfs"
240
241In this example, the `from_multiconfig` is "x86". The `to_multiconfig` is "arm". The
242task on which the :ref:`ref-tasks-image` task in the recipe depends is the
243:ref:`ref-tasks-rootfs` task from the ``core-image-minimal`` recipe associated
244with the "arm" multiconfig.
245
246Once you set up this dependency, you can build the "x86" multiconfig
247using a BitBake command as follows::
248
249   $ bitbake mc:x86:core-image-sato
250
251This command executes all the tasks needed to create the
252``core-image-sato`` image for the "x86" multiconfig. Because of the
253dependency, BitBake also executes through the :ref:`ref-tasks-rootfs` task for the
254"arm" multiconfig build.
255
256Having a recipe depend on the root filesystem of another build might not
257seem that useful. Consider this change to the statement in the
258``core-image-sato`` recipe::
259
260   do_image[mcdepends] = "mc:x86:arm:core-image-minimal:do_image"
261
262In this case, BitBake must
263create the ``core-image-minimal`` image for the "arm" build since the
264"x86" build depends on it.
265
266Because "x86" and "arm" are enabled for multiple configuration builds
267and have separate configuration files, BitBake places the artifacts for
268each build in the respective temporary build directories (i.e.
269:term:`TMPDIR`).
270
271Building an Initial RAM Filesystem (Initramfs) Image
272====================================================
273
274An initial RAM filesystem (:term:`Initramfs`) image provides a temporary root
275filesystem used for early system initialization, typically providing tools and
276loading modules needed to locate and mount the final root filesystem.
277
278Follow these steps to create an :term:`Initramfs` image:
279
280#. *Create the Initramfs Image Recipe:* You can reference the
281   ``core-image-minimal-initramfs.bb`` recipe found in the
282   ``meta/recipes-core`` directory of the :term:`Source Directory`
283   as an example from which to work.
284
285#. *Decide if You Need to Bundle the Initramfs Image Into the Kernel
286   Image:* If you want the :term:`Initramfs` image that is built to be bundled
287   in with the kernel image, set the :term:`INITRAMFS_IMAGE_BUNDLE`
288   variable to ``"1"`` in your ``local.conf`` configuration file and set the
289   :term:`INITRAMFS_IMAGE` variable in the recipe that builds the kernel image.
290
291   Setting the :term:`INITRAMFS_IMAGE_BUNDLE` flag causes the :term:`Initramfs`
292   image to be unpacked into the ``${B}/usr/`` directory. The unpacked
293   :term:`Initramfs` image is then passed to the kernel's ``Makefile`` using the
294   :term:`CONFIG_INITRAMFS_SOURCE` variable, allowing the :term:`Initramfs`
295   image to be built into the kernel normally.
296
297#. *Optionally Add Items to the Initramfs Image Through the Initramfs
298   Image Recipe:* If you add items to the :term:`Initramfs` image by way of its
299   recipe, you should use :term:`PACKAGE_INSTALL` rather than
300   :term:`IMAGE_INSTALL`. :term:`PACKAGE_INSTALL` gives more direct control of
301   what is added to the image as compared to the defaults you might not
302   necessarily want that are set by the :ref:`ref-classes-image`
303   or :ref:`ref-classes-core-image` classes.
304
305#. *Build the Kernel Image and the Initramfs Image:* Build your kernel
306   image using BitBake. Because the :term:`Initramfs` image recipe is a
307   dependency of the kernel image, the :term:`Initramfs` image is built as well
308   and bundled with the kernel image if you used the
309   :term:`INITRAMFS_IMAGE_BUNDLE` variable described earlier.
310
311Bundling an Initramfs Image From a Separate Multiconfig
312-------------------------------------------------------
313
314There may be a case where we want to build an :term:`Initramfs` image which does not
315inherit the same distro policy as our main image, for example, we may want
316our main image to use ``TCLIBC="glibc"``, but to use ``TCLIBC="musl"`` in our :term:`Initramfs`
317image to keep a smaller footprint. However, by performing the steps mentioned
318above the :term:`Initramfs` image will inherit ``TCLIBC="glibc"`` without allowing us
319to override it.
320
321To achieve this, you need to perform some additional steps:
322
323#. *Create a multiconfig for your Initramfs image:* You can perform the steps
324   on ":ref:`dev-manual/building:building images for multiple targets using multiple configurations`" to create a separate multiconfig.
325   For the sake of simplicity let's assume such multiconfig is called: ``initramfscfg.conf`` and
326   contains the variables::
327
328      TMPDIR="${TOPDIR}/tmp-initramfscfg"
329      TCLIBC="musl"
330
331#. *Set additional Initramfs variables on your main configuration:*
332   Additionally, on your main configuration (``local.conf``) you need to set the
333   variables::
334
335     INITRAMFS_MULTICONFIG = "initramfscfg"
336     INITRAMFS_DEPLOY_DIR_IMAGE = "${TOPDIR}/tmp-initramfscfg/deploy/images/${MACHINE}"
337
338   The variables :term:`INITRAMFS_MULTICONFIG` and :term:`INITRAMFS_DEPLOY_DIR_IMAGE`
339   are used to create a multiconfig dependency from the kernel to the :term:`INITRAMFS_IMAGE`
340   to be built coming from the ``initramfscfg`` multiconfig, and to let the
341   buildsystem know where the :term:`INITRAMFS_IMAGE` will be located.
342
343   Building a system with such configuration will build the kernel using the
344   main configuration but the :ref:`ref-tasks-bundle_initramfs` task will grab the
345   selected :term:`INITRAMFS_IMAGE` from :term:`INITRAMFS_DEPLOY_DIR_IMAGE`
346   instead, resulting in a musl based :term:`Initramfs` image bundled in the kernel
347   but a glibc based main image.
348
349   The same is applicable to avoid inheriting :term:`DISTRO_FEATURES` on :term:`INITRAMFS_IMAGE`
350   or to build a different :term:`DISTRO` for it such as ``poky-tiny``.
351
352
353Building a Tiny System
354======================
355
356Very small distributions have some significant advantages such as
357requiring less on-die or in-package memory (cheaper), better performance
358through efficient cache usage, lower power requirements due to less
359memory, faster boot times, and reduced development overhead. Some
360real-world examples where a very small distribution gives you distinct
361advantages are digital cameras, medical devices, and small headless
362systems.
363
364This section presents information that shows you how you can trim your
365distribution to even smaller sizes than the ``poky-tiny`` distribution,
366which is around 5 Mbytes, that can be built out-of-the-box using the
367Yocto Project.
368
369Tiny System Overview
370--------------------
371
372The following list presents the overall steps you need to consider and
373perform to create distributions with smaller root filesystems, achieve
374faster boot times, maintain your critical functionality, and avoid
375initial RAM disks:
376
377-  :ref:`Determine your goals and guiding principles
378   <dev-manual/building:goals and guiding principles>`
379
380-  :ref:`dev-manual/building:understand what contributes to your image size`
381
382-  :ref:`Reduce the size of the root filesystem
383   <dev-manual/building:trim the root filesystem>`
384
385-  :ref:`Reduce the size of the kernel <dev-manual/building:trim the kernel>`
386
387-  :ref:`dev-manual/building:remove package management requirements`
388
389-  :ref:`dev-manual/building:look for other ways to minimize size`
390
391-  :ref:`dev-manual/building:iterate on the process`
392
393Goals and Guiding Principles
394----------------------------
395
396Before you can reach your destination, you need to know where you are
397going. Here is an example list that you can use as a guide when creating
398very small distributions:
399
400-  Determine how much space you need (e.g. a kernel that is 1 Mbyte or
401   less and a root filesystem that is 3 Mbytes or less).
402
403-  Find the areas that are currently taking 90% of the space and
404   concentrate on reducing those areas.
405
406-  Do not create any difficult "hacks" to achieve your goals.
407
408-  Leverage the device-specific options.
409
410-  Work in a separate layer so that you keep changes isolated. For
411   information on how to create layers, see the
412   ":ref:`dev-manual/layers:understanding and creating layers`" section.
413
414Understand What Contributes to Your Image Size
415----------------------------------------------
416
417It is easiest to have something to start with when creating your own
418distribution. You can use the Yocto Project out-of-the-box to create the
419``poky-tiny`` distribution. Ultimately, you will want to make changes in
420your own distribution that are likely modeled after ``poky-tiny``.
421
422.. note::
423
424   To use ``poky-tiny`` in your build, set the :term:`DISTRO` variable in your
425   ``local.conf`` file to "poky-tiny" as described in the
426   ":ref:`dev-manual/custom-distribution:creating your own distribution`"
427   section.
428
429Understanding some memory concepts will help you reduce the system size.
430Memory consists of static, dynamic, and temporary memory. Static memory
431is the TEXT (code), DATA (initialized data in the code), and BSS
432(uninitialized data) sections. Dynamic memory represents memory that is
433allocated at runtime: stacks, hash tables, and so forth. Temporary
434memory is recovered after the boot process. This memory consists of
435memory used for decompressing the kernel and for the ``__init__``
436functions.
437
438To help you see where you currently are with kernel and root filesystem
439sizes, you can use two tools found in the :term:`Source Directory`
440in the
441``scripts/tiny/`` directory:
442
443-  ``ksize.py``: Reports component sizes for the kernel build objects.
444
445-  ``dirsize.py``: Reports component sizes for the root filesystem.
446
447This next tool and command help you organize configuration fragments and
448view file dependencies in a human-readable form:
449
450-  ``merge_config.sh``: Helps you manage configuration files and
451   fragments within the kernel. With this tool, you can merge individual
452   configuration fragments together. The tool allows you to make
453   overrides and warns you of any missing configuration options. The
454   tool is ideal for allowing you to iterate on configurations, create
455   minimal configurations, and create configuration files for different
456   machines without having to duplicate your process.
457
458   The ``merge_config.sh`` script is part of the Linux Yocto kernel Git
459   repositories (i.e. ``linux-yocto-3.14``, ``linux-yocto-3.10``,
460   ``linux-yocto-3.8``, and so forth) in the ``scripts/kconfig``
461   directory.
462
463   For more information on configuration fragments, see the
464   ":ref:`kernel-dev/common:creating configuration fragments`"
465   section in the Yocto Project Linux Kernel Development Manual.
466
467-  ``bitbake -u taskexp -g bitbake_target``: Using the BitBake command
468   with these options brings up a Dependency Explorer from which you can
469   view file dependencies. Understanding these dependencies allows you
470   to make informed decisions when cutting out various pieces of the
471   kernel and root filesystem.
472
473Trim the Root Filesystem
474------------------------
475
476The root filesystem is made up of packages for booting, libraries, and
477applications. To change things, you can configure how the packaging
478happens, which changes the way you build them. You can also modify the
479filesystem itself or select a different filesystem.
480
481First, find out what is hogging your root filesystem by running the
482``dirsize.py`` script from your root directory::
483
484   $ cd root-directory-of-image
485   $ dirsize.py 100000 > dirsize-100k.log
486   $ cat dirsize-100k.log
487
488You can apply a filter to the script to ignore files
489under a certain size. The previous example filters out any files below
490100 Kbytes. The sizes reported by the tool are uncompressed, and thus
491will be smaller by a relatively constant factor in a compressed root
492filesystem. When you examine your log file, you can focus on areas of
493the root filesystem that take up large amounts of memory.
494
495You need to be sure that what you eliminate does not cripple the
496functionality you need. One way to see how packages relate to each other
497is by using the Dependency Explorer UI with the BitBake command::
498
499   $ cd image-directory
500   $ bitbake -u taskexp -g image
501
502Use the interface to
503select potential packages you wish to eliminate and see their dependency
504relationships.
505
506When deciding how to reduce the size, get rid of packages that result in
507minimal impact on the feature set. For example, you might not need a VGA
508display. Or, you might be able to get by with ``devtmpfs`` and ``mdev``
509instead of ``udev``.
510
511Use your ``local.conf`` file to make changes. For example, to eliminate
512``udev`` and ``glib``, set the following in the local configuration
513file::
514
515   VIRTUAL-RUNTIME_dev_manager = ""
516
517Finally, you should consider exactly the type of root filesystem you
518need to meet your needs while also reducing its size. For example,
519consider ``cramfs``, ``squashfs``, ``ubifs``, ``ext2``, or an
520:term:`Initramfs` using ``initramfs``. Be aware that ``ext3`` requires a 1
521Mbyte journal. If you are okay with running read-only, you do not need
522this journal.
523
524.. note::
525
526   After each round of elimination, you need to rebuild your system and
527   then use the tools to see the effects of your reductions.
528
529Trim the Kernel
530---------------
531
532The kernel is built by including policies for hardware-independent
533aspects. What subsystems do you enable? For what architecture are you
534building? Which drivers do you build by default?
535
536.. note::
537
538   You can modify the kernel source if you want to help with boot time.
539
540Run the ``ksize.py`` script from the top-level Linux build directory to
541get an idea of what is making up the kernel::
542
543   $ cd top-level-linux-build-directory
544   $ ksize.py > ksize.log
545   $ cat ksize.log
546
547When you examine the log, you will see how much space is taken up with
548the built-in ``.o`` files for drivers, networking, core kernel files,
549filesystem, sound, and so forth. The sizes reported by the tool are
550uncompressed, and thus will be smaller by a relatively constant factor
551in a compressed kernel image. Look to reduce the areas that are large
552and taking up around the "90% rule."
553
554To examine, or drill down, into any particular area, use the ``-d``
555option with the script::
556
557   $ ksize.py -d > ksize.log
558
559Using this option
560breaks out the individual file information for each area of the kernel
561(e.g. drivers, networking, and so forth).
562
563Use your log file to see what you can eliminate from the kernel based on
564features you can let go. For example, if you are not going to need
565sound, you do not need any drivers that support sound.
566
567After figuring out what to eliminate, you need to reconfigure the kernel
568to reflect those changes during the next build. You could run
569``menuconfig`` and make all your changes at once. However, that makes it
570difficult to see the effects of your individual eliminations and also
571makes it difficult to replicate the changes for perhaps another target
572device. A better method is to start with no configurations using
573``allnoconfig``, create configuration fragments for individual changes,
574and then manage the fragments into a single configuration file using
575``merge_config.sh``. The tool makes it easy for you to iterate using the
576configuration change and build cycle.
577
578Each time you make configuration changes, you need to rebuild the kernel
579and check to see what impact your changes had on the overall size.
580
581Remove Package Management Requirements
582--------------------------------------
583
584Packaging requirements add size to the image. One way to reduce the size
585of the image is to remove all the packaging requirements from the image.
586This reduction includes both removing the package manager and its unique
587dependencies as well as removing the package management data itself.
588
589To eliminate all the packaging requirements for an image, be sure that
590"package-management" is not part of your
591:term:`IMAGE_FEATURES`
592statement for the image. When you remove this feature, you are removing
593the package manager as well as its dependencies from the root
594filesystem.
595
596Look for Other Ways to Minimize Size
597------------------------------------
598
599Depending on your particular circumstances, other areas that you can
600trim likely exist. The key to finding these areas is through tools and
601methods described here combined with experimentation and iteration. Here
602are a couple of areas to experiment with:
603
604-  ``glibc``: In general, follow this process:
605
606   #. Remove ``glibc`` features from
607      :term:`DISTRO_FEATURES`
608      that you think you do not need.
609
610   #. Build your distribution.
611
612   #. If the build fails due to missing symbols in a package, determine
613      if you can reconfigure the package to not need those features. For
614      example, change the configuration to not support wide character
615      support as is done for ``ncurses``. Or, if support for those
616      characters is needed, determine what ``glibc`` features provide
617      the support and restore the configuration.
618
619   4. Rebuild and repeat the process.
620
621-  ``busybox``: For BusyBox, use a process similar as described for
622   ``glibc``. A difference is you will need to boot the resulting system
623   to see if you are able to do everything you expect from the running
624   system. You need to be sure to integrate configuration fragments into
625   Busybox because BusyBox handles its own core features and then allows
626   you to add configuration fragments on top.
627
628Iterate on the Process
629----------------------
630
631If you have not reached your goals on system size, you need to iterate
632on the process. The process is the same. Use the tools and see just what
633is taking up 90% of the root filesystem and the kernel. Decide what you
634can eliminate without limiting your device beyond what you need.
635
636Depending on your system, a good place to look might be Busybox, which
637provides a stripped down version of Unix tools in a single, executable
638file. You might be able to drop virtual terminal services or perhaps
639ipv6.
640
641Building Images for More than One Machine
642=========================================
643
644A common scenario developers face is creating images for several
645different machines that use the same software environment. In this
646situation, it is tempting to set the tunings and optimization flags for
647each build specifically for the targeted hardware (i.e. "maxing out" the
648tunings). Doing so can considerably add to build times and package feed
649maintenance collectively for the machines. For example, selecting tunes
650that are extremely specific to a CPU core used in a system might enable
651some micro optimizations in GCC for that particular system but would
652otherwise not gain you much of a performance difference across the other
653systems as compared to using a more general tuning across all the builds
654(e.g. setting :term:`DEFAULTTUNE`
655specifically for each machine's build). Rather than "max out" each
656build's tunings, you can take steps that cause the OpenEmbedded build
657system to reuse software across the various machines where it makes
658sense.
659
660If build speed and package feed maintenance are considerations, you
661should consider the points in this section that can help you optimize
662your tunings to best consider build times and package feed maintenance.
663
664-  *Share the :term:`Build Directory`:* If at all possible, share the
665   :term:`TMPDIR` across builds. The Yocto Project supports switching between
666   different :term:`MACHINE` values in the same :term:`TMPDIR`. This practice
667   is well supported and regularly used by developers when building for
668   multiple machines. When you use the same :term:`TMPDIR` for multiple
669   machine builds, the OpenEmbedded build system can reuse the existing native
670   and often cross-recipes for multiple machines. Thus, build time decreases.
671
672   .. note::
673
674      If :term:`DISTRO` settings change or fundamental configuration settings
675      such as the filesystem layout, you need to work with a clean :term:`TMPDIR`.
676      Sharing :term:`TMPDIR` under these circumstances might work but since it is
677      not guaranteed, you should use a clean :term:`TMPDIR`.
678
679-  *Enable the Appropriate Package Architecture:* By default, the
680   OpenEmbedded build system enables three levels of package
681   architectures: "all", "tune" or "package", and "machine". Any given
682   recipe usually selects one of these package architectures (types) for
683   its output. Depending for what a given recipe creates packages,
684   making sure you enable the appropriate package architecture can
685   directly impact the build time.
686
687   A recipe that just generates scripts can enable "all" architecture
688   because there are no binaries to build. To specifically enable "all"
689   architecture, be sure your recipe inherits the
690   :ref:`ref-classes-allarch` class.
691   This class is useful for "all" architectures because it configures
692   many variables so packages can be used across multiple architectures.
693
694   If your recipe needs to generate packages that are machine-specific
695   or when one of the build or runtime dependencies is already
696   machine-architecture dependent, which makes your recipe also
697   machine-architecture dependent, make sure your recipe enables the
698   "machine" package architecture through the
699   :term:`MACHINE_ARCH`
700   variable::
701
702      PACKAGE_ARCH = "${MACHINE_ARCH}"
703
704   When you do not
705   specifically enable a package architecture through the
706   :term:`PACKAGE_ARCH`, The
707   OpenEmbedded build system defaults to the
708   :term:`TUNE_PKGARCH` setting::
709
710      PACKAGE_ARCH = "${TUNE_PKGARCH}"
711
712-  *Choose a Generic Tuning File if Possible:* Some tunes are more
713   generic and can run on multiple targets (e.g. an ``armv5`` set of
714   packages could run on ``armv6`` and ``armv7`` processors in most
715   cases). Similarly, ``i486`` binaries could work on ``i586`` and
716   higher processors. You should realize, however, that advances on
717   newer processor versions would not be used.
718
719   If you select the same tune for several different machines, the
720   OpenEmbedded build system reuses software previously built, thus
721   speeding up the overall build time. Realize that even though a new
722   sysroot for each machine is generated, the software is not recompiled
723   and only one package feed exists.
724
725-  *Manage Granular Level Packaging:* Sometimes there are cases where
726   injecting another level of package architecture beyond the three
727   higher levels noted earlier can be useful. For example, consider how
728   NXP (formerly Freescale) allows for the easy reuse of binary packages
729   in their layer
730   :yocto_git:`meta-freescale </meta-freescale/>`.
731   In this example, the
732   :yocto_git:`fsl-dynamic-packagearch </meta-freescale/tree/classes/fsl-dynamic-packagearch.bbclass>`
733   class shares GPU packages for i.MX53 boards because all boards share
734   the AMD GPU. The i.MX6-based boards can do the same because all
735   boards share the Vivante GPU. This class inspects the BitBake
736   datastore to identify if the package provides or depends on one of
737   the sub-architecture values. If so, the class sets the
738   :term:`PACKAGE_ARCH` value
739   based on the ``MACHINE_SUBARCH`` value. If the package does not
740   provide or depend on one of the sub-architecture values but it
741   matches a value in the machine-specific filter, it sets
742   :term:`MACHINE_ARCH`. This
743   behavior reduces the number of packages built and saves build time by
744   reusing binaries.
745
746-  *Use Tools to Debug Issues:* Sometimes you can run into situations
747   where software is being rebuilt when you think it should not be. For
748   example, the OpenEmbedded build system might not be using shared
749   state between machines when you think it should be. These types of
750   situations are usually due to references to machine-specific
751   variables such as :term:`MACHINE`,
752   :term:`SERIAL_CONSOLES`,
753   :term:`XSERVER`,
754   :term:`MACHINE_FEATURES`,
755   and so forth in code that is supposed to only be tune-specific or
756   when the recipe depends
757   (:term:`DEPENDS`,
758   :term:`RDEPENDS`,
759   :term:`RRECOMMENDS`,
760   :term:`RSUGGESTS`, and so forth)
761   on some other recipe that already has
762   :term:`PACKAGE_ARCH` defined
763   as "${MACHINE_ARCH}".
764
765   .. note::
766
767      Patches to fix any issues identified are most welcome as these
768      issues occasionally do occur.
769
770   For such cases, you can use some tools to help you sort out the
771   situation:
772
773   -  ``state-diff-machines.sh``*:* You can find this tool in the
774      ``scripts`` directory of the Source Repositories. See the comments
775      in the script for information on how to use the tool.
776
777   -  *BitBake's "-S printdiff" Option:* Using this option causes
778      BitBake to try to establish the most recent signature match
779      (e.g. in the shared state cache) and then compare matched signatures
780      to determine the stamps and delta where these two stamp trees diverge.
781
782Building Software from an External Source
783=========================================
784
785By default, the OpenEmbedded build system uses the :term:`Build Directory`
786when building source code. The build process involves fetching the source
787files, unpacking them, and then patching them if necessary before the build
788takes place.
789
790There are situations where you might want to build software from source
791files that are external to and thus outside of the OpenEmbedded build
792system. For example, suppose you have a project that includes a new BSP
793with a heavily customized kernel. And, you want to minimize exposing the
794build system to the development team so that they can focus on their
795project and maintain everyone's workflow as much as possible. In this
796case, you want a kernel source directory on the development machine
797where the development occurs. You want the recipe's
798:term:`SRC_URI` variable to point to
799the external directory and use it as is, not copy it.
800
801To build from software that comes from an external source, all you need to do
802is inherit the :ref:`ref-classes-externalsrc` class and then set
803the :term:`EXTERNALSRC` variable to point to your external source code. Here
804are the statements to put in your ``local.conf`` file::
805
806   INHERIT += "externalsrc"
807   EXTERNALSRC:pn-myrecipe = "path-to-your-source-tree"
808
809This next example shows how to accomplish the same thing by setting
810:term:`EXTERNALSRC` in the recipe itself or in the recipe's append file::
811
812   EXTERNALSRC = "path"
813   EXTERNALSRC_BUILD = "path"
814
815.. note::
816
817   In order for these settings to take effect, you must globally or
818   locally inherit the :ref:`ref-classes-externalsrc` class.
819
820By default, :ref:`ref-classes-externalsrc` builds the source code in a
821directory separate from the external source directory as specified by
822:term:`EXTERNALSRC`. If you need
823to have the source built in the same directory in which it resides, or
824some other nominated directory, you can set
825:term:`EXTERNALSRC_BUILD`
826to point to that directory::
827
828   EXTERNALSRC_BUILD:pn-myrecipe = "path-to-your-source-tree"
829
830Replicating a Build Offline
831===========================
832
833It can be useful to take a "snapshot" of upstream sources used in a
834build and then use that "snapshot" later to replicate the build offline.
835To do so, you need to first prepare and populate your downloads
836directory your "snapshot" of files. Once your downloads directory is
837ready, you can use it at any time and from any machine to replicate your
838build.
839
840Follow these steps to populate your Downloads directory:
841
842#. *Create a Clean Downloads Directory:* Start with an empty downloads
843   directory (:term:`DL_DIR`). You
844   start with an empty downloads directory by either removing the files
845   in the existing directory or by setting :term:`DL_DIR` to point to either
846   an empty location or one that does not yet exist.
847
848#. *Generate Tarballs of the Source Git Repositories:* Edit your
849   ``local.conf`` configuration file as follows::
850
851      DL_DIR = "/home/your-download-dir/"
852      BB_GENERATE_MIRROR_TARBALLS = "1"
853
854   During
855   the fetch process in the next step, BitBake gathers the source files
856   and creates tarballs in the directory pointed to by :term:`DL_DIR`. See
857   the
858   :term:`BB_GENERATE_MIRROR_TARBALLS`
859   variable for more information.
860
861#. *Populate Your Downloads Directory Without Building:* Use BitBake to
862   fetch your sources but inhibit the build::
863
864      $ bitbake target --runonly=fetch
865
866   The downloads directory (i.e. ``${DL_DIR}``) now has
867   a "snapshot" of the source files in the form of tarballs, which can
868   be used for the build.
869
870#. *Optionally Remove Any Git or other SCM Subdirectories From the
871   Downloads Directory:* If you want, you can clean up your downloads
872   directory by removing any Git or other Source Control Management
873   (SCM) subdirectories such as ``${DL_DIR}/git2/*``. The tarballs
874   already contain these subdirectories.
875
876Once your downloads directory has everything it needs regarding source
877files, you can create your "own-mirror" and build your target.
878Understand that you can use the files to build the target offline from
879any machine and at any time.
880
881Follow these steps to build your target using the files in the downloads
882directory:
883
884#. *Using Local Files Only:* Inside your ``local.conf`` file, add the
885   :term:`SOURCE_MIRROR_URL` variable, inherit the
886   :ref:`ref-classes-own-mirrors` class, and use the
887   :term:`BB_NO_NETWORK` variable to your ``local.conf``::
888
889      SOURCE_MIRROR_URL ?= "file:///home/your-download-dir/"
890      INHERIT += "own-mirrors"
891      BB_NO_NETWORK = "1"
892
893   The :term:`SOURCE_MIRROR_URL` and :ref:`ref-classes-own-mirrors`
894   class set up the system to use the downloads directory as your "own
895   mirror". Using the :term:`BB_NO_NETWORK` variable makes sure that
896   BitBake's fetching process in step 3 stays local, which means files
897   from your "own-mirror" are used.
898
899#. *Start With a Clean Build:* You can start with a clean build by
900   removing the ``${``\ :term:`TMPDIR`\ ``}`` directory or using a new
901   :term:`Build Directory`.
902
903#. *Build Your Target:* Use BitBake to build your target::
904
905      $ bitbake target
906
907   The build completes using the known local "snapshot" of source
908   files from your mirror. The resulting tarballs for your "snapshot" of
909   source files are in the downloads directory.
910
911   .. note::
912
913      The offline build does not work if recipes attempt to find the
914      latest version of software by setting
915      :term:`SRCREV` to
916      ``${``\ :term:`AUTOREV`\ ``}``::
917
918         SRCREV = "${AUTOREV}"
919
920      When a recipe sets :term:`SRCREV` to
921      ``${``\ :term:`AUTOREV`\ ``}``, the build system accesses the network in an
922      attempt to determine the latest version of software from the SCM.
923      Typically, recipes that use :term:`AUTOREV` are custom or modified
924      recipes. Recipes that reside in public repositories usually do not
925      use :term:`AUTOREV`.
926
927      If you do have recipes that use :term:`AUTOREV`, you can take steps to
928      still use the recipes in an offline build. Do the following:
929
930      #. Use a configuration generated by enabling :ref:`build
931         history <dev-manual/build-quality:maintaining build output quality>`.
932
933      #. Use the ``buildhistory-collect-srcrevs`` command to collect the
934         stored :term:`SRCREV` values from the build's history. For more
935         information on collecting these values, see the
936         ":ref:`dev-manual/build-quality:build history package information`"
937         section.
938
939      #. Once you have the correct source revisions, you can modify
940         those recipes to set :term:`SRCREV` to specific versions of the
941         software.
942
943