cr_cronet.py 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. #!/usr/bin/env python3
  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. cr_cronet.py - cr - like helper tool for cronet developers
  7. """
  8. import argparse
  9. import os
  10. import pipes
  11. import subprocess
  12. import sys
  13. def quoted_args(args):
  14. return ' '.join([pipes.quote(arg) for arg in args])
  15. def run(command, **kwargs):
  16. print(command, kwargs)
  17. return subprocess.call(command, **kwargs)
  18. def run_shell(command, extra_options=''):
  19. command = command + ' ' + extra_options
  20. print(command)
  21. return os.system(command)
  22. def gn(out_dir, gn_args, gn_extra=None):
  23. cmd = ['gn', 'gen', out_dir, "--args=%s" % gn_args]
  24. if gn_extra:
  25. cmd += gn_extra
  26. return run(cmd)
  27. def build(out_dir, build_target, extra_options=None):
  28. cmd = ['ninja', '-C', out_dir, build_target] + get_ninja_jobs_options()
  29. if extra_options:
  30. cmd += extra_options
  31. return run(cmd)
  32. def install(out_dir):
  33. cmd = ['build/android/adb_install_apk.py']
  34. # Propagate PATH to avoid issues with missing tools http://crbug/1217979
  35. env = {
  36. 'BUILDTYPE': out_dir[4:],
  37. 'PATH': os.environ.get('PATH', '')
  38. }
  39. return run(cmd + ['CronetTestInstrumentation.apk'], env=env) or \
  40. run(cmd + ['ChromiumNetTestSupport.apk'], env=env)
  41. def test(out_dir, extra_options):
  42. return run([out_dir + '/bin/run_cronet_test_instrumentation_apk'] +
  43. extra_options)
  44. def unittest(out_dir, extra_options):
  45. return run([out_dir + '/bin/run_cronet_unittests_android'] +
  46. extra_options)
  47. def test_ios(out_dir, extra_options):
  48. return run([out_dir + '/iossim', '-c', quoted_args(extra_options),
  49. out_dir + '/cronet_test.app'])
  50. def unittest_ios(out_dir, extra_options):
  51. return run([out_dir + '/iossim', '-c', quoted_args(extra_options),
  52. out_dir + '/cronet_unittests_ios.app'])
  53. def debug(extra_options):
  54. return run(['build/android/adb_gdb', '--start',
  55. '--activity=.CronetTestActivity',
  56. '--program-name=CronetTest',
  57. '--package-name=org.chromium.net'] +
  58. extra_options)
  59. def stack(out_dir):
  60. return run_shell(
  61. 'adb logcat -d | CHROMIUM_OUTPUT_DIR=' + pipes.quote(out_dir) +
  62. ' third_party/android_platform/development/scripts/stack')
  63. def use_goma():
  64. goma_dir = (subprocess.check_output(['goma_ctl', 'goma_dir'])
  65. .decode('utf-8')
  66. .strip())
  67. result = run(['goma_ctl', 'ensure_start'])
  68. if not result:
  69. return 'use_goma=true goma_dir="' + goma_dir + '" '
  70. return ''
  71. def get_ninja_jobs_options():
  72. if use_goma():
  73. return ["-j1000"]
  74. return []
  75. def get_default_gn_args(target_os, is_release):
  76. gn_args = 'target_os="' + target_os + ('" enable_websockets=false '
  77. 'disable_file_support=true '
  78. 'disable_brotli_filter=false '
  79. 'is_component_build=false '
  80. 'use_crash_key_stubs=true '
  81. 'use_partition_alloc=false '
  82. 'include_transport_security_state_preload_list=false ') + use_goma()
  83. if (is_release):
  84. gn_args += 'is_debug=false is_official_build=true '
  85. return gn_args
  86. def get_mobile_gn_args(target_os, is_release):
  87. return get_default_gn_args(target_os, is_release) + \
  88. 'use_platform_icu_alternatives=true '
  89. def get_ios_gn_args(is_release, bundle_id_prefix, target_cpu):
  90. print(is_release, bundle_id_prefix, target_cpu)
  91. return get_mobile_gn_args('ios', is_release) + \
  92. ('is_cronet_build=true '
  93. 'enable_remoting=false '
  94. 'ios_app_bundle_id_prefix="%s" '
  95. 'ios_deployment_target="10.0" '
  96. 'enable_dsyms=true '
  97. 'ios_stack_profiler_enabled=false '
  98. 'target_cpu="%s" ') % (bundle_id_prefix, target_cpu)
  99. def get_android_gn_args(is_release):
  100. return (get_mobile_gn_args('android', is_release) +
  101. # Keep in sync with //tools/mb/mb_config.pyl cronet_android config.
  102. 'default_min_sdk_version = 19 ' +
  103. 'use_errorprone_java_compiler=true ' +
  104. 'enable_reporting=true ' +
  105. 'use_hashed_jni_names=true ')
  106. def get_mac_gn_args(is_release):
  107. return get_default_gn_args('mac', is_release) + \
  108. 'disable_histogram_support=true ' + \
  109. 'enable_dsyms=true '
  110. def main():
  111. is_ios = (sys.platform == 'darwin')
  112. parser = argparse.ArgumentParser()
  113. parser.add_argument('command',
  114. choices=['gn',
  115. 'sync',
  116. 'build',
  117. 'install',
  118. 'proguard',
  119. 'test',
  120. 'build-test',
  121. 'unit',
  122. 'build-unit',
  123. 'stack',
  124. 'debug',
  125. 'build-debug'])
  126. parser.add_argument('-d', '--out_dir', action='store',
  127. help='name of the build directory')
  128. parser.add_argument('-x', '--x86', action='store_true',
  129. help='build for Intel x86 architecture')
  130. parser.add_argument('-r', '--release', action='store_true',
  131. help='use release configuration')
  132. parser.add_argument('-a', '--asan', action='store_true',
  133. help='use address sanitizer')
  134. if is_ios:
  135. parser.add_argument('-i', '--iphoneos', action='store_true',
  136. help='build for physical iphone')
  137. parser.add_argument('-b', '--bundle-id-prefix', action='store',
  138. dest='bundle_id_prefix', default='org.chromium',
  139. help='configure bundle id prefix')
  140. options, extra_options = parser.parse_known_args()
  141. print(options)
  142. print(extra_options)
  143. if is_ios:
  144. test_target = 'cronet_test'
  145. unit_target = 'cronet_unittests_ios'
  146. gn_extra = ['--ide=xcode', '--filters=//components/cronet/*']
  147. if options.iphoneos:
  148. gn_args = get_ios_gn_args(options.release, options.bundle_id_prefix,
  149. 'arm64')
  150. out_dir_suffix = '-iphoneos'
  151. else:
  152. gn_args = get_ios_gn_args(options.release, options.bundle_id_prefix,
  153. 'x64')
  154. out_dir_suffix = '-iphonesimulator'
  155. if options.asan:
  156. gn_args += 'is_asan=true '
  157. out_dir_suffix += '-asan'
  158. else:
  159. test_target = 'cronet_test_instrumentation_apk'
  160. unit_target = 'cronet_unittests_android'
  161. gn_args = get_android_gn_args(options.release)
  162. gn_extra = []
  163. out_dir_suffix = ''
  164. if options.x86:
  165. gn_args += 'target_cpu="x86" '
  166. out_dir_suffix = '-x86'
  167. else:
  168. gn_args += 'arm_use_neon=false '
  169. if options.asan:
  170. # ASAN on Android requires one-time setup described here:
  171. # https://www.chromium.org/developers/testing/addresssanitizer
  172. gn_args += 'is_asan=true is_clang=true is_debug=false '
  173. out_dir_suffix += '-asan'
  174. if options.release:
  175. out_dir = 'out/Release' + out_dir_suffix
  176. else:
  177. out_dir = 'out/Debug' + out_dir_suffix
  178. if options.out_dir:
  179. out_dir = options.out_dir
  180. if (options.command=='gn'):
  181. return gn(out_dir, gn_args, gn_extra)
  182. if (options.command=='sync'):
  183. return run(['git', 'pull', '--rebase']) or run(['gclient', 'sync'])
  184. if (options.command=='build'):
  185. return build(out_dir, test_target, extra_options)
  186. if (not is_ios):
  187. if (options.command=='install'):
  188. return install(out_dir)
  189. if (options.command=='proguard'):
  190. return build(out_dir, 'cronet_sample_proguard_apk')
  191. if (options.command=='test'):
  192. return install(out_dir) or test(out_dir, extra_options)
  193. if (options.command=='build-test'):
  194. return build(out_dir, test_target) or install(out_dir) or \
  195. test(out_dir, extra_options)
  196. if (options.command=='stack'):
  197. return stack(out_dir)
  198. if (options.command=='debug'):
  199. return install(out_dir) or debug(extra_options)
  200. if (options.command=='build-debug'):
  201. return build(out_dir, test_target) or install(out_dir) or \
  202. debug(extra_options)
  203. if (options.command=='unit'):
  204. return unittest(out_dir, extra_options)
  205. if (options.command=='build-unit'):
  206. return build(out_dir, unit_target) or unittest(out_dir, extra_options)
  207. else:
  208. if (options.command=='test'):
  209. return test_ios(out_dir, extra_options)
  210. if (options.command=='build-test'):
  211. return build(out_dir, test_target) or test_ios(out_dir, extra_options)
  212. if (options.command=='unit'):
  213. return unittest_ios(out_dir, extra_options)
  214. if (options.command=='build-unit'):
  215. return build(out_dir, unit_target) or unittest_ios(out_dir, extra_options)
  216. parser.print_help()
  217. return 1
  218. if __name__ == '__main__':
  219. sys.exit(main())