| # Copyright 2022 The Chromium Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import("//chrome/common/features.gni") |
| import("//tools/grit/grit_rule.gni") |
| import("//tools/grit/preprocess_if_expr.gni") |
| import("//tools/polymer/css_to_wrapper.gni") |
| import("//tools/polymer/html_to_wrapper.gni") |
| import("//tools/typescript/ts_library.gni") |
| import("//ui/webui/resources/tools/generate_grd.gni") |
| import("../tools/optimize_webui.gni") |
| |
| # See documentation at https://chromium.googlesource.com/chromium/src/+/HEAD/docs/webui_build_configuration.md#build_webui |
| |
| template("build_webui") { |
| not_needed([ "target_name" ]) |
| |
| forward_variables_from(invoker, |
| [ |
| "grd_prefix", |
| "static_files", |
| ]) |
| |
| preprocess_dir = "${target_gen_dir}/preprocessed" |
| tsc_dir = "${target_gen_dir}/tsc" |
| |
| optimize = false |
| if (defined(invoker.optimize)) { |
| optimize = invoker.optimize |
| } |
| |
| ### Compute the lists of files that are used across multiple targets. |
| |
| # At least one of `web_component_files` or 'non_web_component_files` must be |
| # defined. |
| assert(defined(invoker.web_component_files) || |
| defined(invoker.non_web_component_files)) |
| |
| ts_files = [] |
| if (defined(invoker.web_component_files)) { |
| ts_files += invoker.web_component_files |
| } |
| if (defined(invoker.non_web_component_files)) { |
| ts_files += invoker.non_web_component_files |
| } |
| |
| if (defined(invoker.web_component_files) || |
| defined(invoker.icons_html_files)) { |
| # Files that are passed as input to html_to_wrapper(). |
| html_files = [] |
| if (defined(invoker.web_component_files)) { |
| foreach(f, invoker.web_component_files) { |
| html_files += [ string_replace(f, ".ts", ".html") ] |
| } |
| } |
| if (defined(invoker.icons_html_files)) { |
| html_files += invoker.icons_html_files |
| } |
| |
| # Files that are generated by html_to_wrapper(). |
| html_wrapper_files = [] |
| foreach(f, html_files) { |
| html_wrapper_files += [ f + ".ts" ] |
| } |
| } |
| |
| if (defined(invoker.css_files)) { |
| # Files that are generated by css_to_wrapper(). |
| css_wrapper_files = [] |
| foreach(f, invoker.css_files) { |
| css_wrapper_files += [ f + ".ts" ] |
| } |
| } |
| |
| # Generated Mojo JS files. |
| if (defined(invoker.mojo_files)) { |
| assert(defined(invoker.mojo_files_deps)) |
| mojo_files = [] |
| foreach(mojo_file, invoker.mojo_files) { |
| mojo_files += [ get_path_info(invoker.mojo_files, "file") ] |
| } |
| } |
| |
| # Compute which static_files should be preprocessed. |
| non_preprocessed_files_filter = [ |
| "*.jpg", |
| "*.png", |
| "*.svg", |
| ] |
| static_non_preprocessed_files = |
| filter_include(static_files, non_preprocessed_files_filter) |
| static_preprocessed_files = |
| filter_exclude(static_files, non_preprocessed_files_filter) |
| |
| ### Define the various targets that are required by the build pipeline. |
| |
| # Specifically the order in which these targets are executed is: |
| # |
| # 1) preprocess_if_expr() |
| # 2) html_to_wrapper(), css_to_wrapper() |
| # 3) ts_library() |
| # 4) optimize_webui() (only if |invoker.optimize| is true) |
| # 5) generate_grd() |
| # 6) grit() |
| |
| preprocess_if_expr("preprocess_static_files") { |
| visibility = [ ":build_grd" ] |
| defines = chrome_grit_defines |
| in_folder = "." |
| out_folder = preprocess_dir |
| in_files = static_preprocessed_files |
| out_manifest = "${target_gen_dir}/preprocess_static_files_manifest.json" |
| } |
| |
| preprocess_if_expr("preprocess") { |
| visibility = [ |
| ":build_ts", |
| ":css_wrapper_files", |
| ":html_wrapper_files", |
| ] |
| |
| defines = chrome_grit_defines |
| in_folder = "." |
| out_folder = preprocess_dir |
| in_files = ts_files |
| |
| if (defined(html_files)) { |
| in_files += html_files |
| } |
| |
| if (defined(invoker.css_files)) { |
| in_files += invoker.css_files |
| } |
| } |
| |
| if (defined(html_files)) { |
| html_to_wrapper("html_wrapper_files") { |
| visibility = [ ":build_ts" ] |
| deps = [ ":preprocess" ] |
| in_folder = preprocess_dir |
| out_folder = preprocess_dir |
| in_files = html_files |
| minify = optimize |
| |
| if (defined(invoker.html_to_wrapper_template)) { |
| template = invoker.html_to_wrapper_template |
| } |
| } |
| } |
| |
| if (defined(invoker.css_files)) { |
| css_to_wrapper("css_wrapper_files") { |
| visibility = [ ":build_ts" ] |
| deps = [ ":preprocess" ] |
| in_folder = preprocess_dir |
| out_folder = preprocess_dir |
| in_files = invoker.css_files |
| minify = optimize |
| } |
| } |
| |
| if (defined(invoker.mojo_files_deps)) { |
| copy("copy_mojo") { |
| visibility = [ ":build_ts" ] |
| deps = invoker.mojo_files_deps |
| sources = invoker.mojo_files |
| outputs = [ "${preprocess_dir}/{{source_file_part}}" ] |
| } |
| } |
| |
| ts_library("build_ts") { |
| root_dir = preprocess_dir |
| out_dir = tsc_dir |
| |
| composite = false |
| if (defined(invoker.ts_composite)) { |
| composite = invoker.ts_composite |
| } |
| |
| if (!composite) { |
| visibility = [ |
| ":build_bundle", |
| ":build_grd", |
| ] |
| } |
| |
| if (!defined(invoker.ts_use_local_config) || invoker.ts_use_local_config) { |
| tsconfig_base = "tsconfig_base.json" |
| } |
| |
| in_files = ts_files |
| |
| extra_deps = [ ":preprocess" ] |
| |
| if (defined(html_files)) { |
| in_files += html_wrapper_files |
| extra_deps += [ ":html_wrapper_files" ] |
| } |
| |
| if (defined(invoker.css_files)) { |
| in_files += css_wrapper_files |
| extra_deps += [ ":css_wrapper_files" ] |
| } |
| |
| if (defined(invoker.ts_deps)) { |
| deps = invoker.ts_deps |
| } |
| |
| if (defined(invoker.ts_definitions)) { |
| definitions = invoker.ts_definitions |
| } |
| |
| if (defined(invoker.ts_path_mappings)) { |
| path_mappings = invoker.ts_path_mappings |
| } |
| |
| if (defined(invoker.mojo_files_deps)) { |
| assert(defined(invoker.mojo_files)) |
| target_outputs = get_target_outputs(":copy_mojo") |
| |
| # Add all Mojo JS files produced by `:copy_mojo` as inputs to the TS |
| # compiler. |
| foreach(o, target_outputs) { |
| in_files += [ rebase_path(o, preprocess_dir) ] |
| } |
| extra_deps += [ ":copy_mojo" ] |
| } |
| |
| if (defined(invoker.ts_extra_deps)) { |
| extra_deps += invoker.ts_extra_deps |
| } |
| } |
| |
| if (optimize) { |
| bundle_manifest = "bundle_manifest.json" |
| |
| optimize_webui("build_bundle") { |
| visibility = [ ":build_grd" ] |
| host = invoker.optimize_webui_host |
| input = rebase_path(tsc_dir, root_build_dir) |
| js_out_files = invoker.optimize_webui_out_files |
| js_module_in_files = invoker.optimize_webui_in_files |
| out_manifest = "$target_gen_dir/$bundle_manifest" |
| excludes = invoker.optimize_webui_excludes |
| |
| deps = [ |
| ":build_ts", |
| "//ui/webui/resources:preprocess", |
| ] |
| } |
| } |
| |
| generate_grd("build_grd") { |
| visibility = [ ":resources_grit" ] |
| grd_prefix = grd_prefix |
| out_grd = "$target_gen_dir/resources.grd" |
| |
| input_files = static_non_preprocessed_files |
| input_files_base_dir = rebase_path(".", "//") |
| |
| deps = [ ":preprocess_static_files" ] |
| manifest_files = |
| [ "${target_gen_dir}/preprocess_static_files_manifest.json" ] |
| |
| if (optimize) { |
| deps += [ ":build_bundle" ] |
| manifest_files += [ "$target_gen_dir/$bundle_manifest" ] |
| resource_path_rewrites = invoker.optimize_webui_resource_paths_rewrites |
| } else { |
| deps += [ ":build_ts" ] |
| manifest_files += |
| filter_include(get_target_outputs(":build_ts"), [ "*.manifest" ]) |
| } |
| |
| if (defined(invoker.extra_grdp_deps)) { |
| deps += invoker.extra_grdp_deps |
| grdp_files = invoker.extra_grdp_files |
| } |
| } |
| |
| grit("resources") { |
| defines = chrome_grit_defines |
| |
| # These arguments are needed since the grd is generated at build time. |
| enable_input_discovery_for_gn_analyze = false |
| source = "$target_gen_dir/resources.grd" |
| deps = [ ":build_grd" ] |
| |
| outputs = [ |
| "grit/${grd_prefix}_resources.h", |
| "grit/${grd_prefix}_resources_map.cc", |
| "grit/${grd_prefix}_resources_map.h", |
| "${grd_prefix}_resources.pak", |
| ] |
| |
| grit_output_dir = "$root_gen_dir/chrome" |
| if (defined(invoker.grit_output_dir)) { |
| grit_output_dir = invoker.grit_output_dir |
| } |
| |
| output_dir = grit_output_dir |
| } |
| } |