# Copyright 2017 The Chromium Authors. All rights reserved.
# 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/WebKit/Source/bindings/core/v8/V8ContextSnapshot.{cpp|h}.
# to speedup creating a V8 context and setting up around it.

import("//tools/v8_context_snapshot/v8_context_snapshot.gni")

import("//build/config/c++/c++.gni")
import("//build/config/compiler/compiler.gni")
import("//v8/snapshot_toolchain.gni")

if (is_android) {
  import("//build/config/android/rules.gni")
}

if (is_android) {
  android_assets("v8_context_snapshot_assets") {
    deps = [
      ":v8_context_snapshot",
    ]
    sources = [
      "$root_out_dir/v8_context_snapshot.bin",
    ]
    disable_compression = true
  }
}

group("v8_context_snapshot") {
  if (use_v8_context_snapshot) {
    public_deps = [
      ":generate_v8_context_snapshot",
    ]
    data = [
      "$root_out_dir/v8_context_snapshot.bin",
    ]
  }
}

config("use_v8_context_snapshot") {
  if (use_v8_context_snapshot) {
    defines = [ "USE_V8_CONTEXT_SNAPSHOT" ]
  }
}

if (use_v8_context_snapshot) {
  action("generate_v8_context_snapshot") {
    script = "//build/gn_run_binary.py"
    output_file = "$root_out_dir/v8_context_snapshot.bin"
    output_path = rebase_path(output_file, root_build_dir)

    args = [
      "./" + rebase_path(
              get_label_info(
                      ":v8_context_snapshot_generator($v8_snapshot_toolchain)",
                      "root_out_dir") + "/v8_context_snapshot_generator",
              root_build_dir),
      "--output_file=$output_path",
    ]

    outputs = [
      output_file,
    ]

    deps = [
      ":v8_context_snapshot_generator($v8_snapshot_toolchain)",
    ]
  }

  # 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 (use_gold || use_lld) {
      ldflags = [ "-Wl,--icf=none" ]
    }
  }

  executable("v8_context_snapshot_generator") {
    sources = [
      "v8_context_snapshot_generator.cc",
    ]

    deps = [
      "//gin:gin",
      "//mojo/edk/system:system",
      "//services/service_manager/public/cpp",
      "//third_party/WebKit/public:blink",
      "//v8",
    ]

    if (is_linux && (is_component_build || using_sanitizer) &&
        use_custom_libcxx) {
      deps += [ "//buildtools/third_party/libc++:libc++" ]
    }

    configs += [
      "//v8:external_startup_data",
      ":disable_icf",
    ]
  }
}
