Openembedded Core Discussions
 help / color / mirror / Atom feed
* [PATCH V2 0/1] list-packageconfig-flag.py: add a script to list all PACKAGECONFIG's flags
@ 2013-08-02  2:20 Hongxu Jia
  2013-08-02  2:20 ` [PATCH 1/1] " Hongxu Jia
  0 siblings, 1 reply; 2+ messages in thread
From: Hongxu Jia @ 2013-08-02  2:20 UTC (permalink / raw)
  To: openembedded-core

Change in V2: PACKAGECONFIG's flag added in class could be parsed.

Usage: list-packageconfig-flag.py [OPTION] [METADIR]...
  list recipes which have PACKAGECONFIG's flags in METADIR

OPTION:
  -h, --help  display this help and exit
  -f, --flag  list PACKAGECONFIG's flags and all affected recipes in METADIR

EXAMPLE:
list-packageconfig-flag.py poky/meta poky/meta-yocto
RECIPE NAME          PACKAGECONFIG's flag
=========================================
libarchive_2.8.5.bb  acl xattr largefile zlib bz2 xz openssl libxml2 expat
strace_4.8.bb        libaio acl
connman.inc          wifi bluetooth 3g tist openvpn vpnc l2tp pptp wispr

list-packageconfig-flag.py -f poky/meta poky/meta-yocto
PACKAGECONFIG's flag     RECIPE NAME
====================================
speex                    gstreamer1.0-plugins-good.inc
keyutils                 rpm_5.4.9.bb
gallium-egl              mesa.inc

//Hongxu
The following changes since commit 67864ca79da08df752487a3a4e1a975546da123d:

  systemd: Remove systemd_unitdir if systemd is not in distro features (2013-07-24 11:35:39 +0100)

are available in the git repository at:

  git://git.pokylinux.org/poky-contrib hongxu/list-pkgconfigflag
  http://git.pokylinux.org/cgit.cgi/poky-contrib/log/?h=hongxu/list-pkgconfigflag

Hongxu Jia (1):
  list-packageconfig-flag.py: add a script to list all PACKAGECONFIG's
    flags

 scripts/contrib/list-packageconfig-flag.py | 180 +++++++++++++++++++++++++++++
 1 file changed, 180 insertions(+)
 create mode 100755 scripts/contrib/list-packageconfig-flag.py

-- 
1.8.1.2



^ permalink raw reply	[flat|nested] 2+ messages in thread

* [PATCH 1/1] list-packageconfig-flag.py: add a script to list all PACKAGECONFIG's flags
  2013-08-02  2:20 [PATCH V2 0/1] list-packageconfig-flag.py: add a script to list all PACKAGECONFIG's flags Hongxu Jia
@ 2013-08-02  2:20 ` Hongxu Jia
  0 siblings, 0 replies; 2+ messages in thread
From: Hongxu Jia @ 2013-08-02  2:20 UTC (permalink / raw)
  To: openembedded-core

list-packageconfig-flag.py will walk the METADIR and collect recipes which
have PACKAGECONFIG's flags.

The default display is to list recipes which have PACKAGECONFIG's flags in
METADIR. If option '-f' is used, it will list PACKAGECONFIG's flags and all
affected recipes in METADIR

EXAMPLE:
list-packageconfig-flag.py poky/meta poky/meta-yocto
RECIPE NAME          PACKAGECONFIG's flag
=========================================
libarchive_2.8.5.bb  acl xattr largefile zlib bz2 xz openssl libxml2 expat
strace_4.8.bb        libaio acl
connman.inc          wifi bluetooth 3g tist openvpn vpnc l2tp pptp wispr

list-packageconfig-flag.py -f poky/meta poky/meta-yocto
PACKAGECONFIG's flag     RECIPE NAME
====================================
speex                    gstreamer1.0-plugins-good.inc
keyutils                 rpm_5.4.9.bb
gallium-egl              mesa.inc

[YOCTO #4368]

Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
---
 scripts/contrib/list-packageconfig-flag.py | 180 +++++++++++++++++++++++++++++
 1 file changed, 180 insertions(+)
 create mode 100755 scripts/contrib/list-packageconfig-flag.py

diff --git a/scripts/contrib/list-packageconfig-flag.py b/scripts/contrib/list-packageconfig-flag.py
new file mode 100755
index 0000000..dbf40b7
--- /dev/null
+++ b/scripts/contrib/list-packageconfig-flag.py
@@ -0,0 +1,180 @@
+#!/usr/bin/env python
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# 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.
+#
+# Copyright (C) 2013 Wind River Systems, Inc.
+#
+# list recipes which have PACKAGECONFIG's flags in METADIR
+# list PACKAGECONFIG's flags and all affected recipes in METADIR
+#
+
+import sys
+import getopt
+import os
+import re
+
+usage_body = '''  list recipes which have PACKAGECONFIG's flags in METADIR
+
+OPTION:
+  -h, --help  display this help and exit
+  -f, --flag  list PACKAGECONFIG's flags and all affected recipes in METADIR
+
+EXAMPLE:
+list-packageconfig-flag.py poky/meta poky/meta-yocto
+list-packageconfig-flag.py -f poky/meta poky/meta-yocto
+'''
+
+def usage():
+    print 'Usage: %s [OPTION] [METADIR]...' % os.path.basename(sys.argv[0])
+    print usage_body
+
+def parse_recipe(recipe):
+    ''' Parse a recipe to collect PACKAGECONFIG's flags '''
+    prog = re.compile(r' *PACKAGECONFIG\[(?P<flag>.*)\] *=.*')
+    try:
+        r = open(recipe)
+    except IOError as (errno, strerror):
+        print >> sys.stderr, 'WARNING: Failed to open recipe', recipe
+
+    flaglist = []
+    for line in r:
+        # Strip any comments from the line
+        line = line.rsplit('#')[0]
+        m = prog.match(line)
+        if m:
+            flaglist.append(m.group('flag'))
+    r.close()
+
+    return flaglist
+
+def process_recipes(metadir):
+    ''' Collect recipes which have PACKAGECONFIG's flags in METADIR '''
+    # recipesdict = {'recipe': ['flag1', 'flag2',...]}
+    recipesdict = {}
+    for root,dirs,files in os.walk(metadir):
+        for name in files:
+            if name.find(".bb") >= 0 or name.find(".inc") >= 0 or name.find(".bbclass") >= 0:
+                flaglist = parse_recipe(os.path.join(root,name))
+                if flaglist:
+                    recipesdict[name] = flaglist
+
+    return recipesdict
+
+def collect_flags(recipesdict):
+    ''' Collect PACKAGECONFIG's flags and all affected recipes in recipesdict '''
+    # flagsdict = {'flag': ['recipe1', 'recipe2',...]}
+    flagsdict = {}
+    for recipename,flaglist in recipesdict.iteritems():
+        for flag in flaglist:
+            if flag in flagsdict:
+                flagsdict[flag].append(recipename)
+            else:
+                flagsdict[flag] = [recipename]
+
+    return flagsdict
+
+def display_recipes(recipesdict):
+    ''' Display recipes which have PACKAGECONFIG's flags in recipesdict '''
+    recipename_len = len("RECIPE NAME") + 1
+    for recipename in recipesdict:
+        if recipename_len < len(recipename):
+            recipename_len = len(recipename)
+    recipename_len += 1
+
+    header = '%-*s%s' % (recipename_len, str("RECIPE NAME"), str("PACKAGECONFIG's flag"))
+    print header
+    print str("").ljust(len(header), '=')
+    for recipename, flaglist in recipesdict.iteritems():
+        print('%-*s%s' % (recipename_len, recipename, ' '.join(flaglist)))
+
+
+def display_flags(flagsdict):
+    ''' Display PACKAGECONFIG's flags and all affected recipes in flagsdict '''
+    flag_len = len("PACKAGECONFIG's flag") + 5
+
+    header = '%-*s%s' % (flag_len, str("PACKAGECONFIG's flag"), str("RECIPE NAME"))
+    print header
+    print str("").ljust(len(header), '=')
+
+    for flag in flagsdict:
+        print('%-*s%s' % (flag_len, flag, '  '.join(flagsdict[flag])))
+
+def filter_subdirs(dirlist):
+    '''Filter out subdirs in dirlist'''
+    def dir_is_subdir(dir, dirlist):
+        for curdir in dirlist:
+            dirs = dir.split('/')
+            curdirs = curdir.split('/')
+            curdirsdepth = len(curdirs)
+            if curdirsdepth < len(dirs):
+                if dirs[:curdirsdepth] == curdirs[:curdirsdepth]:
+                    return True
+        return False
+
+    for curdir in dirlist[:]:
+        if dir_is_subdir(curdir, dirlist):
+            dirlist.remove(curdir)
+
+def main():
+    metadirs = []
+    listtype = 'recipes'
+    recipesdict = {}
+    flagsdict = {}
+
+    # Collect and validate input
+    try:
+        opts, args = getopt.getopt(sys.argv[1:], "hf", ["help", "flag"])
+    except getopt.GetoptError, err:
+        print >> sys.stderr,'%s' % str(err)
+        usage()
+        sys.exit(2)
+    for opt, value in opts:
+        if opt in ('-h', '--help'):
+            usage()
+            sys.exit(0)
+        elif opt in ('-f', '--flag'):
+            listtype = 'flags'
+        else:
+            assert False, "unhandled option"
+
+    for metadir in args:
+        if os.path.isdir(metadir):
+            metadir = os.path.abspath(metadir)
+            if metadir not in metadirs:
+                metadirs.append(metadir)
+        else:
+            print >> sys.stderr, 'ERROR: meta directory \'%s\' is not a directory' % (metadir)
+            sys.exit(3)
+
+    if len(metadirs) == 0:
+        print >> sys.stderr, 'ERROR: no metadir specified'
+        usage()
+        sys.exit(4)
+    else:
+        # Filter out subdirs to save time
+        filter_subdirs(metadirs)
+
+    # Collect recipes which have PACKAGECONFIG's flags in metadirs
+    for metadir in metadirs:
+        recipesdict.update(process_recipes(metadir))
+
+    if listtype == 'flags':
+        # Collect PACKAGECONFIG's flags and all affected recipes in recipesdict
+        flagsdict = collect_flags(recipesdict)
+        display_flags(flagsdict)
+    elif listtype == 'recipes':
+        display_recipes(recipesdict)
+
+if __name__ == "__main__":
+    main()
-- 
1.8.1.2



^ permalink raw reply related	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2013-08-02  2:20 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-08-02  2:20 [PATCH V2 0/1] list-packageconfig-flag.py: add a script to list all PACKAGECONFIG's flags Hongxu Jia
2013-08-02  2:20 ` [PATCH 1/1] " Hongxu Jia

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox