diff options
Diffstat (limited to 'bitbake/lib/bb/ui')
-rwxr-xr-x | bitbake/lib/bb/ui/crumbs/builder.py | 59 | ||||
-rwxr-xr-x | bitbake/lib/bb/ui/crumbs/imagedetailspage.py | 72 |
2 files changed, 113 insertions, 18 deletions
diff --git a/bitbake/lib/bb/ui/crumbs/builder.py b/bitbake/lib/bb/ui/crumbs/builder.py index dcc4104262..457cadc77a 100755 --- a/bitbake/lib/bb/ui/crumbs/builder.py +++ b/bitbake/lib/bb/ui/crumbs/builder.py | |||
@@ -1359,6 +1359,25 @@ class Builder(gtk.Window): | |||
1359 | 1359 | ||
1360 | return kernel_path | 1360 | return kernel_path |
1361 | 1361 | ||
1362 | def show_load_run_script_dialog(self): | ||
1363 | dialog = gtk.FileChooserDialog("Select Run Script", self, | ||
1364 | gtk.FILE_CHOOSER_ACTION_OPEN) | ||
1365 | button = dialog.add_button("Cancel", gtk.RESPONSE_NO) | ||
1366 | HobAltButton.style_button(button) | ||
1367 | button = dialog.add_button("Select", gtk.RESPONSE_YES) | ||
1368 | HobButton.style_button(button) | ||
1369 | |||
1370 | dialog.set_current_folder(self.parameters.image_addr) | ||
1371 | |||
1372 | response = dialog.run() | ||
1373 | run_script_path = "" | ||
1374 | if response == gtk.RESPONSE_YES: | ||
1375 | run_script_path = dialog.get_filename() | ||
1376 | |||
1377 | dialog.destroy() | ||
1378 | |||
1379 | return run_script_path | ||
1380 | |||
1362 | def runqemu_image(self, image_name, kernel_name): | 1381 | def runqemu_image(self, image_name, kernel_name): |
1363 | if not image_name or not kernel_name: | 1382 | if not image_name or not kernel_name: |
1364 | lbl = "<b>Please select %s to launch in QEMU.</b>" % ("a kernel" if image_name else "an image") | 1383 | lbl = "<b>Please select %s to launch in QEMU.</b>" % ("a kernel" if image_name else "an image") |
@@ -1397,6 +1416,46 @@ class Builder(gtk.Window): | |||
1397 | dialog.run() | 1416 | dialog.run() |
1398 | dialog.destroy() | 1417 | dialog.destroy() |
1399 | 1418 | ||
1419 | def run_custom_image(self, image_name, custom_sim_path): | ||
1420 | if not image_name or not custom_sim_path: | ||
1421 | if not image_name: | ||
1422 | lbl = "<b>Please select an image to launch in the custom simulator.</b>" | ||
1423 | else: | ||
1424 | lbl = "<b>Please select a custom simulator for launching the selected image.</b>" | ||
1425 | dialog = CrumbsMessageDialog(self, lbl, gtk.MESSAGE_INFO) | ||
1426 | button = dialog.add_button("Close", gtk.RESPONSE_OK) | ||
1427 | HobButton.style_button(button) | ||
1428 | dialog.run() | ||
1429 | dialog.destroy() | ||
1430 | return | ||
1431 | |||
1432 | image_path = os.path.join(self.parameters.image_addr, image_name) | ||
1433 | |||
1434 | source_env_path = os.path.join(self.parameters.core_base, "oe-init-build-env") | ||
1435 | tmp_path = self.parameters.tmpdir | ||
1436 | cmdline = bb.ui.crumbs.utils.which_terminal() | ||
1437 | if os.path.exists(image_path) and os.path.exists(custom_sim_path) \ | ||
1438 | and os.path.exists(source_env_path) and os.path.exists(tmp_path) \ | ||
1439 | and cmdline: | ||
1440 | cmdline += "\' bash -c \"export OE_TMPDIR=" + tmp_path + "; " | ||
1441 | cmdline += "source " + source_env_path + " " + os.getcwd() + "; " | ||
1442 | cmdline += custom_sim_path + " " + image_path + "\"\'" | ||
1443 | subprocess.Popen(shlex.split(cmdline)) | ||
1444 | else: | ||
1445 | lbl = "<b>Path error</b>" | ||
1446 | msg = "One of your paths is wrong," | ||
1447 | msg = msg + " please make sure the following paths exist:\n" | ||
1448 | msg = msg + "image path:" + image_path + "\n" | ||
1449 | msg = msg + "custom simulator path:" + custom_sim_path + "\n" | ||
1450 | msg = msg + "source environment path:" + source_env_path + "\n" | ||
1451 | msg = msg + "tmp path: " + tmp_path + "." | ||
1452 | msg = msg + "You may be missing either xterm or vte for terminal services." | ||
1453 | dialog = CrumbsMessageDialog(self, lbl, gtk.MESSAGE_ERROR, msg) | ||
1454 | button = dialog.add_button("Close", gtk.RESPONSE_OK) | ||
1455 | HobButton.style_button(button) | ||
1456 | dialog.run() | ||
1457 | dialog.destroy() | ||
1458 | |||
1400 | def show_packages(self): | 1459 | def show_packages(self): |
1401 | self.package_details_page.refresh_tables() | 1460 | self.package_details_page.refresh_tables() |
1402 | self.switch_page(self.PACKAGE_SELECTION) | 1461 | self.switch_page(self.PACKAGE_SELECTION) |
diff --git a/bitbake/lib/bb/ui/crumbs/imagedetailspage.py b/bitbake/lib/bb/ui/crumbs/imagedetailspage.py index 352e9489fd..32d4854166 100755 --- a/bitbake/lib/bb/ui/crumbs/imagedetailspage.py +++ b/bitbake/lib/bb/ui/crumbs/imagedetailspage.py | |||
@@ -303,7 +303,7 @@ class ImageDetailsPage (HobPage): | |||
303 | i = i + 1 | 303 | i = i + 1 |
304 | self.num_toggled += is_toggled | 304 | self.num_toggled += is_toggled |
305 | 305 | ||
306 | is_runnable = self.create_bottom_buttons(self.buttonlist, self.toggled_image) | 306 | self.is_runnable = self.create_bottom_buttons(self.buttonlist, self.toggled_image) |
307 | 307 | ||
308 | # Generated image files info | 308 | # Generated image files info |
309 | varlist = ["Name: ", "Files created: ", "Directory: "] | 309 | varlist = ["Name: ", "Files created: ", "Directory: "] |
@@ -324,10 +324,23 @@ class ImageDetailsPage (HobPage): | |||
324 | self.image_detail = self.DetailBox(varlist=varlist, vallist=vallist, button=view_files_button, button2=open_log_button) | 324 | self.image_detail = self.DetailBox(varlist=varlist, vallist=vallist, button=view_files_button, button2=open_log_button) |
325 | self.box_group_area.pack_start(self.image_detail, expand=False, fill=True) | 325 | self.box_group_area.pack_start(self.image_detail, expand=False, fill=True) |
326 | 326 | ||
327 | # The default script path to run the image (runqemu) | ||
328 | self.run_script_path = os.path.join(self.builder.parameters.core_base, "scripts/runqemu") | ||
329 | self.run_script_detail = None | ||
330 | varlist = ["Run script: "] | ||
331 | vallist = [] | ||
332 | vallist.append(self.run_script_path) | ||
333 | |||
334 | change_run_script_button = HobAltButton("Change") | ||
335 | change_run_script_button.connect("clicked", self.change_run_script_cb) | ||
336 | change_run_script_button.set_tooltip_text("Change run script") | ||
337 | self.run_script_detail = self.DetailBox(varlist=varlist, vallist=vallist, button=change_run_script_button) | ||
338 | self.box_group_area.pack_start(self.run_script_detail, expand=False, fill=True) | ||
339 | |||
327 | # The default kernel box for the qemu images | 340 | # The default kernel box for the qemu images |
328 | self.sel_kernel = "" | 341 | self.sel_kernel = "" |
329 | self.kernel_detail = None | 342 | self.kernel_detail = None |
330 | if 'qemu' in image_name: | 343 | if self.test_mach_runnable(image_name): |
331 | self.sel_kernel = self.get_kernel_file_name() | 344 | self.sel_kernel = self.get_kernel_file_name() |
332 | 345 | ||
333 | # varlist = ["Kernel: "] | 346 | # varlist = ["Kernel: "] |
@@ -401,8 +414,10 @@ class ImageDetailsPage (HobPage): | |||
401 | self.box_group_area.pack_start(self.details_bottom_buttons, expand=False, fill=False) | 414 | self.box_group_area.pack_start(self.details_bottom_buttons, expand=False, fill=False) |
402 | 415 | ||
403 | self.show_all() | 416 | self.show_all() |
404 | if self.kernel_detail and (not is_runnable): | 417 | if self.kernel_detail and (not self.is_runnable): |
405 | self.kernel_detail.hide() | 418 | self.kernel_detail.hide() |
419 | if self.run_script_detail and self.is_runnable: | ||
420 | self.run_script_detail.hide() | ||
406 | self.image_saved = False | 421 | self.image_saved = False |
407 | 422 | ||
408 | def view_files_clicked_cb(self, button, image_addr): | 423 | def view_files_clicked_cb(self, button, image_addr): |
@@ -484,7 +499,9 @@ class ImageDetailsPage (HobPage): | |||
484 | if (action_attr == 'run' and primary_action == "Run image") \ | 499 | if (action_attr == 'run' and primary_action == "Run image") \ |
485 | or (action_attr == 'deploy' and primary_action == "Deploy image"): | 500 | or (action_attr == 'deploy' and primary_action == "Deploy image"): |
486 | action_images.append(fileitem) | 501 | action_images.append(fileitem) |
487 | 502 | if (len(action_images) == 0 and primary_action == "Run image"): | |
503 | # if there are no qemu runnable images, let the user choose any of the existing images for custom run | ||
504 | action_images = self.image_store | ||
488 | # pack the corresponding 'runnable' or 'deploy' radio_buttons, if there has no more than one file. | 505 | # pack the corresponding 'runnable' or 'deploy' radio_buttons, if there has no more than one file. |
489 | # assume that there does not both have 'deploy' and 'runnable' files in the same building result | 506 | # assume that there does not both have 'deploy' and 'runnable' files in the same building result |
490 | # in possible as design. | 507 | # in possible as design. |
@@ -499,7 +516,9 @@ class ImageDetailsPage (HobPage): | |||
499 | for fileitem in action_images: | 516 | for fileitem in action_images: |
500 | sel_btn = gtk.RadioButton(sel_parent_btn, fileitem['type']) | 517 | sel_btn = gtk.RadioButton(sel_parent_btn, fileitem['type']) |
501 | sel_parent_btn = sel_btn if not sel_parent_btn else sel_parent_btn | 518 | sel_parent_btn = sel_btn if not sel_parent_btn else sel_parent_btn |
502 | sel_btn.set_active(fileitem['is_toggled']) | 519 | if curr_row == 0: |
520 | sel_btn.set_active(True) | ||
521 | self.toggled_image = fileitem['name'] | ||
503 | sel_btn.connect('toggled', self.table_selected_cb, fileitem) | 522 | sel_btn.connect('toggled', self.table_selected_cb, fileitem) |
504 | if curr_row < 10: | 523 | if curr_row < 10: |
505 | table.attach(sel_btn, 0, 4, curr_row, curr_row + 1, xpadding=24) | 524 | table.attach(sel_btn, 0, 4, curr_row, curr_row + 1, xpadding=24) |
@@ -523,13 +542,15 @@ class ImageDetailsPage (HobPage): | |||
523 | 542 | ||
524 | if response != gtk.RESPONSE_YES: | 543 | if response != gtk.RESPONSE_YES: |
525 | return | 544 | return |
526 | 545 | # perform the primary action on the image selected by the user | |
527 | for fileitem in self.image_store: | 546 | for fileitem in self.image_store: |
528 | if fileitem['is_toggled']: | 547 | if fileitem['name'] == self.toggled_image: |
529 | if fileitem['action_attr'] == 'run': | 548 | if (fileitem['action_attr'] == 'run' and primary_action == "Run image"): |
530 | self.builder.runqemu_image(fileitem['name'], self.sel_kernel) | 549 | self.builder.runqemu_image(fileitem['name'], self.sel_kernel) |
531 | elif fileitem['action_attr'] == 'deploy': | 550 | elif (fileitem['action_attr'] == 'deploy' and primary_action == "Deploy image"): |
532 | self.builder.deploy_image(fileitem['name']) | 551 | self.builder.deploy_image(fileitem['name']) |
552 | elif (primary_action == "Run image"): | ||
553 | self.builder.run_custom_image(fileitem['name'], self.run_script_path) | ||
533 | 554 | ||
534 | def table_selected_cb(self, tbutton, image): | 555 | def table_selected_cb(self, tbutton, image): |
535 | image['is_toggled'] = tbutton.get_active() | 556 | image['is_toggled'] = tbutton.get_active() |
@@ -541,9 +562,14 @@ class ImageDetailsPage (HobPage): | |||
541 | if kernel_path and self.kernel_detail: | 562 | if kernel_path and self.kernel_detail: |
542 | import os.path | 563 | import os.path |
543 | self.sel_kernel = os.path.basename(kernel_path) | 564 | self.sel_kernel = os.path.basename(kernel_path) |
544 | markup = self.kernel_detail.format_line("Kernel: ", self.sel_kernel) | 565 | self.kernel_detail.update_line_widgets("Kernel: ", self.sel_kernel); |
545 | label = ((self.kernel_detail.get_children()[0]).get_children()[0]).get_children()[0] | 566 | |
546 | label.set_markup(markup) | 567 | def change_run_script_cb(self, widget): |
568 | self.run_script_path = self.builder.show_load_run_script_dialog() | ||
569 | if self.run_script_path and self.run_script_detail: | ||
570 | import os.path | ||
571 | self.sel_run_script = os.path.basename(self.run_script_path) | ||
572 | self.run_script_detail.update_line_widgets("Run script: ", self.run_script_path) | ||
547 | 573 | ||
548 | def create_bottom_buttons(self, buttonlist, image_name): | 574 | def create_bottom_buttons(self, buttonlist, image_name): |
549 | # Create the buttons at the bottom | 575 | # Create the buttons at the bottom |
@@ -566,26 +592,33 @@ class ImageDetailsPage (HobPage): | |||
566 | packed = True | 592 | packed = True |
567 | 593 | ||
568 | name = "Run image" | 594 | name = "Run image" |
569 | if name in buttonlist and self.test_type_runnable(image_name) and self.test_mach_runnable(image_name): | 595 | if name in buttonlist: |
596 | name = "Run qemu image" | ||
597 | is_runnable = True | ||
598 | if not (self.test_type_runnable(image_name) and self.test_mach_runnable(image_name)): | ||
599 | name = "Run custom image" | ||
600 | is_runnable = False | ||
570 | if created == True: | 601 | if created == True: |
571 | # separator | 602 | # separator |
572 | #label = gtk.Label(" or ") | 603 | #label = gtk.Label(" or ") |
573 | #self.details_bottom_buttons.pack_end(label, expand=False, fill=False) | 604 | #self.details_bottom_buttons.pack_end(label, expand=False, fill=False) |
574 | 605 | ||
575 | # create button "Run image" | 606 | # create button "Run image" |
576 | run_button = HobAltButton("Run image") | 607 | run_button = HobAltButton(name) |
577 | else: | 608 | else: |
578 | # create button "Run image" as the primary button | 609 | # create button "Run image" as the primary button |
579 | run_button = HobButton("Run image") | 610 | run_button = HobButton(name) |
580 | #run_button.set_size_request(205, 49) | 611 | #run_button.set_size_request(205, 49) |
581 | run_button.set_flags(gtk.CAN_DEFAULT) | 612 | run_button.set_flags(gtk.CAN_DEFAULT) |
582 | packed = True | 613 | packed = True |
583 | run_button.set_tooltip_text("Start up an image with qemu emulator") | 614 | if is_runnable: |
615 | run_button.set_tooltip_text("Start up an image with qemu emulator") | ||
616 | else: | ||
617 | run_button.set_tooltip_text("Start up an image with custom simulator") | ||
584 | button_id = run_button.connect("clicked", self.run_button_clicked_cb) | 618 | button_id = run_button.connect("clicked", self.run_button_clicked_cb) |
585 | self.button_ids[button_id] = run_button | 619 | self.button_ids[button_id] = run_button |
586 | self.details_bottom_buttons.pack_end(run_button, expand=False, fill=False) | 620 | self.details_bottom_buttons.pack_end(run_button, expand=False, fill=False) |
587 | created = True | 621 | created = True |
588 | is_runnable = True | ||
589 | 622 | ||
590 | name = "Save image recipe" | 623 | name = "Save image recipe" |
591 | if name in buttonlist and self.builder.recipe_model.is_custom_image(): | 624 | if name in buttonlist and self.builder.recipe_model.is_custom_image(): |
@@ -628,7 +661,10 @@ class ImageDetailsPage (HobPage): | |||
628 | self.show_builded_images_dialog(None, "Run image") | 661 | self.show_builded_images_dialog(None, "Run image") |
629 | self.set_sensitive(True) | 662 | self.set_sensitive(True) |
630 | else: | 663 | else: |
631 | self.builder.runqemu_image(self.toggled_image, self.sel_kernel) | 664 | if self.is_runnable: |
665 | self.builder.runqemu_image(self.toggled_image, self.sel_kernel) | ||
666 | else: | ||
667 | self.builder.run_custom_image(self.toggled_image, self.run_script_path) | ||
632 | 668 | ||
633 | def save_button_clicked_cb(self, button): | 669 | def save_button_clicked_cb(self, button): |
634 | topdir = self.builder.get_topdir() | 670 | topdir = self.builder.get_topdir() |