diff options
Diffstat (limited to 'chromium/build/config/android/rules.gni')
-rw-r--r-- | chromium/build/config/android/rules.gni | 240 |
1 files changed, 240 insertions, 0 deletions
diff --git a/chromium/build/config/android/rules.gni b/chromium/build/config/android/rules.gni new file mode 100644 index 00000000000..d63c7bf94a5 --- /dev/null +++ b/chromium/build/config/android/rules.gni @@ -0,0 +1,240 @@ +# 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. + +import("config.gni") +import("internal_rules.gni") + +# Declare a jni target +# +# This target generates the native jni bindings for a set of .java files. +# +# See base/android/jni_generator/jni_generator.py for more info about the +# format of generating JNI bindings. +# +# Variables +# sources: list of .java files to generate jni for +# jni_package: subdirectory path for generated bindings +# +# Example +# generate_jni("foo_jni") { +# sources = [ +# "android/java/src/org/chromium/foo/Foo.java", +# "android/java/src/org/chromium/foo/FooUtil.java", +# ] +# jni_package = "foo" +# } +template("generate_jni") { + assert(defined(invoker.sources)) + assert(defined(invoker.jni_package)) + jni_package = invoker.jni_package + base_output_dir = "${root_gen_dir}/${target_name}/${jni_package}" + jni_output_dir = "${base_output_dir}/jni" + + jni_generator_include = "//base/android/jni_generator/jni_generator_helper.h" + + foreach_target_name = "${target_name}__jni_gen" + action_foreach(foreach_target_name) { + script = "//base/android/jni_generator/jni_generator.py" + sources = invoker.sources + source_prereqs = [ jni_generator_include ] + outputs = [ + "${jni_output_dir}/{{source_name_part}}_jni.h" + ] + + args = [ + "--input_file={{source}}", + "--optimize_generation=1", + "--ptr_type=long", + "--output_dir", rebase_path(jni_output_dir, root_build_dir), + "--includes", rebase_path(jni_generator_include, "//"), + ] + if (defined(invoker.jni_generator_jarjar_file)) { + args += [ + "--jarjar", rebase_path(jni_generator_jarjar_file, root_build_dir), + ] + } + } + + config("jni_includes_${target_name}") { + include_dirs = [ base_output_dir ] + } + + group(target_name) { + deps = [ ":$foreach_target_name" ] + direct_dependent_configs = [ ":jni_includes_${target_name}" ] + + if (defined(invoker.deps)) { + deps += invoker.deps + } + if (defined(invoker.forward_dependent_configs_from)) { + forward_dependent_configs_from = invoker.forward_dependent_configs_from + } + } +} + + +# Declare a jni target for a prebuilt jar +# +# This target generates the native jni bindings for a set of classes in a .jar. +# +# See base/android/jni_generator/jni_generator.py for more info about the +# format of generating JNI bindings. +# +# Variables +# classes: list of .class files in the jar to generate jni for. These should +# include the full path to the .class file. +# jni_package: subdirectory path for generated bindings +# jar_file: the path to the .jar. If not provided, will default to the sdk's +# android.jar +# +# Example +# generate_jar_jni("foo_jni") { +# classes = [ +# "android/view/Foo.class", +# ] +# jni_package = "foo" +# } +template("generate_jar_jni") { + assert(defined(invoker.classes)) + assert(defined(invoker.jni_package)) + + if (defined(invoker.jar_file)) { + jar_file = invoker.jar_file + } else { + jar_file = android_sdk_jar + } + + jni_package = invoker.jni_package + base_output_dir = "${root_gen_dir}/${target_name}/${jni_package}" + jni_output_dir = "${base_output_dir}/jni" + + jni_generator_include = + rebase_path("//base/android/jni_generator/jni_generator_helper.h", + root_build_dir) + + # TODO(cjhopman): make jni_generator.py support generating jni for multiple + # .class files from a .jar. + jni_actions = [] + foreach(class, invoker.classes) { + classname_list = process_file_template( + [class], "{{source_name_part}}") + classname = classname_list[0] + jni_target_name = "${target_name}__jni_${classname}" + jni_actions += [ ":$jni_target_name" ] + action(jni_target_name) { + script = "//base/android/jni_generator/jni_generator.py" + sources = [ + jni_generator_include, + jar_file, + ] + outputs = [ + "${jni_output_dir}/${classname}_jni.h" + ] + + args = [ + "--jar_file", rebase_path(jar_file, root_build_dir), + "--input_file", class, + "--optimize_generation=1", + "--ptr_type=long", + "--output_dir", rebase_path(jni_output_dir, root_build_dir), + "--includes", rebase_path(jni_generator_include, "//"), + ] + } + } + + config("jni_includes_${target_name}") { + include_dirs = [ base_output_dir ] + } + + group(target_name) { + deps = jni_actions + if (defined(invoker.deps)) { + deps += invoker.deps + } + if (defined(invoker.forward_dependent_configs_from)) { + forward_dependent_configs_from = invoker.forward_dependent_configs_from + } + direct_dependent_configs = [ ":jni_includes_${target_name}" ] + } +} + +# Declare a target for c-preprocessor-generated java files +# +# This target generates java files using the host C pre-processor. Each file in +# sources will be compiled using the C pre-processor. If include_path is +# specified, it will be passed (with --I) to the pre-processor. +# +# This target will create a single .srcjar. Adding this target to a library +# target's srcjar_deps will make the generated java files be included in that +# library's final outputs. +# +# Variables +# sources: list of files to be processed by the C pre-processor. For each +# file in sources, there will be one .java file in the final .srcjar. For a +# file named FooBar.template, a java file will be created with name +# FooBar.java. +# source_prereqs: additional compile-time dependencies. Any files +# `#include`-ed in the templates should be listed here. +# package_name: this will be the subdirectory for each .java file in the .srcjar. +# +# Example +# java_cpp_template("foo_generated_enum") { +# sources = [ +# "android/java/templates/Foo.template", +# ] +# source_prereqs = [ +# "android/java/templates/native_foo_header.h", +# ] +# +# package_name = "org/chromium/base/library_loader" +# include_path = "android/java/templates" +# } +template("java_cpp_template") { + assert(defined(invoker.sources)) + package_name = invoker.package_name + "" + + if (defined(invoker.include_path)) { + include_path = invoker.include_path + "" + } else { + include_path = "//" + } + + action_foreach("${target_name}__apply_gcc") { + script = "//build/android/gyp/gcc_preprocess.py" + if (defined(invoker.source_prereqs)) { + source_prereqs = invoker.source_prereqs + [] + } + + sources = invoker.sources + + gen_dir = "${target_gen_dir}/${package_name}" + gcc_template_output_pattern = "${gen_dir}/{{source_name_part}}.java" + + outputs = [ + gcc_template_output_pattern + ] + + args = [ + "--include-path", rebase_path(include_path, root_build_dir), + "--output", rebase_path(gen_dir, root_build_dir) + "/{{source_name_part}}.java", + "--template={{source}}", + ] + } + + apply_gcc_outputs = get_target_outputs(":${target_name}__apply_gcc") + base_gen_dir = get_label_info(":${target_name}__apply_gcc", "target_gen_dir") + + srcjar_path = "${target_gen_dir}/${target_name}.srcjar" + zip("${target_name}__zip_srcjar") { + inputs = apply_gcc_outputs + output = srcjar_path + base_dir = base_gen_dir + } + + group(target_name) { + deps = [ + ":${target_name}__zip_srcjar" + ] + } +} |