blob: c7051bb926d89ee8d7fb4fcb5841ea9e8c9572e3 [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" ]
forward_variables_from(invoker, [ "testonly" ])
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",
"testonly",
"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.
#
# js_modules
# List of JS files defining modules that are required by the sources.
# The list must be sorted in dependency order.
# This is based on
# https://github.com/google/closure-compiler/wiki/JS-Modules
# https://stackoverflow.com/questions/10395810/how-do-i-split-my-javascript-into-modules-using-googles-closure-compiler/10401030#10401030
#
# 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" ]
forward_variables_from(invoker, [ "testonly" ])
script = closure_compiler_path
sources = invoker.sources
_js_modules = [
"//ios/web/web_state/js/resources/base.js",
"//ios/web/web_state/js/resources/common.js",
"//ios/web/js_messaging/resources/message.js",
]
if (defined(invoker.js_modules)) {
_js_modules += invoker.js_modules
}
inputs = _js_modules
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) + "/",
]
last_dependency = ""
foreach(_js_module, _js_modules) {
_js_module_name = get_path_info(_js_module, "name")
args += [
"--js",
rebase_path(_js_module, root_build_dir),
"--module",
"$_js_module_name:1$last_dependency",
]
last_dependency = ":$_js_module_name"
}
args += [
"--js",
"{{source}}",
"--module",
"{{source_name_part}}:1$last_dependency",
]
}
bundle_data(target_name) {
forward_variables_from(invoker,
[
"data_deps",
"deps",
"public_deps",
"testonly",
"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) {
not_needed(invoker, [ "js_modules" ])
forward_variables_from(invoker,
[
"data_deps",
"deps",
"public_deps",
"testonly",
"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" ]
forward_variables_from(invoker, [ "testonly" ])
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",
"testonly",
"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",
"testonly",
"visibility",
])
sources = invoker.sources
outputs = [
"{{bundle_resources_dir}}/{{source_file_part}}",
]
}
}
}