From 2ff22490aa65df2fe895f3ea3b0c3e7e674243da Mon Sep 17 00:00:00 2001 From: Hongxu Jia Date: Mon, 5 Aug 2013 19:42:09 +0800 Subject: list-packageconfig-flags.py: add a script to list all PACKAGECONFIG flags - This script will list available pkgs which have PACKAGECONFIG flags. - If option '-f' is used, it will list available PACKAGECONFIG flags and all affected pkgs. - If option '-a' is used, it will list all pkgs and PACKAGECONFIG information - If option '-p' is used, it means list the pkgs with preferred version EXAMPLE: list-packageconfig-flags.py PACKAGE NAME PACKAGECONFIG FLAGS ============================================================== alsa-tools-1.0.26.1 defaultval gtk+ avahi-ui-0.6.31 defaultval python bluez4-4.101 alsa defaultval pie list-packageconfig-flags.py -f PACKAGECONFIG FLAG PACKAGE NAMES ==================================== 3g connman-1.16 avahi cups-1.6.3 pulseaudio-4.0 beecrypt rpm-5.4.9 rpm-native-5.4.9 list-packageconfig-flags.py -a ================================================== gtk+-2.24.18 /home/jiahongxu/yocto/poky/meta/recipes-gnome/gtk+/gtk+_2.24.18.bb PACKAGECONFIG x11 PACKAGECONFIG[x11] --with-x=yes --with-gdktarget=x11,--with-x=no,${X11DEPENDS} xf86-video-intel-2.21.9 /home/jiahongxu/yocto/poky/meta/recipes-graphics/xorg-driver/xf86-video-intel_2.21.9.bb PACKAGECONFIG None PACKAGECONFIG[xvmc] --enable-xvmc,--disable-xvmc,libxvmc PACKAGECONFIG[sna] --enable-sna,--disable-sna [YOCTO #4368] (From OE-Core rev: 8d9e55e1fb073820c959f1797f3ad5a8932b441b) Signed-off-by: Hongxu Jia Signed-off-by: Saul Wold Signed-off-by: Richard Purdie --- scripts/contrib/list-packageconfig-flags.py | 191 ++++++++++++++++++++++++++++ 1 file changed, 191 insertions(+) create mode 100755 scripts/contrib/list-packageconfig-flags.py (limited to 'scripts') diff --git a/scripts/contrib/list-packageconfig-flags.py b/scripts/contrib/list-packageconfig-flags.py new file mode 100755 index 0000000..149922d --- /dev/null +++ b/scripts/contrib/list-packageconfig-flags.py @@ -0,0 +1,191 @@ +#!/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 available pkgs which have PACKAGECONFIG flags +# - list available PACKAGECONFIG flags and all affected pkgs +# - list all pkgs and PACKAGECONFIG information + +import sys +import getopt +import os + +# For importing the following modules +sys.path.insert(0, os.path.join(os.path.abspath(os.path.dirname(sys.argv[0])), '../../bitbake/lib')) +import bb.cache +import bb.cooker +import bb.providers +import bb.tinfoil + +usage_body = ''' list available pkgs which have PACKAGECONFIG flags + +OPTION: + -h, --help display this help and exit + -f, --flag list available PACKAGECONFIG flags and all affected pkgs + -a, --all list all pkgs and PACKAGECONFIG information + -p, --prefer list pkgs with preferred version + +EXAMPLE: +list-packageconfig-flags.py poky/meta poky/meta-yocto +list-packageconfig-flags.py -f poky/meta poky/meta-yocto +list-packageconfig-flags.py -a poky/meta poky/meta-yocto +list-packageconfig-flags.py -p poky/meta poky/meta-yocto +list-packageconfig-flags.py -f -p poky/meta poky/meta-yocto +list-packageconfig-flags.py -a -p poky/meta poky/meta-yocto +''' + +def usage(): + print 'Usage: %s [-f|-a] [-p]' % os.path.basename(sys.argv[0]) + print usage_body + +def get_fnlist(bbhandler, pkg_pn, preferred): + ''' Get all recipe file names ''' + if preferred: + (latest_versions, preferred_versions) = bb.providers.findProviders(bbhandler.config_data, bbhandler.cooker.recipecache, pkg_pn) + + fn_list = [] + for pn in sorted(pkg_pn): + if preferred: + fn_list.append(preferred_versions[pn][1]) + else: + fn_list.extend(pkg_pn[pn]) + + return fn_list + +def get_recipesdata(bbhandler, preferred): + ''' Get data of all available recipes which have PACKAGECONFIG flags ''' + pkg_pn = bbhandler.cooker.recipecache.pkg_pn + + data_dict = {} + for fn in get_fnlist(bbhandler, pkg_pn, preferred): + data = bb.cache.Cache.loadDataFull(fn, bbhandler.cooker.collection.get_file_appends(fn), bbhandler.config_data) + if data.getVarFlags("PACKAGECONFIG"): + data_dict[fn] = data + + return data_dict + +def collect_pkgs(data_dict): + ''' Collect available pkgs in which have PACKAGECONFIG flags ''' + # pkg_dict = {'pkg1': ['flag1', 'flag2',...]} + pkg_dict = {} + for fn in data_dict: + pkgconfigflags = data_dict[fn].getVarFlags("PACKAGECONFIG") + pkgname = data_dict[fn].getVar("P", True) + pkg_dict[pkgname] = sorted(pkgconfigflags.keys()) + + return pkg_dict + +def collect_flags(pkg_dict): + ''' Collect available PACKAGECONFIG flags and all affected pkgs ''' + # flag_dict = {'flag': ['pkg1', 'pkg2',...]} + flag_dict = {} + for pkgname, flaglist in pkg_dict.iteritems(): + for flag in flaglist: + if flag == "defaultval": + continue + + if flag in flag_dict: + flag_dict[flag].append(pkgname) + else: + flag_dict[flag] = [pkgname] + + return flag_dict + +def display_pkgs(pkg_dict): + ''' Display available pkgs which have PACKAGECONFIG flags ''' + pkgname_len = len("PACKAGE NAME") + 1 + for pkgname in pkg_dict: + if pkgname_len < len(pkgname): + pkgname_len = len(pkgname) + pkgname_len += 1 + + header = '%-*s%s' % (pkgname_len, str("PACKAGE NAME"), str("PACKAGECONFIG FLAGS")) + print header + print str("").ljust(len(header), '=') + for pkgname in sorted(pkg_dict): + print('%-*s%s' % (pkgname_len, pkgname, ' '.join(pkg_dict[pkgname]))) + + +def display_flags(flag_dict): + ''' Display available PACKAGECONFIG flags and all affected pkgs ''' + flag_len = len("PACKAGECONFIG FLAG") + 5 + + header = '%-*s%s' % (flag_len, str("PACKAGECONFIG FLAG"), str("PACKAGE NAMES")) + print header + print str("").ljust(len(header), '=') + + for flag in sorted(flag_dict): + print('%-*s%s' % (flag_len, flag, ' '.join(sorted(flag_dict[flag])))) + +def display_all(data_dict): + ''' Display all pkgs and PACKAGECONFIG information ''' + print str("").ljust(50, '=') + for fn in data_dict: + print('%s' % data_dict[fn].getVar("P", True)) + print fn + packageconfig = data_dict[fn].getVar("PACKAGECONFIG", True) or '' + if packageconfig.strip() == '': + packageconfig = 'None' + print('PACKAGECONFIG %s' % packageconfig) + + for flag,flag_val in data_dict[fn].getVarFlags("PACKAGECONFIG").iteritems(): + if flag == "defaultval": + continue + print('PACKAGECONFIG[%s] %s' % (flag, flag_val)) + print '' + +def main(): + listtype = 'pkgs' + preferred = False + pkg_dict = {} + flag_dict = {} + + # Collect and validate input + try: + opts, args = getopt.getopt(sys.argv[1:], "hfap", ["help", "flag", "all", "prefer"]) + 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' + elif opt in ('-a', '--all'): + listtype = 'all' + elif opt in ('-p', '--prefer'): + preferred = True + else: + assert False, "unhandled option" + + bbhandler = bb.tinfoil.Tinfoil() + bbhandler.prepare() + data_dict = get_recipesdata(bbhandler, preferred) + + if listtype == 'flags': + pkg_dict = collect_pkgs(data_dict) + flag_dict = collect_flags(pkg_dict) + display_flags(flag_dict) + elif listtype == 'pkgs': + pkg_dict = collect_pkgs(data_dict) + display_pkgs(pkg_dict) + elif listtype == 'all': + display_all(data_dict) + +if __name__ == "__main__": + main() -- cgit v1.1