# Summarize sstate usage at the end of the build 
 | 
python buildstats_summary () { 
 | 
    import collections 
 | 
    import os.path 
 | 
  
 | 
    bsdir = e.data.expand("${BUILDSTATS_BASE}/${BUILDNAME}") 
 | 
    if not os.path.exists(bsdir): 
 | 
        return 
 | 
  
 | 
    sstatetasks = (e.data.getVar('SSTATETASKS') or '').split() 
 | 
    built = collections.defaultdict(lambda: [set(), set()]) 
 | 
    for pf in os.listdir(bsdir): 
 | 
        taskdir = os.path.join(bsdir, pf) 
 | 
        if not os.path.isdir(taskdir): 
 | 
            continue 
 | 
  
 | 
        tasks = os.listdir(taskdir) 
 | 
        for t in sstatetasks: 
 | 
            no_sstate, sstate = built[t] 
 | 
            if t in tasks: 
 | 
                no_sstate.add(pf) 
 | 
            elif t + '_setscene' in tasks: 
 | 
                sstate.add(pf) 
 | 
  
 | 
    header_printed = False 
 | 
    for t in sstatetasks: 
 | 
        no_sstate, sstate = built[t] 
 | 
        if no_sstate | sstate: 
 | 
            if not header_printed: 
 | 
                header_printed = True 
 | 
                bb.note("Build completion summary:") 
 | 
  
 | 
            sstate_count = len(sstate) 
 | 
            no_sstate_count = len(no_sstate) 
 | 
            total_count = sstate_count + no_sstate_count 
 | 
            bb.note("  {0}: {1:.1f}% sstate reuse({2} setscene, {3} scratch)".format( 
 | 
                t, round(100 * sstate_count / total_count, 1), sstate_count, no_sstate_count)) 
 | 
} 
 | 
addhandler buildstats_summary 
 | 
buildstats_summary[eventmask] = "bb.event.BuildCompleted" 
 |