| OLD | NEW |
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright 2014 The Chromium Authors. All rights reserved. | 2 # Copyright 2014 The Chromium Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 | 5 |
| 6 # This a simple script to make building/testing Mojo components easier. | 6 # This a simple script to make building/testing Mojo components easier. |
| 7 | 7 |
| 8 import argparse | 8 import argparse |
| 9 import os | 9 import os |
| 10 import platform | 10 import platform |
| 11 import re | 11 import re |
| 12 import subprocess | 12 import subprocess |
| 13 import sys | 13 import sys |
| 14 | 14 |
| 15 import mopy.paths | 15 import mopy.paths |
| 16 | 16 |
| 17 | 17 |
| 18 def call(args, command, shell=False): |
| 19 if args.dry_run: |
| 20 if isinstance(command, list): |
| 21 command = ' '.join(command) |
| 22 print command |
| 23 else: |
| 24 return subprocess.call(command, shell=shell) |
| 25 |
| 26 |
| 18 def get_out_dir(args): | 27 def get_out_dir(args): |
| 19 out_dir = "out" | 28 out_dir = "out" |
| 20 prefix = '' | 29 prefix = '' |
| 21 if args.android: | 30 if args.android: |
| 22 prefix = 'android_' | 31 prefix = 'android_' |
| 23 elif args.chromeos: | 32 elif args.chromeos: |
| 24 prefix = 'chromeos_' | 33 prefix = 'chromeos_' |
| 25 subdir = prefix + ('Debug' if args.debug else 'Release') | 34 subdir = prefix + ('Debug' if args.debug else 'Release') |
| 26 return os.path.join(out_dir, subdir) | 35 return os.path.join(out_dir, subdir) |
| 27 | 36 |
| 28 | 37 |
| 29 def sync(args): | 38 def sync(args): |
| 30 # pylint: disable=W0613 | 39 # pylint: disable=W0613 |
| 31 return subprocess.call(['gclient', 'sync']) | 40 return call(args, ['gclient', 'sync']) |
| 32 | 41 |
| 33 | 42 |
| 34 def gn(args): | 43 def gn(args): |
| 35 command = ['gn', 'gen'] | 44 command = ['gn', 'gen'] |
| 36 | 45 |
| 37 gn_args = [] | 46 gn_args = [] |
| 38 gn_args.append('is_debug=' + ('true' if args.debug else 'false')) | 47 gn_args.append('is_debug=' + ('true' if args.debug else 'false')) |
| 39 gn_args.append('is_asan=' + ('true' if args.asan else 'false')) | 48 gn_args.append('is_asan=' + ('true' if args.asan else 'false')) |
| 40 gn_args.append('is_clang=' + ('true' if args.clang else 'false')) | 49 gn_args.append('is_clang=' + ('true' if args.clang else 'false')) |
| 41 | 50 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 61 gn_args.append(r'''os=\"android\" cpu_arch=\"arm\"''') | 70 gn_args.append(r'''os=\"android\" cpu_arch=\"arm\"''') |
| 62 elif args.chromeos: | 71 elif args.chromeos: |
| 63 gn_args.append(r'''os=\"chromeos\" ui_base_build_ime=false | 72 gn_args.append(r'''os=\"chromeos\" ui_base_build_ime=false |
| 64 use_system_harfbuzz=false''') | 73 use_system_harfbuzz=false''') |
| 65 | 74 |
| 66 out_dir = get_out_dir(args) | 75 out_dir = get_out_dir(args) |
| 67 command.append(out_dir) | 76 command.append(out_dir) |
| 68 command.append('--args="%s"' % ' '.join(gn_args)) | 77 command.append('--args="%s"' % ' '.join(gn_args)) |
| 69 | 78 |
| 70 print 'Running %s ...' % ' '.join(command) | 79 print 'Running %s ...' % ' '.join(command) |
| 71 return subprocess.call(' '.join(command), shell=True) | 80 return call(args, ' '.join(command), shell=True) |
| 72 | 81 |
| 73 | 82 |
| 74 def get_gn_arg_value(out_dir, arg): | 83 def get_gn_arg_value(out_dir, arg): |
| 75 args_file_path = os.path.join(out_dir, "args.gn") | 84 args_file_path = os.path.join(out_dir, "args.gn") |
| 76 if os.path.isfile(args_file_path): | 85 if os.path.isfile(args_file_path): |
| 77 key_value_regex = re.compile(r'^%s = (.+)$' % arg) | 86 key_value_regex = re.compile(r'^%s = (.+)$' % arg) |
| 78 with open(args_file_path, "r") as args_file: | 87 with open(args_file_path, "r") as args_file: |
| 79 for line in args_file.readlines(): | 88 for line in args_file.readlines(): |
| 80 m = key_value_regex.search(line) | 89 m = key_value_regex.search(line) |
| 81 if m: | 90 if m: |
| 82 return m.group(1).strip('"') | 91 return m.group(1).strip('"') |
| 83 return '' | 92 return '' |
| 84 | 93 |
| 85 | 94 |
| 86 def build(args): | 95 def build(args): |
| 87 out_dir = get_out_dir(args) | 96 out_dir = get_out_dir(args) |
| 88 print 'Building in %s ...' % out_dir | 97 print 'Building in %s ...' % out_dir |
| 89 if get_gn_arg_value(out_dir, 'use_goma') == 'true': | 98 if get_gn_arg_value(out_dir, 'use_goma') == 'true': |
| 90 # Use the configured goma directory. | 99 # Use the configured goma directory. |
| 91 local_goma_dir = get_gn_arg_value(out_dir, 'goma_dir') | 100 local_goma_dir = get_gn_arg_value(out_dir, 'goma_dir') |
| 92 print 'Ensuring goma (in %s) started ...' % local_goma_dir | 101 print 'Ensuring goma (in %s) started ...' % local_goma_dir |
| 93 command = ['python', | 102 command = ['python', |
| 94 os.path.join(local_goma_dir, 'goma_ctl.py'), | 103 os.path.join(local_goma_dir, 'goma_ctl.py'), |
| 95 'ensure_start'] | 104 'ensure_start'] |
| 96 exit_code = subprocess.call(command) | 105 exit_code = call(args, command) |
| 97 if exit_code: | 106 if exit_code: |
| 98 return exit_code | 107 return exit_code |
| 99 | 108 |
| 100 return subprocess.call(['ninja', '-j', '1000', '-l', '100', '-C', out_dir, | 109 return call(args, ['ninja', '-j', '1000', '-l', '100', '-C', out_dir, |
| 101 'root']) | 110 'root']) |
| 102 else: | 111 else: |
| 103 return subprocess.call(['ninja', '-C', out_dir, 'root']) | 112 return call(args, ['ninja', '-C', out_dir, 'root']) |
| 104 | 113 |
| 105 | 114 |
| 106 def run_unittests(args): | 115 def run_unittests(args): |
| 107 out_dir = get_out_dir(args) | 116 out_dir = get_out_dir(args) |
| 108 print 'Running unit tests in %s ...' % out_dir | 117 print 'Running unit tests in %s ...' % out_dir |
| 109 command = ['python'] | 118 command = ['python'] |
| 110 if platform.system() == 'Linux': | 119 if platform.system() == 'Linux' and not args.android: |
| 111 command.append('./testing/xvfb.py') | 120 command.append('./testing/xvfb.py') |
| 112 command.append(out_dir) | 121 command.append(out_dir) |
| 113 | 122 |
| 114 command.append(os.path.join('mojo', 'tools', 'test_runner.py')) | 123 command.append(os.path.join('mojo', 'tools', 'test_runner.py')) |
| 115 command.append(os.path.join('mojo', 'tools', 'data', 'unittests')) | 124 if args.android: |
| 125 command.append('--android') |
| 126 command.append(os.path.join('mojo', 'tools', 'data', 'android_unittests')) |
| 127 else: |
| 128 command.append(os.path.join('mojo', 'tools', 'data', 'unittests')) |
| 116 command.append(out_dir) | 129 command.append(out_dir) |
| 117 command.append('mojob_test_successes') | 130 command.append('mojob_test_successes') |
| 118 return subprocess.call(command) | 131 return call(args, command) |
| 119 | 132 |
| 120 | 133 |
| 121 def run_skytests(args): | 134 def run_skytests(args): |
| 122 out_dir = get_out_dir(args) | 135 out_dir = get_out_dir(args) |
| 123 if platform.system() != 'Linux': | 136 if platform.system() != 'Linux' or args.android: |
| 124 return 0 | 137 return 0 |
| 125 | 138 |
| 126 command = [] | 139 command = [] |
| 127 command.append('./testing/xvfb.py') | 140 command.append('./testing/xvfb.py') |
| 128 command.append(out_dir) | 141 command.append(out_dir) |
| 129 command.append('sky/tools/test_sky') | 142 command.append('sky/tools/test_sky') |
| 130 command.append('-t') | 143 command.append('-t') |
| 131 command.append('Debug' if args.debug else 'Release') | 144 command.append('Debug' if args.debug else 'Release') |
| 132 command.append('--no-new-test-results') | 145 command.append('--no-new-test-results') |
| 133 command.append('--no-show-results') | 146 command.append('--no-show-results') |
| 134 command.append('--verbose') | 147 command.append('--verbose') |
| 135 | 148 |
| 136 if args.builder_name: | 149 if args.builder_name: |
| 137 command.append('--builder-name') | 150 command.append('--builder-name') |
| 138 command.append(args.builder_name) | 151 command.append(args.builder_name) |
| 139 | 152 |
| 140 if args.build_number: | 153 if args.build_number: |
| 141 command.append('--build-number') | 154 command.append('--build-number') |
| 142 command.append(args.build_number) | 155 command.append(args.build_number) |
| 143 | 156 |
| 144 if args.master_name: | 157 if args.master_name: |
| 145 command.append('--master-name') | 158 command.append('--master-name') |
| 146 command.append(args.master_name) | 159 command.append(args.master_name) |
| 147 | 160 |
| 148 if args.test_results_server: | 161 if args.test_results_server: |
| 149 command.append('--test-results-server') | 162 command.append('--test-results-server') |
| 150 command.append(args.test_results_server) | 163 command.append(args.test_results_server) |
| 151 | 164 |
| 152 return subprocess.call(command) | 165 return call(args, command) |
| 153 | 166 |
| 154 | 167 |
| 155 def run_pytests(args): | 168 def run_pytests(args): |
| 156 out_dir = get_out_dir(args) | 169 out_dir = get_out_dir(args) |
| 157 print 'Running python tests in %s ...' % out_dir | 170 print 'Running python tests in %s ...' % out_dir |
| 158 command = ['python'] | 171 command = ['python'] |
| 159 command.append(os.path.join('mojo', 'tools', 'run_mojo_python_tests.py')) | 172 command.append(os.path.join('mojo', 'tools', 'run_mojo_python_tests.py')) |
| 160 exit_code = subprocess.call(command) | 173 exit_code = call(args, command) |
| 161 if exit_code: | 174 if exit_code: |
| 162 return exit_code | 175 return exit_code |
| 163 | 176 |
| 164 if platform.system() != 'Linux': | 177 if platform.system() != 'Linux' or args.android: |
| 165 print ('Python bindings tests are only supported on Linux.') | 178 print ('Python bindings tests are only supported on Linux.') |
| 166 return | 179 return |
| 167 | 180 |
| 168 command = ['python'] | 181 command = ['python'] |
| 169 command.append(os.path.join('mojo', 'tools', | 182 command.append(os.path.join('mojo', 'tools', |
| 170 'run_mojo_python_bindings_tests.py')) | 183 'run_mojo_python_bindings_tests.py')) |
| 171 command.append('--build-dir=' + out_dir) | 184 command.append('--build-dir=' + out_dir) |
| 172 return subprocess.call(command) | 185 return call(args, command) |
| 173 | 186 |
| 174 | 187 |
| 175 def test(args): | 188 def test(args): |
| 176 exit_code = run_unittests(args) | 189 exit_code = run_unittests(args) |
| 177 if exit_code: | 190 if exit_code: |
| 178 return exit_code | 191 return exit_code |
| 179 exit_code = run_pytests(args) | 192 exit_code = run_pytests(args) |
| 180 if exit_code: | 193 if exit_code: |
| 181 return exit_code | 194 return exit_code |
| 182 return run_skytests(args) | 195 return run_skytests(args) |
| 183 | 196 |
| 184 | 197 |
| 185 def perftest(args): | 198 def perftest(args): |
| 186 out_dir = get_out_dir(args) | 199 out_dir = get_out_dir(args) |
| 187 print 'Running perf tests in %s ...' % out_dir | 200 print 'Running perf tests in %s ...' % out_dir |
| 188 command = [] | 201 command = [] |
| 189 command.append(os.path.join(out_dir, 'mojo_public_system_perftests')) | 202 command.append(os.path.join(out_dir, 'mojo_public_system_perftests')) |
| 190 return subprocess.call(command) | 203 return call(args, command) |
| 191 | 204 |
| 192 | 205 |
| 193 def pytest(args): | 206 def pytest(args): |
| 194 return run_pytests(args) | 207 return run_pytests(args) |
| 195 | 208 |
| 196 | 209 |
| 197 def darttest(args): | 210 def darttest(args): |
| 198 out_dir = get_out_dir(args) | 211 out_dir = get_out_dir(args) |
| 199 print 'Running Dart tests in %s ...' % out_dir | 212 print 'Running Dart tests in %s ...' % out_dir |
| 200 command = [] | 213 command = [] |
| 201 command.append('dart') | 214 command.append('dart') |
| 202 command.append('--checked') | 215 command.append('--checked') |
| 203 command.append('--enable-async') | 216 command.append('--enable-async') |
| 204 command.append(os.path.join('mojo', 'tools', 'dart_test_runner.dart')) | 217 command.append(os.path.join('mojo', 'tools', 'dart_test_runner.dart')) |
| 205 command.append(os.path.join(out_dir, 'gen')) | 218 command.append(os.path.join(out_dir, 'gen')) |
| 206 return subprocess.call(command) | 219 return call(args, command) |
| 207 | 220 |
| 208 | 221 |
| 209 def main(): | 222 def main(): |
| 210 os.chdir(mopy.paths.Paths().src_root) | 223 os.chdir(mopy.paths.Paths().src_root) |
| 211 | 224 |
| 212 parser = argparse.ArgumentParser(description='A script to make building' | 225 parser = argparse.ArgumentParser(description='A script to make building' |
| 213 '/testing Mojo components easier.') | 226 '/testing Mojo components easier.') |
| 214 | 227 |
| 215 parent_parser = argparse.ArgumentParser(add_help=False) | 228 parent_parser = argparse.ArgumentParser(add_help=False) |
| 216 debug_group = parent_parser.add_mutually_exclusive_group() | 229 debug_group = parent_parser.add_mutually_exclusive_group() |
| 217 debug_group.add_argument('--debug', help='Debug build (default)', | 230 debug_group.add_argument('--debug', help='Debug build (default)', |
| 218 default=True, action='store_true') | 231 default=True, action='store_true') |
| 219 debug_group.add_argument('--release', help='Release build', default=False, | 232 debug_group.add_argument('--release', help='Release build', default=False, |
| 220 dest='debug', action='store_false') | 233 dest='debug', action='store_false') |
| 221 | 234 |
| 222 os_group = parent_parser.add_mutually_exclusive_group() | 235 os_group = parent_parser.add_mutually_exclusive_group() |
| 223 os_group.add_argument('--android', help='Build for Android', | 236 os_group.add_argument('--android', help='Build for Android', |
| 224 action='store_true') | 237 action='store_true') |
| 225 os_group.add_argument('--chromeos', help='Build for ChromeOS', | 238 os_group.add_argument('--chromeos', help='Build for ChromeOS', |
| 226 action='store_true') | 239 action='store_true') |
| 227 | 240 |
| 241 parent_parser.add_argument('--dry-run', help='Print commands', |
| 242 action='store_true') |
| 243 |
| 228 subparsers = parser.add_subparsers() | 244 subparsers = parser.add_subparsers() |
| 229 | 245 |
| 230 sync_parser = subparsers.add_parser('sync', parents=[parent_parser], | 246 sync_parser = subparsers.add_parser('sync', parents=[parent_parser], |
| 231 help='Sync using gclient (does not run gn).') | 247 help='Sync using gclient (does not run gn).') |
| 232 sync_parser.set_defaults(func=sync) | 248 sync_parser.set_defaults(func=sync) |
| 233 | 249 |
| 234 gn_parser = subparsers.add_parser('gn', parents=[parent_parser], | 250 gn_parser = subparsers.add_parser('gn', parents=[parent_parser], |
| 235 help='Run gn for mojo (does not sync).') | 251 help='Run gn for mojo (does not sync).') |
| 236 gn_parser.set_defaults(func=gn) | 252 gn_parser.set_defaults(func=gn) |
| 237 gn_parser.add_argument('--asan', help='Uses Address Sanitizer', | 253 gn_parser.add_argument('--asan', help='Uses Address Sanitizer', |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 290 args.clang = False | 306 args.clang = False |
| 291 | 307 |
| 292 if platform.system() == 'Windows': | 308 if platform.system() == 'Windows': |
| 293 args.clang = False | 309 args.clang = False |
| 294 | 310 |
| 295 return args.func(args) | 311 return args.func(args) |
| 296 | 312 |
| 297 | 313 |
| 298 if __name__ == '__main__': | 314 if __name__ == '__main__': |
| 299 sys.exit(main()) | 315 sys.exit(main()) |
| OLD | NEW |