OLD | NEW |
1 # Copyright 2015 The Chromium Authors. All rights reserved. | 1 # Copyright 2015 The Chromium Authors. All rights reserved. |
2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
4 | 4 |
5 """Configuration for the shell abstraction. | 5 """Configuration for the shell abstraction. |
6 | 6 |
7 This module declares ShellConfig and knows how to compute it from command-line | 7 This module declares ShellConfig and knows how to compute it from command-line |
8 arguments, applying any default paths inferred from the checkout, configuration | 8 arguments, applying any default paths inferred from the checkout, configuration |
9 file, etc. | 9 file, etc. |
10 """ | 10 """ |
11 | 11 |
| 12 import ast |
| 13 |
12 from devtoolslib import paths | 14 from devtoolslib import paths |
13 | 15 |
14 | 16 |
| 17 class ShellConfigurationException(Exception): |
| 18 """Represents an error preventing creating a functional shell abstraction.""" |
| 19 pass |
| 20 |
| 21 |
15 class ShellConfig(object): | 22 class ShellConfig(object): |
16 """Configuration for the shell abstraction.""" | 23 """Configuration for the shell abstraction.""" |
17 | 24 |
18 def __init__(self): | 25 def __init__(self): |
19 self.android = None | 26 self.android = None |
20 self.shell_path = None | 27 self.shell_path = None |
21 self.origin = None | 28 self.origin = None |
22 self.map_url_list = None | 29 self.map_url_list = [] |
23 self.map_origin_list = None | 30 self.map_origin_list = [] |
| 31 self.dev_servers = [] |
24 self.sky = None | 32 self.sky = None |
25 self.verbose = None | 33 self.verbose = None |
26 | 34 |
27 # Android-only. | 35 # Android-only. |
28 self.adb_path = None | 36 self.adb_path = None |
29 self.target_device = None | 37 self.target_device = None |
30 self.logcat_tags = None | 38 self.logcat_tags = None |
31 | 39 |
32 # Desktop-only. | 40 # Desktop-only. |
33 self.use_osmesa = None | 41 self.use_osmesa = None |
34 | 42 |
35 | 43 |
| 44 class DevServerConfig(object): |
| 45 """Configuration for a development server running on a host and available to |
| 46 the shell. |
| 47 """ |
| 48 def __init__(self): |
| 49 self.host = None |
| 50 self.mappings = None |
| 51 |
| 52 |
36 def add_shell_arguments(parser): | 53 def add_shell_arguments(parser): |
37 """Adds argparse arguments allowing to configure shell abstraction using | 54 """Adds argparse arguments allowing to configure shell abstraction using |
38 configure_shell() below. | 55 configure_shell() below. |
39 """ | 56 """ |
40 # Arguments configuring the shell run. | 57 # Arguments configuring the shell run. |
41 parser.add_argument('--android', help='Run on Android', | 58 parser.add_argument('--android', help='Run on Android', |
42 action='store_true') | 59 action='store_true') |
43 parser.add_argument('--shell-path', help='Path of the Mojo shell binary.') | 60 parser.add_argument('--shell-path', help='Path of the Mojo shell binary.') |
44 parser.add_argument('--origin', help='Origin for mojo: URLs. This can be a ' | 61 parser.add_argument('--origin', help='Origin for mojo: URLs. This can be a ' |
45 'web url or a local directory path.') | 62 'web url or a local directory path.') |
(...skipping 15 matching lines...) Expand all Loading... |
61 android_group.add_argument('--target-device', help='Device to run on.') | 78 android_group.add_argument('--target-device', help='Device to run on.') |
62 android_group.add_argument('--logcat-tags', help='Comma-separated list of ' | 79 android_group.add_argument('--logcat-tags', help='Comma-separated list of ' |
63 'additional logcat tags to display.') | 80 'additional logcat tags to display.') |
64 | 81 |
65 desktop_group = parser.add_argument_group('Desktop-only', | 82 desktop_group = parser.add_argument_group('Desktop-only', |
66 'These arguments apply only when running on desktop.') | 83 'These arguments apply only when running on desktop.') |
67 desktop_group.add_argument('--use-osmesa', action='store_true', | 84 desktop_group.add_argument('--use-osmesa', action='store_true', |
68 help='Configure the native viewport service ' | 85 help='Configure the native viewport service ' |
69 'for off-screen rendering.') | 86 'for off-screen rendering.') |
70 | 87 |
71 # Arguments allowing to indicate the configuration we are targeting when | 88 config_file_group = parser.add_argument_group('Configuration file', |
72 # running within a Chromium-like checkout. These will go away once we have | 89 'These arguments allow to modify the behavior regarding the mojoconfig ' |
73 # devtools config files, see https://github.com/domokit/devtools/issues/28. | 90 'file.') |
74 chromium_config_group = parser.add_argument_group('Chromium configuration', | 91 config_file_group.add_argument('--config-file', type=file, |
| 92 help='Path of the configuration file to use.') |
| 93 |
| 94 # Arguments allowing to indicate the build directory we are targeting when |
| 95 # running within a Chromium-like checkout (e.g. Mojo checkout). These will go |
| 96 # away once we have devtools config files, see |
| 97 # https://github.com/domokit/devtools/issues/28. |
| 98 chromium_checkout_group = parser.add_argument_group( |
| 99 'Chromium-like checkout configuration', |
75 'These arguments allow to infer paths to tools and build results ' | 100 'These arguments allow to infer paths to tools and build results ' |
76 'when running withing a Chromium-like checkout') | 101 'when running within a Chromium-like checkout') |
77 debug_group = chromium_config_group.add_mutually_exclusive_group() | 102 debug_group = chromium_checkout_group.add_mutually_exclusive_group() |
78 debug_group.add_argument('--debug', help='Debug build (default)', | 103 debug_group.add_argument('--debug', help='Debug build (default)', |
79 default=True, action='store_true') | 104 default=True, action='store_true') |
80 debug_group.add_argument('--release', help='Release build', default=False, | 105 debug_group.add_argument('--release', help='Release build', default=False, |
81 dest='debug', action='store_false') | 106 dest='debug', action='store_false') |
82 chromium_config_group.add_argument('--target-cpu', | 107 chromium_checkout_group.add_argument('--target-cpu', |
83 help='CPU architecture to run for.', | 108 help='CPU architecture to run for.', |
84 choices=['x64', 'x86', 'arm']) | 109 choices=['x64', 'x86', 'arm']) |
85 | 110 |
86 | 111 |
| 112 def _read_config_file(config_file, aliases): |
| 113 spec = config_file.read() |
| 114 for alias_pattern, alias_value in aliases: |
| 115 spec = spec.replace(alias_pattern, alias_value) |
| 116 return ast.literal_eval(spec) |
| 117 |
| 118 |
87 def get_shell_config(script_args): | 119 def get_shell_config(script_args): |
88 """Processes command-line options defined in add_shell_arguments(), applying | 120 """Processes command-line options defined in add_shell_arguments(), applying |
89 any inferred default paths and produces an instance of ShellConfig. | 121 any inferred default paths and produces an instance of ShellConfig. |
90 | 122 |
91 Returns: | 123 Returns: |
92 An instance of ShellConfig. | 124 An instance of ShellConfig. |
93 """ | 125 """ |
94 # Infer paths based on the Chromium configuration options | 126 # Infer paths based on the Chromium configuration options |
95 # (--debug/--release, etc.), if running within a Chromium-like checkout. | 127 # (--debug/--release, etc.), if running within a Chromium-like checkout. |
96 inferred_paths = paths.infer_paths(script_args.android, script_args.debug, | 128 inferred_paths = paths.infer_paths(script_args.android, script_args.debug, |
97 script_args.target_cpu) | 129 script_args.target_cpu) |
98 | |
99 shell_config = ShellConfig() | 130 shell_config = ShellConfig() |
100 | 131 |
101 shell_config.android = script_args.android | 132 shell_config.android = script_args.android |
102 shell_config.shell_path = (script_args.shell_path or | 133 shell_config.shell_path = (script_args.shell_path or |
103 inferred_paths['shell_path']) | 134 inferred_paths['shell_path']) |
104 shell_config.origin = script_args.origin | 135 shell_config.origin = script_args.origin |
105 shell_config.map_url_list = script_args.map_url | 136 shell_config.map_url_list = script_args.map_url |
106 shell_config.map_origin_list = script_args.map_origin | 137 shell_config.map_origin_list = script_args.map_origin |
107 shell_config.sky = script_args.sky | 138 shell_config.sky = script_args.sky |
108 shell_config.verbose = script_args.verbose | 139 shell_config.verbose = script_args.verbose |
109 | 140 |
110 # Android-only. | 141 # Android-only. |
111 shell_config.adb_path = (script_args.adb_path or inferred_paths['adb_path']) | 142 shell_config.adb_path = (script_args.adb_path or inferred_paths['adb_path']) |
112 shell_config.target_device = script_args.target_device | 143 shell_config.target_device = script_args.target_device |
113 shell_config.logcat_tags = script_args.logcat_tags | 144 shell_config.logcat_tags = script_args.logcat_tags |
114 | 145 |
115 # Desktop-only. | 146 # Desktop-only. |
116 shell_config.use_osmesa = script_args.use_osmesa | 147 shell_config.use_osmesa = script_args.use_osmesa |
117 | 148 |
118 if (shell_config.android and not shell_config.origin and | 149 if (shell_config.android and not shell_config.origin and |
119 inferred_paths['build_dir_path']): | 150 inferred_paths['build_dir_path']): |
120 shell_config.origin = inferred_paths['build_dir_path'] | 151 shell_config.origin = inferred_paths['build_dir_path'] |
| 152 |
| 153 # Read the mojoconfig file. |
| 154 if script_args.config_file: |
| 155 config_file_aliases = [] |
| 156 if inferred_paths['build_dir_path']: |
| 157 config_file_aliases.append(('@{BUILD_DIR}', |
| 158 inferred_paths['build_dir_path'])) |
| 159 |
| 160 mojoconfig = None |
| 161 try: |
| 162 mojoconfig = _read_config_file(script_args.config_file, |
| 163 config_file_aliases) |
| 164 except SyntaxError: |
| 165 raise ShellConfigurationException('Failed to parse the mojoconfig file.') |
| 166 |
| 167 if 'dev_servers' in mojoconfig: |
| 168 try: |
| 169 for dev_server_spec in mojoconfig['dev_servers']: |
| 170 dev_server_config = DevServerConfig() |
| 171 dev_server_config.host = dev_server_spec['host'] |
| 172 dev_server_config.mappings = [] |
| 173 for prefix, path in dev_server_spec['mappings']: |
| 174 dev_server_config.mappings.append((prefix, path)) |
| 175 shell_config.dev_servers.append(dev_server_config) |
| 176 except (ValueError, KeyError): |
| 177 raise ShellConfigurationException('Failed to parse dev_servers in ' |
| 178 'the mojoconfig file.') |
121 return shell_config | 179 return shell_config |
OLD | NEW |