| #!/usr/bin/env python |
| # Copyright 2014 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import argparse |
| import logging |
| import sys |
| |
| from devtoolslib import paths |
| from devtoolslib import shell_arguments |
| |
| _USAGE = ("mojo_run " |
| "[--args-for=<mojo-app>] " |
| "[--content-handlers=<handlers>] " |
| "[--enable-external-applications] " |
| "[--disable-cache] " |
| "[--enable-multiprocess] " |
| "[<mojo-app>] " |
| """ |
| |
| A <mojo-app> is a Mojo URL or a Mojo URL and arguments within quotes. |
| Example: mojo_run "mojo:js_standalone test.js". |
| <url-lib-path> is searched for shared libraries named by mojo URLs. |
| The value of <handlers> is a comma separated list like: |
| text/html,mojo:html_viewer,application/javascript,mojo:js_content_handler |
| """) |
| |
| _DESCRIPTION = """Runner for Mojo applications. |
| |
| Any arguments not recognized by the script will be passed on as shell arguments. |
| """ |
| |
| |
| # Port on which the mojo:debugger http server will be available on the host |
| # machine. |
| _MOJO_DEBUGGER_PORT = 7777 |
| _DEFAULT_WINDOW_MANAGER = "mojo:kiosk_wm" |
| |
| |
| def _configure_debugger(shell): |
| """Configures mojo:debugger to run and sets up port forwarding for its http |
| server if the shell is running on a device. |
| |
| Returns: |
| Arguments that need to be appended to the shell argument list in order to |
| run with the debugger. |
| """ |
| shell.ForwardHostPortToShell(_MOJO_DEBUGGER_PORT) |
| return ['mojo:debugger %d' % _MOJO_DEBUGGER_PORT] |
| |
| |
| def main(): |
| logging.basicConfig() |
| |
| parser = argparse.ArgumentParser(usage=_USAGE, description=_DESCRIPTION) |
| |
| # Arguments allowing to indicate the configuration we are targeting when |
| # running within a Chromium-like checkout. These will go away once we have |
| # devtools config files, see https://github.com/domokit/devtools/issues/28. |
| chromium_config_group = parser.add_argument_group('Chromium configuration', |
| 'These arguments allow to infer paths to tools and build results ' |
| 'when running withing a Chromium-like checkout') |
| debug_group = chromium_config_group.add_mutually_exclusive_group() |
| debug_group.add_argument('--debug', help='Debug build (default)', |
| default=True, action='store_true') |
| debug_group.add_argument('--release', help='Release build', default=False, |
| dest='debug', action='store_false') |
| chromium_config_group.add_argument('--target-cpu', |
| help='CPU architecture to run for.', |
| choices=['x64', 'x86', 'arm']) |
| |
| shell_arguments.add_shell_arguments(parser) |
| parser.add_argument('--no-debugger', action="store_true", |
| help='Do not spawn mojo:debugger.') |
| parser.add_argument('--window-manager', default=_DEFAULT_WINDOW_MANAGER, |
| help='Window manager app to be mapped as ' |
| 'mojo:window_manager. By default it is ' + |
| _DEFAULT_WINDOW_MANAGER) |
| parser.add_argument('--sky', |
| help='Loads the given Sky file.') |
| |
| script_args, shell_args = parser.parse_known_args() |
| |
| # Infer paths based on the config if running within a Chromium-like checkout. |
| mojo_paths, _ = paths.infer_mojo_paths(script_args.android, |
| script_args.debug, |
| script_args.target_cpu) |
| if mojo_paths: |
| if script_args.android and not script_args.adb_path: |
| script_args.adb_path = mojo_paths['adb'] |
| if script_args.android and not script_args.origin: |
| script_args.origin = mojo_paths['build'] |
| if not script_args.shell_path: |
| script_args.shell_path = mojo_paths['shell'] |
| |
| if script_args.verbose: |
| print 'Running within a Chromium-style checkout.' |
| print ' - using the locally built shell at: ' + script_args.shell_path |
| if script_args.origin: |
| print ' - using the origin: ' + script_args.origin |
| if script_args.android: |
| print ' - using the adb path: ' + script_args.adb_path |
| elif script_args.verbose: |
| print 'Running outside a Chromium-style checkout.' |
| |
| try: |
| shell, shell_args = shell_arguments.configure_shell(script_args, shell_args) |
| except shell_arguments.ShellConfigurationException as e: |
| print e |
| return 1 |
| |
| if not script_args.no_debugger: |
| if script_args.verbose: |
| print 'Spawning mojo:debugger, use `mojo_debug` to inspect the shell.' |
| print 'Note that mojo:debugger will prevent the shell from terminating,' |
| print ' pass --no-debugger to skip spawning mojo:debugger.' |
| shell_args.extend(_configure_debugger(shell)) |
| |
| shell_args = shell_arguments.append_to_argument(shell_args, '--url-mappings=', |
| 'mojo:window_manager=%s' % |
| script_args.window_manager) |
| |
| if script_args.sky: |
| if not mojo_paths: |
| print 'Running with --sky is not supported outside of the Mojo checkout.' |
| # See https://github.com/domokit/devtools/issues/27. |
| return 1 |
| shell_args.extend(shell_arguments._configure_sky(shell, mojo_paths['root'], |
| mojo_paths['sky_packages'], |
| script_args.sky)) |
| |
| if script_args.verbose: |
| print "Shell arguments: " + str(shell_args) |
| |
| shell.Run(shell_args) |
| return 0 |
| |
| |
| if __name__ == "__main__": |
| sys.exit(main()) |