| 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
|
| index ff12a1ed7ca4641141787987ec4611fcb4b9d9f9..794e6a321018d0bbc82977fe7b73439222f3cef0 100755
|
| --- a/build/android/gyp/write_build_config.py
|
| +++ b/build/android/gyp/write_build_config.py
|
| @@ -10,16 +10,17 @@ 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 target's that depend on that one.
|
| +other targets that depend on that one.
|
|
|
| There are several different types of build_configs:
|
| android_library: An android library containing java code.
|
| + android_resources: A target containing android resources.
|
|
|
| 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=@(build_config_path):javac:classpath
|
| + --python-arg=@(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
|
| @@ -35,17 +36,40 @@ import sys
|
|
|
| from util import build_utils
|
|
|
| +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 Deps(path):
|
| + return set(GetDepConfig(path)['deps_configs'])
|
| + return build_utils.GetSortedTransitiveDependencies(deps_config_paths, Deps)
|
| +
|
| +
|
| 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.')
|
| + 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.')
|
| +
|
| # android_library options
|
| parser.add_option('--jar-path', help='Path to target\'s jar output.')
|
|
|
| @@ -57,37 +81,67 @@ def main(argv):
|
| required_options = ('build_config', 'type')
|
| build_utils.CheckOptions(options, parser, required_options)
|
|
|
| + if not options.type in [
|
| + 'android_library', 'android_resources']:
|
| + raise Exception('Unknown type: <%s>' % options.type)
|
| +
|
| if options.type == 'android_library':
|
| required_options = ('jar_path',)
|
| build_utils.CheckOptions(options, parser, required_options)
|
|
|
| - deps_configs = build_utils.ParseGypList(options.possible_deps_configs)
|
| - for c in deps_configs:
|
| + possible_deps_configs = build_utils.ParseGypList(
|
| + options.possible_deps_configs)
|
| + for c in possible_deps_configs:
|
| if not os.path.exists(c):
|
| # Currently we only allow deps to things that write build_config files.
|
| raise Exception('Unknown dep type: ' + c)
|
|
|
| - deps_configs = [build_utils.ReadJson(c) for c in deps_configs]
|
| + direct_deps_config_paths = possible_deps_configs
|
| + all_deps_config_paths = GetAllDepsConfigsInOrder(direct_deps_config_paths)
|
|
|
| - if options.type == 'android_library':
|
| - javac_classpath = [c['outputs']['jar_path'] for c in deps_configs]
|
| - config = {
|
| - 'outputs': {
|
| - 'jar_path': options.jar_path
|
| - },
|
| - 'javac': {
|
| - 'classpath': javac_classpath
|
| - }
|
| + direct_deps_configs = [GetDepConfig(p) for p in direct_deps_config_paths]
|
| + all_deps_configs = [GetDepConfig(p) for p in all_deps_config_paths]
|
| +
|
| + direct_library_deps = DepsOfType('android_library', direct_deps_configs)
|
| + all_resources_deps = DepsOfType('android_resources', all_deps_configs)
|
| +
|
| + # Initialize some common config.
|
| + config = {
|
| + 'deps_info': {
|
| + 'path': options.build_config,
|
| + 'type': options.type,
|
| + 'deps_configs': direct_deps_config_paths,
|
| }
|
| - else:
|
| - raise Exception('Unknown type: ' + options.type)
|
| + }
|
| + deps_info = config['deps_info']
|
|
|
| - build_utils.WriteJson(config, options.build_config)
|
| + if options.type == 'android_library':
|
| + javac_classpath = [c['jar_path'] for c in direct_library_deps]
|
| + deps_info['jar_path'] = options.jar_path
|
| + config['javac'] = {
|
| + 'classpath': javac_classpath,
|
| + }
|
| + # 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 all_resources_deps if 'srcjar' in c]
|
| +
|
| + if options.type == 'android_resources':
|
| + deps_info['resources_zip'] = options.resources_zip
|
| + if options.srcjar:
|
| + deps_info['srcjar'] = options.srcjar
|
| + config['resources'] = {}
|
| + config['resources']['dependency_zips'] = [
|
| + c['resources_zip'] for c in all_resources_deps]
|
| +
|
| + build_utils.WriteJson(config, options.build_config, only_if_changed=True)
|
|
|
| if options.depfile:
|
| build_utils.WriteDepfile(
|
| options.depfile,
|
| - build_utils.GetPythonDependencies())
|
| + all_deps_config_paths + build_utils.GetPythonDependencies())
|
|
|
|
|
| if __name__ == '__main__':
|
|
|