Index: ios/web_view/tools/build.py |
diff --git a/ios/web_view/tools/build.py b/ios/web_view/tools/build.py |
new file mode 100755 |
index 0000000000000000000000000000000000000000..58cad8aae6bad9ab1f38885e27a2f7c45855a145 |
--- /dev/null |
+++ b/ios/web_view/tools/build.py |
@@ -0,0 +1,184 @@ |
+#!/usr/bin/python |
+# Copyright 2017 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. |
+ |
+""" |
+Builds and packages CronetChromeWebView.framework. |
+""" |
+ |
+import argparse |
+import os |
+import shutil |
+import sys |
+ |
+def target_dir_name(build_config, target_device): |
+ """Returns a default output directory name string. |
+ |
+ Args: |
+ build_config: A string describing the build configuration. Ex: 'Debug' |
+ target_device: A string describing the target device. Ex: 'simulator' |
+ """ |
+ return '%s-iphone%s' % (build_config, target_device) |
+ |
+def build(build_config, target_device, extra_gn_options): |
+ """Generates and builds CronetChromeWebView.framework. |
+ |
+ Args: |
+ build_config: A string describing the build configuration. Ex: 'Debug' |
+ target_device: A string describing the target device. Ex: 'simulator' |
+ extra_gn_options: A string of gn args (space separated key=value items) to |
+ be appended to the gn gen command. |
+ |
+ Returns: |
+ The return code of generating ninja if it is non-zero, else the return code |
+ of the ninja build command. |
+ """ |
+ if target_device == 'os': |
+ target_cpu = 'arm' |
+ additional_cpu = 'arm64' |
+ else: |
+ target_cpu = 'x86' |
+ additional_cpu = 'x64' |
+ |
+ if build_config == 'Debug': |
+ build_config_gn_args = 'is_debug=true' |
+ else: |
+ build_config_gn_args = ('is_debug=false enable_stripping=true ' |
+ 'is_official_build=true') |
+ |
+ build_dir = os.path.join("out", target_dir_name(build_config, target_device)) |
+ gn_args = ('target_os="ios" enable_websockets=false ' |
+ 'is_component_build=false use_xcode_clang=true ' |
+ 'disable_file_support=true disable_ftp_support=true ' |
+ 'disable_brotli_filter=true ios_enable_code_signing=false ' |
+ 'target_cpu="%s" additional_target_cpus = ["%s"] %s %s' % |
+ (target_cpu, additional_cpu, build_config_gn_args, |
+ extra_gn_options)) |
+ |
+ gn_command = 'gn gen %s --args=\'%s\'' % (build_dir, gn_args) |
+ print gn_command |
+ gn_result = os.system(gn_command) |
+ if gn_result != 0: |
+ return gn_result |
+ |
+ ninja_command = ('ninja -C %s ios/web_view:cronet_ios_web_view_package' % |
+ build_dir) |
+ print ninja_command |
+ return os.system(ninja_command) |
+ |
+def copy_build_products(build_config, target_device, out_dir): |
+ """Copies the resulting framework and symbols to out_dir. |
+ |
+ Args: |
+ build_config: A string describing the build configuration. Ex: 'Debug' |
+ target_device: A string describing the target device. Ex: 'simulator' |
+ out_dir: A string to the path which all build products will be copied. |
+ """ |
+ target_dir = target_dir_name(build_config, target_device) |
+ build_dir = os.path.join("out", target_dir) |
+ |
+ # Copy framework. |
+ framework_source = os.path.join(build_dir, 'CronetChromeWebView.framework') |
+ framework_dest = os.path.join(out_dir, target_dir, |
+ 'CronetChromeWebView.framework') |
+ print 'Copying %s to %s' % (framework_source, framework_dest) |
+ shutil.copytree(framework_source, framework_dest) |
+ |
+ # Copy symbols. |
+ symbols_source = os.path.join(build_dir, 'CronetChromeWebView.dSYM') |
+ symbols_dest = os.path.join(out_dir, target_dir, 'CronetChromeWebView.dSYM') |
+ print 'Copying %s to %s' % (symbols_source, symbols_dest) |
+ shutil.copytree(symbols_source, symbols_dest) |
+ |
+def package_framework(build_config, target_device, out_dir, extra_gn_options): |
+ """Builds CronetChromeWebView.framework and copies the result to out_dir. |
+ |
+ Args: |
+ build_config: A string describing the build configuration. Ex: 'Debug' |
+ target_device: A string describing the target device. Ex: 'simulator' |
+ out_dir: A string to the path which all build products will be copied. |
+ extra_gn_options: A string of gn args (space separated key=value items) to |
+ be appended to the gn gen command. |
+ |
+ Returns: |
+ The return code of the build if it fails or 0 if the build was successful. |
+ """ |
+ print '\nBuilding for %s (%s)' % (target_device, build_config) |
+ |
+ build_result = build(build_config, target_device, extra_gn_options) |
+ if build_result != 0: |
+ error = 'Building %s/%s failed with code: ' % (build_config, target_device) |
+ print >>sys.stderr, error, build_result |
+ return build_result |
+ copy_build_products(build_config, target_device, out_dir) |
+ return 0 |
+ |
+def package_all_frameworks(out_dir, extra_gn_options): |
+ """Builds CronetChromeWebView.framework. |
+ |
+ Builds Release and Debug versions of CronetChromeWebView.framework for both |
+ iOS devices and simulator and copies the resulting frameworks into out_dir. |
+ |
+ Args: |
+ out_dir: A string to the path which all build products will be copied. |
+ extra_gn_options: A string of gn args (space separated key=value items) to |
+ be appended to the gn gen command. |
+ |
+ Returns: |
+ 0 if all builds are successful or 1 if any build fails. |
+ """ |
+ print 'Building CronetChromeWebView.framework...' |
+ |
+ # Package all builds in the output directory |
+ os.makedirs(out_dir) |
+ |
+ if package_framework('Debug', 'simulator', out_dir, extra_gn_options) != 0: |
+ return 1 |
+ if package_framework('Debug', 'os', out_dir, extra_gn_options) != 0: |
+ return 1 |
+ if package_framework('Release', 'simulator', out_dir, extra_gn_options) != 0: |
+ return 1 |
+ if package_framework('Release', 'os', out_dir, extra_gn_options) != 0: |
+ return 1 |
+ |
+ # Copy common files from last built package to out_dir. |
+ build_dir = os.path.join("out", target_dir_name('Release', 'os')) |
+ package_dir = os.path.join(build_dir, 'cronet_ios_web_view') |
+ shutil.copy2(os.path.join(package_dir, 'AUTHORS'), out_dir) |
+ shutil.copy2(os.path.join(package_dir, 'LICENSE'), out_dir) |
+ shutil.copy2(os.path.join(package_dir, 'VERSION'), out_dir) |
+ |
+ print '\nSuccess! CronetChromeWebView.framework is packaged into %s' % out_dir |
+ |
+ return 0 |
+ |
+def main(): |
+ description = "Build and package CronetChromeWebView.framework" |
+ parser = argparse.ArgumentParser(description=description) |
+ |
+ parser.add_argument('out_dir', nargs='?', default='out/CronetChromeWebView', |
+ help='path to output directory') |
+ parser.add_argument('--no_goma', action='store_true', |
+ help='Prevents adding use_goma=true to the gn args.') |
+ |
+ options, extra_options = parser.parse_known_args() |
+ print 'Options:', options |
+ |
+ if len(extra_options): |
+ print >>sys.stderr, 'Unknown options: ', extra_options |
+ return 1 |
+ |
+ out_dir = options.out_dir |
+ # Make sure that the output directory does not exist |
+ if os.path.exists(out_dir): |
+ print >>sys.stderr, 'The output directory already exists: ' + out_dir |
+ return 1 |
+ |
+ gn_options = '' if options.no_goma else 'use_goma=true' |
+ |
+ return package_all_frameworks(out_dir, gn_options) |
+ |
+ |
+if __name__ == '__main__': |
+ sys.exit(main()) |