blob: d63c7bf94a5a7c0076bc0a0619ee26e793b2ecea [file] [log] [blame]
# 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"
]
}
}