| Index: build/android/gyp/write_build_config.py
|
| diff --git a/build/android/gyp/write_build_config.py b/build/android/gyp/write_build_config.py
|
| deleted file mode 100755
|
| index 3773e98bc70beeb6c154774c395a31999a85b009..0000000000000000000000000000000000000000
|
| --- a/build/android/gyp/write_build_config.py
|
| +++ /dev/null
|
| @@ -1,357 +0,0 @@
|
| -#!/usr/bin/env 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.
|
| -
|
| -"""Writes a build_config file.
|
| -
|
| -The build_config file for a target is a json file containing information about
|
| -how to build that target based on the target's dependencies. This includes
|
| -things like: the javac classpath, the list of android resources dependencies,
|
| -etc. It also includes the information needed to create the build_config for
|
| -other targets that depend on that one.
|
| -
|
| -Android build scripts should not refer to the build_config directly, and the
|
| -build specification should instead pass information in using the special
|
| -file-arg syntax (see build_utils.py:ExpandFileArgs). That syntax allows passing
|
| -of values in a json dict in a file and looks like this:
|
| - --python-arg=@FileArg(build_config_path:javac:classpath)
|
| -
|
| -Note: If paths to input files are passed in this way, it is important that:
|
| - 1. inputs/deps of the action ensure that the files are available the first
|
| - time the action runs.
|
| - 2. Either (a) or (b)
|
| - a. inputs/deps ensure that the action runs whenever one of the files changes
|
| - b. the files are added to the action's depfile
|
| -"""
|
| -
|
| -import optparse
|
| -import os
|
| -import sys
|
| -import xml.dom.minidom
|
| -
|
| -from util import build_utils
|
| -
|
| -import write_ordered_libraries
|
| -
|
| -class AndroidManifest(object):
|
| - def __init__(self, path):
|
| - self.path = path
|
| - dom = xml.dom.minidom.parse(path)
|
| - manifests = dom.getElementsByTagName('manifest')
|
| - assert len(manifests) == 1
|
| - self.manifest = manifests[0]
|
| -
|
| - def GetInstrumentation(self):
|
| - instrumentation_els = self.manifest.getElementsByTagName('instrumentation')
|
| - if len(instrumentation_els) == 0:
|
| - return None
|
| - if len(instrumentation_els) != 1:
|
| - raise Exception(
|
| - 'More than one <instrumentation> element found in %s' % self.path)
|
| - return instrumentation_els[0]
|
| -
|
| - def CheckInstrumentation(self, expected_package):
|
| - instr = self.GetInstrumentation()
|
| - if not instr:
|
| - raise Exception('No <instrumentation> elements found in %s' % self.path)
|
| - instrumented_package = instr.getAttributeNS(
|
| - 'http://schemas.android.com/apk/res/android', 'targetPackage')
|
| - if instrumented_package != expected_package:
|
| - raise Exception(
|
| - 'Wrong instrumented package. Expected %s, got %s'
|
| - % (expected_package, instrumented_package))
|
| -
|
| - def GetPackageName(self):
|
| - return self.manifest.getAttribute('package')
|
| -
|
| -
|
| -dep_config_cache = {}
|
| -def GetDepConfig(path):
|
| - if not path in dep_config_cache:
|
| - dep_config_cache[path] = build_utils.ReadJson(path)['deps_info']
|
| - return dep_config_cache[path]
|
| -
|
| -
|
| -def DepsOfType(wanted_type, configs):
|
| - return [c for c in configs if c['type'] == wanted_type]
|
| -
|
| -
|
| -def GetAllDepsConfigsInOrder(deps_config_paths):
|
| - def GetDeps(path):
|
| - return set(GetDepConfig(path)['deps_configs'])
|
| - return build_utils.GetSortedTransitiveDependencies(deps_config_paths, GetDeps)
|
| -
|
| -
|
| -class Deps(object):
|
| - def __init__(self, direct_deps_config_paths):
|
| - self.all_deps_config_paths = GetAllDepsConfigsInOrder(
|
| - direct_deps_config_paths)
|
| - self.direct_deps_configs = [
|
| - GetDepConfig(p) for p in direct_deps_config_paths]
|
| - self.all_deps_configs = [
|
| - GetDepConfig(p) for p in self.all_deps_config_paths]
|
| -
|
| - def All(self, wanted_type=None):
|
| - if type is None:
|
| - return self.all_deps_configs
|
| - return DepsOfType(wanted_type, self.all_deps_configs)
|
| -
|
| - def Direct(self, wanted_type=None):
|
| - if wanted_type is None:
|
| - return self.direct_deps_configs
|
| - return DepsOfType(wanted_type, self.direct_deps_configs)
|
| -
|
| - def AllConfigPaths(self):
|
| - return self.all_deps_config_paths
|
| -
|
| -
|
| -def main(argv):
|
| - parser = optparse.OptionParser()
|
| - build_utils.AddDepfileOption(parser)
|
| - parser.add_option('--build-config', help='Path to build_config output.')
|
| - parser.add_option(
|
| - '--type',
|
| - help='Type of this target (e.g. android_library).')
|
| - parser.add_option(
|
| - '--possible-deps-configs',
|
| - help='List of paths for dependency\'s build_config files. Some '
|
| - 'dependencies may not write build_config files. Missing build_config '
|
| - 'files are handled differently based on the type of this target.')
|
| -
|
| - # android_resources options
|
| - parser.add_option('--srcjar', help='Path to target\'s resources srcjar.')
|
| - parser.add_option('--resources-zip', help='Path to target\'s resources zip.')
|
| - parser.add_option('--r-text', help='Path to target\'s R.txt file.')
|
| - parser.add_option('--package-name',
|
| - help='Java package name for these resources.')
|
| - parser.add_option('--android-manifest', help='Path to android manifest.')
|
| -
|
| - # java library options
|
| - parser.add_option('--jar-path', help='Path to target\'s jar output.')
|
| - parser.add_option('--supports-android', action='store_true',
|
| - help='Whether this library supports running on the Android platform.')
|
| - parser.add_option('--requires-android', action='store_true',
|
| - help='Whether this library requires running on the Android platform.')
|
| - parser.add_option('--bypass-platform-checks', action='store_true',
|
| - help='Bypass checks for support/require Android platform.')
|
| -
|
| - # android library options
|
| - parser.add_option('--dex-path', help='Path to target\'s dex output.')
|
| -
|
| - # native library options
|
| - parser.add_option('--native-libs', help='List of top-level native libs.')
|
| - parser.add_option('--readelf-path', help='Path to toolchain\'s readelf.')
|
| -
|
| - parser.add_option('--tested-apk-config',
|
| - help='Path to the build config of the tested apk (for an instrumentation '
|
| - 'test apk).')
|
| -
|
| - options, args = parser.parse_args(argv)
|
| -
|
| - if args:
|
| - parser.error('No positional arguments should be given.')
|
| -
|
| -
|
| - if not options.type in [
|
| - 'java_library', 'android_resources', 'android_apk', 'deps_dex']:
|
| - raise Exception('Unknown type: <%s>' % options.type)
|
| -
|
| - required_options = ['build_config'] + {
|
| - 'java_library': ['jar_path'],
|
| - 'android_resources': ['resources_zip'],
|
| - 'android_apk': ['jar_path', 'dex_path', 'resources_zip'],
|
| - 'deps_dex': ['dex_path']
|
| - }[options.type]
|
| -
|
| - if options.native_libs:
|
| - required_options.append('readelf_path')
|
| -
|
| - build_utils.CheckOptions(options, parser, required_options)
|
| -
|
| - if options.type == 'java_library':
|
| - if options.supports_android and not options.dex_path:
|
| - raise Exception('java_library that supports Android requires a dex path.')
|
| -
|
| - if options.requires_android and not options.supports_android:
|
| - raise Exception(
|
| - '--supports-android is required when using --requires-android')
|
| -
|
| - possible_deps_config_paths = build_utils.ParseGypList(
|
| - options.possible_deps_configs)
|
| -
|
| - allow_unknown_deps = (options.type == 'android_apk' or
|
| - options.type == 'android_resources')
|
| - unknown_deps = [
|
| - c for c in possible_deps_config_paths if not os.path.exists(c)]
|
| - if unknown_deps and not allow_unknown_deps:
|
| - raise Exception('Unknown deps: ' + str(unknown_deps))
|
| -
|
| - direct_deps_config_paths = [
|
| - c for c in possible_deps_config_paths if not c in unknown_deps]
|
| -
|
| - deps = Deps(direct_deps_config_paths)
|
| - direct_library_deps = deps.Direct('java_library')
|
| - all_library_deps = deps.All('java_library')
|
| -
|
| - direct_resources_deps = deps.Direct('android_resources')
|
| - all_resources_deps = deps.All('android_resources')
|
| - # Resources should be ordered with the highest-level dependency first so that
|
| - # overrides are done correctly.
|
| - all_resources_deps.reverse()
|
| -
|
| - if options.type == 'android_apk' and options.tested_apk_config:
|
| - tested_apk_deps = Deps([options.tested_apk_config])
|
| - tested_apk_resources_deps = tested_apk_deps.All('android_resources')
|
| - all_resources_deps = [
|
| - d for d in all_resources_deps if not d in tested_apk_resources_deps]
|
| -
|
| - # Initialize some common config.
|
| - config = {
|
| - 'deps_info': {
|
| - 'name': os.path.basename(options.build_config),
|
| - 'path': options.build_config,
|
| - 'type': options.type,
|
| - 'deps_configs': direct_deps_config_paths,
|
| - }
|
| - }
|
| - deps_info = config['deps_info']
|
| -
|
| - if options.type == 'java_library' and not options.bypass_platform_checks:
|
| - deps_info['requires_android'] = options.requires_android
|
| - deps_info['supports_android'] = options.supports_android
|
| -
|
| - deps_require_android = (all_resources_deps +
|
| - [d['name'] for d in all_library_deps if d['requires_android']])
|
| - deps_not_support_android = (
|
| - [d['name'] for d in all_library_deps if not d['supports_android']])
|
| -
|
| - if deps_require_android and not options.requires_android:
|
| - raise Exception('Some deps require building for the Android platform: ' +
|
| - str(deps_require_android))
|
| -
|
| - if deps_not_support_android and options.supports_android:
|
| - raise Exception('Not all deps support the Android platform: ' +
|
| - str(deps_not_support_android))
|
| -
|
| - if options.type in ['java_library', 'android_apk']:
|
| - javac_classpath = [c['jar_path'] for c in direct_library_deps]
|
| - java_full_classpath = [c['jar_path'] for c in all_library_deps]
|
| - deps_info['resources_deps'] = [c['path'] for c in all_resources_deps]
|
| - deps_info['jar_path'] = options.jar_path
|
| - if options.type == 'android_apk' or options.supports_android:
|
| - deps_info['dex_path'] = options.dex_path
|
| - config['javac'] = {
|
| - 'classpath': javac_classpath,
|
| - }
|
| - config['java'] = {
|
| - 'full_classpath': java_full_classpath
|
| - }
|
| -
|
| - if options.type == 'java_library':
|
| - # Only resources might have srcjars (normal srcjar targets are listed in
|
| - # srcjar_deps). A resource's srcjar contains the R.java file for those
|
| - # resources, and (like Android's default build system) we allow a library to
|
| - # refer to the resources in any of its dependents.
|
| - config['javac']['srcjars'] = [
|
| - c['srcjar'] for c in direct_resources_deps if 'srcjar' in c]
|
| -
|
| - if options.type == 'android_apk':
|
| - # Apks will get their resources srcjar explicitly passed to the java step.
|
| - config['javac']['srcjars'] = []
|
| -
|
| - if options.type == 'android_resources':
|
| - deps_info['resources_zip'] = options.resources_zip
|
| - if options.srcjar:
|
| - deps_info['srcjar'] = options.srcjar
|
| - if options.android_manifest:
|
| - manifest = AndroidManifest(options.android_manifest)
|
| - deps_info['package_name'] = manifest.GetPackageName()
|
| - if options.package_name:
|
| - deps_info['package_name'] = options.package_name
|
| - if options.r_text:
|
| - deps_info['r_text'] = options.r_text
|
| -
|
| - if options.type == 'android_resources' or options.type == 'android_apk':
|
| - config['resources'] = {}
|
| - config['resources']['dependency_zips'] = [
|
| - c['resources_zip'] for c in all_resources_deps]
|
| - config['resources']['extra_package_names'] = []
|
| - config['resources']['extra_r_text_files'] = []
|
| -
|
| - if options.type == 'android_apk':
|
| - config['resources']['extra_package_names'] = [
|
| - c['package_name'] for c in all_resources_deps if 'package_name' in c]
|
| - config['resources']['extra_r_text_files'] = [
|
| - c['r_text'] for c in all_resources_deps if 'r_text' in c]
|
| -
|
| - if options.type in ['android_apk', 'deps_dex']:
|
| - deps_dex_files = [c['dex_path'] for c in all_library_deps]
|
| -
|
| - # An instrumentation test apk should exclude the dex files that are in the apk
|
| - # under test.
|
| - if options.type == 'android_apk' and options.tested_apk_config:
|
| - tested_apk_deps = Deps([options.tested_apk_config])
|
| - tested_apk_library_deps = tested_apk_deps.All('java_library')
|
| - tested_apk_deps_dex_files = [c['dex_path'] for c in tested_apk_library_deps]
|
| - deps_dex_files = [
|
| - p for p in deps_dex_files if not p in tested_apk_deps_dex_files]
|
| -
|
| - tested_apk_config = GetDepConfig(options.tested_apk_config)
|
| - expected_tested_package = tested_apk_config['package_name']
|
| - AndroidManifest(options.android_manifest).CheckInstrumentation(
|
| - expected_tested_package)
|
| -
|
| - # Dependencies for the final dex file of an apk or a 'deps_dex'.
|
| - if options.type in ['android_apk', 'deps_dex']:
|
| - config['final_dex'] = {}
|
| - dex_config = config['final_dex']
|
| - # TODO(cjhopman): proguard version
|
| - dex_config['dependency_dex_files'] = deps_dex_files
|
| -
|
| - if options.type == 'android_apk':
|
| - config['dist_jar'] = {
|
| - 'dependency_jars': [
|
| - c['jar_path'] for c in all_library_deps
|
| - ]
|
| - }
|
| - manifest = AndroidManifest(options.android_manifest)
|
| - deps_info['package_name'] = manifest.GetPackageName()
|
| - if not options.tested_apk_config and manifest.GetInstrumentation():
|
| - # This must then have instrumentation only for itself.
|
| - manifest.CheckInstrumentation(manifest.GetPackageName())
|
| -
|
| - library_paths = []
|
| - java_libraries_list = []
|
| - if options.native_libs:
|
| - libraries = build_utils.ParseGypList(options.native_libs)
|
| - if libraries:
|
| - libraries_dir = os.path.dirname(libraries[0])
|
| - write_ordered_libraries.SetReadelfPath(options.readelf_path)
|
| - write_ordered_libraries.SetLibraryDirs([libraries_dir])
|
| - all_native_library_deps = (
|
| - write_ordered_libraries.GetSortedTransitiveDependenciesForBinaries(
|
| - libraries))
|
| - # Create a java literal array with the "base" library names:
|
| - # e.g. libfoo.so -> foo
|
| - java_libraries_list = '{%s}' % ','.join(
|
| - ['"%s"' % s[3:-3] for s in all_native_library_deps])
|
| - library_paths = map(
|
| - write_ordered_libraries.FullLibraryPath, all_native_library_deps)
|
| -
|
| - config['native'] = {
|
| - 'libraries': library_paths,
|
| - 'java_libraries_list': java_libraries_list
|
| - }
|
| -
|
| - build_utils.WriteJson(config, options.build_config, only_if_changed=True)
|
| -
|
| - if options.depfile:
|
| - build_utils.WriteDepfile(
|
| - options.depfile,
|
| - deps.AllConfigPaths() + build_utils.GetPythonDependencies())
|
| -
|
| -
|
| -if __name__ == '__main__':
|
| - sys.exit(main(sys.argv[1:]))
|
|
|