[oe] [PATCH v2] packaged-staging.bbclass: use 'os.unlink()' instead of spawning 'rm'
Tom Rini
tom_rini at mentor.com
Wed Apr 14 14:52:30 UTC 2010
On Wed, 2010-04-14 at 11:55 +0200, Enrico Scholz wrote:
> Doing a '-c clean' operation on a staged package with very much files
> (e.g. glibc) took several minutes because
>
> * every removed file was reported
> * an 'rm' instance was spawned for every file
>
> This patch uses the native 'os.unlink()' method for removing files and
> reports only the removed root directory instead of the single files.
>
> Based upon maillist discussion, reporting happens with 'debug' level
> instead of 'note' one, and only error conditions due to non-existing
> files will be ignored. Other (e.g. permission denied) errors will now
> abort the build while they were silently ignored previously.
>
> Signed-off-by: Enrico Scholz <enrico.scholz at sigma-chemnitz.de>
Acked-by: Tom Rini <tom_rini at mentor.com>
(Aside: Do you have write access? If not, shoot me a msg off list and
I'll put this in).
> ---
> classes/packaged-staging.bbclass | 23 ++++++++++++++++++-----
> 1 files changed, 18 insertions(+), 5 deletions(-)
>
> diff --git a/classes/packaged-staging.bbclass b/classes/packaged-staging.bbclass
> index 9c72d11..f3648d2 100644
> --- a/classes/packaged-staging.bbclass
> +++ b/classes/packaged-staging.bbclass
> @@ -26,6 +26,16 @@ PSTAGE_NATIVEDEPENDS = "\
>
> BB_STAMP_WHITELIST = "${PSTAGE_NATIVEDEPENDS}"
>
> +def _package_unlink (f):
> + import os, errno
> + try:
> + os.unlink(f)
> + return True
> + except OSError, e:
> + if e.errno == errno.ENOENT:
> + return False
> + raise
> +
> python () {
> pstage_allowed = True
>
> @@ -87,10 +97,10 @@ def pstage_manualclean(srcname, destvarname, d):
> dest = bb.data.getVar(destvarname, d, True)
>
> for walkroot, dirs, files in os.walk(src):
> + bb.debug("rm %s" % walkroot)
> for file in files:
> filepath = os.path.join(walkroot, file).replace(src, dest)
> - bb.note("rm %s" % filepath)
> - os.system("rm %s" % filepath)
> + _package_unlink(filepath)
>
> def pstage_set_pkgmanager(d):
> path = bb.data.getVar("PATH", d, 1)
> @@ -162,6 +172,7 @@ PSTAGE_TASKS_COVERED = "fetch unpack munge patch configure qa_configure rig_loca
> SCENEFUNCS += "packagestage_scenefunc"
>
> python packagestage_scenefunc () {
> + import glob
> if bb.data.getVar("PSTAGING_ACTIVE", d, 1) == "0":
> return
>
> @@ -227,7 +238,9 @@ python packagestage_scenefunc () {
>
> # Remove the stamps and files we added above
> # FIXME - we should really only remove the stamps we added
> - os.system('rm -f ' + stamp + '.*')
> + for fname in glob.glob(stamp + '.*'):
> + _package_unlink(fname)
> +
> os.system(bb.data.expand("rm -rf ${WORKDIR}/tstage", d))
>
> if stageok:
> @@ -260,8 +273,8 @@ python packagedstage_stampfixing_eventhandler() {
> # so we need to remove the autogenerated stamps.
> for task in taskscovered:
> dir = "%s.do_%s" % (e.stampPrefix[fn], task)
> - os.system('rm -f ' + dir)
> - os.system('rm -f ' + stamp)
> + _package_unlink(dir)
> + _package_unlink(stamp)
> }
>
> populate_staging_preamble () {
--
Tom Rini <tom_rini at mentor.com>
Mentor Graphics Corporation
More information about the Openembedded-devel
mailing list