[bitbake-devel] [PATCH 07/13] lib/bb/main: consolidate UI/server extension listing and loading

Burton, Ross ross.burton at intel.com
Tue Aug 18 09:32:17 UTC 2015


It looks like this is responsible for some autobuilder failures where
bitbake decides to use hob instead of knotty2 and aborts on start up with:

FATAL: Hob requires Gtk+ 2.20.0 or higher, PyGtk 2.21.0 or higher (No
module named gobject).

Ross

On 17 August 2015 at 12:12, Paul Eggleton <paul.eggleton at linux.intel.com>
wrote:

> Provide us with a means of showing the list of UIs / server choices for
> the command line help, and do the processing in one place for both.
>
> Signed-off-by: Paul Eggleton <paul.eggleton at linux.intel.com>
> ---
>  lib/bb/main.py | 78
> ++++++++++++++++++++++++++++++++++++----------------------
>  1 file changed, 48 insertions(+), 30 deletions(-)
>
> diff --git a/lib/bb/main.py b/lib/bb/main.py
> index 4d77408..2b720aa 100755
> --- a/lib/bb/main.py
> +++ b/lib/bb/main.py
> @@ -41,22 +41,45 @@ logger = logging.getLogger("BitBake")
>  class BBMainException(Exception):
>      pass
>
> -def get_ui(config):
> -    if not config.ui:
> -        # modify 'ui' attribute because it is also read by cooker
> -        config.ui = os.environ.get('BITBAKE_UI', 'knotty')
> -
> -    interface = config.ui
> -
> +def list_extension_modules(pkg, checkattr):
> +    """
> +    Lists extension modules in a specific Python package
> +    (e.g. UIs, servers)
> +    Parameters:
> +        pkg: previously imported Python package to list
> +        checkattr: attribute to look for in module to determine if it's
> valid
> +            as the type of extension you are looking for
> +    """
> +    import pkgutil
> +    pkgdir = os.path.dirname(pkg.__file__)
> +
> +    modules = []
> +    for _, modulename, _ in pkgutil.iter_modules([pkgdir]):
> +        if os.path.isdir(os.path.join(pkgdir, modulename)):
> +            # ignore directories
> +            continue
> +        try:
> +            module = __import__(pkg.__name__, fromlist=[modulename])
> +        except ImportError:
> +            # If we can't import it, it's not valid
> +            continue
> +        module_if = getattr(module, modulename)
> +        if getattr(module_if, 'hidden_extension', False):
> +            continue
> +        if not checkattr or hasattr(module_if, checkattr):
> +            modules.append(modulename)
> +    return modules
> +
> +def import_extension_module(pkg, modulename):
>      try:
>          # Dynamically load the UI based on the ui name. Although we
>          # suggest a fixed set this allows you to have flexibility in which
>          # ones are available.
> -        module = __import__("bb.ui", fromlist = [interface])
> -        return getattr(module, interface)
> +        module = __import__(pkg.__name__, fromlist = [modulename])
> +        return getattr(module, modulename)
>      except AttributeError:
> -        raise BBMainException("FATAL: Invalid user interface '%s'
> specified.\n"
> -                 "Valid interfaces: depexp, goggle, ncurses, hob, knotty
> [default]." % interface)
> +        raise BBMainException("FATAL: Unable to import extension module
> %s from %s" % (modulename, pkg.__name__))
> +
>
>
>  # Display bitbake/OE warnings via the BitBake.Warnings logger, ignoring
> others"""
> @@ -146,11 +169,19 @@ class
> BitBakeConfigParameters(cookerdata.ConfigParameters):
>          parser.add_option("-P", "--profile", help = "Profile the command
> and save reports.",
>                     action = "store_true", dest = "profile", default =
> False)
>
> -        parser.add_option("-u", "--ui", help = "The user interface to use
> (e.g. knotty, hob, depexp).",
> -                   action = "store", dest = "ui")
> +        env_ui = os.environ.get('BITBAKE_UI', None)
> +        valid_uis = list_extension_modules(bb.ui, 'main')
> +        default_ui = env_ui or 'knotty'
> +        if env_ui and not env_ui in valid_uis:
> +            raise BBMainException('Invalid UI "%s" specified in
> BITBAKE_UI environment variable - valid choices: %s' % (env_ui, ',
> '.join(valid_uis)))
> +        elif not default_ui in valid_uis:
> +            raise BBMainException('Default UI "%s" could not be found')
> +        parser.add_option("-u", "--ui", help = "The user interface to use
> (%s)." % ', '.join(valid_uis),
> +                   action="store", dest="ui", type="choice",
> choices=valid_uis, default=default_ui)
>
> -        parser.add_option("-t", "--servertype", help = "Choose which
> server to use, process or xmlrpc.",
> -                   action = "store", dest = "servertype")
> +        valid_server_types = list_extension_modules(bb.server,
> 'BitBakeServer')
> +        parser.add_option("-t", "--servertype", help = "Choose which
> server type to use (%s)." % ', '.join(valid_server_types),
> +                   action = "store", dest = "servertype", default =
> "process")
>
>          parser.add_option("", "--token", help = "Specify the connection
> token to be used when connecting to a remote server.",
>                     action = "store", dest = "xmlrpctoken")
> @@ -279,21 +310,8 @@ def bitbake_main(configParams, configuration):
>
>      configuration.setConfigParameters(configParams)
>
> -    ui_module = get_ui(configParams)
> -
> -    # Server type can be xmlrpc or process currently, if nothing is
> specified,
> -    # the default server is process
> -    if configParams.servertype:
> -        server_type = configParams.servertype
> -    else:
> -        server_type = 'process'
> -
> -    try:
> -        module = __import__("bb.server", fromlist = [server_type])
> -        servermodule = getattr(module, server_type)
> -    except AttributeError:
> -        raise BBMainException("FATAL: Invalid server type '%s'
> specified.\n"
> -                              "Valid interfaces: xmlrpc, process
> [default]." % server_type)
> +    ui_module = import_extension_module(bb.ui, configParams.ui)
> +    servermodule = import_extension_module(bb.server,
> configParams.servertype)
>
>      if configParams.server_only:
>          if configParams.servertype != "xmlrpc":
> --
> 2.1.0
>
> --
> _______________________________________________
> bitbake-devel mailing list
> bitbake-devel at lists.openembedded.org
> http://lists.openembedded.org/mailman/listinfo/bitbake-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openembedded.org/pipermail/bitbake-devel/attachments/20150818/fc8c9cb3/attachment-0002.html>


More information about the bitbake-devel mailing list