[poky] [PATCH 1/1] cleanup-workdir: add a script to clean up WORKDIR

Richard Purdie richard.purdie at linuxfoundation.org
Tue Mar 13 10:52:45 PDT 2012


On Tue, 2012-03-06 at 14:36 +0800, Kang Kai wrote:
> [Yocto 1561]
> Add script cleanup-workdir to clean up WORKDIR. It checks every
> package build directories under WORKDIR then parse the directory
> name to get package name and version. If the version is not the
> package prefer version then delete the directory.
> 
> Signed-off-by: Kang Kai <kai.kang at windriver.com>
> ---
>  scripts/cleanup-workdir |  147 +++++++++++++++++++++++++++++++++++++++++++++++
>  1 files changed, 147 insertions(+), 0 deletions(-)
>  create mode 100755 scripts/cleanup-workdir
> 
> diff --git a/scripts/cleanup-workdir b/scripts/cleanup-workdir
> new file mode 100755
> index 0000000..5827ff9
> --- /dev/null
> +++ b/scripts/cleanup-workdir
> @@ -0,0 +1,147 @@
> +#!/usr/bin/env python
> +
> +# Copyright (c) 2012 Wind River Systems, Inc.
> +#
> +# This program is free software; you can redistribute it and/or modify
> +# it under the terms of the GNU General Public License version 2 as
> +# published by the Free Software Foundation.
> +#
> +# This program is distributed in the hope that it will be useful,
> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
> +# See the GNU General Public License for more details.
> +#
> +# You should have received a copy of the GNU General Public License
> +# along with this program; if not, write to the Free Software
> +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
> +
> +import os
> +import sys
> +import optparse
> +import re
> +import shutil
> +
> +versions = {}
> +obsolete_dirs = []
> +verfile = '/tmp/bitbake-s.%d' % os.getpid()
> +
> +def err_quit(msg):
> +    print msg
> +    try:
> +        os.remove(verfile)
> +    except:
> +        pass
> +    sys.exit(1)
> +
> +def parse_version(verstr):
> +    elems = verstr.split(':')
> +    epoch = elems[0]
> +    if len(epoch) == 0:
> +        return elems[1]
> +    else:
> +        return epoch + '_' + elems[1]
> +
> +def parse_dir(match, pkgabsdir):
> +    pkg_name = match.group(1)
> +    pkg_version = match.group(2)
> +    if pkg_name in versions:
> +        if pkg_version != versions[pkg_name]:
> +            obsolete_dirs.append(pkgabsdir)
> +        return True
> +    return False
> +
> +def main():
> +    parser = optparse.OptionParser(
> +        usage = """%prog [options] [BUILDDIR]
> +
> +Remove the obsolete packages' build directories in WORKDIR.
> +If BUILDDIR is not appended, current directory is treated as build directory.""")
> +
> +    parser.add_option("-i", "--initenv", help = "The file oe-init-build-env which needs to be sourced before run bitbake",
> +                        action = "store", dest = "envfile", default = None)
> +
> +    options, args = parser.parse_args(sys.argv)
> +
> +    builddir = None
> +    if len(args) > 1:
> +        builddir = args[1]
> +    if not builddir and os.path.exists('tmp/work'):
> +        builddir = os.getcwd()
> +    if not builddir:
> +        err_quit("Current directory is not a valid build directory. Please input a valid build diretory.")
> +
> +    envfile = options.__dict__['envfile']
> +    if not envfile:
> +        envfile = os.path.join(builddir, "../oe-init-build-env")
> +    if not os.path.exists(envfile):
> +        err_quit("Can't find file oe-init-build-env.")
> +
> +    print 'Updating bitbake caches...'
> +    cmd = "source %s . &>/dev/null && bitbake -s > %s " % (envfile, verfile)
> +    ret = os.system(cmd)
> +    if ret != 0:
> +        print "Execute 'bitbake -s' failed. Can't get packages' versions."
> +        return 1
> +
> +    fverfile = open(verfile, 'r')
> +    alllines = fverfile.readlines()
> +    fverfile.close()
> +
> +    alllines = alllines[5:]
> +    for line in alllines:
> +        line = line.strip()
> +        line = re.sub('\s+', ' ', line)
> +        elems = line.split(' ')
> +        if len(elems) == 2:
> +            version = parse_version(elems[1])
> +        else:
> +            version = parse_version(elems[2])
> +        versions[elems[0]] = version
> +
> +    workdir = os.path.join(builddir, 'tmp/work')

This looks reasonable to me but we should ask bitbake what WORKDIR is
rather than hardcode this here.

Otherwise it looks like a reasonable place to start with this.

Cheers,

Richard

> +    for archdir in os.listdir(workdir):
> +        archdir = os.path.join(workdir, archdir)
> +        if not os.path.isdir(archdir):
> +            pass
> +
> +        for pkgdir in sorted(os.listdir(archdir)):
> +            pkgabsdir = os.path.join(archdir, pkgdir)
> +            if not os.path.isdir(pkgabsdir):
> +                pass
> +
> +            # parse the package directory names
> +            # parse native/nativesdk packages first
> +            match = re.match('(.*?-native.*?)-(.*)', pkgdir)
> +            if match and parse_dir(match, pkgabsdir):
> +                continue
> +
> +            # parse package names which ends with numbers such as 'glib-2.0'
> +            match = re.match('(.*?-[\.\d]+)-(\d.*)', pkgdir)
> +            if match and parse_dir(match, pkgabsdir):
> +                continue
> +
> +            # other packages
> +            match = re.match('(.*?)-(\d.*)', pkgdir)
> +            if match and parse_dir(match, pkgabsdir):
> +                continue
> +
> +    for d in obsolete_dirs:
> +        print "Deleleting %s" % d
> +        shutil.rmtree(d, True)
> +    os.remove(verfile)
> +
> +    if len(obsolete_dirs):
> +        print '\nTotal %d items.' % len(obsolete_dirs)
> +    else:
> +        print '\nNo obsolete directory found under %s.' % workdir
> +
> +    return 0
> +
> +if __name__ == '__main__':
> +    try:
> +        ret = main()
> +    except Exception:
> +        ret = 2
> +        import traceback
> +        traceback.print_exc(3)
> +    sys.exit(ret)





More information about the poky mailing list