[OE-core] [PATCH 1/4] buildhistory-extra.bbclass: store more information about a build

Patrick Ohly patrick.ohly at intel.com
Wed Nov 25 09:30:29 UTC 2015


From: Paul Eggleton <paul.eggleton at linux.intel.com>

When distributing a distro, it may be useful to also have additional
information about the sources used for creating a build. YOCTO #8138
specifically mentions:
- set of recipes that we used in builds, including information like
  checksum, originated layer(s), .bbappend and other overrides.
- information about source/patch files used in recipes (URLs, layers
  originating from, checksums).
- for images, links to source recipe names/versions that was used in image.

[Code from Paul, commit message from Patrick]

Signed-off-by: Patrick Ohly <patrick.ohly at intel.com>
---
 meta/classes/buildhistory-extra.bbclass | 86 +++++++++++++++++++++++++++++++++
 1 file changed, 86 insertions(+)
 create mode 100644 meta/classes/buildhistory-extra.bbclass

diff --git a/meta/classes/buildhistory-extra.bbclass b/meta/classes/buildhistory-extra.bbclass
new file mode 100644
index 0000000..e9fea5d
--- /dev/null
+++ b/meta/classes/buildhistory-extra.bbclass
@@ -0,0 +1,86 @@
+# Provides some extra logging into buildhistory of some of the inputs
+# (buildhistory itself mostly concentrates on build output)
+#
+# Copyright (C) 2015 Intel Corporation
+# Licensed under the MIT license
+
+BUILDHISTORY_EXTRA_PKGVARS ?= "PACKAGECONFIG EXTRA_OEMAKE EXTRA_OECONF EXTRA_OECMAKE EXTRA_OESCONS EXTRA_QMAKEVARS_PRE EXTRA_QMAKEVARS_POST OE_FEATURES SUMMARY DESCRIPTION HOMEPAGE LICENSE"
+
+python buildhistory_emit_pkghistory_append() {
+    import codecs
+
+    relpath = os.path.dirname(d.getVar('TOPDIR', True))
+
+    # List sources
+    pkghistdir = d.getVar('BUILDHISTORY_DIR_PACKAGE', True)
+    srcsfile = os.path.join(pkghistdir, "sources")
+    with codecs.open(srcsfile, "w", encoding='utf8') as f:
+        urls = (d.getVar('SRC_URI', True) or '').split()
+        for url in urls:
+            localpath = bb.fetch2.localpath(url, d)
+            if os.path.isfile(localpath):
+                sha256sum = bb.utils.sha256_file(localpath)
+            else:
+                sha256sum = 'N/A'
+            if localpath.startswith(relpath):
+                localpath = os.path.relpath(localpath, relpath)
+            f.write('%s %s %s\n' % (url, localpath, sha256sum))
+
+    # List metadata
+    includes = d.getVar('BBINCLUDED', True).split()
+    metafile = os.path.join(pkghistdir, "metadata")
+    with codecs.open(metafile, "w", encoding='utf8') as f:
+        for path in includes:
+            if os.path.exists(path):
+                sha256sum = bb.utils.sha256_file(path)
+                if path.startswith(relpath):
+                    path = os.path.relpath(path, relpath)
+                f.write('%s %s\n' % (path, sha256sum))
+
+    # List some extra var values
+    latestfile = os.path.join(pkghistdir, "latest")
+    vars = (d.getVar('BUILDHISTORY_EXTRA_PKGVARS', True) or '').split()
+    if vars:
+        with codecs.open(latestfile, "a", encoding='utf8') as f:
+            for var in vars:
+                value = oe.utils.squashspaces(d.getVar(var, True) or '')
+                if value:
+                    f.write('%s = %s\n' % (var, value))
+}
+
+python() {
+    if bb.data.inherits_class('kernel', d):
+        d.appendVarFlag('do_compile', 'prefuncs', ' buildhistory_extra_emit_kernelconfig')
+        d.appendVarFlag('do_compile', 'vardepsexclude', ' buildhistory_extra_emit_kernelconfig')
+}
+
+python buildhistory_extra_emit_kernelconfig() {
+    # Copy the final kernel config
+    # Unlike the rest of buildhistory this will only get run when the kernel is actually built
+    # (as opposed to being restored from the sstate cache); this is because do_shared_workdir
+    # operates outside of sstate and that running is the only way you get the config other than
+    # during the actual kernel build.
+    import shutil
+    pkghistdir = d.getVar('BUILDHISTORY_DIR_PACKAGE', True)
+    shutil.copyfile(d.expand('${B}/.config'), os.path.join(pkghistdir, 'kconfig'))
+}
+
+buildhistory_get_image_installed_append() {
+	# Create a file mapping installed packages to recipes
+	printf "" > ${BUILDHISTORY_DIR_IMAGE}/installed-package-recipes.txt
+	cat ${IMAGE_MANIFEST} | while read pkg pkgarch version
+	do
+		if [ -n "$pkg" ] ; then
+			recipe=`oe-pkgdata-util -p ${PKGDATA_DIR} lookup-recipe $pkg`
+			pkge=`oe-pkgdata-util -p ${PKGDATA_DIR} read-value PKGE $pkg`
+			if [ "$pkge" != "" ] ; then
+				pkge="$pkge-"
+			fi
+			pkgr=`oe-pkgdata-util -p ${PKGDATA_DIR} read-value PKGR $pkg`
+			if [ "$pkgr" != "" ] ; then
+				pkgr="-$pkgr"
+			fi
+			echo "$pkg $version $pkge$version$pkgr $recipe" >> ${BUILDHISTORY_DIR_IMAGE}/installed-package-recipes.txt
+		fi
+	done
+}
\ No newline at end of file
-- 
2.1.4




More information about the Openembedded-core mailing list