blob: 320b9f2ccab344f65e3893e56fb3dc3e3b22ce29 [file] [log] [blame]
# Copyright 2015 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("//build/util/java_action.gni")
declare_args() {
# Control whether the JavaScript files shipped with Chrome on iOS are
# compiled with closure_compiler or not. Useful for debugging.
compile_javascript = true
}
closure_compiler_path = "//third_party/closure_compiler/compiler/compiler.jar"
# Defines a target that create a JavaScript bundle using the closure compiler.
#
# Variables
# sources:
# List of JavaScript files to compile into the bundle.
#
# closure_entry_point:
# Name of the entry point closure module.
#
# deps (optional)
# List of targets required by this target.
#
# visibility (optional)
# Visibility restrictions.
#
# Generates a single JavaScript bundle file that can be put in the application
# bundle.
#
# TODO(crbug.com/487804): once all errors have been fixed, sync with the flags
# from third_party/closure_compiler/closure_args.gni.
template("js_compile_bundle") {
assert(defined(invoker.sources),
"Need sources in $target_name listing the js files.")
assert(defined(invoker.closure_entry_point),
"Need closure_entry_point in $target_name for generated js file.")
_target_name = target_name
compile_js_target_name = target_name + "_compile_js"
java_action(compile_js_target_name) {
visibility = [ ":$_target_name" ]
script = closure_compiler_path
sources = invoker.sources
outputs = [
"$target_gen_dir/$_target_name.js",
]
args = [
"--compilation_level",
"SIMPLE_OPTIMIZATIONS",
"--js_output_file",
rebase_path("$target_gen_dir/$_target_name.js", root_build_dir),
"--only_closure_dependencies",
"--closure_entry_point",
invoker.closure_entry_point,
"--js",
] + rebase_path(sources, root_build_dir)
}
bundle_data(target_name) {
forward_variables_from(invoker,
[
"data_deps",
"deps",
"public_deps",
"visibility",
])
if (!defined(public_deps)) {
public_deps = []
}
public_deps += [ ":$compile_js_target_name" ]
sources = get_target_outputs(":$compile_js_target_name")
outputs = [
"{{bundle_resources_dir}}/{{source_file_part}}",
]
}
}
# Defines a target that compile JavaScript files with error checking using the
# closure compiler.
#
# Variables
# sources:
# List of JavaScript files to compile.
#
# deps (optional)
# List of targets required by this target.
#
# visibility (optional)
# Visibility restrictions.
#
# TODO(crbug.com/487804): once all errors have been fixed, sync with the flags
# from third_party/closure_compiler/closure_args.gni.
template("js_compile_checked") {
assert(defined(invoker.sources),
"Need sources in $target_name listing the js files.")
if (compile_javascript) {
_target_name = target_name
compile_js_target_name = target_name + "_compile_js"
java_action_foreach(compile_js_target_name) {
visibility = [ ":$_target_name" ]
script = closure_compiler_path
sources = invoker.sources
outputs = [
"$target_gen_dir/{{source_file_part}}",
]
args = [
"--compilation_level",
"SIMPLE_OPTIMIZATIONS",
"--jscomp_error=checkTypes",
"--jscomp_error=checkVars",
"--jscomp_error=missingProperties",
"--jscomp_error=undefinedVars",
"--jscomp_error=accessControls",
"--jscomp_error=ambiguousFunctionDecl",
"--jscomp_error=constantProperty",
"--jscomp_error=deprecated",
"--jscomp_error=externsValidation",
"--jscomp_error=globalThis",
"--jscomp_error=invalidCasts",
"--jscomp_error=missingReturn",
"--jscomp_error=nonStandardJsDocs",
"--jscomp_error=suspiciousCode",
"--jscomp_error=undefinedNames",
"--jscomp_error=unknownDefines",
"--jscomp_error=uselessCode",
"--jscomp_error=visibility",
"--module_output_path_prefix",
rebase_path(target_gen_dir, root_build_dir) + "/",
"--js",
rebase_path("//ios/web/web_state/js/resources/base.js", root_build_dir),
"--module",
"base_module:1",
"--js",
rebase_path("//ios/web/web_state/js/resources/common.js",
root_build_dir),
"--module",
"common_module:1:base_module",
"--js",
rebase_path("//ios/web/web_state/js/resources/message.js",
root_build_dir),
"--module",
"message_module:1:common_module",
"--js",
"{{source}}",
"--module",
"{{source_name_part}}:1:common_module:message_module",
]
}
bundle_data(target_name) {
forward_variables_from(invoker,
[
"data_deps",
"deps",
"public_deps",
"visibility",
])
if (!defined(public_deps)) {
public_deps = []
}
public_deps += [ ":$compile_js_target_name" ]
sources = get_target_outputs(":$compile_js_target_name")
outputs = [
"{{bundle_resources_dir}}/{{source_file_part}}",
]
}
} else {
bundle_data(target_name) {
forward_variables_from(invoker,
[
"data_deps",
"deps",
"public_deps",
"visibility",
])
sources = invoker.sources
outputs = [
"{{bundle_resources_dir}}/{{source_file_part}}",
]
}
}
}
# Defines a target that compile JavaScript files without error checking using
# the closure compiler.
#
# Variables
# sources:
# List of JavaScript files to compile.
#
# deps (optional)
# List of targets required by this target.
#
# visibility (optional)
# Visibility restrictions.
#
# TODO(crbug.com/487804): once all errors have been fixed, remove this template
# and port all code to use js_compile_checked instead.
template("js_compile_unchecked") {
assert(defined(invoker.sources),
"Need sources in $target_name listing the js files.")
if (compile_javascript) {
_target_name = target_name
compile_js_target_name = target_name + "_compile_js"
java_action_foreach(compile_js_target_name) {
visibility = [ ":$_target_name" ]
script = closure_compiler_path
sources = invoker.sources
outputs = [
"$target_gen_dir/{{source_file_part}}",
]
args = [
"--compilation_level",
"SIMPLE_OPTIMIZATIONS",
"--js",
"{{source}}",
"--js_output_file",
rebase_path("$target_gen_dir/{{source_file_part}}", root_build_dir),
]
}
bundle_data(target_name) {
forward_variables_from(invoker,
[
"data_deps",
"deps",
"public_deps",
"visibility",
])
if (!defined(public_deps)) {
public_deps = []
}
public_deps += [ ":$compile_js_target_name" ]
sources = get_target_outputs(":$compile_js_target_name")
outputs = [
"{{bundle_resources_dir}}/{{source_file_part}}",
]
}
} else {
bundle_data(target_name) {
forward_variables_from(invoker,
[
"data_deps",
"deps",
"public_deps",
"visibility",
])
sources = invoker.sources
outputs = [
"{{bundle_resources_dir}}/{{source_file_part}}",
]
}
}
}