diff options
author | Liming An <limingx.l.an@intel.com> | 2012-08-02 19:06:01 +0800 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2012-08-02 17:05:06 +0100 |
commit | 94e2a104ece703d8fa6046ea0fcf9a51ae1930e3 (patch) | |
tree | 33845eb0bc89d506e8e451a93f720f483a4a8993 /bitbake/lib/bb/ui/crumbs/builder.py | |
parent | 5d952ba4a00f14f005706e3c70a98f5f8cf6ab0f (diff) | |
download | poky-94e2a104ece703d8fa6046ea0fcf9a51ae1930e3.tar.gz |
bitbake: Hob: log for Hob and allow users to show logs after successful build
If users build images in Hob, record logs and allow users to retrieve the lo
after successful build.
The logs are generated if and only if:
- users do "just bake"
- users do "build image" after "build packages"
- users do "build packages" only
[YOCTO #1991]
(Bitbake rev: 291289787bb042b99f0599babc2d67c220aadb87)
Signed-off-by: Shane Wang <shane.wang@intel.com>
Signed-off-by: Liming An <limingx.l.an@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib/bb/ui/crumbs/builder.py')
-rwxr-xr-x | bitbake/lib/bb/ui/crumbs/builder.py | 52 |
1 files changed, 42 insertions, 10 deletions
diff --git a/bitbake/lib/bb/ui/crumbs/builder.py b/bitbake/lib/bb/ui/crumbs/builder.py index c2e7068428..cb2338e777 100755 --- a/bitbake/lib/bb/ui/crumbs/builder.py +++ b/bitbake/lib/bb/ui/crumbs/builder.py | |||
@@ -27,6 +27,7 @@ import os | |||
27 | import subprocess | 27 | import subprocess |
28 | import shlex | 28 | import shlex |
29 | import re | 29 | import re |
30 | import logging | ||
30 | from bb.ui.crumbs.template import TemplateMgr | 31 | from bb.ui.crumbs.template import TemplateMgr |
31 | from bb.ui.crumbs.imageconfigurationpage import ImageConfigurationPage | 32 | from bb.ui.crumbs.imageconfigurationpage import ImageConfigurationPage |
32 | from bb.ui.crumbs.recipeselectionpage import RecipeSelectionPage | 33 | from bb.ui.crumbs.recipeselectionpage import RecipeSelectionPage |
@@ -395,6 +396,11 @@ class Builder(gtk.Window): | |||
395 | 396 | ||
396 | self.template = None | 397 | self.template = None |
397 | 398 | ||
399 | # logger | ||
400 | self.logger = logging.getLogger("BitBake") | ||
401 | self.consolelog = None | ||
402 | self.current_logfile = None | ||
403 | |||
398 | # configuration and parameters | 404 | # configuration and parameters |
399 | self.configuration = Configuration() | 405 | self.configuration = Configuration() |
400 | self.parameters = Parameters() | 406 | self.parameters = Parameters() |
@@ -433,6 +439,7 @@ class Builder(gtk.Window): | |||
433 | self.handler.build.connect("build-aborted", self.handler_build_aborted_cb) | 439 | self.handler.build.connect("build-aborted", self.handler_build_aborted_cb) |
434 | self.handler.build.connect("task-started", self.handler_task_started_cb) | 440 | self.handler.build.connect("task-started", self.handler_task_started_cb) |
435 | self.handler.build.connect("log-error", self.handler_build_failure_cb) | 441 | self.handler.build.connect("log-error", self.handler_build_failure_cb) |
442 | self.handler.build.connect("log", self.handler_build_log_cb) | ||
436 | self.handler.build.connect("no-provider", self.handler_no_provider_cb) | 443 | self.handler.build.connect("no-provider", self.handler_no_provider_cb) |
437 | self.handler.connect("generating-data", self.handler_generating_data_cb) | 444 | self.handler.connect("generating-data", self.handler_generating_data_cb) |
438 | self.handler.connect("data-generated", self.handler_data_generated_cb) | 445 | self.handler.connect("data-generated", self.handler_data_generated_cb) |
@@ -501,25 +508,34 @@ class Builder(gtk.Window): | |||
501 | self.set_user_config() | 508 | self.set_user_config() |
502 | self.handler.generate_recipes() | 509 | self.handler.generate_recipes() |
503 | 510 | ||
504 | def generate_packages_async(self): | 511 | def generate_packages_async(self, log = False): |
505 | self.switch_page(self.PACKAGE_GENERATING) | 512 | self.switch_page(self.PACKAGE_GENERATING) |
513 | if log: | ||
514 | self.current_logfile = self.handler.get_logfile() | ||
515 | self.do_log(self.current_logfile) | ||
506 | # Build packages | 516 | # Build packages |
507 | _, all_recipes = self.recipe_model.get_selected_recipes() | 517 | _, all_recipes = self.recipe_model.get_selected_recipes() |
508 | self.set_user_config() | 518 | self.set_user_config() |
509 | self.handler.reset_build() | 519 | self.handler.reset_build() |
510 | self.handler.generate_packages(all_recipes, self.configuration.default_task) | 520 | self.handler.generate_packages(all_recipes, self.configuration.default_task) |
511 | 521 | ||
512 | def fast_generate_image_async(self): | 522 | def fast_generate_image_async(self, log = False): |
513 | self.switch_page(self.FAST_IMAGE_GENERATING) | 523 | self.switch_page(self.FAST_IMAGE_GENERATING) |
524 | if log: | ||
525 | self.current_logfile = self.handler.get_logfile() | ||
526 | self.do_log(self.current_logfile) | ||
514 | # Build packages | 527 | # Build packages |
515 | _, all_recipes = self.recipe_model.get_selected_recipes() | 528 | _, all_recipes = self.recipe_model.get_selected_recipes() |
516 | self.set_user_config() | 529 | self.set_user_config() |
517 | self.handler.reset_build() | 530 | self.handler.reset_build() |
518 | self.handler.generate_packages(all_recipes, self.configuration.default_task) | 531 | self.handler.generate_packages(all_recipes, self.configuration.default_task) |
519 | 532 | ||
520 | def generate_image_async(self): | 533 | def generate_image_async(self, cont = False): |
521 | self.switch_page(self.IMAGE_GENERATING) | 534 | self.switch_page(self.IMAGE_GENERATING) |
522 | self.handler.reset_build() | 535 | self.handler.reset_build() |
536 | if not cont: | ||
537 | self.current_logfile = self.handler.get_logfile() | ||
538 | self.do_log(self.current_logfile) | ||
523 | # Build image | 539 | # Build image |
524 | self.set_user_config() | 540 | self.set_user_config() |
525 | toolchain_packages = [] | 541 | toolchain_packages = [] |
@@ -627,14 +643,14 @@ class Builder(gtk.Window): | |||
627 | pass | 643 | pass |
628 | 644 | ||
629 | elif next_step == self.PACKAGE_SELECTION: | 645 | elif next_step == self.PACKAGE_SELECTION: |
630 | pass | 646 | self.package_details_page.show_page(self.current_logfile) |
631 | 647 | ||
632 | elif next_step == self.PACKAGE_GENERATING or next_step == self.FAST_IMAGE_GENERATING: | 648 | elif next_step == self.PACKAGE_GENERATING or next_step == self.FAST_IMAGE_GENERATING: |
633 | # both PACKAGE_GENEATING and FAST_IMAGE_GENERATING share the same page | 649 | # both PACKAGE_GENEATING and FAST_IMAGE_GENERATING share the same page |
634 | self.build_details_page.show_page(next_step) | 650 | self.build_details_page.show_page(next_step) |
635 | 651 | ||
636 | elif next_step == self.PACKAGE_GENERATED: | 652 | elif next_step == self.PACKAGE_GENERATED: |
637 | pass | 653 | self.package_details_page.show_page(self.current_logfile) |
638 | 654 | ||
639 | elif next_step == self.IMAGE_GENERATING: | 655 | elif next_step == self.IMAGE_GENERATING: |
640 | # after packages are generated, selected_packages need to | 656 | # after packages are generated, selected_packages need to |
@@ -736,7 +752,7 @@ class Builder(gtk.Window): | |||
736 | 752 | ||
737 | self.rcppkglist_populated() | 753 | self.rcppkglist_populated() |
738 | if self.current_step == self.FAST_IMAGE_GENERATING: | 754 | if self.current_step == self.FAST_IMAGE_GENERATING: |
739 | self.generate_image_async() | 755 | self.generate_image_async(True) |
740 | 756 | ||
741 | def show_error_dialog(self, msg): | 757 | def show_error_dialog(self, msg): |
742 | lbl = "<b>Error</b>\n" | 758 | lbl = "<b>Error</b>\n" |
@@ -963,6 +979,10 @@ class Builder(gtk.Window): | |||
963 | def handler_build_failure_cb(self, running_build): | 979 | def handler_build_failure_cb(self, running_build): |
964 | self.build_details_page.show_issues() | 980 | self.build_details_page.show_issues() |
965 | 981 | ||
982 | def handler_build_log_cb(self, running_build, func, obj): | ||
983 | if hasattr(self.logger, func): | ||
984 | getattr(self.logger, func)(obj) | ||
985 | |||
966 | def destroy_window_cb(self, widget, event): | 986 | def destroy_window_cb(self, widget, event): |
967 | if not self.sensitive: | 987 | if not self.sensitive: |
968 | return True | 988 | return True |
@@ -992,7 +1012,7 @@ class Builder(gtk.Window): | |||
992 | dialog.run() | 1012 | dialog.run() |
993 | dialog.destroy() | 1013 | dialog.destroy() |
994 | return | 1014 | return |
995 | self.generate_packages_async() | 1015 | self.generate_packages_async(True) |
996 | 1016 | ||
997 | def build_image(self): | 1017 | def build_image(self): |
998 | selected_packages = self.package_model.get_selected_packages() | 1018 | selected_packages = self.package_model.get_selected_packages() |
@@ -1005,7 +1025,7 @@ class Builder(gtk.Window): | |||
1005 | dialog.run() | 1025 | dialog.run() |
1006 | dialog.destroy() | 1026 | dialog.destroy() |
1007 | return | 1027 | return |
1008 | self.generate_image_async() | 1028 | self.generate_image_async(True) |
1009 | 1029 | ||
1010 | def just_bake(self): | 1030 | def just_bake(self): |
1011 | selected_image = self.recipe_model.get_selected_image() | 1031 | selected_image = self.recipe_model.get_selected_image() |
@@ -1022,7 +1042,7 @@ class Builder(gtk.Window): | |||
1022 | dialog.destroy() | 1042 | dialog.destroy() |
1023 | return | 1043 | return |
1024 | 1044 | ||
1025 | self.fast_generate_image_async() | 1045 | self.fast_generate_image_async(True) |
1026 | 1046 | ||
1027 | def show_binb_dialog(self, binb): | 1047 | def show_binb_dialog(self, binb): |
1028 | markup = "<b>Brought in by:</b>\n%s" % binb | 1048 | markup = "<b>Brought in by:</b>\n%s" % binb |
@@ -1241,7 +1261,7 @@ class Builder(gtk.Window): | |||
1241 | response = dialog.run() | 1261 | response = dialog.run() |
1242 | dialog.destroy() | 1262 | dialog.destroy() |
1243 | if response == gtk.RESPONSE_YES: | 1263 | if response == gtk.RESPONSE_YES: |
1244 | self.generate_packages_async() | 1264 | self.generate_packages_async(True) |
1245 | else: | 1265 | else: |
1246 | self.switch_page(self.PACKAGE_SELECTION) | 1266 | self.switch_page(self.PACKAGE_SELECTION) |
1247 | else: | 1267 | else: |
@@ -1289,3 +1309,15 @@ class Builder(gtk.Window): | |||
1289 | self.cancel_build_sync() | 1309 | self.cancel_build_sync() |
1290 | elif response == gtk.RESPONSE_YES: | 1310 | elif response == gtk.RESPONSE_YES: |
1291 | self.cancel_build_sync(True) | 1311 | self.cancel_build_sync(True) |
1312 | |||
1313 | def do_log(self, consolelogfile = None): | ||
1314 | if consolelogfile: | ||
1315 | if self.consolelog: | ||
1316 | self.logger.removeHandler(self.consolelog) | ||
1317 | self.consolelog = None | ||
1318 | self.consolelog = logging.FileHandler(consolelogfile) | ||
1319 | bb.msg.addDefaultlogFilter(self.consolelog) | ||
1320 | format = bb.msg.BBLogFormatter("%(levelname)s: %(message)s") | ||
1321 | self.consolelog.setFormatter(format) | ||
1322 | |||
1323 | self.logger.addHandler(self.consolelog) \ No newline at end of file | ||