# 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("//build/config/chrome_build.gni")
import("//build/split_static_library.gni")
import("//third_party/WebKit/Source/config.gni")

blink_core_output_dir = "$root_gen_dir/blink/core"

# This file sets core_config_add and core_config_remove lists of configs to
# modify the default lists of configs set in the build as appropriate for core
# targets. This avoids duplicating logic across many targets.
core_config_add = [
  "//build/config/compiler:wexit_time_destructors",
  "//third_party/WebKit/Source:config",
  "//third_party/WebKit/Source:non_test_config",
  "//third_party/WebKit/Source/core:config",
]
core_config_remove = []

# Compute the optimization level. The GYP code sets "optimize: max" which sets
# speed-over-size optimization for official builds on Windows only. The GN's
# build optimize_max config applies this optimization on all platforms, so
# compute how to modify the config list to duplicate the GYP behavior.
# TODO revisit this behavior, as the Windows-specific part seems suspicious.
if (is_win && is_official_build) {
  core_config_remove += [ "//build/config/compiler:default_optimization" ]
  core_config_add += [ "//build/config/compiler:optimize_max" ]
}

if (remove_webcore_debug_symbols) {
  core_config_remove += [ "//build/config/compiler:default_symbols" ]
  core_config_add += [ "//build/config/compiler:no_symbols" ]
}

# Use this target type to link core targets.
if (is_component_build) {
  # To get exported symbols correct in component builds, the files must be in
  # source sets.
  core_link_large_target_type = "source_set"
  core_link_small_target_type = "source_set"
} else {
  # In static builds some of the libraries can get >2GB on Windows so we need
  # to split the targets for the larger ones.
  core_link_large_target_type = "split_static_library"
  core_link_small_target_type = "static_library"
}

# Use this to generate a static library or source set that gets linked into
# "core". This will either be a source_set (component build), a static library
# (split_count undefined) or a split static library (split_count defined).
#
# Special values. All unlisted values are forwarded to the underlying library.
#
#   configs
#      Normal meaning. The set_defaults call below will make the default value
#      of configs in the calling code take into account the core_config_add and
#      core_config_remove lists above. So you don't need to manually take these
#      into account: just modify the configs as normal for target-specific
#      overrides (or don't touch it).
#
#   split_count
#      If defined, non-component builds will generate this number of static
#      libraries by splitting the sources. This is for use on Windows where the
#      maximum static library size is 2GB, and 64-bit builds with full symbols
#      can exceed this if there are many sources.
#
#   deps
#      Normal meaning but "core:prerequisites" target is always added. Callers
#      shouldn'y list prerequisites as a dependency.
#
#   visibility
#      Normal meaning if defined. If undefined, defaults to everything in core.
template("blink_core_sources") {
  if (is_component_build) {
    target_type = "source_set"

    # This assert avoids an unused variable warning.
    assert(!defined(invoker.split_count) || invoker.split_count != 0)
  } else if (!defined(invoker.split_count)) {
    target_type = "static_library"
  } else {
    target_type = "split_static_library"
  }

  target(target_type, target_name) {
    # The visibility will get overridden by forward_variables_from below if the
    # invoker defined it.
    visibility = [ "//third_party/WebKit/Source/core/*" ]

    if (target_type == "split_static_library") {
      split_count = invoker.split_count
    }

    deps = [
      "//third_party/WebKit/Source/core:prerequisites",
    ]
    if (defined(invoker.deps)) {
      deps += invoker.deps
    }

    # Take everything else not handled above from the invoker.
    forward_variables_from(invoker,
                           "*",
                           [
                             "deps",
                             "split_count",
                           ])
  }
}
set_defaults("blink_core_sources") {
  # This sets the default list of configs when the blink_core_sources target
  # is defined. The default_compiler_configs comes from BUILDCONFIG.gn and
  # is the list normally applied to static libraries and source sets.
  configs = default_compiler_configs - core_config_remove + core_config_add
}
