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

group("v8_context_snapshot") {
  if (use_v8_context_snapshot) {
    public_deps = [
      ":generate_v8_context_snapshot",
    ]
    if (!is_android) {
      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) {
  if (is_android && enable_java_templates) {
    android_assets("v8_context_snapshot_assets") {
      deps = [
        ":v8_context_snapshot",
      ]
      sources = [
        "$root_out_dir/natives_blob.bin",
      ]
      renaming_sources = [ "$root_out_dir/v8_context_snapshot.bin" ]
      if (current_cpu == "arm" || current_cpu == "x86" ||
          current_cpu == "mipsel") {
        renaming_destinations = [ "v8_context_snapshot_32.bin" ]
      } else {
        renaming_destinations = [ "v8_context_snapshot_64.bin" ]
      }
      disable_compression = true
    }
  }

  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/core/embedder",
      "//services/service_manager/public/cpp",
      "//third_party/blink/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",
    ]
  }
}
