1*4882a593Smuzhiyun# Summarize sstate usage at the end of the build 2*4882a593Smuzhiyunpython buildstats_summary () { 3*4882a593Smuzhiyun import collections 4*4882a593Smuzhiyun import os.path 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun bsdir = e.data.expand("${BUILDSTATS_BASE}/${BUILDNAME}") 7*4882a593Smuzhiyun if not os.path.exists(bsdir): 8*4882a593Smuzhiyun return 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun sstatetasks = (e.data.getVar('SSTATETASKS') or '').split() 11*4882a593Smuzhiyun built = collections.defaultdict(lambda: [set(), set()]) 12*4882a593Smuzhiyun for pf in os.listdir(bsdir): 13*4882a593Smuzhiyun taskdir = os.path.join(bsdir, pf) 14*4882a593Smuzhiyun if not os.path.isdir(taskdir): 15*4882a593Smuzhiyun continue 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun tasks = os.listdir(taskdir) 18*4882a593Smuzhiyun for t in sstatetasks: 19*4882a593Smuzhiyun no_sstate, sstate = built[t] 20*4882a593Smuzhiyun if t in tasks: 21*4882a593Smuzhiyun no_sstate.add(pf) 22*4882a593Smuzhiyun elif t + '_setscene' in tasks: 23*4882a593Smuzhiyun sstate.add(pf) 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun header_printed = False 26*4882a593Smuzhiyun for t in sstatetasks: 27*4882a593Smuzhiyun no_sstate, sstate = built[t] 28*4882a593Smuzhiyun if no_sstate | sstate: 29*4882a593Smuzhiyun if not header_printed: 30*4882a593Smuzhiyun header_printed = True 31*4882a593Smuzhiyun bb.note("Build completion summary:") 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun sstate_count = len(sstate) 34*4882a593Smuzhiyun no_sstate_count = len(no_sstate) 35*4882a593Smuzhiyun total_count = sstate_count + no_sstate_count 36*4882a593Smuzhiyun bb.note(" {0}: {1:.1f}% sstate reuse({2} setscene, {3} scratch)".format( 37*4882a593Smuzhiyun t, round(100 * sstate_count / total_count, 1), sstate_count, no_sstate_count)) 38*4882a593Smuzhiyun} 39*4882a593Smuzhiyunaddhandler buildstats_summary 40*4882a593Smuzhiyunbuildstats_summary[eventmask] = "bb.event.BuildCompleted" 41