1.. SPDX-License-Identifier: CC-BY-SA-2.0-UK
2
3Maintaining Build Output Quality
4********************************
5
6Many factors can influence the quality of a build. For example, if you
7upgrade a recipe to use a new version of an upstream software package or
8you experiment with some new configuration options, subtle changes can
9occur that you might not detect until later. Consider the case where
10your recipe is using a newer version of an upstream package. In this
11case, a new version of a piece of software might introduce an optional
12dependency on another library, which is auto-detected. If that library
13has already been built when the software is building, the software will
14link to the built library and that library will be pulled into your
15image along with the new software even if you did not want the library.
16
17The :ref:`ref-classes-buildhistory` class helps you maintain the quality of
18your build output. You can use the class to highlight unexpected and possibly
19unwanted changes in the build output. When you enable build history, it records
20information about the contents of each package and image and then commits that
21information to a local Git repository where you can examine the information.
22
23The remainder of this section describes the following:
24
25-  :ref:`How you can enable and disable build history <dev-manual/build-quality:enabling and disabling build history>`
26
27-  :ref:`How to understand what the build history contains <dev-manual/build-quality:understanding what the build history contains>`
28
29-  :ref:`How to limit the information used for build history <dev-manual/build-quality:using build history to gather image information only>`
30
31-  :ref:`How to examine the build history from both a command-line and web interface <dev-manual/build-quality:examining build history information>`
32
33Enabling and Disabling Build History
34====================================
35
36Build history is disabled by default. To enable it, add the following
37:term:`INHERIT` statement and set the :term:`BUILDHISTORY_COMMIT` variable to
38"1" at the end of your ``conf/local.conf`` file found in the
39:term:`Build Directory`::
40
41   INHERIT += "buildhistory"
42   BUILDHISTORY_COMMIT = "1"
43
44Enabling build history as
45previously described causes the OpenEmbedded build system to collect
46build output information and commit it as a single commit to a local
47:ref:`overview-manual/development-environment:git` repository.
48
49.. note::
50
51   Enabling build history increases your build times slightly,
52   particularly for images, and increases the amount of disk space used
53   during the build.
54
55You can disable build history by removing the previous statements from
56your ``conf/local.conf`` file.
57
58Understanding What the Build History Contains
59=============================================
60
61Build history information is kept in ``${``\ :term:`TOPDIR`\ ``}/buildhistory``
62in the :term:`Build Directory` as defined by the :term:`BUILDHISTORY_DIR`
63variable. Here is an example abbreviated listing:
64
65.. image:: figures/buildhistory.png
66   :align: center
67   :width: 50%
68
69At the top level, there is a ``metadata-revs`` file that lists the
70revisions of the repositories for the enabled layers when the build was
71produced. The rest of the data splits into separate ``packages``,
72``images`` and ``sdk`` directories, the contents of which are described
73as follows.
74
75Build History Package Information
76---------------------------------
77
78The history for each package contains a text file that has name-value
79pairs with information about the package. For example,
80``buildhistory/packages/i586-poky-linux/busybox/busybox/latest``
81contains the following:
82
83.. code-block:: none
84
85   PV = 1.22.1
86   PR = r32
87   RPROVIDES =
88   RDEPENDS = glibc (>= 2.20) update-alternatives-opkg
89   RRECOMMENDS = busybox-syslog busybox-udhcpc update-rc.d
90   PKGSIZE = 540168
91   FILES = /usr/bin/* /usr/sbin/* /usr/lib/busybox/* /usr/lib/lib*.so.* \
92      /etc /com /var /bin/* /sbin/* /lib/*.so.* /lib/udev/rules.d \
93      /usr/lib/udev/rules.d /usr/share/busybox /usr/lib/busybox/* \
94      /usr/share/pixmaps /usr/share/applications /usr/share/idl \
95      /usr/share/omf /usr/share/sounds /usr/lib/bonobo/servers
96   FILELIST = /bin/busybox /bin/busybox.nosuid /bin/busybox.suid /bin/sh \
97      /etc/busybox.links.nosuid /etc/busybox.links.suid
98
99Most of these
100name-value pairs correspond to variables used to produce the package.
101The exceptions are ``FILELIST``, which is the actual list of files in
102the package, and ``PKGSIZE``, which is the total size of files in the
103package in bytes.
104
105There is also a file that corresponds to the recipe from which the package
106came (e.g. ``buildhistory/packages/i586-poky-linux/busybox/latest``):
107
108.. code-block:: none
109
110   PV = 1.22.1
111   PR = r32
112   DEPENDS = initscripts kern-tools-native update-rc.d-native \
113      virtual/i586-poky-linux-compilerlibs virtual/i586-poky-linux-gcc \
114      virtual/libc virtual/update-alternatives
115   PACKAGES = busybox-ptest busybox-httpd busybox-udhcpd busybox-udhcpc \
116      busybox-syslog busybox-mdev busybox-hwclock busybox-dbg \
117      busybox-staticdev busybox-dev busybox-doc busybox-locale busybox
118
119Finally, for those recipes fetched from a version control system (e.g.,
120Git), there is a file that lists source revisions that are specified in
121the recipe and the actual revisions used during the build. Listed
122and actual revisions might differ when
123:term:`SRCREV` is set to
124${:term:`AUTOREV`}. Here is an
125example assuming
126``buildhistory/packages/qemux86-poky-linux/linux-yocto/latest_srcrev``)::
127
128   # SRCREV_machine = "38cd560d5022ed2dbd1ab0dca9642e47c98a0aa1"
129   SRCREV_machine = "38cd560d5022ed2dbd1ab0dca9642e47c98a0aa1"
130   # SRCREV_meta = "a227f20eff056e511d504b2e490f3774ab260d6f"
131   SRCREV_meta ="a227f20eff056e511d504b2e490f3774ab260d6f"
132
133You can use the
134``buildhistory-collect-srcrevs`` command with the ``-a`` option to
135collect the stored :term:`SRCREV` values from build history and report them
136in a format suitable for use in global configuration (e.g.,
137``local.conf`` or a distro include file) to override floating
138:term:`AUTOREV` values to a fixed set of revisions. Here is some example
139output from this command::
140
141   $ buildhistory-collect-srcrevs -a
142   # all-poky-linux
143   SRCREV:pn-ca-certificates = "07de54fdcc5806bde549e1edf60738c6bccf50e8"
144   SRCREV:pn-update-rc.d = "8636cf478d426b568c1be11dbd9346f67e03adac"
145   # core2-64-poky-linux
146   SRCREV:pn-binutils = "87d4632d36323091e731eb07b8aa65f90293da66"
147   SRCREV:pn-btrfs-tools = "8ad326b2f28c044cb6ed9016d7c3285e23b673c8"
148   SRCREV_bzip2-tests:pn-bzip2 = "f9061c030a25de5b6829e1abf373057309c734c0"
149   SRCREV:pn-e2fsprogs = "02540dedd3ddc52c6ae8aaa8a95ce75c3f8be1c0"
150   SRCREV:pn-file = "504206e53a89fd6eed71aeaf878aa3512418eab1"
151   SRCREV_glibc:pn-glibc = "24962427071fa532c3c48c918e9d64d719cc8a6c"
152   SRCREV:pn-gnome-desktop-testing = "e346cd4ed2e2102c9b195b614f3c642d23f5f6e7"
153   SRCREV:pn-init-system-helpers = "dbd9197569c0935029acd5c9b02b84c68fd937ee"
154   SRCREV:pn-kmod = "b6ecfc916a17eab8f93be5b09f4e4f845aabd3d1"
155   SRCREV:pn-libnsl2 = "82245c0c58add79a8e34ab0917358217a70e5100"
156   SRCREV:pn-libseccomp = "57357d2741a3b3d3e8425889a6b79a130e0fa2f3"
157   SRCREV:pn-libxcrypt = "50cf2b6dd4fdf04309445f2eec8de7051d953abf"
158   SRCREV:pn-ncurses = "51d0fd9cc3edb975f04224f29f777f8f448e8ced"
159   SRCREV:pn-procps = "19a508ea121c0c4ac6d0224575a036de745eaaf8"
160   SRCREV:pn-psmisc = "5fab6b7ab385080f1db725d6803136ec1841a15f"
161   SRCREV:pn-ptest-runner = "bcb82804daa8f725b6add259dcef2067e61a75aa"
162   SRCREV:pn-shared-mime-info = "18e558fa1c8b90b86757ade09a4ba4d6a6cf8f70"
163   SRCREV:pn-zstd = "e47e674cd09583ff0503f0f6defd6d23d8b718d3"
164   # qemux86_64-poky-linux
165   SRCREV_machine:pn-linux-yocto = "20301aeb1a64164b72bc72af58802b315e025c9c"
166   SRCREV_meta:pn-linux-yocto = "2d38a472b21ae343707c8bd64ac68a9eaca066a0"
167   # x86_64-linux
168   SRCREV:pn-binutils-cross-x86_64 = "87d4632d36323091e731eb07b8aa65f90293da66"
169   SRCREV_glibc:pn-cross-localedef-native = "24962427071fa532c3c48c918e9d64d719cc8a6c"
170   SRCREV_localedef:pn-cross-localedef-native = "794da69788cbf9bf57b59a852f9f11307663fa87"
171   SRCREV:pn-debianutils-native = "de14223e5bffe15e374a441302c528ffc1cbed57"
172   SRCREV:pn-libmodulemd-native = "ee80309bc766d781a144e6879419b29f444d94eb"
173   SRCREV:pn-virglrenderer-native = "363915595e05fb252e70d6514be2f0c0b5ca312b"
174   SRCREV:pn-zstd-native = "e47e674cd09583ff0503f0f6defd6d23d8b718d3"
175
176.. note::
177
178   Here are some notes on using the ``buildhistory-collect-srcrevs`` command:
179
180   -  By default, only values where the :term:`SRCREV` was not hardcoded
181      (usually when :term:`AUTOREV` is used) are reported. Use the ``-a``
182      option to see all :term:`SRCREV` values.
183
184   -  The output statements might not have any effect if overrides are
185      applied elsewhere in the build system configuration. Use the
186      ``-f`` option to add the ``forcevariable`` override to each output
187      line if you need to work around this restriction.
188
189   -  The script does apply special handling when building for multiple
190      machines. However, the script does place a comment before each set
191      of values that specifies which triplet to which they belong as
192      previously shown (e.g., ``i586-poky-linux``).
193
194Build History Image Information
195-------------------------------
196
197The files produced for each image are as follows:
198
199-  ``image-files:`` A directory containing selected files from the root
200   filesystem. The files are defined by
201   :term:`BUILDHISTORY_IMAGE_FILES`.
202
203-  ``build-id.txt:`` Human-readable information about the build
204   configuration and metadata source revisions. This file contains the
205   full build header as printed by BitBake.
206
207-  ``*.dot:`` Dependency graphs for the image that are compatible with
208   ``graphviz``.
209
210-  ``files-in-image.txt:`` A list of files in the image with
211   permissions, owner, group, size, and symlink information.
212
213-  ``image-info.txt:`` A text file containing name-value pairs with
214   information about the image. See the following listing example for
215   more information.
216
217-  ``installed-package-names.txt:`` A list of installed packages by name
218   only.
219
220-  ``installed-package-sizes.txt:`` A list of installed packages ordered
221   by size.
222
223-  ``installed-packages.txt:`` A list of installed packages with full
224   package filenames.
225
226.. note::
227
228   Installed package information is able to be gathered and produced
229   even if package management is disabled for the final image.
230
231Here is an example of ``image-info.txt``:
232
233.. code-block:: none
234
235   DISTRO = poky
236   DISTRO_VERSION = 3.4+snapshot-a0245d7be08f3d24ea1875e9f8872aa6bbff93be
237   USER_CLASSES = buildstats
238   IMAGE_CLASSES = qemuboot qemuboot license_image
239   IMAGE_FEATURES = debug-tweaks
240   IMAGE_LINGUAS =
241   IMAGE_INSTALL = packagegroup-core-boot speex speexdsp
242   BAD_RECOMMENDATIONS =
243   NO_RECOMMENDATIONS =
244   PACKAGE_EXCLUDE =
245   ROOTFS_POSTPROCESS_COMMAND = write_package_manifest; license_create_manifest; cve_check_write_rootfs_manifest;   ssh_allow_empty_password;  ssh_allow_root_login;  postinst_enable_logging;  rootfs_update_timestamp;   write_image_test_data;   empty_var_volatile;   sort_passwd; rootfs_reproducible;
246   IMAGE_POSTPROCESS_COMMAND =  buildhistory_get_imageinfo ;
247   IMAGESIZE = 9265
248
249Other than ``IMAGESIZE``,
250which is the total size of the files in the image in Kbytes, the
251name-value pairs are variables that may have influenced the content of
252the image. This information is often useful when you are trying to
253determine why a change in the package or file listings has occurred.
254
255Using Build History to Gather Image Information Only
256----------------------------------------------------
257
258As you can see, build history produces image information, including
259dependency graphs, so you can see why something was pulled into the
260image. If you are just interested in this information and not interested
261in collecting specific package or SDK information, you can enable
262writing only image information without any history by adding the
263following to your ``conf/local.conf`` file found in the
264:term:`Build Directory`::
265
266   INHERIT += "buildhistory"
267   BUILDHISTORY_COMMIT = "0"
268   BUILDHISTORY_FEATURES = "image"
269
270Here, you set the
271:term:`BUILDHISTORY_FEATURES`
272variable to use the image feature only.
273
274Build History SDK Information
275-----------------------------
276
277Build history collects similar information on the contents of SDKs (e.g.
278``bitbake -c populate_sdk imagename``) as compared to information it
279collects for images. Furthermore, this information differs depending on
280whether an extensible or standard SDK is being produced.
281
282The following list shows the files produced for SDKs:
283
284-  ``files-in-sdk.txt:`` A list of files in the SDK with permissions,
285   owner, group, size, and symlink information. This list includes both
286   the host and target parts of the SDK.
287
288-  ``sdk-info.txt:`` A text file containing name-value pairs with
289   information about the SDK. See the following listing example for more
290   information.
291
292-  ``sstate-task-sizes.txt:`` A text file containing name-value pairs
293   with information about task group sizes (e.g. :ref:`ref-tasks-populate_sysroot`
294   tasks have a total size). The ``sstate-task-sizes.txt`` file exists
295   only when an extensible SDK is created.
296
297-  ``sstate-package-sizes.txt:`` A text file containing name-value pairs
298   with information for the shared-state packages and sizes in the SDK.
299   The ``sstate-package-sizes.txt`` file exists only when an extensible
300   SDK is created.
301
302-  ``sdk-files:`` A folder that contains copies of the files mentioned
303   in ``BUILDHISTORY_SDK_FILES`` if the files are present in the output.
304   Additionally, the default value of ``BUILDHISTORY_SDK_FILES`` is
305   specific to the extensible SDK although you can set it differently if
306   you would like to pull in specific files from the standard SDK.
307
308   The default files are ``conf/local.conf``, ``conf/bblayers.conf``,
309   ``conf/auto.conf``, ``conf/locked-sigs.inc``, and
310   ``conf/devtool.conf``. Thus, for an extensible SDK, these files get
311   copied into the ``sdk-files`` directory.
312
313-  The following information appears under each of the ``host`` and
314   ``target`` directories for the portions of the SDK that run on the
315   host and on the target, respectively:
316
317   .. note::
318
319      The following files for the most part are empty when producing an
320      extensible SDK because this type of SDK is not constructed from
321      packages as is the standard SDK.
322
323   -  ``depends.dot:`` Dependency graph for the SDK that is compatible
324      with ``graphviz``.
325
326   -  ``installed-package-names.txt:`` A list of installed packages by
327      name only.
328
329   -  ``installed-package-sizes.txt:`` A list of installed packages
330      ordered by size.
331
332   -  ``installed-packages.txt:`` A list of installed packages with full
333      package filenames.
334
335Here is an example of ``sdk-info.txt``:
336
337.. code-block:: none
338
339   DISTRO = poky
340   DISTRO_VERSION = 1.3+snapshot-20130327
341   SDK_NAME = poky-glibc-i686-arm
342   SDK_VERSION = 1.3+snapshot
343   SDKMACHINE =
344   SDKIMAGE_FEATURES = dev-pkgs dbg-pkgs
345   BAD_RECOMMENDATIONS =
346   SDKSIZE = 352712
347
348Other than ``SDKSIZE``, which is
349the total size of the files in the SDK in Kbytes, the name-value pairs
350are variables that might have influenced the content of the SDK. This
351information is often useful when you are trying to determine why a
352change in the package or file listings has occurred.
353
354Examining Build History Information
355-----------------------------------
356
357You can examine build history output from the command line or from a web
358interface.
359
360To see any changes that have occurred (assuming you have
361:term:`BUILDHISTORY_COMMIT` = "1"),
362you can simply use any Git command that allows you to view the history
363of a repository. Here is one method::
364
365   $ git log -p
366
367You need to realize,
368however, that this method does show changes that are not significant
369(e.g. a package's size changing by a few bytes).
370
371There is a command-line tool called ``buildhistory-diff``, though,
372that queries the Git repository and prints just the differences that
373might be significant in human-readable form. Here is an example::
374
375   $ poky/poky/scripts/buildhistory-diff . HEAD^
376   Changes to images/qemux86_64/glibc/core-image-minimal (files-in-image.txt):
377      /etc/anotherpkg.conf was added
378      /sbin/anotherpkg was added
379      * (installed-package-names.txt):
380      *   anotherpkg was added
381   Changes to images/qemux86_64/glibc/core-image-minimal (installed-package-names.txt):
382      anotherpkg was added
383   packages/qemux86_64-poky-linux/v86d: PACKAGES: added "v86d-extras"
384      * PR changed from "r0" to "r1"
385      * PV changed from "0.1.10" to "0.1.12"
386   packages/qemux86_64-poky-linux/v86d/v86d: PKGSIZE changed from 110579 to 144381 (+30%)
387      * PR changed from "r0" to "r1"
388      * PV changed from "0.1.10" to "0.1.12"
389
390.. note::
391
392   The ``buildhistory-diff`` tool requires the ``GitPython``
393   package. Be sure to install it using Pip3 as follows::
394
395         $ pip3 install GitPython --user
396
397
398   Alternatively, you can install ``python3-git`` using the appropriate
399   distribution package manager (e.g. ``apt``, ``dnf``, or ``zipper``).
400
401To see changes to the build history using a web interface, follow the
402instruction in the ``README`` file
403:yocto_git:`here </buildhistory-web/>`.
404
405Here is a sample screenshot of the interface:
406
407.. image:: figures/buildhistory-web.png
408   :width: 100%
409
410