Having do_rm_work depend on do_build had one major disadvantage: do_build depends on the do_build of other recipes, to ensure that runtime dependencies also get built. The effect is that when work on a recipe is complete and it could get cleaned up, do_rm_work still doesn't run because it waits for those other recipes, thus leading to more temporary disk space usage than really needed.
The right solution is to inject do_rm_work before do_build and after all tasks of the recipe. Achieving that depends on the new bitbake support for prioritizing anonymous functions to ensure that rm_work.bbclass gets to see a full set of existing tasks when adding its own one. This is relevant, for example, for do_analyseimage in meta-security-isafw's isafw.bbclass. In addition, the new "rm_work" scheduler is used by default. It prioritizes finishing recipes over continuing with the more important recipes (with "importance" determined by the number of reverse-dependencies). Benchmarking (see "rm_work + pybootchart enhancements" on the OE-core mailing list) showed that builds with the modified rm_work.bbclass were both faster (albeit not by much) and required considerably less disk space (14230MiB instead of 18740MiB for core-image-sato). Interestingly enough, builds with rm_work.bbclass were also faster than those without. Signed-off-by: Patrick Ohly <patrick.o...@intel.com> --- meta/classes/rm_work.bbclass | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/meta/classes/rm_work.bbclass b/meta/classes/rm_work.bbclass index 3516c7e..1205104 100644 --- a/meta/classes/rm_work.bbclass +++ b/meta/classes/rm_work.bbclass @@ -11,16 +11,13 @@ # RM_WORK_EXCLUDE += "icu-native icu busybox" # -# Use the completion scheduler by default when rm_work is active +# Use the dedicated rm_work scheduler by default when rm_work is active # to try and reduce disk usage -BB_SCHEDULER ?= "completion" +BB_SCHEDULER ?= "rm_work" # Run the rm_work task in the idle scheduling class BB_TASK_IONICE_LEVEL_task-rm_work = "3.0" -RMWORK_ORIG_TASK := "${BB_DEFAULT_TASK}" -BB_DEFAULT_TASK = "rm_work_all" - do_rm_work () { # If the recipe name is in the RM_WORK_EXCLUDE, skip the recipe. for p in ${RM_WORK_EXCLUDE}; do @@ -97,13 +94,6 @@ do_rm_work () { rm -f $i done } -addtask rm_work after do_${RMWORK_ORIG_TASK} - -do_rm_work_all () { - : -} -do_rm_work_all[recrdeptask] = "do_rm_work" -addtask rm_work_all after do_rm_work do_populate_sdk[postfuncs] += "rm_work_populatesdk" rm_work_populatesdk () { @@ -117,7 +107,7 @@ rm_work_rootfs () { } rm_work_rootfs[cleandirs] = "${WORKDIR}/rootfs" -python () { +python __anonymous_rm_work() { if bb.data.inherits_class('kernel', d): d.appendVar("RM_WORK_EXCLUDE", ' ' + d.getVar("PN")) # If the recipe name is in the RM_WORK_EXCLUDE, skip the recipe. @@ -126,4 +116,19 @@ python () { if pn in excludes: d.delVarFlag('rm_work_rootfs', 'cleandirs') d.delVarFlag('rm_work_populatesdk', 'cleandirs') + else: + # Inject do_rm_work into the tasks of the current recipe such that do_build + # depends on it and that it runs after all other tasks that block do_build, + # i.e. after all work on the current recipe is done. The reason for taking + # this approach instead of making do_rm_work depend on do_build is that + # do_build inherits additional runtime dependencies on + # other recipes and thus will typically run much later than completion of + # work in the recipe itself. + deps = bb.build.preceedtask('do_build', True, d) + if 'do_build' in deps: + deps.remove('do_build') + bb.build.addtask('do_rm_work', 'do_build', ' '.join(deps), d) } +# Higher priority than the normal 100, and thus we run after other +# classes like package_rpm.bbclass which also add custom tasks. +__anonymous_rm_work[__anonprio] = "1000" -- 2.1.4 -- _______________________________________________ Openembedded-core mailing list Openembedded-core@lists.openembedded.org http://lists.openembedded.org/mailman/listinfo/openembedded-core