1#
2# Writes build information to target filesystem on /etc/buildinfo
3#
4# Copyright (C) 2014 Intel Corporation
5# Author: Alejandro Enedino Hernandez Samaniego <alejandro.hernandez@intel.com>
6#
7# SPDX-License-Identifier: MIT
8#
9# Usage: add INHERIT += "image-buildinfo" to your conf file
10#
11
12# Desired variables to display
13IMAGE_BUILDINFO_VARS ?= "DISTRO DISTRO_VERSION"
14
15# Desired location of the output file in the image.
16IMAGE_BUILDINFO_FILE ??= "${sysconfdir}/buildinfo"
17SDK_BUILDINFO_FILE ??= "/buildinfo"
18
19# From buildhistory.bbclass
20def image_buildinfo_outputvars(vars, d):
21    vars = vars.split()
22    ret = ""
23    for var in vars:
24        value = d.getVar(var) or ""
25        if (d.getVarFlag(var, 'type') == "list"):
26            value = oe.utils.squashspaces(value)
27        ret += "%s = %s\n" % (var, value)
28    return ret.rstrip('\n')
29
30# Returns layer revisions along with their respective status
31def get_layer_revs(d):
32    revisions = oe.buildcfg.get_layer_revisions(d)
33    medadata_revs = ["%-17s = %s:%s%s" % (r[1], r[2], r[3], r[4]) for r in revisions]
34    return '\n'.join(medadata_revs)
35
36def buildinfo_target(d):
37        # Get context
38        if d.getVar('BB_WORKERCONTEXT') != '1':
39                return ""
40        # Single and list variables to be read
41        vars = (d.getVar("IMAGE_BUILDINFO_VARS") or "")
42        return image_buildinfo_outputvars(vars, d)
43
44python buildinfo() {
45    if not d.getVar('IMAGE_BUILDINFO_FILE'):
46        return
47    destfile = d.expand('${BUILDINFODEST}${IMAGE_BUILDINFO_FILE}')
48    bb.utils.mkdirhier(os.path.dirname(destfile))
49    with open(destfile, 'w') as build:
50        build.writelines((
51            '''-----------------------
52Build Configuration:  |
53-----------------------
54''',
55            buildinfo_target(d),
56            '''
57-----------------------
58Layer Revisions:      |
59-----------------------
60''',
61            get_layer_revs(d),
62            '''
63'''
64       ))
65}
66
67# Write build information to target filesystem
68python buildinfo_image () {
69    d.setVar("BUILDINFODEST", "${IMAGE_ROOTFS}")
70    bb.build.exec_func("buildinfo", d)
71}
72
73python buildinfo_sdk () {
74    d.setVar("BUILDINFODEST", "${SDK_OUTPUT}/${SDKPATH}")
75    d.setVar("IMAGE_BUILDINFO_FILE", d.getVar("SDK_BUILDINFO_FILE"))
76    bb.build.exec_func("buildinfo", d)
77}
78
79IMAGE_PREPROCESS_COMMAND += "buildinfo_image"
80POPULATE_SDK_PRE_TARGET_COMMAND += "buildinfo_sdk"
81
82