chromium/tools/v8_context_snapshot/BUILD.gn

# 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" ]
    }
  }
}