Index: build/config/android/rules.gni |
diff --git a/build/config/android/rules.gni b/build/config/android/rules.gni |
index d28c4814531ffe2e742a605a10de70fbddd468fc..ed07e14fb5d68a654638421aaa6ab8e6475faa2f 100644 |
--- a/build/config/android/rules.gni |
+++ b/build/config/android/rules.gni |
@@ -640,6 +640,153 @@ template("java_strings_grd_prebuilt") { |
} |
} |
+# Declare a Java executable target |
+# |
+# This target creates an executable from java code and libraries. The executable |
+# will be in the output folder's /bin/ directory. |
+# |
+# Variables |
+# deps: Specifies the dependencies of this target. Java targets in this list |
+# will be included in the executable (and the javac classpath). |
+# |
+# java_files: List of .java files included in this library. |
+# srcjar_deps: List of srcjar dependencies. The .java files in the srcjars |
+# will be added to java_files and be included in this library. |
+# srcjars: List of srcjars to be included in this library, together with the |
+# ones obtained from srcjar_deps. |
+# |
+# chromium_code: If true, extra analysis warning/errors will be enabled. |
+# |
+# datadeps, testonly |
+# |
+# Example |
+# java_library("foo") { |
+# java_files = [ "org/chromium/foo/FooMain.java" ] |
+# deps = [ ":bar_java" ] |
+# main_class = "org.chromium.foo.FooMain" |
+# } |
+template("java_binary") { |
+ # TODO(cjhopman): This should not act like a java_library for dependents (i.e. |
+ # dependents shouldn't get the jar in their classpath, etc.). |
+ java_library_impl(target_name) { |
+ if (defined(invoker.DEPRECATED_java_in_dir)) { DEPRECATED_java_in_dir = invoker.DEPRECATED_java_in_dir } |
+ if (defined(invoker.chromium_code)) { chromium_code = invoker.chromium_code } |
+ if (defined(invoker.datadeps)) { deps = invoker.datadeps } |
+ if (defined(invoker.deps)) { deps = invoker.deps } |
+ if (defined(invoker.java_files)) { java_files = invoker.java_files } |
+ if (defined(invoker.srcjar_deps)) { srcjar_deps = invoker.srcjar_deps } |
+ if (defined(invoker.srcjars)) { srcjars = invoker.srcjars } |
+ if (defined(invoker.testonly)) { testonly = invoker.testonly } |
+ |
+ main_class = invoker.main_class |
+ } |
+} |
+ |
+ |
+# Declare an java library target |
+# |
+# Variables |
+# deps: Specifies the dependencies of this target. Java targets in this list |
+# will be added to the javac classpath. |
+# |
+# java_files: List of .java files included in this library. |
+# srcjar_deps: List of srcjar dependencies. The .java files in the srcjars |
+# will be added to java_files and be included in this library. |
+# srcjars: List of srcjars to be included in this library, together with the |
+# ones obtained from srcjar_deps. |
+# DEPRECATED_java_in_dir: Directory containing java files. All .java files in |
+# this directory will be included in the library. This is only supported to |
+# ease the gyp->gn conversion and will be removed in the future. |
+# |
+# chromium_code: If true, extra analysis warning/errors will be enabled. |
+# jar_excluded_patterns: List of patterns of .class files to exclude from the |
+# final jar. |
+# |
+# proguard_preprocess: If true, proguard preprocessing will be run. This can |
+# be used to remove unwanted parts of the library. |
+# proguard_config: Path to the proguard config for preprocessing. |
+# |
+# supports_android: If true, Android targets (android_library, android_apk) |
+# may depend on this target. Note: if true, this target must only use the |
+# subset of Java available on Android. |
+# requires_android_platform: If true, this library may depend on |
+# android-specific targets. If this is the case, there should be some |
+# android-platform-like implementation available at runtime (Android, |
+# robolectric, etc). |
+# |
+# datadeps, testonly |
+# |
+# Example |
+# java_library("foo_java") { |
+# java_files = [ |
+# "org/chromium/foo/Foo.java", |
+# "org/chromium/foo/FooInterface.java", |
+# "org/chromium/foo/FooService.java", |
+# ] |
+# deps = [ |
+# ":bar_java" |
+# ] |
+# srcjar_deps = [ |
+# ":foo_generated_enum" |
+# ] |
+# jar_excluded_patterns = [ |
+# "*/FooService.class", "*/FooService##*.class" |
+# ] |
+# } |
+template("java_library") { |
+ java_library_impl(target_name) { |
+ if (defined(invoker.DEPRECATED_java_in_dir)) { DEPRECATED_java_in_dir = invoker.DEPRECATED_java_in_dir } |
+ if (defined(invoker.chromium_code)) { chromium_code = invoker.chromium_code } |
+ if (defined(invoker.datadeps)) { deps = invoker.datadeps } |
+ if (defined(invoker.deps)) { deps = invoker.deps } |
+ if (defined(invoker.jar_excluded_patterns)) { jar_excluded_patterns = invoker.jar_excluded_patterns } |
+ if (defined(invoker.java_files)) { java_files = invoker.java_files } |
+ if (defined(invoker.proguard_config)) { proguard_config = invoker.proguard_config } |
+ if (defined(invoker.proguard_preprocess)) { proguard_preprocess = invoker.proguard_preprocess } |
+ if (defined(invoker.srcjar_deps)) { srcjar_deps = invoker.srcjar_deps } |
+ if (defined(invoker.srcjars)) { srcjars = invoker.srcjars } |
+ if (defined(invoker.testonly)) { testonly = invoker.testonly } |
+ if (defined(invoker.jar_path)) { jar_path = invoker.jar_path } |
+ |
+ if (defined(invoker.supports_android) && invoker.supports_android) { |
+ supports_android = true |
+ } |
+ if (defined(invoker.requires_android_platform) |
+ && invoker.requires_android_platform) { |
+ supports_android = true |
+ requires_android = true |
+ } |
+ } |
+} |
+ |
+ |
+# Declare an java library target for a prebuilt jar |
+# |
+# Variables |
+# deps: Specifies the dependencies of this target. Java targets in this list |
+# will be added to the javac classpath. |
+# jar_path: Path to the prebuilt jar. |
+# proguard_preprocess: If true, proguard preprocessing will be run. This can |
+# be used to remove unwanted parts of the library. |
+# proguard_config: Path to the proguard config for preprocessing. |
+# |
+# Example |
+# java_prebuilt("foo_java") { |
+# jar_path = "foo.jar" |
+# deps = [ |
+# ":foo_resources", |
+# ":bar_java" |
+# ] |
+# } |
+template("java_prebuilt") { |
+ java_prebuilt_impl(target_name) { |
+ jar_path = invoker.jar_path |
+ if (defined(invoker.testonly)) { testonly = invoker.testonly } |
+ if (defined(invoker.deps)) { deps = invoker.deps } |
+ if (defined(invoker.proguard_config)) { proguard_config = invoker.proguard_config } |
+ if (defined(invoker.proguard_preprocess)) { proguard_preprocess = invoker.proguard_preprocess } |
+ } |
+} |
# Declare an Android library target |
# |
@@ -650,21 +797,24 @@ template("java_strings_grd_prebuilt") { |
# deps: Specifies the dependencies of this target. Java targets in this list |
# will be added to the javac classpath. Android resources in dependencies |
# will be used when building this library. |
+# |
# java_files: List of .java files included in this library. |
# srcjar_deps: List of srcjar dependencies. The .java files in the srcjars |
# will be added to java_files and be included in this library. |
# srcjars: List of srcjars to be included in this library, together with the |
# ones obtained from srcjar_deps. |
+# DEPRECATED_java_in_dir: Directory containing java files. All .java files in |
+# this directory will be included in the library. This is only supported to |
+# ease the gyp->gn conversion and will be removed in the future. |
+# |
# chromium_code: If true, extra analysis warning/errors will be enabled. |
# jar_excluded_patterns: List of patterns of .class files to exclude from the |
# final jar. |
+# |
# proguard_preprocess: If true, proguard preprocessing will be run. This can |
# be used to remove unwanted parts of the library. |
# proguard_config: Path to the proguard config for preprocessing. |
# |
-# DEPRECATED_java_in_dir: Directory containing java files. All .java files in |
-# this directory will be included in the library. This is only supported to |
-# ease the gyp->gn conversion and will be removed in the future. |
# |
# Example |
# android_library("foo_java") { |
@@ -684,133 +834,33 @@ template("java_strings_grd_prebuilt") { |
# ] |
# } |
template("android_library") { |
- if (defined(invoker.testonly)) { testonly = invoker.testonly } |
- |
- assert(defined(invoker.java_files) || defined(invoker.DEPRECATED_java_in_dir) |
- || defined(invoker.srcjars) || defined(invoker.srcjar_deps)) |
- _base_path = "$target_gen_dir/$target_name" |
- _build_config = _base_path + ".build_config" |
- _jar_path = _base_path + ".jar" |
- if (defined(invoker.dex_path)) { |
- _dex_path = invoker.dex_path |
- } else { |
- _dex_path = _base_path + ".dex.jar" |
- } |
- |
- write_build_config("${target_name}__build_config") { |
- type = "android_library" |
- |
- deps = [] |
- if (defined(invoker.deps)) { |
- deps += invoker.deps |
- } |
- |
- build_config = _build_config |
- jar_path = _jar_path |
- dex_path = _dex_path |
- } |
- |
- _chromium_code = true |
- if (defined(invoker.chromium_code)) { |
- _chromium_code = invoker.chromium_code |
- } |
- |
- android_java_library(target_name) { |
- chromium_code = _chromium_code |
- if (defined(invoker.java_files)) { |
- java_files = invoker.java_files |
- } else if (defined(invoker.DEPRECATED_java_in_dir)) { |
- DEPRECATED_java_in_dir = invoker.DEPRECATED_java_in_dir |
- } |
- build_config = _build_config |
- jar_path = _jar_path |
- dex_path = _dex_path |
- |
- if (defined(invoker.proguard_preprocess) && invoker.proguard_preprocess) { |
- proguard_preprocess = true |
- proguard_config = invoker.proguard_config |
- } |
- |
- jar_excluded_patterns = [ |
+ assert(!defined(invoker.jar_path), |
+ "android_library does not support a custom jar path") |
+ java_library_impl(target_name) { |
+ if (defined(invoker.DEPRECATED_java_in_dir)) { DEPRECATED_java_in_dir = invoker.DEPRECATED_java_in_dir } |
+ if (defined(invoker.chromium_code)) { chromium_code = invoker.chromium_code } |
+ if (defined(invoker.datadeps)) { deps = invoker.datadeps } |
+ if (defined(invoker.deps)) { deps = invoker.deps } |
+ if (defined(invoker.jar_excluded_patterns)) { jar_excluded_patterns = invoker.jar_excluded_patterns } |
+ if (defined(invoker.java_files)) { java_files = invoker.java_files } |
+ if (defined(invoker.proguard_config)) { proguard_config = invoker.proguard_config } |
+ if (defined(invoker.proguard_preprocess)) { proguard_preprocess = invoker.proguard_preprocess } |
+ if (defined(invoker.srcjar_deps)) { srcjar_deps = invoker.srcjar_deps } |
+ if (defined(invoker.srcjars)) { srcjars = invoker.srcjars } |
+ if (defined(invoker.testonly)) { testonly = invoker.testonly } |
+ if (defined(invoker.dex_path)) { dex_path = invoker.dex_path } |
+ |
+ supports_android = true |
+ requires_android = true |
+ |
+ if (!defined(jar_excluded_patterns)) { jar_excluded_patterns = [] } |
+ jar_excluded_patterns += [ |
"*/R.class", "*/R##*.class", |
"*/Manifest.class", "*/Manifest##*.class", |
] |
- if (defined(invoker.jar_excluded_patterns)) { |
- jar_excluded_patterns += invoker.jar_excluded_patterns |
- } |
- |
- if (defined(invoker.srcjar_deps)) { |
- srcjar_deps = invoker.srcjar_deps |
- } |
- if (defined(invoker.srcjars)) { |
- srcjars = invoker.srcjars |
- } |
} |
} |
-template("java_library") { |
- if (defined(invoker.testonly)) { testonly = invoker.testonly } |
- |
- assert(defined(invoker.java_files) || defined(invoker.DEPRECATED_java_in_dir) |
- || defined(invoker.srcjars)) |
- |
- _srcjar_deps = [] |
- if (defined(invoker.srcjar_deps)) { |
- _srcjar_deps = invoker.srcjar_deps |
- } |
- |
- _srcjars = [] |
- if (defined(invoker.srcjars)) { |
- _srcjars = invoker.srcjars |
- } |
- |
- _java_files = [] |
- if (defined(invoker.java_files)) { |
- _java_files = invoker.java_files |
- } else if (defined(invoker.DEPRECATED_java_in_dir)) { |
- _src_dir = invoker.DEPRECATED_java_in_dir + "/src" |
- _src_dir_exists = exec_script("//build/dir_exists.py", |
- [ rebase_path(_src_dir, root_build_dir) ], |
- "string") |
- assert(_src_dir_exists == "False", |
- "In GN, java_in_dir should be the fully specified java directory " + |
- "(i.e. including the trailing \"/src\")") |
- |
- _java_files_build_rel = exec_script( |
- "//build/android/gyp/find.py", |
- [ |
- "--pattern", |
- "*.java", |
- rebase_path(invoker.DEPRECATED_java_in_dir, root_build_dir) |
- ], |
- "list lines" |
- ) |
- _java_files = rebase_path(_java_files_build_rel, ".", root_build_dir) |
- } |
- assert(_java_files != [] || _srcjar_deps != [] || _srcjars != []) |
- |
- # TODO(cjhopman): Write a proper build config so that java library |
- # dependencies work correctly. |
- _build_config = "$target_gen_dir/$target_name.build_config" |
- write_file( |
- _build_config, |
- "{ \"javac\": { \"classpath\": [], \"srcjars\": [] } }") |
- |
- _jar_path = "$root_build_dir/lib.java/$target_name.jar" |
- if (defined(invoker.jar_path)) { |
- _jar_path = invoker.jar_path |
- } |
- |
- compile_java(target_name) { |
- build_config = _build_config |
- jar_path = _jar_path |
- java_files = _java_files |
- srcjar_deps = _srcjar_deps |
- srcjars = _srcjars |
- } |
-} |
- |
- |
# Declare an Android library target for a prebuilt jar |
# |
# This target creates an Android library containing java code and Android |
@@ -834,47 +884,14 @@ template("java_library") { |
# ] |
# } |
template("android_java_prebuilt") { |
- if (defined(invoker.testonly)) { testonly = invoker.testonly } |
- |
- assert(defined(invoker.jar_path)) |
- _base_path = "${target_gen_dir}/$target_name" |
- _jar_path = _base_path + ".jar" |
- _dex_path = _base_path + ".dex.jar" |
- _build_config = _base_path + ".build_config" |
- |
- write_build_config("${target_name}__build_config") { |
- type = "android_library" |
- |
- deps = [] |
- if (defined(invoker.deps)) { |
- deps += invoker.deps |
- } |
- build_config = _build_config |
- jar_path = _jar_path |
- dex_path = _dex_path |
- } |
- |
- java_prebuilt("${target_name}__process_jar") { |
- if (defined(invoker.proguard_preprocess) && invoker.proguard_preprocess) { |
- proguard_preprocess = true |
- proguard_config = invoker.proguard_config |
- } |
- |
- build_config = _build_config |
- input_jar_path = invoker.jar_path |
- output_jar_path = _jar_path |
- } |
- |
- dex("${target_name}__dex") { |
- sources = [_jar_path] |
- output = _dex_path |
- } |
- |
- group(target_name) { |
- deps = [ |
- ":${target_name}__build_config", |
- ":${target_name}__dex", |
- ] |
+ java_prebuilt_impl(target_name) { |
+ jar_path = invoker.jar_path |
+ supports_android = true |
+ requires_android = true |
+ if (defined(invoker.testonly)) { testonly = invoker.testonly } |
+ if (defined(invoker.deps)) { deps = invoker.deps } |
+ if (defined(invoker.proguard_config)) { proguard_config = invoker.proguard_config } |
+ if (defined(invoker.proguard_preprocess)) { proguard_preprocess = invoker.proguard_preprocess } |
} |
} |
@@ -934,7 +951,7 @@ template("android_apk") { |
assert(defined(invoker.final_apk_path) || defined(invoker.apk_name)) |
gen_dir = "$target_gen_dir/$target_name" |
base_path = "$gen_dir/$target_name" |
- build_config = "$base_path.build_config" |
+ _build_config = "$base_path.build_config" |
resources_zip_path = "$base_path.resources.zip" |
all_resources_zip_path = "$base_path.resources.all.zip" |
jar_path = "$base_path.jar" |
@@ -1009,12 +1026,13 @@ template("android_apk") { |
} |
} |
- _rebased_build_config = rebase_path(build_config, root_build_dir) |
+ _rebased_build_config = rebase_path(_build_config, root_build_dir) |
write_build_config("${_template_name}__build_config") { |
type = "android_apk" |
dex_path = final_dex_path |
resources_zip = resources_zip_path |
+ build_config = _build_config |
if (defined(invoker.deps)) { |
deps = invoker.deps |
@@ -1032,6 +1050,7 @@ template("android_apk") { |
resource_dirs = ["//build/android/ant/empty/res"] |
zip_path = resources_zip_path |
generate_constant_ids = true |
+ build_config = _build_config |
} |
_srcjar_deps += [":${_template_name}__process_resources"] |
@@ -1049,7 +1068,7 @@ template("android_apk") { |
"//base/android/java/templates/NativeLibraries.template", |
] |
inputs = [ |
- build_config, |
+ _build_config, |
] |
defines = [ |
@@ -1071,8 +1090,12 @@ template("android_apk") { |
} |
final_deps += [ ":${_template_name}__java" ] |
- android_java_library("${_template_name}__java") { |
+ java_library_impl("${_template_name}__java") { |
+ supports_android = true |
+ requires_android = true |
+ override_build_config = _build_config |
android_manifest = invoker.android_manifest |
+ chromium_code = true |
if (defined(invoker.java_files)) { |
java_files = invoker.java_files |
} else if (defined(invoker.DEPRECATED_java_in_dir)) { |
@@ -1092,7 +1115,7 @@ template("android_apk") { |
action("${_template_name}__create_dist_jar") { |
script = "//build/android/gyp/create_dist_jar.py" |
depfile = "$target_gen_dir/$target_name.d" |
- inputs = [ build_config ] |
+ inputs = [ _build_config ] |
outputs = [ |
depfile, |
_dist_jar_path, |
@@ -1114,7 +1137,7 @@ template("android_apk") { |
dex("${_template_name}__final_dex") { |
deps = [ ":${_template_name}__java" ] |
sources = [ jar_path ] |
- inputs = [ build_config ] |
+ inputs = [ _build_config ] |
output = final_dex_path |
dex_arg_key = "${_rebased_build_config}:apk_dex:dependency_dex_files" |
args = [ "--inputs=@FileArg($dex_arg_key)" ] |
@@ -1129,7 +1152,7 @@ template("android_apk") { |
depfile |
] |
inputs = [ |
- build_config |
+ _build_config |
] |
deps = [] |
skip_packing_list = [ |