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