build-quality.rst 17 KB

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