# Copyright 2019 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import("//build/buildflag_header.gni")
import("//build/config/python.gni")
import("//third_party/blink/renderer/bindings/bindings.gni")
import("//third_party/blink/renderer/bindings/generated_in_core.gni")
import(
"//third_party/blink/renderer/bindings/generated_in_extensions_chromeos.gni")
import(
"//third_party/blink/renderer/bindings/generated_in_extensions_webview.gni")
import("//third_party/blink/renderer/bindings/generated_in_modules.gni")
import("//third_party/blink/renderer/bindings/idl_in_core.gni")
import("//third_party/blink/renderer/bindings/idl_in_extensions_chromeos.gni")
import("//third_party/blink/renderer/bindings/idl_in_extensions_webview.gni")
import("//third_party/blink/renderer/bindings/idl_in_modules.gni")
visibility = [ "//third_party/blink/renderer/*" ]
bindings_gen_dir = get_path_info(".", "gen_dir")
template("collect_idl_files") {
action_with_pydeps(target_name) {
script = "scripts/collect_idl_files.py"
inputs = invoker.inputs
outputs = [ invoker.output ]
# List input file names in a temporary file.
response_file_contents = rebase_path(inputs, root_build_dir)
args = [
"--idl_list_file",
"{{response_file_name}}",
"--component",
invoker.component,
"--output",
rebase_path(invoker.output, root_build_dir),
]
if (defined(invoker.for_testing) && invoker.for_testing) {
args += [ "--for_testing" ]
}
if (defined(invoker.deps)) {
deps = invoker.deps
}
}
}
collect_idl_files("web_idl_in_core") {
component = "core"
inputs = static_idl_files_in_core
output = "${bindings_gen_dir}/web_idl_in_core.pickle"
}
collect_idl_files("web_idl_in_core_for_testing") {
component = "core"
for_testing = true
inputs = static_idl_files_in_core_for_testing
inputs += get_path_info(
[
"$root_gen_dir/third_party/blink/renderer/core/testing/internal_runtime_flags.idl",
"$root_gen_dir/third_party/blink/renderer/core/testing/internal_settings_generated.idl",
],
"abspath")
deps = [
"//third_party/blink/renderer/core:generated_testing_idls_internal_runtime_flags",
"//third_party/blink/renderer/core:generated_testing_idls_settings",
]
output = "${bindings_gen_dir}/web_idl_in_core_for_testing.pickle"
}
collect_idl_files("web_idl_in_extensions_chromeos") {
component = "extensions_chromeos"
inputs = static_idl_files_in_extensions_chromeos
output = "${bindings_gen_dir}/web_idl_in_extensions_chromeos.pickle"
}
collect_idl_files("web_idl_in_extensions_webview") {
component = "extensions_webview"
inputs = static_idl_files_in_extensions_webview
output = "${bindings_gen_dir}/web_idl_in_extensions_webview.pickle"
}
collect_idl_files("web_idl_in_modules") {
component = "modules"
inputs = static_idl_files_in_modules
output = "${bindings_gen_dir}/web_idl_in_modules.pickle"
}
collect_idl_files("web_idl_in_modules_for_testing") {
component = "modules"
for_testing = true
inputs = static_idl_files_in_modules_for_testing
output = "${bindings_gen_dir}/web_idl_in_modules_for_testing.pickle"
}
action_with_pydeps("web_idl_database") {
visibility += [
"//testing/libfuzzer/research/fuzzilli_idl_fuzzing:*",
"//tools/privacy_budget/blink_apis:*",
]
script = "scripts/build_web_idl_database.py"
input_data_files = get_target_outputs(":web_idl_in_core") +
get_target_outputs(":web_idl_in_core_for_testing") +
get_target_outputs(":web_idl_in_modules") +
get_target_outputs(":web_idl_in_modules_for_testing")
runtime_enabled_features_file = "../platform/runtime_enabled_features.json5"
deps = [
":web_idl_in_core",
":web_idl_in_core_for_testing",
":web_idl_in_modules",
":web_idl_in_modules_for_testing",
]
if (use_blink_extensions_chromeos) {
input_data_files += get_target_outputs(":web_idl_in_extensions_chromeos")
deps += [ ":web_idl_in_extensions_chromeos" ]
}
if (use_blink_extensions_webview) {
input_data_files += get_target_outputs(":web_idl_in_extensions_webview")
deps += [ ":web_idl_in_extensions_webview" ]
}
inputs = input_data_files + [ runtime_enabled_features_file ]
outputs = [ web_idl_database_filepath ]
args = [
"--output",
rebase_path(web_idl_database_filepath, root_build_dir),
"--runtime_enabled_features",
rebase_path(runtime_enabled_features_file, root_build_dir),
"--",
] + rebase_path(input_data_files, root_build_dir)
}
template("generate_bindings") {
action_with_pydeps(target_name) {
script = "scripts/generate_bindings.py"
if (defined(invoker.visibility)) {
visibility += invoker.visibility
}
if (defined(invoker.pool)) {
pool = invoker.pool
}
web_idl_database_outputs = get_target_outputs(":web_idl_database")
web_idl_database = web_idl_database_outputs[0]
inputs = [ web_idl_database ]
outputs = invoker.outputs
args = [
"--web_idl_database",
rebase_path(web_idl_database, root_build_dir),
"--root_src_dir",
rebase_path("//", root_build_dir),
"--root_gen_dir",
rebase_path(root_gen_dir, root_build_dir),
"--output_reldir",
"core=" + rebase_path("${bindings_gen_dir}/core/v8/", root_gen_dir),
"--output_reldir",
"modules=" + rebase_path("${bindings_gen_dir}/modules/v8/", root_gen_dir),
]
if (use_blink_extensions_chromeos) {
args += [
"--output_reldir",
"extensions_chromeos=" +
rebase_path("${bindings_gen_dir}/extensions_chromeos/v8/",
root_gen_dir),
]
}
if (use_blink_extensions_webview) {
args += [
"--output_reldir",
"extensions_webview=" +
rebase_path("${bindings_gen_dir}/extensions_webview/v8/",
root_gen_dir),
]
}
if (blink_enable_generated_code_formatting) {
args += [ "--format_generated_files" ]
}
args += invoker.targets
deps = [ ":web_idl_database" ]
}
}
generate_bindings("generate_bindings_all") {
visibility += [ "//third_party/blink/public/mojom/*" ]
targets = []
outputs = []
targets += [ "async_iterator" ]
outputs += generated_async_iterator_sources_in_core +
generated_async_iterator_sources_in_modules
targets += [ "callback_function" ]
outputs += generated_callback_function_sources_in_core +
generated_callback_function_sources_in_modules +
generated_callback_function_sources_for_testing_in_core
targets += [ "callback_interface" ]
outputs += generated_callback_interface_sources_in_core +
generated_callback_interface_sources_in_modules
targets += [ "dictionary" ]
outputs += generated_dictionary_sources_in_core +
generated_dictionary_sources_in_modules +
generated_dictionary_sources_for_testing_in_core +
generated_dictionary_sources_for_testing_in_modules
if (use_blink_extensions_chromeos) {
outputs += generated_dictionary_sources_in_extensions_chromeos
}
if (use_blink_extensions_webview) {
outputs += generated_dictionary_sources_in_extensions_webview
}
targets += [ "enumeration" ]
outputs += generated_enumeration_sources_in_core +
generated_enumeration_sources_in_modules +
generated_enumeration_sources_for_testing_in_core +
generated_enumeration_sources_for_testing_in_modules
if (use_blink_extensions_chromeos) {
outputs += generated_enumeration_sources_in_extensions_chromeos
}
if (use_blink_extensions_webview) {
outputs += generated_enumeration_sources_in_extensions_webview
}
targets += [ "interface" ]
outputs += generated_interface_sources_in_core +
generated_interface_sources_in_modules +
generated_interface_extra_sources_in_modules +
generated_interface_sources_for_testing_in_core +
generated_interface_sources_for_testing_in_modules +
generated_interface_extra_sources_for_testing_in_modules
if (use_blink_extensions_chromeos) {
outputs += generated_interface_sources_in_extensions_chromeos
}
if (use_blink_extensions_webview) {
outputs += generated_interface_sources_in_extensions_webview
}
targets += [ "namespace" ]
outputs += generated_namespace_sources_in_core +
generated_namespace_sources_in_modules
targets += [ "observable_array" ]
outputs += generated_observable_array_sources_in_core +
generated_observable_array_sources_in_modules
targets += [ "sync_iterator" ]
outputs += generated_sync_iterator_sources_in_core +
generated_sync_iterator_sources_in_modules
targets += [ "typedef" ]
outputs +=
generated_typedef_sources_in_core + generated_typedef_sources_in_modules
targets += [ "union" ]
outputs +=
generated_union_sources_in_core + generated_union_sources_in_modules +
generated_union_sources_for_testing_in_core
}
action_with_pydeps("check_generated_file_list") {
script = "scripts/check_generated_file_list.py"
web_idl_database_outputs = get_target_outputs(":web_idl_database")
web_idl_database = web_idl_database_outputs[0]
result_file = "${bindings_gen_dir}/check_generated_file_list_results.txt"
inputs = [
web_idl_database,
"//third_party/blink/renderer/bindings/generated_in_core.gni",
"//third_party/blink/renderer/bindings/generated_in_extensions_chromeos.gni",
"//third_party/blink/renderer/bindings/generated_in_extensions_webview.gni",
"//third_party/blink/renderer/bindings/generated_in_modules.gni",
"//third_party/blink/renderer/bindings/idl_in_core.gni",
"//third_party/blink/renderer/bindings/idl_in_extensions_chromeos.gni",
"//third_party/blink/renderer/bindings/idl_in_extensions_webview.gni",
"//third_party/blink/renderer/bindings/idl_in_modules.gni",
]
outputs = [ result_file ]
file_list = []
file_list += [ "--for_prod" ]
file_list += [
"--kind",
"async_iterator",
]
file_list += generated_async_iterator_sources_in_core +
generated_async_iterator_sources_in_modules
file_list += [
"--kind",
"callback_function",
]
file_list += generated_callback_function_sources_in_core +
generated_callback_function_sources_in_modules
file_list += [
"--kind",
"callback_interface",
]
file_list += generated_callback_interface_sources_in_core +
generated_callback_interface_sources_in_modules
file_list += [
"--kind",
"dictionary",
]
file_list += generated_dictionary_sources_in_core +
generated_dictionary_sources_in_modules
if (use_blink_extensions_chromeos) {
file_list += generated_dictionary_sources_in_extensions_chromeos
}
if (use_blink_extensions_webview) {
file_list += generated_dictionary_sources_in_extensions_webview
}
file_list += [
"--kind",
"enumeration",
]
file_list += generated_enumeration_sources_in_core +
generated_enumeration_sources_in_modules
if (use_blink_extensions_chromeos) {
file_list += generated_enumeration_sources_in_extensions_chromeos
}
if (use_blink_extensions_webview) {
file_list += generated_enumeration_sources_in_extensions_webview
}
file_list += [
"--kind",
"interface",
]
file_list += generated_interface_sources_in_core +
generated_interface_sources_in_modules
if (use_blink_extensions_chromeos) {
file_list += generated_interface_sources_in_extensions_chromeos
}
if (use_blink_extensions_webview) {
file_list += generated_interface_sources_in_extensions_webview
}
file_list += [
"--kind",
"namespace",
]
file_list += generated_namespace_sources_in_core +
generated_namespace_sources_in_modules
file_list += [
"--kind",
"observable_array",
]
file_list += generated_observable_array_sources_in_core +
generated_observable_array_sources_in_modules
file_list += [
"--kind",
"sync_iterator",
]
file_list += generated_sync_iterator_sources_in_core +
generated_sync_iterator_sources_in_modules
file_list += [
"--kind",
"union",
]
file_list +=
generated_union_sources_in_core + generated_union_sources_in_modules
file_list += [ "--for_testing" ]
file_list += [
"--kind",
"callback_function",
]
file_list += generated_callback_function_sources_for_testing_in_core
file_list += [
"--kind",
"dictionary",
]
file_list += generated_dictionary_sources_for_testing_in_core +
generated_dictionary_sources_for_testing_in_modules
file_list += [
"--kind",
"enumeration",
]
file_list += generated_enumeration_sources_for_testing_in_core +
generated_enumeration_sources_for_testing_in_modules
file_list += [
"--kind",
"interface",
]
file_list += generated_interface_sources_for_testing_in_core +
generated_interface_sources_for_testing_in_modules
file_list += [
"--kind",
"union",
]
file_list += generated_union_sources_for_testing_in_core
response_file_contents = []
foreach(token, file_list) {
response_file_contents +=
[ string_replace(token, "${root_gen_dir}/", "", 1) ]
}
args = [
"--web_idl_database",
rebase_path(web_idl_database, root_build_dir),
"--root_src_dir",
rebase_path("//", root_build_dir),
"--root_gen_dir",
rebase_path(root_gen_dir, root_build_dir),
"--output_reldir",
"core=" + rebase_path("${bindings_gen_dir}/core/v8/", root_gen_dir),
"--output_reldir",
"modules=" + rebase_path("${bindings_gen_dir}/modules/v8/", root_gen_dir),
]
if (use_blink_extensions_chromeos) {
args += [
"--output_reldir",
"extensions_chromeos=" +
rebase_path("${bindings_gen_dir}/extensions_chromeos/v8/",
root_gen_dir),
]
}
if (use_blink_extensions_webview) {
args += [
"--output_reldir",
"extensions_webview=" +
rebase_path("${bindings_gen_dir}/extensions_webview/v8/",
root_gen_dir),
]
}
args += [
"--generated_file_list",
"{{response_file_name}}",
"--output",
rebase_path(result_file, root_build_dir),
]
deps = [
# A lot of C++ compile tasks are waiting for the completion of the
# bindings generator because most Blink C++ source files directly or
# indirectly depend on the generated bindings files. Since we'd like
# `generate_bindings_all` to use the most CPU power and memory so that
# it unblocks Blink C++ compile tasks as soon as possible, we do not like
# `check_generated_file_list` running in parallel to
# `generate_bindings_all`.
#
# This trick (unnecessary dependency to `generate_bindings_all`) makes
# `check_generated_file_list` wait for the completion of
# `generate_bindings_all`.
":generate_bindings_all",
":web_idl_database",
]
}
action_with_pydeps("validate_web_idl") {
script = "scripts/validate_web_idl.py"
web_idl_database_outputs = get_target_outputs(":web_idl_database")
web_idl_database = web_idl_database_outputs[0]
idl_syntax_known_issues = "idl_syntax_known_issues.txt"
validate_web_idl_result = "${bindings_gen_dir}/validate_web_idl_results.txt"
inputs = [
web_idl_database,
idl_syntax_known_issues,
]
outputs = [ validate_web_idl_result ]
args = [
"--web_idl_database",
rebase_path(web_idl_database, root_build_dir),
"--idl_syntax_known_issues",
rebase_path(idl_syntax_known_issues, root_build_dir),
"--output",
rebase_path(validate_web_idl_result, root_build_dir),
]
deps = [
# A lot of C++ compile tasks are waiting for the completion of the
# bindings generator because most Blink C++ source files directly or
# indirectly depend on the generated bindings files. Since we'd like
# `generate_bindings_all` to use the most CPU power and memory so that
# it unblocks Blink C++ compile tasks as soon as possible, we do not like
# `validate_web_idl` running in parallel to `generate_bindings_all`.
#
# This trick (unnecessary dependency to `generate_bindings_all`) makes
# `validate_web_idl` wait for the completion of `generate_bindings_all`.
":generate_bindings_all",
":web_idl_database",
]
}
# Exposes the libraries that affect the resulting blob image of the V8 context
# snapshot.
group("v8_context_snapshot_influential_libs") {
visibility = []
visibility = [ "//tools/v8_context_snapshot/*" ]
public_deps = [
"//third_party/blink/renderer/core",
"//third_party/blink/renderer/modules",
"//third_party/blink/renderer/platform",
]
}
buildflag_header("buildflags") {
header = "buildflags.h"
header_dir = "third_party/blink/renderer/bindings"
flags = [ "PRODUCE_V8_COMPILE_HINTS=$produce_v8_compile_hints" ]
}