# Copyright 2014 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.

import("config.gni")
if (is_clang) {
  import("//build/config/clang/clang.gni")
}

visibility = [ "//third_party/WebKit/*" ]

# arguments --------------------------------------------------------------------

declare_args() {
  # Set to true to enable the clang plugin that checks the usage of the Blink
  # garbage-collection infrastructure during compilation.
  blink_gc_plugin = true

  # Set to true to have the clang Blink GC plugin emit class graph (in JSON)
  # with typed pointer edges; for debugging or other (internal) uses.
  blink_gc_plugin_option_do_dump_graph = false

  # Set to true to have the clang Blink GC plugin additionally check if
  # a class has an empty destructor which would be unnecessarily invoked
  # when finalized.
  blink_gc_plugin_option_warn_unneeded_finalizer = false
}

# features ---------------------------------------------------------------------

config("features") {
  defines = feature_defines_list
}

# inside_blink -----------------------------------------------------------------

config("inside_blink") {
  defines = [
    "BLINK_IMPLEMENTATION=1",
    "INSIDE_BLINK",
  ]
}

# config -----------------------------------------------------------------------

config("config") {
  include_dirs = [
    ".",
    "..",
    "$root_gen_dir/blink",
    "$root_gen_dir/third_party/WebKit",
  ]

  cflags = []
  defines = []

  if (is_win) {
    cflags += [
      "/wd4305",  # Truncation from 'type1' to 'type2'.
      "/wd4324",  # Struct padded due to declspec(align).
      "/wd4714",  # Function marked forceinline not inlined.
      "/wd4800",  # Value forced to bool.
      "/wd4996",  # Deprecated function call.
    ]
  }

  if (is_win) {
    if (is_component_build) {
      defines += [ "USING_V8_SHARED" ]
    }
  }

  if (is_clang && blink_gc_plugin && clang_use_chrome_plugins) {
    # On Windows, the plugin is built directly into clang, so there's
    # no need to load it dynamically.
    if (!is_win) {
      _blink_gc_plugin_dll_extension = "so"
      if (is_mac || is_ios) {
        _blink_gc_plugin_dll_extension = "dylib"
      }
      cflags += [
        "-Xclang",
        "-load",
        "-Xclang",
        rebase_path(
            "${clang_base_path}/lib/libBlinkGCPlugin.${_blink_gc_plugin_dll_extension}",
            root_build_dir),
      ]
    }
    cflags += [
      "-Xclang",
      "-add-plugin",
      "-Xclang",
      "blink-gc-plugin",
    ]

    # Add arguments for enabled GC plugin options:
    if (blink_gc_plugin_option_do_dump_graph) {
      cflags += [
        "-Xclang",
        "-plugin-arg-blink-gc-plugin",
        "-Xclang",
        "dump-graph",
      ]
    }
    if (blink_gc_plugin_option_warn_unneeded_finalizer) {
      cflags += [
        "-Xclang",
        "-plugin-arg-blink-gc-plugin",
        "-Xclang",
        "warn-unneeded-finalizer",
      ]
    }
  }
}

# The follow configs apply to all targets except for unit tests, which rely on
# static initializers.
config("non_test_config") {
  cflags = []

  if (is_clang) {
    cflags += [ "-Wglobal-constructors" ]
  }
}

if (is_mac) {
  # This sets up precompiled headers for Mac.
  config("mac_precompiled_headers") {
    precompiled_header = rebase_path("build/mac/Prefix.h", root_build_dir)
    precompiled_source = "//third_party/WebKit/Source/build/mac/Prefix.h"
  }
}
