build-quality.rst 17 KB

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