|  | #!/usr/bin/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. | 
|  |  | 
|  | """ | 
|  | cr_cronet.py - cr - like helper tool for cronet developers | 
|  | """ | 
|  |  | 
|  | import argparse | 
|  | import os | 
|  | import pipes | 
|  | import subprocess | 
|  | import sys | 
|  |  | 
|  |  | 
|  | def quoted_args(args): | 
|  | return ' '.join([pipes.quote(arg) for arg in args]) | 
|  |  | 
|  |  | 
|  | def run(command, **kwargs): | 
|  | print command, kwargs | 
|  | return subprocess.call(command, **kwargs) | 
|  |  | 
|  |  | 
|  | def run_shell(command, extra_options=''): | 
|  | command = command + ' ' + extra_options | 
|  | print command | 
|  | return os.system(command) | 
|  |  | 
|  |  | 
|  | def gn(out_dir, gn_args, gn_extra=None): | 
|  | cmd = ['gn', 'gen', out_dir, "--args=%s" % gn_args] | 
|  | if gn_extra: | 
|  | cmd += gn_extra | 
|  | return run(cmd) | 
|  |  | 
|  |  | 
|  | def build(out_dir, build_target, extra_options=None): | 
|  | cmd = ['ninja', '-C', out_dir, build_target] + get_ninja_jobs_options() | 
|  | if extra_options: | 
|  | cmd += extra_options | 
|  | return run(cmd) | 
|  |  | 
|  |  | 
|  | def install(out_dir): | 
|  | cmd = ['build/android/adb_install_apk.py'] | 
|  | env = {'BUILDTYPE': out_dir[4:]} | 
|  | return run(cmd + ['CronetTestInstrumentation.apk'], env=env) or \ | 
|  | run(cmd + ['ChromiumNetTestSupport.apk'], env=env) | 
|  |  | 
|  |  | 
|  | def test(out_dir, extra_options): | 
|  | return run([out_dir + '/bin/run_cronet_test_instrumentation_apk'] + | 
|  | extra_options) | 
|  |  | 
|  |  | 
|  | def unittest(out_dir, extra_options): | 
|  | return run([out_dir + '/bin/run_cronet_unittests_android'] + | 
|  | extra_options) | 
|  |  | 
|  |  | 
|  | def test_ios(out_dir, extra_options): | 
|  | return run([out_dir + '/iossim', '-c', quoted_args(extra_options), | 
|  | out_dir + '/cronet_test.app']) | 
|  |  | 
|  |  | 
|  | def unittest_ios(out_dir, extra_options): | 
|  | return run([out_dir + '/iossim', '-c', quoted_args(extra_options), | 
|  | out_dir + '/cronet_unittests_ios.app']) | 
|  |  | 
|  |  | 
|  | def debug(extra_options): | 
|  | return run(['build/android/adb_gdb', '--start', | 
|  | '--activity=.CronetTestActivity', | 
|  | '--program-name=CronetTest', | 
|  | '--package-name=org.chromium.net'] + | 
|  | extra_options) | 
|  |  | 
|  |  | 
|  | def stack(out_dir): | 
|  | return run_shell( | 
|  | 'adb logcat -d | CHROMIUM_OUTPUT_DIR=' + pipes.quote(out_dir) + | 
|  | ' third_party/android_platform/development/scripts/stack') | 
|  |  | 
|  |  | 
|  | def use_goma(): | 
|  | home_goma = os.path.expanduser("~/goma") | 
|  | if os.path.exists(home_goma) or os.environ.get("GOMA_DIR") or \ | 
|  | os.environ.get("GOMADIR"): | 
|  | return 'use_goma=true ' | 
|  | return '' | 
|  |  | 
|  |  | 
|  | def get_ninja_jobs_options(): | 
|  | if use_goma(): | 
|  | return ["-j1000"] | 
|  | return [] | 
|  |  | 
|  |  | 
|  | def get_default_gn_args(target_os, is_release): | 
|  | gn_args = 'target_os="' + target_os + '" enable_websockets=false '+ \ | 
|  | 'disable_file_support=true disable_ftp_support=true '+ \ | 
|  | 'disable_brotli_filter=false ' + \ | 
|  | 'is_component_build=false ' + \ | 
|  | 'use_crash_key_stubs=true ' + \ | 
|  | 'ignore_elf32_limitations=true use_partition_alloc=false ' + \ | 
|  | 'include_transport_security_state_preload_list=false ' + use_goma() | 
|  | if (is_release): | 
|  | gn_args += 'is_debug=false is_official_build=true ' | 
|  | return gn_args | 
|  |  | 
|  |  | 
|  | def get_mobile_gn_args(target_os, is_release): | 
|  | return get_default_gn_args(target_os, is_release) + \ | 
|  | 'use_platform_icu_alternatives=true ' | 
|  |  | 
|  |  | 
|  | def get_ios_gn_args(is_release, target_cpu): | 
|  | return get_mobile_gn_args('ios', is_release) + \ | 
|  | 'is_cronet_build=true  ' + \ | 
|  | 'use_xcode_clang=false ' + \ | 
|  | 'ios_deployment_target="9.0" ' + \ | 
|  | 'enable_dsyms=true ' + \ | 
|  | 'target_cpu="%s" ' % target_cpu | 
|  |  | 
|  |  | 
|  | def get_mac_gn_args(is_release): | 
|  | return get_default_gn_args('mac', is_release) + \ | 
|  | 'disable_histogram_support=true ' + \ | 
|  | 'enable_dsyms=true ' | 
|  |  | 
|  |  | 
|  | def main(): | 
|  | parser = argparse.ArgumentParser() | 
|  | parser.add_argument('command', | 
|  | choices=['gn', | 
|  | 'sync', | 
|  | 'build', | 
|  | 'install', | 
|  | 'proguard', | 
|  | 'test', | 
|  | 'build-test', | 
|  | 'unit', | 
|  | 'build-unit', | 
|  | 'stack', | 
|  | 'debug', | 
|  | 'build-debug']) | 
|  | parser.add_argument('-d', '--out_dir', action='store', | 
|  | help='name of the build directory') | 
|  | parser.add_argument('-i', '--iphoneos', action='store_true', | 
|  | help='build for physical iphone') | 
|  | parser.add_argument('-x', '--x86', action='store_true', | 
|  | help='build for Intel x86 architecture') | 
|  | parser.add_argument('-r', '--release', action='store_true', | 
|  | help='use release configuration') | 
|  | parser.add_argument('-a', '--asan', action='store_true', | 
|  | help='use address sanitizer') | 
|  |  | 
|  | options, extra_options = parser.parse_known_args() | 
|  | print options | 
|  | print extra_options | 
|  |  | 
|  | is_ios = (sys.platform == 'darwin') | 
|  | if is_ios: | 
|  | test_target = 'cronet_test' | 
|  | unit_target = 'cronet_unittests_ios' | 
|  | gn_extra = ['--ide=xcode'] | 
|  | if options.iphoneos: | 
|  | gn_args = get_ios_gn_args(options.release, 'arm64') | 
|  | out_dir_suffix = '-iphoneos' | 
|  | else: | 
|  | gn_args = get_ios_gn_args(options.release, 'x64') | 
|  | out_dir_suffix = '-iphonesimulator' | 
|  | if options.asan: | 
|  | gn_args += 'is_asan=true ' | 
|  | out_dir_suffix += '-asan' | 
|  | else: | 
|  | test_target = 'cronet_test_instrumentation_apk' | 
|  | unit_target = 'cronet_unittests_android' | 
|  | gn_args = get_mobile_gn_args('android', options.release) + \ | 
|  | 'use_errorprone_java_compiler=true enable_reporting=true ' + \ | 
|  | 'use_hashed_jni_names=true ' | 
|  | gn_extra = [] | 
|  | out_dir_suffix = '' | 
|  | if options.x86: | 
|  | gn_args += 'target_cpu="x86" ' | 
|  | out_dir_suffix = '-x86' | 
|  | else: | 
|  | gn_args += 'arm_use_neon=false ' | 
|  | if options.asan: | 
|  | # ASAN on Android requires one-time setup described here: | 
|  | # https://www.chromium.org/developers/testing/addresssanitizer | 
|  | gn_args += 'is_asan=true is_clang=true is_debug=false ' | 
|  | out_dir_suffix += '-asan' | 
|  |  | 
|  | if options.release: | 
|  | out_dir = 'out/Release' + out_dir_suffix | 
|  | else: | 
|  | out_dir = 'out/Debug' + out_dir_suffix | 
|  |  | 
|  | if options.out_dir: | 
|  | out_dir = options.out_dir | 
|  |  | 
|  | if (options.command=='gn'): | 
|  | return gn(out_dir, gn_args, gn_extra) | 
|  | if (options.command=='sync'): | 
|  | return run(['git', 'pull', '--rebase']) or run(['gclient', 'sync']) | 
|  | if (options.command=='build'): | 
|  | return build(out_dir, test_target, extra_options) | 
|  | if (not is_ios): | 
|  | if (options.command=='install'): | 
|  | return install(out_dir) | 
|  | if (options.command=='proguard'): | 
|  | return build(out_dir, 'cronet_sample_proguard_apk') | 
|  | if (options.command=='test'): | 
|  | return install(out_dir) or test(out_dir, extra_options) | 
|  | if (options.command=='build-test'): | 
|  | return build(out_dir, test_target) or install(out_dir) or \ | 
|  | test(out_dir, extra_options) | 
|  | if (options.command=='stack'): | 
|  | return stack(out_dir) | 
|  | if (options.command=='debug'): | 
|  | return install(out_dir) or debug(extra_options) | 
|  | if (options.command=='build-debug'): | 
|  | return build(out_dir, test_target) or install(out_dir) or \ | 
|  | debug(extra_options) | 
|  | if (options.command=='unit'): | 
|  | return unittest(out_dir, extra_options) | 
|  | if (options.command=='build-unit'): | 
|  | return build(out_dir, unit_target) or unittest(out_dir, extra_options) | 
|  | else: | 
|  | if (options.command=='test'): | 
|  | return test_ios(out_dir, extra_options) | 
|  | if (options.command=='build-test'): | 
|  | return build(out_dir, test_target) or test_ios(out_dir, extra_options) | 
|  | if (options.command=='unit'): | 
|  | return unittest_ios(out_dir, extra_options) | 
|  | if (options.command=='build-unit'): | 
|  | return build(out_dir, unit_target) or unittest_ios(out_dir, extra_options) | 
|  |  | 
|  | parser.print_help() | 
|  | return 1 | 
|  |  | 
|  |  | 
|  | if __name__ == '__main__': | 
|  | sys.exit(main()) |