xref: /OK3568_Linux_fs/yocto/poky/meta/classes/image-buildinfo.bbclass (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun#
2*4882a593Smuzhiyun# Writes build information to target filesystem on /etc/build
3*4882a593Smuzhiyun#
4*4882a593Smuzhiyun# Copyright (C) 2014 Intel Corporation
5*4882a593Smuzhiyun# Author: Alejandro Enedino Hernandez Samaniego <alejandro.hernandez@intel.com>
6*4882a593Smuzhiyun#
7*4882a593Smuzhiyun# Licensed under the MIT license, see COPYING.MIT for details
8*4882a593Smuzhiyun#
9*4882a593Smuzhiyun# Usage: add INHERIT += "image-buildinfo" to your conf file
10*4882a593Smuzhiyun#
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun# Desired variables to display
13*4882a593SmuzhiyunIMAGE_BUILDINFO_VARS ?= "DISTRO DISTRO_VERSION"
14*4882a593Smuzhiyun
15*4882a593Smuzhiyun# Desired location of the output file in the image.
16*4882a593SmuzhiyunIMAGE_BUILDINFO_FILE ??= "${sysconfdir}/build"
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun# From buildhistory.bbclass
19*4882a593Smuzhiyundef image_buildinfo_outputvars(vars, d):
20*4882a593Smuzhiyun    vars = vars.split()
21*4882a593Smuzhiyun    ret = ""
22*4882a593Smuzhiyun    for var in vars:
23*4882a593Smuzhiyun        value = d.getVar(var) or ""
24*4882a593Smuzhiyun        if (d.getVarFlag(var, 'type') == "list"):
25*4882a593Smuzhiyun            value = oe.utils.squashspaces(value)
26*4882a593Smuzhiyun        ret += "%s = %s\n" % (var, value)
27*4882a593Smuzhiyun    return ret.rstrip('\n')
28*4882a593Smuzhiyun
29*4882a593Smuzhiyun# Gets git branch's status (clean or dirty)
30*4882a593Smuzhiyundef get_layer_git_status(path):
31*4882a593Smuzhiyun    import subprocess
32*4882a593Smuzhiyun    try:
33*4882a593Smuzhiyun        subprocess.check_output("""cd %s; export PSEUDO_UNLOAD=1; set -e;
34*4882a593Smuzhiyun                                git diff --quiet --no-ext-diff
35*4882a593Smuzhiyun                                git diff --quiet --no-ext-diff --cached""" % path,
36*4882a593Smuzhiyun                                shell=True,
37*4882a593Smuzhiyun                                stderr=subprocess.STDOUT)
38*4882a593Smuzhiyun        return ""
39*4882a593Smuzhiyun    except subprocess.CalledProcessError as ex:
40*4882a593Smuzhiyun        # Silently treat errors as "modified", without checking for the
41*4882a593Smuzhiyun        # (expected) return code 1 in a modified git repo. For example, we get
42*4882a593Smuzhiyun        # output and a 129 return code when a layer isn't a git repo at all.
43*4882a593Smuzhiyun        return "-- modified"
44*4882a593Smuzhiyun
45*4882a593Smuzhiyun# Returns layer revisions along with their respective status
46*4882a593Smuzhiyundef get_layer_revs(d):
47*4882a593Smuzhiyun    layers = (d.getVar("BBLAYERS") or "").split()
48*4882a593Smuzhiyun    medadata_revs = ["%-17s = %s:%s %s" % (os.path.basename(i), \
49*4882a593Smuzhiyun        base_get_metadata_git_branch(i, None).strip(), \
50*4882a593Smuzhiyun        base_get_metadata_git_revision(i, None), \
51*4882a593Smuzhiyun        get_layer_git_status(i)) \
52*4882a593Smuzhiyun            for i in layers]
53*4882a593Smuzhiyun    return '\n'.join(medadata_revs)
54*4882a593Smuzhiyun
55*4882a593Smuzhiyundef buildinfo_target(d):
56*4882a593Smuzhiyun        # Get context
57*4882a593Smuzhiyun        if d.getVar('BB_WORKERCONTEXT') != '1':
58*4882a593Smuzhiyun                return ""
59*4882a593Smuzhiyun        # Single and list variables to be read
60*4882a593Smuzhiyun        vars = (d.getVar("IMAGE_BUILDINFO_VARS") or "")
61*4882a593Smuzhiyun        return image_buildinfo_outputvars(vars, d)
62*4882a593Smuzhiyun
63*4882a593Smuzhiyun# Write build information to target filesystem
64*4882a593Smuzhiyunpython buildinfo () {
65*4882a593Smuzhiyun    if not d.getVar('IMAGE_BUILDINFO_FILE'):
66*4882a593Smuzhiyun        return
67*4882a593Smuzhiyun    with open(d.expand('${IMAGE_ROOTFS}${IMAGE_BUILDINFO_FILE}'), 'w') as build:
68*4882a593Smuzhiyun        build.writelines((
69*4882a593Smuzhiyun            '''-----------------------
70*4882a593SmuzhiyunBuild Configuration:  |
71*4882a593Smuzhiyun-----------------------
72*4882a593Smuzhiyun''',
73*4882a593Smuzhiyun            buildinfo_target(d),
74*4882a593Smuzhiyun            '''
75*4882a593Smuzhiyun-----------------------
76*4882a593SmuzhiyunLayer Revisions:      |
77*4882a593Smuzhiyun-----------------------
78*4882a593Smuzhiyun''',
79*4882a593Smuzhiyun            get_layer_revs(d),
80*4882a593Smuzhiyun            '''
81*4882a593Smuzhiyun'''
82*4882a593Smuzhiyun       ))
83*4882a593Smuzhiyun}
84*4882a593Smuzhiyun
85*4882a593SmuzhiyunIMAGE_PREPROCESS_COMMAND += "buildinfo;"
86