diff options
| -rwxr-xr-x | bitbake/lib/bb/main.py | 85 |
1 files changed, 54 insertions, 31 deletions
diff --git a/bitbake/lib/bb/main.py b/bitbake/lib/bb/main.py index 4d77408f6a..c98cf444b0 100755 --- a/bitbake/lib/bb/main.py +++ b/bitbake/lib/bb/main.py | |||
| @@ -41,22 +41,44 @@ logger = logging.getLogger("BitBake") | |||
| 41 | class BBMainException(Exception): | 41 | class BBMainException(Exception): |
| 42 | pass | 42 | pass |
| 43 | 43 | ||
| 44 | def get_ui(config): | 44 | def list_extension_modules(pkg, checkattr): |
| 45 | if not config.ui: | 45 | """ |
| 46 | # modify 'ui' attribute because it is also read by cooker | 46 | Lists extension modules in a specific Python package |
| 47 | config.ui = os.environ.get('BITBAKE_UI', 'knotty') | 47 | (e.g. UIs, servers) |
| 48 | 48 | Parameters: | |
| 49 | interface = config.ui | 49 | pkg: previously imported Python package to list |
| 50 | 50 | checkattr: attribute to look for in module to determine if it's valid | |
| 51 | as the type of extension you are looking for | ||
| 52 | """ | ||
| 53 | import pkgutil | ||
| 54 | pkgdir = os.path.dirname(pkg.__file__) | ||
| 55 | |||
| 56 | modules = [] | ||
| 57 | for _, modulename, _ in pkgutil.iter_modules([pkgdir]): | ||
| 58 | if os.path.isdir(os.path.join(pkgdir, modulename)): | ||
| 59 | # ignore directories | ||
| 60 | continue | ||
| 61 | try: | ||
| 62 | module = __import__(pkg.__name__, fromlist=[modulename]) | ||
| 63 | except (ImportError, SystemExit): | ||
| 64 | # If we can't import it, it's not valid | ||
| 65 | continue | ||
| 66 | module_if = getattr(module, modulename) | ||
| 67 | if getattr(module_if, 'hidden_extension', False): | ||
| 68 | continue | ||
| 69 | if not checkattr or hasattr(module_if, checkattr): | ||
| 70 | modules.append(modulename) | ||
| 71 | return modules | ||
| 72 | |||
| 73 | def import_extension_module(pkg, modulename): | ||
| 51 | try: | 74 | try: |
| 52 | # Dynamically load the UI based on the ui name. Although we | 75 | # Dynamically load the UI based on the ui name. Although we |
| 53 | # suggest a fixed set this allows you to have flexibility in which | 76 | # suggest a fixed set this allows you to have flexibility in which |
| 54 | # ones are available. | 77 | # ones are available. |
| 55 | module = __import__("bb.ui", fromlist = [interface]) | 78 | module = __import__(pkg.__name__, fromlist = [modulename]) |
| 56 | return getattr(module, interface) | 79 | return getattr(module, modulename) |
| 57 | except AttributeError: | 80 | except AttributeError: |
| 58 | raise BBMainException("FATAL: Invalid user interface '%s' specified.\n" | 81 | raise BBMainException("FATAL: Unable to import extension module %s from %s" % (modulename, pkg.__name__)) |
| 59 | "Valid interfaces: depexp, goggle, ncurses, hob, knotty [default]." % interface) | ||
| 60 | 82 | ||
| 61 | 83 | ||
| 62 | # Display bitbake/OE warnings via the BitBake.Warnings logger, ignoring others""" | 84 | # Display bitbake/OE warnings via the BitBake.Warnings logger, ignoring others""" |
| @@ -146,11 +168,25 @@ class BitBakeConfigParameters(cookerdata.ConfigParameters): | |||
| 146 | parser.add_option("-P", "--profile", help = "Profile the command and save reports.", | 168 | parser.add_option("-P", "--profile", help = "Profile the command and save reports.", |
| 147 | action = "store_true", dest = "profile", default = False) | 169 | action = "store_true", dest = "profile", default = False) |
| 148 | 170 | ||
| 149 | parser.add_option("-u", "--ui", help = "The user interface to use (e.g. knotty, hob, depexp).", | 171 | def present_options(optionlist): |
| 150 | action = "store", dest = "ui") | 172 | if len(optionlist) > 1: |
| 151 | 173 | return ' or '.join([', '.join(optionlist[:-1]), optionlist[-1]]) | |
| 152 | parser.add_option("-t", "--servertype", help = "Choose which server to use, process or xmlrpc.", | 174 | else: |
| 153 | action = "store", dest = "servertype") | 175 | return optionlist[0] |
| 176 | |||
| 177 | env_ui = os.environ.get('BITBAKE_UI', None) | ||
| 178 | valid_uis = list_extension_modules(bb.ui, 'main') | ||
| 179 | default_ui = env_ui or 'knotty' | ||
| 180 | if env_ui and not env_ui in valid_uis: | ||
| 181 | raise BBMainException('Invalid UI "%s" specified in BITBAKE_UI environment variable - valid choices: %s' % (env_ui, present_options(valid_uis))) | ||
| 182 | elif not default_ui in valid_uis: | ||
| 183 | raise BBMainException('Default UI "%s" could not be found') | ||
| 184 | parser.add_option("-u", "--ui", help = "The user interface to use (%s - default %%default)." % present_options(valid_uis), | ||
| 185 | action="store", dest="ui", type="choice", choices=valid_uis, default=default_ui) | ||
| 186 | |||
| 187 | valid_server_types = list_extension_modules(bb.server, 'BitBakeServer') | ||
| 188 | parser.add_option("-t", "--servertype", help = "Choose which server type to use (%s - default %%default)." % present_options(valid_server_types), | ||
| 189 | action = "store", dest = "servertype", default = "process") | ||
| 154 | 190 | ||
| 155 | parser.add_option("", "--token", help = "Specify the connection token to be used when connecting to a remote server.", | 191 | parser.add_option("", "--token", help = "Specify the connection token to be used when connecting to a remote server.", |
| 156 | action = "store", dest = "xmlrpctoken") | 192 | action = "store", dest = "xmlrpctoken") |
| @@ -279,21 +315,8 @@ def bitbake_main(configParams, configuration): | |||
| 279 | 315 | ||
| 280 | configuration.setConfigParameters(configParams) | 316 | configuration.setConfigParameters(configParams) |
| 281 | 317 | ||
| 282 | ui_module = get_ui(configParams) | 318 | ui_module = import_extension_module(bb.ui, configParams.ui) |
| 283 | 319 | servermodule = import_extension_module(bb.server, configParams.servertype) | |
| 284 | # Server type can be xmlrpc or process currently, if nothing is specified, | ||
| 285 | # the default server is process | ||
| 286 | if configParams.servertype: | ||
| 287 | server_type = configParams.servertype | ||
| 288 | else: | ||
| 289 | server_type = 'process' | ||
| 290 | |||
| 291 | try: | ||
| 292 | module = __import__("bb.server", fromlist = [server_type]) | ||
| 293 | servermodule = getattr(module, server_type) | ||
| 294 | except AttributeError: | ||
| 295 | raise BBMainException("FATAL: Invalid server type '%s' specified.\n" | ||
| 296 | "Valid interfaces: xmlrpc, process [default]." % server_type) | ||
| 297 | 320 | ||
| 298 | if configParams.server_only: | 321 | if configParams.server_only: |
| 299 | if configParams.servertype != "xmlrpc": | 322 | if configParams.servertype != "xmlrpc": |
