damargulis | 5c5337d | 2017-04-21 22:36:08 | [diff] [blame] | 1 | # Copyright 2017 The Chromium Authors. All rights reserved. |
| 2 | # Use of this source code is governed by a BSD-style license that can be |
| 3 | # found in the LICENSE file. |
| 4 | |
| 5 | import("//third_party/closure_compiler/closure_args.gni") |
Christopher Lam | ef75ebfe | 2018-03-28 04:20:27 | [diff] [blame] | 6 | import("//ui/webui/webui_features.gni") |
damargulis | 5c5337d | 2017-04-21 22:36:08 | [diff] [blame] | 7 | |
| 8 | script_path = "//third_party/closure_compiler" |
| 9 | compiler_path = "$script_path/compiler/compiler.jar" |
Christopher Lam | 997fd81 | 2017-11-03 03:42:40 | [diff] [blame] | 10 | externs_path = "$script_path/externs" |
Christopher Lam | 739a90d | 2018-03-07 03:54:37 | [diff] [blame] | 11 | interfaces_path = "$script_path/interfaces" |
dpapad | 9d78844 | 2018-04-17 20:04:27 | [diff] [blame] | 12 | chrome_externs = "$externs_path/chrome.js" |
Christopher Lam | 997fd81 | 2017-11-03 03:42:40 | [diff] [blame] | 13 | polymer_externs = "$externs_path/polymer-1.0.js" |
damargulis | 5c5337d | 2017-04-21 22:36:08 | [diff] [blame] | 14 | |
| 15 | # Defines a target that creates an ordering for .js files to be used by |
| 16 | # js_binary to compile. |
| 17 | # |
| 18 | # Variables: |
| 19 | # sources: |
Christopher Lam | 997fd81 | 2017-11-03 03:42:40 | [diff] [blame] | 20 | # List of Javascript files to include in the library. Uses target_name.js by |
| 21 | # default. |
damargulis | 5c5337d | 2017-04-21 22:36:08 | [diff] [blame] | 22 | # |
| 23 | # deps: |
| 24 | # List of js_library targets to depend on |
| 25 | # |
alexclarke | 1a69b3b2 | 2017-06-09 11:52:41 | [diff] [blame] | 26 | # extra_deps: |
| 27 | # List of any other rules to depend on. E.g. a rule that generates js source |
| 28 | # files |
| 29 | # |
Christopher Lam | 739a90d | 2018-03-07 03:54:37 | [diff] [blame] | 30 | # externs_list: |
| 31 | # A list of .js files to pass to the compiler as externs |
| 32 | # |
| 33 | # extra_sources: |
| 34 | # A list of .js files to pass to the compiler as interfaces |
| 35 | # |
damargulis | 5c5337d | 2017-04-21 22:36:08 | [diff] [blame] | 36 | # Example: |
| 37 | # js_library("apple_tree") { |
| 38 | # sources = ["tree_main.js"] |
| 39 | # deps = [ |
| 40 | # ":branch", |
| 41 | # ":trunk", |
| 42 | # ":root", |
| 43 | # ] |
| 44 | # } |
| 45 | |
| 46 | template("js_library") { |
damargulis | 5c5337d | 2017-04-21 22:36:08 | [diff] [blame] | 47 | action(target_name) { |
| 48 | script = "$script_path/js_library.py" |
| 49 | forward_variables_from(invoker, |
| 50 | [ |
| 51 | "sources", |
| 52 | "deps", |
Christopher Lam | 997fd81 | 2017-11-03 03:42:40 | [diff] [blame] | 53 | "externs_list", |
Christopher Lam | 739a90d | 2018-03-07 03:54:37 | [diff] [blame] | 54 | "extra_sources", |
alexclarke | 1a69b3b2 | 2017-06-09 11:52:41 | [diff] [blame] | 55 | "extra_deps", |
damargulis | 5c5337d | 2017-04-21 22:36:08 | [diff] [blame] | 56 | ]) |
| 57 | output_file = "$target_gen_dir/$target_name.js_library" |
| 58 | outputs = [ |
| 59 | output_file, |
| 60 | ] |
| 61 | args = [ "--output" ] + [ rebase_path(output_file, root_build_dir) ] |
Christopher Lam | 997fd81 | 2017-11-03 03:42:40 | [diff] [blame] | 62 | |
| 63 | if (!defined(sources)) { |
| 64 | sources = [ |
| 65 | target_name + ".js", |
| 66 | ] |
damargulis | 5c5337d | 2017-04-21 22:36:08 | [diff] [blame] | 67 | } |
Christopher Lam | 997fd81 | 2017-11-03 03:42:40 | [diff] [blame] | 68 | |
| 69 | args += [ "--sources" ] + rebase_path(sources, root_build_dir) |
Christopher Lam | 739a90d | 2018-03-07 03:54:37 | [diff] [blame] | 70 | if (defined(extra_sources)) { |
| 71 | args += rebase_path(extra_sources, root_build_dir) |
Christopher Lam | 99223904 | 2018-06-13 00:36:26 | [diff] [blame] | 72 | sources += extra_sources |
Christopher Lam | 739a90d | 2018-03-07 03:54:37 | [diff] [blame] | 73 | } |
Christopher Lam | 997fd81 | 2017-11-03 03:42:40 | [diff] [blame] | 74 | |
damargulis | 5c5337d | 2017-04-21 22:36:08 | [diff] [blame] | 75 | if (defined(deps)) { |
| 76 | args += [ "--deps" ] |
| 77 | foreach(dep, deps) { |
| 78 | # Get the output path for each dep |
| 79 | dep_gen_dir = get_label_info(dep, "target_gen_dir") |
| 80 | dep_name = get_label_info(dep, "name") |
| 81 | dep_output_path = "$dep_gen_dir/$dep_name.js_library" |
| 82 | args += [ rebase_path(dep_output_path, root_build_dir) ] |
| 83 | } |
| 84 | } |
Christopher Lam | 997fd81 | 2017-11-03 03:42:40 | [diff] [blame] | 85 | if (defined(externs_list)) { |
| 86 | args += [ "--externs" ] + rebase_path(externs_list, root_build_dir) |
Christopher Lam | 99223904 | 2018-06-13 00:36:26 | [diff] [blame] | 87 | sources += externs_list |
Christopher Lam | 997fd81 | 2017-11-03 03:42:40 | [diff] [blame] | 88 | } |
alexclarke | 1a69b3b2 | 2017-06-09 11:52:41 | [diff] [blame] | 89 | if (defined(extra_deps)) { |
| 90 | if (!defined(deps)) { |
| 91 | deps = [] |
| 92 | } |
| 93 | deps += extra_deps |
| 94 | } |
damargulis | 5c5337d | 2017-04-21 22:36:08 | [diff] [blame] | 95 | } |
| 96 | } |
| 97 | |
| 98 | # Defines a target that compiles javascript files using the Closure compiler. |
| 99 | # This will produce a minified javascript output file. Additional checks and |
| 100 | # optimizations can be configured using the closure_flags attribute. |
| 101 | # |
| 102 | # Variables: |
| 103 | # sources: |
Christopher Lam | 997fd81 | 2017-11-03 03:42:40 | [diff] [blame] | 104 | # List of .js files to compile. Will be target_name.js by default. Use |
| 105 | # sources = [] to specify no input files (when making a target that just |
| 106 | # group compiles other targets, for example). |
damargulis | 5c5337d | 2017-04-21 22:36:08 | [diff] [blame] | 107 | # |
| 108 | # deps: |
| 109 | # List of js_library rules to depend on |
| 110 | # |
| 111 | # outputs: |
| 112 | # A file to write the compiled .js to. |
| 113 | # Only takes in a single file, but must be placed in a list |
| 114 | # |
| 115 | # bootstrap_file: |
| 116 | # A .js files to include before all others |
| 117 | # |
| 118 | # config_files: |
| 119 | # A list of .js files to include after the bootstrap_file but before all |
| 120 | # others |
| 121 | # |
| 122 | # closure_flags: |
| 123 | # A list of custom flags to pass to the Closure compiler. Do not include |
| 124 | # the leading dashes |
| 125 | # |
| 126 | # externs_list: |
| 127 | # A list of .js files to pass to the compiler as externs |
| 128 | # |
| 129 | # Example: |
| 130 | # js_binary("tree") { |
| 131 | # sources = ["tree_main.js"] |
| 132 | # deps = [":apple_tree"] |
| 133 | # outputs = [ "$target_gen_dir/tree.js" ] |
| 134 | # bootstrap_file = "bootstrap.js" |
| 135 | # config_files = [ |
| 136 | # "config1.js", |
| 137 | # "config2.js", |
| 138 | # ] |
| 139 | # closure_flags = ["jscomp_error=undefinedVars"] |
| 140 | # externs_list = [ "externs.js" ] |
| 141 | # } |
| 142 | |
| 143 | template("js_binary") { |
damargulis | 5c5337d | 2017-04-21 22:36:08 | [diff] [blame] | 144 | action(target_name) { |
| 145 | script = "$script_path/js_binary.py" |
| 146 | forward_variables_from(invoker, |
| 147 | [ |
| 148 | "sources", |
| 149 | "deps", |
| 150 | "outputs", |
| 151 | "bootstrap_file", |
| 152 | "config_files", |
| 153 | "closure_flags", |
| 154 | "externs_list", |
Christopher Lam | 770bd96 | 2018-03-07 11:22:19 | [diff] [blame] | 155 | "extra_deps", |
damargulis | 5c5337d | 2017-04-21 22:36:08 | [diff] [blame] | 156 | ]) |
| 157 | args = [ |
| 158 | "--compiler", |
| 159 | rebase_path(compiler_path, root_build_dir), |
| 160 | ] |
Christopher Lam | 997fd81 | 2017-11-03 03:42:40 | [diff] [blame] | 161 | |
| 162 | if (!defined(outputs)) { |
| 163 | outputs = [ |
| 164 | "$target_gen_dir/$target_name.js", |
| 165 | ] |
damargulis | 5c5337d | 2017-04-21 22:36:08 | [diff] [blame] | 166 | } |
Christopher Lam | 997fd81 | 2017-11-03 03:42:40 | [diff] [blame] | 167 | args += [ "--output" ] + rebase_path(outputs, root_build_dir) |
| 168 | |
| 169 | if (!defined(sources)) { |
| 170 | sources = [ |
| 171 | "$target_name.js", |
| 172 | ] |
| 173 | } |
| 174 | |
damargulis | 5c5337d | 2017-04-21 22:36:08 | [diff] [blame] | 175 | if (defined(deps)) { |
| 176 | args += [ "--deps" ] |
| 177 | foreach(dep, deps) { |
| 178 | # Get the output path for each dep |
| 179 | dep_gen_dir = get_label_info(dep, "target_gen_dir") |
| 180 | dep_name = get_label_info(dep, "name") |
| 181 | dep_output_path = "$dep_gen_dir/$dep_name.js_library" |
| 182 | args += [ rebase_path(dep_output_path, root_build_dir) ] |
| 183 | } |
| 184 | } |
Christopher Lam | 997fd81 | 2017-11-03 03:42:40 | [diff] [blame] | 185 | |
| 186 | args += [ "--sources" ] + rebase_path(sources, root_build_dir) |
| 187 | |
damargulis | 5c5337d | 2017-04-21 22:36:08 | [diff] [blame] | 188 | if (defined(bootstrap_file)) { |
| 189 | args += [ |
| 190 | "--bootstrap", |
| 191 | rebase_path(bootstrap_file, root_build_dir), |
| 192 | ] |
| 193 | sources += [ bootstrap_file ] |
| 194 | } |
| 195 | if (defined(config_files)) { |
| 196 | args += [ "--config" ] + rebase_path(config_files, root_build_dir) |
| 197 | sources += config_files |
| 198 | } |
| 199 | |
| 200 | # |minifying_closure_args| from |
| 201 | # //third_party/closure_compiler/closure_args.gni |
Christopher Lam | 997fd81 | 2017-11-03 03:42:40 | [diff] [blame] | 202 | if (!defined(closure_flags)) { |
| 203 | closure_flags = default_closure_args |
damargulis | 5c5337d | 2017-04-21 22:36:08 | [diff] [blame] | 204 | } |
Christopher Lam | 997fd81 | 2017-11-03 03:42:40 | [diff] [blame] | 205 | args += [ "--flags" ] + closure_flags |
| 206 | args += [ |
| 207 | "--externs", |
dpapad | 9d78844 | 2018-04-17 20:04:27 | [diff] [blame] | 208 | rebase_path("$chrome_externs", root_build_dir), |
Christopher Lam | 997fd81 | 2017-11-03 03:42:40 | [diff] [blame] | 209 | rebase_path("$polymer_externs", root_build_dir), |
| 210 | ] |
damargulis | 5c5337d | 2017-04-21 22:36:08 | [diff] [blame] | 211 | if (defined(externs_list)) { |
damargulis | 5c5337d | 2017-04-21 22:36:08 | [diff] [blame] | 212 | args += rebase_path(externs_list, root_build_dir) |
| 213 | sources += externs_list |
| 214 | } |
Christopher Lam | 770bd96 | 2018-03-07 11:22:19 | [diff] [blame] | 215 | |
| 216 | if (defined(extra_deps)) { |
| 217 | if (!defined(deps)) { |
| 218 | deps = [] |
| 219 | } |
| 220 | deps += extra_deps |
| 221 | } |
damargulis | 5c5337d | 2017-04-21 22:36:08 | [diff] [blame] | 222 | } |
| 223 | } |
Christopher Lam | 739a90d | 2018-03-07 03:54:37 | [diff] [blame] | 224 | |
| 225 | # Defines a target that compiles a group of js_library targets. |
| 226 | template("js_type_check") { |
Christopher Lam | ef75ebfe | 2018-03-28 04:20:27 | [diff] [blame] | 227 | if (closure_compile) { |
| 228 | js_binary(target_name) { |
| 229 | sources = [] |
| 230 | forward_variables_from(invoker, [ "deps" ]) |
| 231 | } |
| 232 | } else { |
| 233 | not_needed(invoker, "*") |
| 234 | group(target_name) { |
| 235 | } |
Christopher Lam | 739a90d | 2018-03-07 03:54:37 | [diff] [blame] | 236 | } |
| 237 | } |