Patchwork buildstats-summary.bbclass: Import useful bbclass from meta-mentor

login
register
mail settings
Submitter Martin Jansa
Date June 6, 2014, 7:27 p.m.
Message ID <1402082874-12187-1-git-send-email-Martin.Jansa@gmail.com>
Download mbox | patch
Permalink /patch/73455/
State New
Headers show

Comments

Martin Jansa - June 6, 2014, 7:27 p.m.
Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com>
---
 meta/classes/buildstats-summary.bbclass | 43 +++++++++++++++++++++++++++++++++
 1 file changed, 43 insertions(+)
 create mode 100644 meta/classes/buildstats-summary.bbclass
Chris Larson - June 11, 2014, 8:54 p.m.
On Fri, Jun 6, 2014 at 12:27 PM, Martin Jansa <martin.jansa@gmail.com>
wrote:

> Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com>
> ---
>  meta/classes/buildstats-summary.bbclass | 43
> +++++++++++++++++++++++++++++++++
>  1 file changed, 43 insertions(+)
>  create mode 100644 meta/classes/buildstats-summary.bbclass
>
> diff --git a/meta/classes/buildstats-summary.bbclass b/meta/classes/
> buildstats-summary.bbclass
> new file mode 100644
> index 0000000..3c02724
> --- /dev/null
> +++ b/meta/classes/buildstats-summary.bbclass
> @@ -0,0 +1,43 @@
> +# Imported from meta-mentor
> +# http://git.yoctoproject.org/cgit/cgit.cgi/meta-mentor/log/classes/
> buildstats-summary.bbclass
> +# with following modifications
> +# 1) when both setscene and normal tasks were executed, count it as
> no_sstate
> +# 2) count do_populate_sysroot and do_packagedata tasks, because often we
> invalidate only runtime deps
>

Looks like useful improvements, nicely done. Have you thought about not
hardcoding the task list, if we're going to display it this way? See
https://gist.github.com/kergoth/2519927f59712282e9e8 for a version which
obeys SSTATETASKS.
Martin Jansa - June 11, 2014, 9:24 p.m.
On Wed, Jun 11, 2014 at 01:54:38PM -0700, Christopher Larson wrote:
> On Fri, Jun 6, 2014 at 12:27 PM, Martin Jansa <martin.jansa@gmail.com>
> wrote:
> 
> > Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com>
> > ---
> >  meta/classes/buildstats-summary.bbclass | 43
> > +++++++++++++++++++++++++++++++++
> >  1 file changed, 43 insertions(+)
> >  create mode 100644 meta/classes/buildstats-summary.bbclass
> >
> > diff --git a/meta/classes/buildstats-summary.bbclass b/meta/classes/
> > buildstats-summary.bbclass
> > new file mode 100644
> > index 0000000..3c02724
> > --- /dev/null
> > +++ b/meta/classes/buildstats-summary.bbclass
> > @@ -0,0 +1,43 @@
> > +# Imported from meta-mentor
> > +# http://git.yoctoproject.org/cgit/cgit.cgi/meta-mentor/log/classes/
> > buildstats-summary.bbclass
> > +# with following modifications
> > +# 1) when both setscene and normal tasks were executed, count it as
> > no_sstate
> > +# 2) count do_populate_sysroot and do_packagedata tasks, because often we
> > invalidate only runtime deps
> >
> 
> Looks like useful improvements, nicely done. Have you thought about not
> hardcoding the task list, if we're going to display it this way? See
> https://gist.github.com/kergoth/2519927f59712282e9e8 for a version which
> obeys SSTATETASKS.

I'm fine with your version showing all SSTATETASKS, would you mind
sending PATCHv2 with your modification or should I?

I've hardcoded packagedata only because it was typical case when I was
wondering why the build took so long even with populate_sysroot reused
from sstate (e.g. after some package.bbclass change), but showing all
doesn't hurt.

Patch

diff --git a/meta/classes/buildstats-summary.bbclass b/meta/classes/buildstats-summary.bbclass
new file mode 100644
index 0000000..3c02724
--- /dev/null
+++ b/meta/classes/buildstats-summary.bbclass
@@ -0,0 +1,43 @@ 
+# Imported from meta-mentor
+# http://git.yoctoproject.org/cgit/cgit.cgi/meta-mentor/log/classes/buildstats-summary.bbclass
+# with following modifications
+# 1) when both setscene and normal tasks were executed, count it as no_sstate
+# 2) count do_populate_sysroot and do_packagedata tasks, because often we invalidate only runtime deps
+
+python buildstats_summary () {
+    if not isinstance(e, bb.event.BuildCompleted):
+        return
+
+    import os.path
+
+    bn = get_bn(e)
+    bsdir = os.path.join(e.data.getVar('BUILDSTATS_BASE', True), bn)
+    if not os.path.exists(bsdir):
+        return
+
+    sstate_ps, no_sstate_ps, sstate_pd, no_sstate_pd = set(), set(), 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)
+        if 'do_populate_sysroot' in tasks:
+            no_sstate_ps.add(pf)
+        elif 'do_populate_sysroot_setscene' in tasks:
+            sstate_ps.add(pf)
+        if 'do_packagedata' in tasks:
+            no_sstate_pd.add(pf)
+        elif 'do_packagedata_setscene' in tasks:
+            sstate_pd.add(pf)
+
+    if not sstate_ps and not no_sstate_ps and not sstate_pd and not no_sstate_pd:
+        return
+
+    bb.note("Build completion summary:")
+    if (len(sstate_ps)+len(no_sstate_ps)) > 0:
+        bb.note("  populate_sysroot reused from sstate in %d%% (%d setscene, %d scratch)" % (100*len(sstate_ps)/(len(sstate_ps)+len(no_sstate_ps)), len(sstate_ps), len(no_sstate_ps)))
+    if (len(sstate_pd)+len(no_sstate_pd)) > 0:
+        bb.note("  packagedata reused from sstate in %d%% (%d setscene, %d scratch)" % (100*len(sstate_pd)/(len(sstate_pd)+len(no_sstate_pd)), len(sstate_ps), len(no_sstate_ps)))
+}
+addhandler buildstats_summary