John Abd-El-Malek | 8672309 | 2014-11-07 10:58:14 -0800 | [diff] [blame] | 1 | #!/usr/bin/env python |
| 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 |
| 4 | # found in the LICENSE file. |
| 5 | |
| 6 | # This a simple script to make building/testing Mojo components easier. |
| 7 | |
| 8 | import argparse |
Viet-Trung Luu | 0f09fc7 | 2014-12-01 15:39:51 -0800 | [diff] [blame] | 9 | from copy import deepcopy |
John Abd-El-Malek | 8672309 | 2014-11-07 10:58:14 -0800 | [diff] [blame] | 10 | import os |
| 11 | import platform |
John Abd-El-Malek | a46d012 | 2014-11-10 13:47:26 -0800 | [diff] [blame] | 12 | import re |
John Abd-El-Malek | 8672309 | 2014-11-07 10:58:14 -0800 | [diff] [blame] | 13 | import subprocess |
| 14 | import sys |
| 15 | |
Viet-Trung Luu | 0f09fc7 | 2014-12-01 15:39:51 -0800 | [diff] [blame] | 16 | from get_test_list import GetTestList |
Viet-Trung Luu | 931979c | 2014-11-24 16:13:52 -0800 | [diff] [blame] | 17 | from mopy.config import Config |
| 18 | from mopy.paths import Paths |
| 19 | |
| 20 | |
Viet-Trung Luu | 0f09fc7 | 2014-12-01 15:39:51 -0800 | [diff] [blame] | 21 | def _args_to_config(args): |
Viet-Trung Luu | 931979c | 2014-11-24 16:13:52 -0800 | [diff] [blame] | 22 | # Default to host OS. |
| 23 | target_os = None |
| 24 | if args.android: |
| 25 | target_os = Config.OS_ANDROID |
| 26 | elif args.chromeos: |
| 27 | target_os = Config.OS_CHROMEOS |
Viet-Trung Luu | 24e7e7a | 2014-11-25 11:06:53 -0800 | [diff] [blame] | 28 | |
Nick Bray | f93c0fa | 2015-01-13 14:02:57 -0800 | [diff] [blame] | 29 | if args.cpu_arch is None and args.android: |
| 30 | args.cpu_arch = 'arm' |
| 31 | target_arch = args.cpu_arch |
| 32 | |
Viet-Trung Luu | 24e7e7a | 2014-11-25 11:06:53 -0800 | [diff] [blame] | 33 | additional_args = {} |
| 34 | |
| 35 | if 'clang' in args: |
Viet-Trung Luu | c346278 | 2014-11-25 12:47:08 -0800 | [diff] [blame] | 36 | additional_args['is_clang'] = args.clang |
Viet-Trung Luu | 24e7e7a | 2014-11-25 11:06:53 -0800 | [diff] [blame] | 37 | |
| 38 | if 'asan' in args and args.asan: |
| 39 | additional_args['sanitizer'] = Config.SANITIZER_ASAN |
| 40 | |
| 41 | # Additional non-standard config entries: |
| 42 | |
| 43 | if 'goma' in args: |
| 44 | goma_dir = os.environ.get('GOMA_DIR') |
| 45 | goma_home_dir = os.path.join(os.getenv('HOME', ''), 'goma') |
| 46 | if args.goma and goma_dir: |
| 47 | additional_args['use_goma'] = True |
| 48 | additional_args['goma_dir'] = goma_dir |
| 49 | elif args.goma and os.path.exists(goma_home_dir): |
| 50 | additional_args['use_goma'] = True |
| 51 | additional_args['goma_dir'] = goma_home_dir |
| 52 | else: |
| 53 | additional_args['use_goma'] = False |
| 54 | additional_args['goma_dir'] = None |
| 55 | |
Nick Bray | f93c0fa | 2015-01-13 14:02:57 -0800 | [diff] [blame] | 56 | additional_args['use_nacl'] = args.nacl |
Nick Bray | e7561b4 | 2015-01-09 10:54:19 -0800 | [diff] [blame] | 57 | |
Viet-Trung Luu | 0f09fc7 | 2014-12-01 15:39:51 -0800 | [diff] [blame] | 58 | if 'dry_run' in args: |
| 59 | additional_args['dry_run'] = args.dry_run |
| 60 | |
Viet-Trung Luu | 24e7e7a | 2014-11-25 11:06:53 -0800 | [diff] [blame] | 61 | if 'builder_name' in args: |
| 62 | additional_args['builder_name'] = args.builder_name |
| 63 | if 'build_number' in args: |
| 64 | additional_args['build_number'] = args.build_number |
| 65 | if 'master_name' in args: |
| 66 | additional_args['master_name'] = args.master_name |
| 67 | if 'test_results_server' in args: |
| 68 | additional_args['test_results_server'] = args.test_results_server |
| 69 | |
Nick Bray | f93c0fa | 2015-01-13 14:02:57 -0800 | [diff] [blame] | 70 | return Config(target_os=target_os, target_arch=target_arch, |
| 71 | is_debug=args.debug, **additional_args) |
John Abd-El-Malek | f8a33b8 | 2014-11-07 16:01:25 -0800 | [diff] [blame] | 72 | |
John Abd-El-Malek | 8672309 | 2014-11-07 10:58:14 -0800 | [diff] [blame] | 73 | |
Viet-Trung Luu | 0f09fc7 | 2014-12-01 15:39:51 -0800 | [diff] [blame] | 74 | def _get_out_dir(config): |
Viet-Trung Luu | 24e7e7a | 2014-11-25 11:06:53 -0800 | [diff] [blame] | 75 | paths = Paths(config) |
Viet-Trung Luu | 931979c | 2014-11-24 16:13:52 -0800 | [diff] [blame] | 76 | return paths.SrcRelPath(paths.build_dir) |
John Abd-El-Malek | 8672309 | 2014-11-07 10:58:14 -0800 | [diff] [blame] | 77 | |
| 78 | |
Viet-Trung Luu | 24e7e7a | 2014-11-25 11:06:53 -0800 | [diff] [blame] | 79 | def sync(config): |
John Abd-El-Malek | 8672309 | 2014-11-07 10:58:14 -0800 | [diff] [blame] | 80 | # pylint: disable=W0613 |
| 81 | return subprocess.call(['gclient', 'sync']) |
| 82 | |
| 83 | |
Viet-Trung Luu | 24e7e7a | 2014-11-25 11:06:53 -0800 | [diff] [blame] | 84 | def gn(config): |
James Robinson | 5f36d37 | 2015-01-08 13:03:56 -0800 | [diff] [blame] | 85 | command = ['gn', 'gen', '--check'] |
John Abd-El-Malek | 8672309 | 2014-11-07 10:58:14 -0800 | [diff] [blame] | 86 | |
| 87 | gn_args = [] |
Viet-Trung Luu | 24e7e7a | 2014-11-25 11:06:53 -0800 | [diff] [blame] | 88 | gn_args.append('is_debug=' + ('true' if config.is_debug else 'false')) |
| 89 | gn_args.append('is_asan=' + ('true' if config.sanitizer == |
| 90 | Config.SANITIZER_ASAN else 'false')) |
Viet-Trung Luu | c346278 | 2014-11-25 12:47:08 -0800 | [diff] [blame] | 91 | if config.is_clang is not None: |
| 92 | gn_args.append('is_clang=' + ('true' if config.is_clang else 'false')) |
| 93 | else: |
| 94 | gn_args.append('is_clang=' + ('true' if config.target_os not in |
| 95 | (Config.OS_ANDROID, Config.OS_WINDOWS) |
| 96 | else 'false')) |
John Abd-El-Malek | 8672309 | 2014-11-07 10:58:14 -0800 | [diff] [blame] | 97 | |
Viet-Trung Luu | c346278 | 2014-11-25 12:47:08 -0800 | [diff] [blame] | 98 | if config.values['use_goma']: |
John Abd-El-Malek | 8672309 | 2014-11-07 10:58:14 -0800 | [diff] [blame] | 99 | gn_args.append('use_goma=true') |
Viet-Trung Luu | c346278 | 2014-11-25 12:47:08 -0800 | [diff] [blame] | 100 | gn_args.append(r'''goma_dir=\"%s\"''' % config.values['goma_dir']) |
John Abd-El-Malek | 8672309 | 2014-11-07 10:58:14 -0800 | [diff] [blame] | 101 | else: |
| 102 | gn_args.append('use_goma=false') |
| 103 | |
Nick Bray | e7561b4 | 2015-01-09 10:54:19 -0800 | [diff] [blame] | 104 | if config.values['use_nacl']: |
| 105 | gn_args.append('mojo_use_nacl=true') |
| 106 | |
Viet-Trung Luu | 24e7e7a | 2014-11-25 11:06:53 -0800 | [diff] [blame] | 107 | if config.target_os == Config.OS_ANDROID: |
Nick Bray | f93c0fa | 2015-01-13 14:02:57 -0800 | [diff] [blame] | 108 | gn_args.append(r'''os=\"android\"''') |
Viet-Trung Luu | 24e7e7a | 2014-11-25 11:06:53 -0800 | [diff] [blame] | 109 | elif config.target_os == Config.OS_CHROMEOS: |
Elliot Glaysher | e1fd494 | 2015-01-14 15:49:41 -0800 | [diff] [blame] | 110 | gn_args.append(r'''os=\"chromeos\" use_system_harfbuzz=false''') |
John Abd-El-Malek | 8672309 | 2014-11-07 10:58:14 -0800 | [diff] [blame] | 111 | |
Nick Bray | f93c0fa | 2015-01-13 14:02:57 -0800 | [diff] [blame] | 112 | gn_args.append(r'''cpu_arch=\"%s\"''' % config.target_arch) |
| 113 | |
Viet-Trung Luu | 0f09fc7 | 2014-12-01 15:39:51 -0800 | [diff] [blame] | 114 | out_dir = _get_out_dir(config) |
John Abd-El-Malek | 8672309 | 2014-11-07 10:58:14 -0800 | [diff] [blame] | 115 | command.append(out_dir) |
| 116 | command.append('--args="%s"' % ' '.join(gn_args)) |
| 117 | |
| 118 | print 'Running %s ...' % ' '.join(command) |
| 119 | return subprocess.call(' '.join(command), shell=True) |
| 120 | |
| 121 | |
Viet-Trung Luu | 0f09fc7 | 2014-12-01 15:39:51 -0800 | [diff] [blame] | 122 | def _get_gn_arg_value(out_dir, arg): |
Viet-Trung Luu | c346278 | 2014-11-25 12:47:08 -0800 | [diff] [blame] | 123 | args_file_path = os.path.join(out_dir, 'args.gn') |
Michael Wasserman | 89f3590 | 2014-11-12 16:01:42 -0800 | [diff] [blame] | 124 | if os.path.isfile(args_file_path): |
| 125 | key_value_regex = re.compile(r'^%s = (.+)$' % arg) |
Viet-Trung Luu | c346278 | 2014-11-25 12:47:08 -0800 | [diff] [blame] | 126 | with open(args_file_path, 'r') as args_file: |
Michael Wasserman | 89f3590 | 2014-11-12 16:01:42 -0800 | [diff] [blame] | 127 | for line in args_file.readlines(): |
| 128 | m = key_value_regex.search(line) |
| 129 | if m: |
| 130 | return m.group(1).strip('"') |
John Abd-El-Malek | a46d012 | 2014-11-10 13:47:26 -0800 | [diff] [blame] | 131 | return '' |
John Abd-El-Malek | 8672309 | 2014-11-07 10:58:14 -0800 | [diff] [blame] | 132 | |
| 133 | |
Viet-Trung Luu | 24e7e7a | 2014-11-25 11:06:53 -0800 | [diff] [blame] | 134 | def build(config): |
Viet-Trung Luu | 0f09fc7 | 2014-12-01 15:39:51 -0800 | [diff] [blame] | 135 | out_dir = _get_out_dir(config) |
Colin Blundell | ae10f6f | 2014-12-08 12:53:01 +0100 | [diff] [blame] | 136 | print 'Building in %s ...' % out_dir |
Viet-Trung Luu | 0f09fc7 | 2014-12-01 15:39:51 -0800 | [diff] [blame] | 137 | if _get_gn_arg_value(out_dir, 'use_goma') == 'true': |
Colin Blundell | ae10f6f | 2014-12-08 12:53:01 +0100 | [diff] [blame] | 138 | # Use the configured goma directory. |
| 139 | local_goma_dir = _get_gn_arg_value(out_dir, 'goma_dir') |
| 140 | print 'Ensuring goma (in %s) started ...' % local_goma_dir |
| 141 | command = ['python', |
| 142 | os.path.join(local_goma_dir, 'goma_ctl.py'), |
| 143 | 'ensure_start'] |
| 144 | exit_code = subprocess.call(command) |
| 145 | if exit_code: |
| 146 | return exit_code |
| 147 | |
Nick Bray | e5ac342 | 2014-12-16 13:27:24 -0800 | [diff] [blame] | 148 | return subprocess.call(['ninja', '-j', '1000', '-l', '100', '-C', out_dir]) |
John Abd-El-Malek | 8672309 | 2014-11-07 10:58:14 -0800 | [diff] [blame] | 149 | else: |
Nick Bray | e5ac342 | 2014-12-16 13:27:24 -0800 | [diff] [blame] | 150 | return subprocess.call(['ninja', '-C', out_dir]) |
John Abd-El-Malek | 8672309 | 2014-11-07 10:58:14 -0800 | [diff] [blame] | 151 | |
| 152 | |
Viet-Trung Luu | 0f09fc7 | 2014-12-01 15:39:51 -0800 | [diff] [blame] | 153 | def _run_tests(config, test_types): |
| 154 | """Runs the tests of the given type(s) for the given config.""" |
John Abd-El-Malek | 8672309 | 2014-11-07 10:58:14 -0800 | [diff] [blame] | 155 | |
Viet-Trung Luu | 0f09fc7 | 2014-12-01 15:39:51 -0800 | [diff] [blame] | 156 | assert isinstance(test_types, list) |
| 157 | config = deepcopy(config) |
| 158 | config.values['test_types'] = test_types |
John Abd-El-Malek | 8672309 | 2014-11-07 10:58:14 -0800 | [diff] [blame] | 159 | |
Viet-Trung Luu | 0f09fc7 | 2014-12-01 15:39:51 -0800 | [diff] [blame] | 160 | test_list = GetTestList(config) |
| 161 | dry_run = config.values.get('dry_run') |
Ojan Vafai | 338355d | 2014-11-20 15:49:20 -0800 | [diff] [blame] | 162 | final_exit_code = 0 |
Viet-Trung Luu | 0f09fc7 | 2014-12-01 15:39:51 -0800 | [diff] [blame] | 163 | for entry in test_list: |
| 164 | print 'Running: %s' % entry['name'] |
| 165 | print 'Command: %s' % entry['command'] |
| 166 | if dry_run: |
| 167 | continue |
John Abd-El-Malek | 8672309 | 2014-11-07 10:58:14 -0800 | [diff] [blame] | 168 | |
Viet-Trung Luu | 0f09fc7 | 2014-12-01 15:39:51 -0800 | [diff] [blame] | 169 | exit_code = subprocess.call(entry['command']) |
Ojan Vafai | 338355d | 2014-11-20 15:49:20 -0800 | [diff] [blame] | 170 | if not final_exit_code: |
| 171 | final_exit_code = exit_code |
Ojan Vafai | 338355d | 2014-11-20 15:49:20 -0800 | [diff] [blame] | 172 | return final_exit_code |
John Abd-El-Malek | 8672309 | 2014-11-07 10:58:14 -0800 | [diff] [blame] | 173 | |
Zachary Anderson | a83affc | 2014-11-25 10:59:27 -0800 | [diff] [blame] | 174 | |
Viet-Trung Luu | 0f09fc7 | 2014-12-01 15:39:51 -0800 | [diff] [blame] | 175 | def test(config): |
| 176 | return _run_tests(config, [Config.TEST_TYPE_DEFAULT]) |
| 177 | |
| 178 | |
Viet-Trung Luu | 24e7e7a | 2014-11-25 11:06:53 -0800 | [diff] [blame] | 179 | def perftest(config): |
Viet-Trung Luu | 0f09fc7 | 2014-12-01 15:39:51 -0800 | [diff] [blame] | 180 | return _run_tests(config, [Config.TEST_TYPE_PERF]) |
John Abd-El-Malek | 8672309 | 2014-11-07 10:58:14 -0800 | [diff] [blame] | 181 | |
| 182 | |
Viet-Trung Luu | 24e7e7a | 2014-11-25 11:06:53 -0800 | [diff] [blame] | 183 | def pytest(config): |
Viet-Trung Luu | 0f09fc7 | 2014-12-01 15:39:51 -0800 | [diff] [blame] | 184 | return _run_tests(config, ['python']) |
John Abd-El-Malek | 8672309 | 2014-11-07 10:58:14 -0800 | [diff] [blame] | 185 | |
| 186 | |
Viet-Trung Luu | 24e7e7a | 2014-11-25 11:06:53 -0800 | [diff] [blame] | 187 | def darttest(config): |
Viet-Trung Luu | 0f09fc7 | 2014-12-01 15:39:51 -0800 | [diff] [blame] | 188 | return _run_tests(config, ['dart']) |
John Abd-El-Malek | 8672309 | 2014-11-07 10:58:14 -0800 | [diff] [blame] | 189 | |
| 190 | |
Nick Bray | ad87e37 | 2015-01-13 14:46:59 -0800 | [diff] [blame] | 191 | def nacltest(config): |
| 192 | return _run_tests(config, ['nacl']) |
| 193 | |
| 194 | |
John Abd-El-Malek | 8672309 | 2014-11-07 10:58:14 -0800 | [diff] [blame] | 195 | def main(): |
Viet-Trung Luu | 931979c | 2014-11-24 16:13:52 -0800 | [diff] [blame] | 196 | os.chdir(Paths().src_root) |
John Abd-El-Malek | f8a33b8 | 2014-11-07 16:01:25 -0800 | [diff] [blame] | 197 | |
John Abd-El-Malek | 8672309 | 2014-11-07 10:58:14 -0800 | [diff] [blame] | 198 | parser = argparse.ArgumentParser(description='A script to make building' |
| 199 | '/testing Mojo components easier.') |
| 200 | |
| 201 | parent_parser = argparse.ArgumentParser(add_help=False) |
Scott Violet | 665d845 | 2014-12-05 08:57:09 -0800 | [diff] [blame] | 202 | parent_parser.add_argument('--asan', help='Use Address Sanitizer', |
| 203 | action='store_true') |
| 204 | |
John Abd-El-Malek | 8672309 | 2014-11-07 10:58:14 -0800 | [diff] [blame] | 205 | debug_group = parent_parser.add_mutually_exclusive_group() |
| 206 | debug_group.add_argument('--debug', help='Debug build (default)', |
| 207 | default=True, action='store_true') |
| 208 | debug_group.add_argument('--release', help='Release build', default=False, |
| 209 | dest='debug', action='store_false') |
| 210 | |
| 211 | os_group = parent_parser.add_mutually_exclusive_group() |
| 212 | os_group.add_argument('--android', help='Build for Android', |
| 213 | action='store_true') |
| 214 | os_group.add_argument('--chromeos', help='Build for ChromeOS', |
| 215 | action='store_true') |
| 216 | |
Nick Bray | f93c0fa | 2015-01-13 14:02:57 -0800 | [diff] [blame] | 217 | parent_parser.add_argument('--cpu-arch', |
| 218 | help='CPU architecture to build for.', |
| 219 | choices=['x64', 'x86', 'arm']) |
| 220 | |
| 221 | parent_parser.add_argument('--nacl', help='Add in NaCl', default=False, |
| 222 | action='store_true') |
| 223 | |
John Abd-El-Malek | 8672309 | 2014-11-07 10:58:14 -0800 | [diff] [blame] | 224 | subparsers = parser.add_subparsers() |
| 225 | |
| 226 | sync_parser = subparsers.add_parser('sync', parents=[parent_parser], |
| 227 | help='Sync using gclient (does not run gn).') |
| 228 | sync_parser.set_defaults(func=sync) |
| 229 | |
| 230 | gn_parser = subparsers.add_parser('gn', parents=[parent_parser], |
| 231 | help='Run gn for mojo (does not sync).') |
| 232 | gn_parser.set_defaults(func=gn) |
John Abd-El-Malek | 8672309 | 2014-11-07 10:58:14 -0800 | [diff] [blame] | 233 | clang_group = gn_parser.add_mutually_exclusive_group() |
Viet-Trung Luu | 24e7e7a | 2014-11-25 11:06:53 -0800 | [diff] [blame] | 234 | clang_group.add_argument('--clang', help='Use Clang (default)', default=None, |
John Abd-El-Malek | 8672309 | 2014-11-07 10:58:14 -0800 | [diff] [blame] | 235 | action='store_true') |
Viet-Trung Luu | 24e7e7a | 2014-11-25 11:06:53 -0800 | [diff] [blame] | 236 | clang_group.add_argument('--gcc', help='Use GCC', |
John Abd-El-Malek | 8672309 | 2014-11-07 10:58:14 -0800 | [diff] [blame] | 237 | dest='clang', action='store_false') |
| 238 | goma_group = gn_parser.add_mutually_exclusive_group() |
| 239 | goma_group.add_argument('--goma', |
| 240 | help='Use Goma (if $GOMA_DIR is set or $HOME/goma ' |
Viet-Trung Luu | 0f09fc7 | 2014-12-01 15:39:51 -0800 | [diff] [blame] | 241 | 'exists; default)', |
John Abd-El-Malek | 8672309 | 2014-11-07 10:58:14 -0800 | [diff] [blame] | 242 | default=True, |
| 243 | action='store_true') |
| 244 | goma_group.add_argument('--no-goma', help='Don\'t use Goma', default=False, |
| 245 | dest='goma', action='store_false') |
| 246 | |
| 247 | build_parser = subparsers.add_parser('build', parents=[parent_parser], |
| 248 | help='Build') |
| 249 | build_parser.set_defaults(func=build) |
| 250 | |
| 251 | test_parser = subparsers.add_parser('test', parents=[parent_parser], |
| 252 | help='Run unit tests (does not build).') |
| 253 | test_parser.set_defaults(func=test) |
Viet-Trung Luu | 0f09fc7 | 2014-12-01 15:39:51 -0800 | [diff] [blame] | 254 | test_parser.add_argument('--dry-run', |
| 255 | help='Print instead of executing commands', |
| 256 | default=False, action='store_true') |
John Abd-El-Malek | 8672309 | 2014-11-07 10:58:14 -0800 | [diff] [blame] | 257 | |
John Abd-El-Malek | 8672309 | 2014-11-07 10:58:14 -0800 | [diff] [blame] | 258 | perftest_parser = subparsers.add_parser('perftest', parents=[parent_parser], |
| 259 | help='Run perf tests (does not build).') |
| 260 | perftest_parser.set_defaults(func=perftest) |
| 261 | |
| 262 | pytest_parser = subparsers.add_parser('pytest', parents=[parent_parser], |
| 263 | help='Run Python unit tests (does not build).') |
| 264 | pytest_parser.set_defaults(func=pytest) |
| 265 | |
| 266 | darttest_parser = subparsers.add_parser('darttest', parents=[parent_parser], |
| 267 | help='Run Dart unit tests (does not build).') |
| 268 | darttest_parser.set_defaults(func=darttest) |
| 269 | |
Nick Bray | ad87e37 | 2015-01-13 14:46:59 -0800 | [diff] [blame] | 270 | nacltest_parser = subparsers.add_parser('nacltest', parents=[parent_parser], |
| 271 | help='Run NaCl unit tests (does not build).') |
| 272 | nacltest_parser.set_defaults(func=nacltest) |
| 273 | |
John Abd-El-Malek | 8672309 | 2014-11-07 10:58:14 -0800 | [diff] [blame] | 274 | args = parser.parse_args() |
Viet-Trung Luu | 0f09fc7 | 2014-12-01 15:39:51 -0800 | [diff] [blame] | 275 | config = _args_to_config(args) |
Viet-Trung Luu | 24e7e7a | 2014-11-25 11:06:53 -0800 | [diff] [blame] | 276 | return args.func(config) |
John Abd-El-Malek | 8672309 | 2014-11-07 10:58:14 -0800 | [diff] [blame] | 277 | |
| 278 | |
| 279 | if __name__ == '__main__': |
| 280 | sys.exit(main()) |