diff options
author | Paul Eggleton <paul.eggleton@linux.intel.com> | 2016-12-13 20:07:06 +1300 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2016-12-14 12:25:07 +0000 |
commit | 7d5c9860de05efc4272256ccefc530113f01d24e (patch) | |
tree | 659eb51c50941c2920215512e38d59da9cb85ee5 /bitbake/lib/bb/main.py | |
parent | e271d7dc606185130e0e47327205bd423490b7c2 (diff) | |
download | poky-7d5c9860de05efc4272256ccefc530113f01d24e.tar.gz |
bitbake: tinfoil: rewrite as a wrapper around the UI
Rewrite tinfoil as a wrapper around the UI, instead of the earlier
approach of starting up just enough of cooker to do what we want. This
has several advantages:
* It now works when bitbake is memory-resident instead of failing with
"ERROR: Only one copy of bitbake should be run against a build
directory".
* We can now connect an actual UI, thus you get things like the recipe
parsing / cache loading progress bar and parse error handling for free
* We can now handle events generated by the server if we wish to do so
* We can potentially extend this to do more stuff, e.g. actually running
build operations - this needs to be made more practical before we can
use it though (since you effectively have to become the UI yourself
for this at the moment.)
The downside is that tinfoil no longer has direct access to cooker, the
global datastore, or the cache. To mitigate this I have extended
data_smart to provide remote access capability for the datastore, and
created "fake" cooker and cooker.recipecache / cooker.collection adapter
objects in order to avoid breaking too many tinfoil-using scripts that
might be out there (we've never officially documented tinfoil or
BitBake's internal code, but we can still make accommodations where
practical). I've at least gone far enough to support all of the
utilities that use tinfoil in OE-Core with some changes, but I know
there are scripts such as Chris Larson's "bb" out there that do make
other calls into BitBake code that I'm not currently providing access to
through the adapters.
Part of the fix for [YOCTO #5470].
(Bitbake rev: 3bbf8d611c859f74d563778115677a04f5c4ab43)
Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib/bb/main.py')
-rwxr-xr-x | bitbake/lib/bb/main.py | 83 |
1 files changed, 49 insertions, 34 deletions
diff --git a/bitbake/lib/bb/main.py b/bitbake/lib/bb/main.py index a544c0aecb..443f5ec2fd 100755 --- a/bitbake/lib/bb/main.py +++ b/bitbake/lib/bb/main.py | |||
@@ -389,12 +389,8 @@ def bitbake_main(configParams, configuration): | |||
389 | except: | 389 | except: |
390 | pass | 390 | pass |
391 | 391 | ||
392 | |||
393 | configuration.setConfigParameters(configParams) | 392 | configuration.setConfigParameters(configParams) |
394 | 393 | ||
395 | ui_module = import_extension_module(bb.ui, configParams.ui, 'main') | ||
396 | servermodule = import_extension_module(bb.server, configParams.servertype, 'BitBakeServer') | ||
397 | |||
398 | if configParams.server_only: | 394 | if configParams.server_only: |
399 | if configParams.servertype != "xmlrpc": | 395 | if configParams.servertype != "xmlrpc": |
400 | raise BBMainException("FATAL: If '--server-only' is defined, we must set the " | 396 | raise BBMainException("FATAL: If '--server-only' is defined, we must set the " |
@@ -442,6 +438,31 @@ def bitbake_main(configParams, configuration): | |||
442 | bb.msg.init_msgconfig(configParams.verbose, configuration.debug, | 438 | bb.msg.init_msgconfig(configParams.verbose, configuration.debug, |
443 | configuration.debug_domains) | 439 | configuration.debug_domains) |
444 | 440 | ||
441 | server, server_connection, ui_module = setup_bitbake(configParams, configuration) | ||
442 | if server_connection is None and configParams.kill_server: | ||
443 | return 0 | ||
444 | |||
445 | if not configParams.server_only: | ||
446 | if configParams.status_only: | ||
447 | server_connection.terminate() | ||
448 | return 0 | ||
449 | |||
450 | try: | ||
451 | return ui_module.main(server_connection.connection, server_connection.events, | ||
452 | configParams) | ||
453 | finally: | ||
454 | bb.event.ui_queue = [] | ||
455 | server_connection.terminate() | ||
456 | else: | ||
457 | print("Bitbake server address: %s, server port: %s" % (server.serverImpl.host, | ||
458 | server.serverImpl.port)) | ||
459 | if configParams.foreground: | ||
460 | server.serverImpl.serve_forever() | ||
461 | return 0 | ||
462 | |||
463 | return 1 | ||
464 | |||
465 | def setup_bitbake(configParams, configuration, extrafeatures=None): | ||
445 | # Ensure logging messages get sent to the UI as events | 466 | # Ensure logging messages get sent to the UI as events |
446 | handler = bb.event.LogHandler() | 467 | handler = bb.event.LogHandler() |
447 | if not configParams.status_only: | 468 | if not configParams.status_only: |
@@ -451,8 +472,11 @@ def bitbake_main(configParams, configuration): | |||
451 | # Clear away any spurious environment variables while we stoke up the cooker | 472 | # Clear away any spurious environment variables while we stoke up the cooker |
452 | cleanedvars = bb.utils.clean_environment() | 473 | cleanedvars = bb.utils.clean_environment() |
453 | 474 | ||
454 | featureset = [] | 475 | if configParams.server_only: |
455 | if not configParams.server_only: | 476 | featureset = [] |
477 | ui_module = None | ||
478 | else: | ||
479 | ui_module = import_extension_module(bb.ui, configParams.ui, 'main') | ||
456 | # Collect the feature set for the UI | 480 | # Collect the feature set for the UI |
457 | featureset = getattr(ui_module, "featureSet", []) | 481 | featureset = getattr(ui_module, "featureSet", []) |
458 | 482 | ||
@@ -463,11 +487,15 @@ def bitbake_main(configParams, configuration): | |||
463 | setattr(configuration, "%s_server" % param, value) | 487 | setattr(configuration, "%s_server" % param, value) |
464 | param = "%s_server" % param | 488 | param = "%s_server" % param |
465 | 489 | ||
466 | if not configParams.remote_server: | 490 | if extrafeatures: |
467 | # we start a server with a given configuration | 491 | for feature in extrafeatures: |
468 | server = start_server(servermodule, configParams, configuration, featureset) | 492 | if not feature in featureset: |
469 | bb.event.ui_queue = [] | 493 | featureset.append(feature) |
470 | else: | 494 | |
495 | servermodule = import_extension_module(bb.server, | ||
496 | configParams.servertype, | ||
497 | 'BitBakeServer') | ||
498 | if configParams.remote_server: | ||
471 | if os.getenv('BBSERVER') == 'autostart': | 499 | if os.getenv('BBSERVER') == 'autostart': |
472 | if configParams.remote_server == 'autostart' or \ | 500 | if configParams.remote_server == 'autostart' or \ |
473 | not servermodule.check_connection(configParams.remote_server, timeout=2): | 501 | not servermodule.check_connection(configParams.remote_server, timeout=2): |
@@ -475,14 +503,19 @@ def bitbake_main(configParams, configuration): | |||
475 | srv = start_server(servermodule, configParams, configuration, featureset) | 503 | srv = start_server(servermodule, configParams, configuration, featureset) |
476 | configParams.remote_server = '%s:%d' % tuple(configuration.interface) | 504 | configParams.remote_server = '%s:%d' % tuple(configuration.interface) |
477 | bb.event.ui_queue = [] | 505 | bb.event.ui_queue = [] |
478 | |||
479 | # we start a stub server that is actually a XMLRPClient that connects to a real server | 506 | # we start a stub server that is actually a XMLRPClient that connects to a real server |
507 | from bb.server.xmlrpc import BitBakeXMLRPCClient | ||
480 | server = servermodule.BitBakeXMLRPCClient(configParams.observe_only, | 508 | server = servermodule.BitBakeXMLRPCClient(configParams.observe_only, |
481 | configParams.xmlrpctoken) | 509 | configParams.xmlrpctoken) |
482 | server.saveConnectionDetails(configParams.remote_server) | 510 | server.saveConnectionDetails(configParams.remote_server) |
511 | else: | ||
512 | # we start a server with a given configuration | ||
513 | server = start_server(servermodule, configParams, configuration, featureset) | ||
514 | bb.event.ui_queue = [] | ||
483 | 515 | ||
484 | 516 | if configParams.server_only: | |
485 | if not configParams.server_only: | 517 | server_connection = None |
518 | else: | ||
486 | try: | 519 | try: |
487 | server_connection = server.establishConnection(featureset) | 520 | server_connection = server.establishConnection(featureset) |
488 | except Exception as e: | 521 | except Exception as e: |
@@ -491,7 +524,7 @@ def bitbake_main(configParams, configuration): | |||
491 | if configParams.kill_server: | 524 | if configParams.kill_server: |
492 | server_connection.connection.terminateServer() | 525 | server_connection.connection.terminateServer() |
493 | bb.event.ui_queue = [] | 526 | bb.event.ui_queue = [] |
494 | return 0 | 527 | return None, None, None |
495 | 528 | ||
496 | server_connection.setupEventQueue() | 529 | server_connection.setupEventQueue() |
497 | 530 | ||
@@ -501,22 +534,4 @@ def bitbake_main(configParams, configuration): | |||
501 | 534 | ||
502 | logger.removeHandler(handler) | 535 | logger.removeHandler(handler) |
503 | 536 | ||
504 | 537 | return server, server_connection, ui_module | |
505 | if configParams.status_only: | ||
506 | server_connection.terminate() | ||
507 | return 0 | ||
508 | |||
509 | try: | ||
510 | return ui_module.main(server_connection.connection, server_connection.events, | ||
511 | configParams) | ||
512 | finally: | ||
513 | bb.event.ui_queue = [] | ||
514 | server_connection.terminate() | ||
515 | else: | ||
516 | print("Bitbake server address: %s, server port: %s" % (server.serverImpl.host, | ||
517 | server.serverImpl.port)) | ||
518 | if configParams.foreground: | ||
519 | server.serverImpl.serve_forever() | ||
520 | return 0 | ||
521 | |||
522 | return 1 | ||