| #!/usr/bin/env python |
| # Copyright 2015 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 os |
| import subprocess |
| import sys |
| |
| _logger = logging.getLogger() |
| _root_path = os.path.realpath(os.path.dirname(__file__)) |
| |
| def _linux_out_dir(args): |
| if args.debug: |
| return os.path.join(_root_path, 'out/Debug') |
| return os.path.join(_root_path, 'out/Release') |
| |
| def _android_out_dir(args): |
| if args.debug: |
| return os.path.join(_root_path, 'out/android_Debug') |
| return os.path.join(_root_path, 'out/android_Release') |
| |
| |
| def _init_logging(verbose_count): |
| if verbose_count == 0: |
| level = logging.WARNING |
| elif verbose_count == 1: |
| level = logging.INFO |
| else: |
| level = logging.DEBUG |
| |
| logging.basicConfig() |
| _logger.setLevel(level) |
| _logger.debug('Initialized logging: verbose_count=%d, level=%d' % |
| (verbose_count, level)) |
| |
| def _run_gn(gn_args, out_dir): |
| # TODO(jamesr): add '--check' to the args. |
| command = ['gn', 'gen'] |
| command.append(out_dir) |
| command.append('--args=%s' % ' '.join(gn_args)) |
| print 'Running %s ...' % (' '.join(command)) |
| return subprocess.call(command) |
| |
| _goma_dir_str = 'goma_dir = ' |
| _use_goma_str = 'use_goma = ' |
| |
| def _gn(args): |
| _logger.debug('_gn()') |
| |
| gn_args = ['is_debug = ' + ('true' if args.debug else 'false')] |
| |
| if 'goma' in args: |
| goma_dir = os.environ.get('GOMA_DIR') |
| goma_home_dir = os.path.join(os.getenv('HOME', ''), 'goma') |
| if args.goma and goma_dir: |
| gn_args.append(_goma_dir_str + '"' + goma_dir + '"') |
| gn_args.append(_use_goma_str + 'true') |
| elif args.goma and os.path.exists(goma_home_dir): |
| gn_args.append(_goma_dir_str + '"' + goma_home_dir + '"') |
| gn_args.append(_use_goma_str + 'true') |
| |
| retcode = _run_gn(gn_args, _linux_out_dir(args)) |
| if retcode != 0: |
| return retcode |
| gn_args.append('target_os="android"') |
| gn_args.append('target_cpu="arm"') |
| return _run_gn(gn_args, _android_out_dir(args)) |
| |
| def _run_build(out_dir): |
| gn_file = os.path.join(out_dir, 'args.gn') |
| use_goma = False |
| with open(gn_file, 'r') as f: |
| lines = f.readlines() |
| for l in lines: |
| if l.startswith(_goma_dir_str): |
| use_goma = True |
| local_goma_dir = l[len(_goma_dir_str)+1:len(l)-2] |
| break |
| _logger.info('use_goma = %s' % use_goma) |
| if use_goma: |
| print 'Ensuring goma (in %s) started ...' % local_goma_dir |
| command = ['python', |
| os.path.join(local_goma_dir, 'goma_ctl.py'), |
| 'ensure_start'] |
| retcode = subprocess.call(command) |
| if retcode != 0: |
| return retcode |
| |
| return subprocess.call(['ninja', '-j', '1000', '-l', '100', '-C', out_dir]) |
| else: |
| return subprocess.call(['ninja', '-C', out_dir]) |
| |
| # Unused argument - pylint: disable=W0613 |
| def _build(args): |
| _logger.debug('_build()') |
| retcode = _run_build(_linux_out_dir(args)) |
| if retcode != 0: |
| return retcode |
| return _run_build(_android_out_dir(args)) |
| |
| # Unused argument - pylint: disable=W0613 |
| def _test(args): |
| _logger.debug('_test()') |
| # TODO(jamesr): Run tests on android too |
| out_dir = _linux_out_dir(args) |
| return subprocess.call([os.path.join(out_dir, 'mojo_shell'), |
| 'mojo:network_service_apptests']) |
| |
| def _upload(args): |
| if args.debug: |
| print "Only upload release binaries (for now)" |
| return 1 |
| base_command = ['tools/upload_service.py', |
| '--linux-x64-binary-dir', _linux_out_dir(args), |
| '--android-arm-binary-dir', _android_out_dir(args)] |
| if args.dry_run: |
| base_command.append('--dry-run') |
| _logger.info('Uploading network service binary') |
| retcode = subprocess.call(base_command + ['--upload-symbols', |
| 'network_service']) |
| if retcode != 0: |
| return retcode |
| _logger.info('Uploading network service apptests binary') |
| return subprocess.call(base_command + ['network_service_apptests']) |
| |
| |
| def main(): |
| parser = argparse.ArgumentParser( |
| description='Script to help build and upload monet') |
| |
| parent_parser = argparse.ArgumentParser(add_help=False) |
| parent_parser.add_argument('--verbose', |
| help='Be verbose (multiple times for more)', |
| default=0, dest='verbose_count', action='count') |
| |
| debug_group = parent_parser.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') |
| |
| subparsers = parser.add_subparsers() |
| |
| gn_parser = subparsers.add_parser('gn', parents=[parent_parser], |
| help='Run gn to generate build files') |
| gn_parser.set_defaults(func=_gn) |
| gn_parser.add_argument('--args', help='Specify extra args', default=None, |
| dest='gn_args') |
| goma_group = gn_parser.add_mutually_exclusive_group() |
| goma_group.add_argument('--goma', |
| help='Use Goma (if $GOMA_DIR is set or $HOME/goma ' |
| 'exists; default)', |
| default=True, |
| action='store_true') |
| goma_group.add_argument('--no-goma', help='Don\'t use Goma', default=False, |
| dest='goma', action='store_false') |
| |
| build_parser = subparsers.add_parser('build', parents=[parent_parser], |
| help='Build') |
| build_parser.set_defaults(func=_build) |
| |
| test_parser = subparsers.add_parser('test', parents=[parent_parser], |
| help='Run network service apptests') |
| test_parser.set_defaults(func=_test) |
| |
| upload_parser = subparsers.add_parser('upload', parents=[parent_parser], |
| help='Upload already built binaries to Google Cloud Storage') |
| upload_parser.add_argument('--dry-run', '-n', |
| help='Dry run (prints what it would upload but does not actually upload)', |
| action='store_true') |
| upload_parser.set_defaults(func=_upload) |
| |
| args = parser.parse_args() |
| _init_logging(args.verbose_count) |
| return args.func(args) |
| |
| if __name__ == '__main__': |
| sys.exit(main()) |