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

# DON'T INCLUDE modules_idl_files.gni FROM HERE.
#
# This file is shared with all modules' BUILD files which shouldn't need access
# to the huge and slow lists of sources. If sharing is necessary, make a
# separate .gni.
import("//build/config/jumbo.gni")
import("//build/split_static_library.gni")
import("//third_party/WebKit/Source/config.gni")

blink_modules_output_dir = "$root_gen_dir/blink/modules"

# Defines a part of blink modules. This is either a source set or a static
# library with defaults for commonly-used values.
#
#   deps
#      Default deps are automatically appended to any specified on the caller.
#
#   visibility
#      Normal meaning if defined. If undefined, defaults to everything in core.
template("blink_modules_sources") {
  if (is_component_build) {
    target_type = "source_set"
  } else {
    if (!defined(invoker.split_count)) {
      target_type = "static_library"
    } else {
      target_type = "split_static_library"
    }
  }

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

    deps = [
      "//third_party/WebKit/Source/core",
      "//third_party/WebKit/Source/modules:make_modules_generated",
      "//third_party/icu",
    ]
    if (defined(invoker.deps)) {
      deps += invoker.deps
    }
    if (target_type == "split_static_library") {
      split_count = invoker.split_count
    }

    # Take everything else not handled above from the invoker.
    forward_variables_from(invoker,
                           "*",
                           [
                             "deps",
                             "split_count",
                           ])
  }
}
set_defaults("blink_modules_sources") {
  # This sets the default list of configs when the blink_modules_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
  configs += [
    # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
    "//build/config/compiler:no_size_t_to_int_warning",
    "//third_party/WebKit/Source:config",
    "//third_party/WebKit/Source/modules:modules_implementation",
    "//third_party/WebKit/Source:non_test_config",
    "//third_party/WebKit/Source:inside_blink",
  ]
  if (remove_webcore_debug_symbols) {
    configs -= [ "//build/config/compiler:default_symbols" ]
    configs += remove_webcore_symbols_config
  }
}
