blob: 4d3dcda0e79d6648fd45aed743e49171d7a23c70 [file] [log] [blame]
# 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
}
}