# Copyright 2017 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# Targets in ths file are to take a V8 context snapshot on build time.
# Created V8 context snapshot is used in
# third_party/blink/renderer/bindings/core/v8/v8_context_snapshot.{cc|h}.
# to speedup creating a V8 context and setting up around it.
import("//tools/v8_context_snapshot/v8_context_snapshot.gni")
import("//build/buildflag_header.gni")
import("//build/config/c++/c++.gni")
import("//build/config/compiler/compiler.gni")
import("//v8/gni/snapshot_toolchain.gni")
if (is_android) {
import("//build/config/android/rules.gni")
}
group("v8_context_snapshot") {
if (use_v8_context_snapshot) {
public_deps = [ ":generate_v8_context_snapshot($v8_snapshot_toolchain)" ]
if (!is_android) {
data = [ "$root_out_dir/$v8_context_snapshot_filename" ]
}
}
}
buildflag_header("buildflags") {
header = "buildflags.h"
flags = [
"USE_V8_CONTEXT_SNAPSHOT=$use_v8_context_snapshot",
"INCLUDE_BOTH_V8_SNAPSHOTS=$include_both_v8_snapshots",
"V8_CONTEXT_SNAPSHOT_FILENAME=\"$v8_context_snapshot_filename\"",
]
}
if (use_v8_context_snapshot) {
if (v8_snapshot_toolchain == current_toolchain) {
action("generate_v8_context_snapshot") {
script = "//build/gn_run_binary.py"
output_file = "$root_build_dir/$v8_context_snapshot_filename"
output_path = rebase_path(output_file, root_build_dir)
args = [
"./" + rebase_path(get_label_info(":v8_context_snapshot_generator",
"root_out_dir") +
"/v8_context_snapshot_generator",
root_build_dir),
"--output_file=$output_path",
]
sources = [ "$root_out_dir/snapshot_blob.bin" ]
deps = [
":v8_context_snapshot_generator",
"//v8:run_mksnapshot_default",
]
# TODO(sky): figure out why this doesn't work on android cross compile.
# In the case of compiling for the snapshot `shlib_extension` is ".so"
# (which is expected), but on disk ".cr.so" is generate, which ends up
# causing gn to fail.
if (is_component_build && target_os != "android") {
# In the component build mode, the snapshot should be updated when any
# of the generator executable or the shared libraries get updated. Note
# that it's possible that some of the shared libraries are updated
# without having the executable updated.
inputs = [
"$root_out_dir/${shlib_prefix}blink_core${shlib_extension}",
"$root_out_dir/${shlib_prefix}blink_modules${shlib_extension}",
"$root_out_dir/${shlib_prefix}blink_platform${shlib_extension}",
"$root_out_dir/${shlib_prefix}v8${shlib_extension}",
]
deps += [
"//third_party/blink/renderer/bindings:v8_context_snapshot_influential_libs",
"//v8",
]
}
outputs = [ output_file ]
}
executable("v8_context_snapshot_generator") {
sources = [ "v8_context_snapshot_generator.cc" ]
deps = [
"//gin:gin",
"//mojo/core/embedder",
"//services/service_manager/public/cpp",
"//third_party/blink/public:blink",
"//v8",
]
configs += [
"//v8:external_startup_data",
":disable_icf",
]
}
}
# This config disables a link time optimization "ICF", which may merge
# different functions into one if the function signature and body of them are
# identical.
#
# ICF breaks 1:1 mappings of the external references for V8 snapshot, so we
# disable it while taking a V8 snapshot.
config("disable_icf") {
visibility = [ ":*" ] # Only targets in this file can depend on this.
if (is_win) {
ldflags = [ "/OPT:NOICF" ] # link.exe, but also lld-link.exe.
} else if (is_apple && !use_lld) {
ldflags = [ "-Wl,-no_deduplicate" ] # ld64.
} else if (use_lld) {
ldflags = [ "-Wl,--icf=none" ]
}
}
}