blob: 713ea3a48e53ce42634c89325edc3e95987d0aaa [file] [log] [blame]
Andrew Geissler517393d2023-01-13 08:55:19 -06001.. 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