123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326 |
- # Copyright 2017 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("//third_party/closure_compiler/closure_args.gni")
- declare_args() {
- # Enable closure type-checking for Chrome's web technology-based UI. This
- # enables the webui_closure_compile target which does a no-op without this
- # flag enabled. Requires Java.
- enable_js_type_check = is_chromeos || is_linux || is_android
- }
- script_path = "//third_party/closure_compiler"
- compiler_path = "$script_path/compiler/compiler.jar"
- externs_path = "$script_path/externs"
- interfaces_path = "$script_path/interfaces"
- chrome_externs = "$externs_path/chrome.js"
- polymer_externs = "$externs_path/polymer-1.0.js"
- # Defines a target that creates an ordering for .js files to be used by
- # js_binary to compile.
- #
- # Variables:
- # sources:
- # List of Javascript files to include in the library. Uses target_name.js by
- # default.
- #
- # deps:
- # List of js_library targets to depend on
- #
- # extra_deps:
- # List of any other rules to depend on. E.g. a rule that generates js source
- # files
- #
- # extra_public_deps
- # List of other targets to expose as public dependencies.
- #
- # externs_list:
- # A list of .js files to pass to the compiler as externs
- #
- # extra_sources:
- # A list of .js files to pass to the compiler as interfaces
- #
- # Example:
- # js_library("apple_tree") {
- # sources = ["tree_main.js"]
- # deps = [
- # ":branch",
- # ":trunk",
- # ":root",
- # ]
- # }
- template("js_library") {
- action(target_name) {
- script = "$script_path/js_library.py"
- forward_variables_from(invoker,
- [
- "deps",
- "externs_list",
- "extra_deps",
- "extra_public_deps",
- "extra_sources",
- "sources",
- "testonly",
- "visibility",
- ])
- inputs = [ "$script_path/compiler.py" ]
- output_file = "$target_gen_dir/$target_name.js_library"
- outputs = [ output_file ]
- args = [ "--output" ] + [ rebase_path(output_file, root_build_dir) ]
- if (!defined(sources)) {
- sources = [ target_name + ".js" ]
- }
- args += [ "--sources" ] + rebase_path(sources, root_build_dir)
- if (defined(extra_sources)) {
- args += rebase_path(extra_sources, root_build_dir)
- sources += extra_sources
- }
- if (defined(deps)) {
- args += [ "--deps" ]
- foreach(dep, deps) {
- # Get the output path for each dep
- dep_gen_dir = get_label_info(dep, "target_gen_dir")
- dep_name = get_label_info(dep, "name")
- dep_output_path = "$dep_gen_dir/$dep_name.js_library"
- args += [ rebase_path(dep_output_path, root_build_dir) ]
- }
- }
- if (defined(externs_list)) {
- args += [ "--externs" ] + rebase_path(externs_list, root_build_dir)
- sources += externs_list
- }
- if (defined(extra_deps)) {
- if (!defined(deps)) {
- deps = []
- }
- deps += extra_deps
- }
- if (defined(extra_public_deps)) {
- public_deps = extra_public_deps
- }
- }
- }
- # Defines a target that compiles javascript files using the Closure compiler.
- # This will produce a minified javascript output file. Additional checks and
- # optimizations can be configured using the closure_flags attribute.
- #
- # Variables:
- # sources:
- # List of .js files to compile. Will be target_name.js by default. Use
- # sources = [] to specify no input files (when making a target that just
- # group compiles other targets, for example).
- #
- # deps:
- # List of js_library rules to depend on
- #
- # outputs:
- # If chunks is not specified, a file to write the compiled .js to.
- # If chunks is specified, a directory to write the compiled .js to.
- # Only takes in a single file or directory, but must be placed in a list.
- #
- # bootstrap_file:
- # A .js files to include before all others
- #
- # config_files:
- # A list of .js files to include after the bootstrap_file but before all
- # others
- #
- # closure_flags:
- # A list of custom flags to pass to the Closure compiler. Do not include
- # the leading dashes
- #
- # externs_list:
- # A list of .js files to pass to the compiler as externs
- #
- # chunks:
- # Unused in chromium/src but used downstream.
- # A boolean indicating that a chunk should be created for each input file
- # (or target_name.js), along with a common_chunk.js for shared code.
- # Requires outputs refer to a directory and chunk_suffix be provided.
- #
- # chunk_suffix:
- # Unused in chromium/src but used downstream.
- # The suffix appended to a source when naming a chunk, since it may not
- # have the same name as the source. By default, creates target_name_chunk.js.
- #
- # Example:
- # js_binary("tree") {
- # sources = ["tree_main.js"]
- # deps = [":apple_tree"]
- # outputs = [ "$target_gen_dir/tree.js" ]
- # bootstrap_file = "bootstrap.js"
- # config_files = [
- # "config1.js",
- # "config2.js",
- # ]
- # closure_flags = ["jscomp_error=undefinedVars"]
- # externs_list = [ "externs.js" ]
- # }
- template("js_binary") {
- action(target_name) {
- script = "$script_path/js_binary.py"
- forward_variables_from(invoker,
- [
- "bootstrap_file",
- "checks_only",
- "chunks",
- "chunk_suffix",
- "closure_flags",
- "config_files",
- "deps",
- "externs_list",
- "extra_deps",
- "is_polymer3",
- "outputs",
- "sources",
- "testonly",
- "uses_legacy_modules",
- ])
- args = [
- "--compiler",
- rebase_path(compiler_path, root_build_dir),
- ]
- if (!defined(outputs)) {
- if (defined(chunks) && chunks) {
- outputs = [ "$target_gen_dir/" ]
- } else {
- outputs = [ "$target_gen_dir/$target_name.js" ]
- }
- }
- args += [ "--output" ] + rebase_path(outputs, root_build_dir)
- if (!defined(sources)) {
- sources = [ "$target_name.js" ]
- }
- if (defined(deps)) {
- args += [ "--deps" ]
- foreach(dep, deps) {
- # Get the output path for each dep
- dep_gen_dir = get_label_info(dep, "target_gen_dir")
- dep_name = get_label_info(dep, "name")
- dep_output_path = "$dep_gen_dir/$dep_name.js_library"
- args += [ rebase_path(dep_output_path, root_build_dir) ]
- }
- }
- args += [ "--sources" ] + rebase_path(sources, root_build_dir)
- if (defined(bootstrap_file)) {
- args += [
- "--bootstrap",
- rebase_path(bootstrap_file, root_build_dir),
- ]
- sources += [ bootstrap_file ]
- }
- if (defined(config_files)) {
- args += [ "--config" ] + rebase_path(config_files, root_build_dir)
- sources += config_files
- }
- if (defined(chunks) && chunks) {
- args += [ "--chunks" ]
- assert(defined(chunk_suffix), "Need chunk_suffix with chunks")
- args += [
- "--chunk_suffix",
- chunk_suffix,
- ]
- }
- if (defined(checks_only) && checks_only) {
- args += [ "--checks-only" ]
- }
- # |minifying_closure_args| from
- # //third_party/closure_compiler/closure_args.gni
- if (!defined(closure_flags)) {
- closure_flags = default_closure_args
- }
- uses_legacy_modules = defined(uses_legacy_modules) && uses_legacy_modules
- if (!uses_legacy_modules) {
- closure_flags += js_modules_args
- } else {
- closure_flags += legacy_modules_args
- }
- is_polymer3 = defined(is_polymer3) && is_polymer3
- assert(!is_polymer3 || !uses_legacy_modules)
- if (is_polymer3) {
- closure_flags += polymer3_args
- }
- args += [ "--flags" ] + closure_flags
- args += [
- "--externs",
- rebase_path("$chrome_externs", root_build_dir),
- ]
- inputs = [
- "$script_path/closure_args.gni",
- chrome_externs,
- compiler_path,
- ]
- # |polymer_externs| should only be added for Polymer versions 1 and 2. For
- # Polymer3, Polymer sources are directly passed to the compiler instead.
- if (!is_polymer3) {
- args += [ rebase_path("$polymer_externs", root_build_dir) ]
- inputs += [ polymer_externs ]
- }
- if (defined(externs_list)) {
- args += rebase_path(externs_list, root_build_dir)
- sources += externs_list
- }
- if (defined(extra_deps)) {
- if (!defined(deps)) {
- deps = []
- }
- deps += extra_deps
- }
- }
- }
- # Defines a target that compiles a group of js_library targets.
- template("js_type_check") {
- if (enable_js_type_check) {
- js_binary(target_name) {
- sources = []
- checks_only = true
- forward_variables_from(invoker,
- [
- "closure_flags",
- "deps",
- "is_polymer3",
- "testonly",
- "uses_legacy_modules",
- ])
- }
- } else {
- not_needed(invoker, "*")
- group(target_name) {
- }
- }
- }
- # These externs files depend on each other (often in a cyclical way), and
- # therefore makes more sense to add all of them as a dependency together.
- chrome_extension_public_externs = [
- "$externs_path/events.js",
- "$externs_path/extension_types.js",
- "$externs_path/runtime.js",
- "$externs_path/tabs.js",
- "$externs_path/windows.js",
- ]
|