# 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") script_path = "//third_party/closure_compiler" compiler_path = "$script_path/compiler/compiler.jar" # 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 # # 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 # # Example: # js_library("apple_tree") { # sources = ["tree_main.js"] # deps = [ # ":branch", # ":trunk", # ":root", # ] # } template("js_library") { assert(defined(invoker.sources) || defined(invoker.deps), "Need sources or deps in $target_name for js_library") action(target_name) { script = "$script_path/js_library.py" forward_variables_from(invoker, [ "sources", "deps", "extra_deps", ]) output_file = "$target_gen_dir/$target_name.js_library" outputs = [ output_file, ] args = [ "--output" ] + [ rebase_path(output_file, root_build_dir) ] if (defined(sources)) { args += [ "--sources" ] + rebase_path(sources, root_build_dir) } 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(extra_deps)) { if (!defined(deps)) { deps = [] } deps += extra_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 # # deps: # List of js_library rules to depend on # # outputs: # A file to write the compiled .js to. # Only takes in a single file, 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 # # 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") { assert(defined(invoker.sources) || defined(invoker.deps), "Need sources or deps in $target_name for js_binary") assert(defined(invoker.outputs), "Need outputs in $target_name for js_binary") action(target_name) { script = "$script_path/js_binary.py" forward_variables_from(invoker, [ "sources", "deps", "outputs", "bootstrap_file", "config_files", "closure_flags", "externs_list", ]) args = [ "--compiler", rebase_path(compiler_path, root_build_dir), ] args += [ "--output" ] + rebase_path(outputs, root_build_dir) if (defined(sources)) { args += [ "--sources" ] + rebase_path(sources, root_build_dir) } else { 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(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 } # |minifying_closure_args| from # //third_party/closure_compiler/closure_args.gni args += [ "--flags" ] + minifying_closure_args if (defined(closure_flags)) { args += closure_flags } if (defined(externs_list)) { args += [ "--externs" ] args += rebase_path(externs_list, root_build_dir) sources += externs_list } } }