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

import("//build/config/jumbo.gni")

platform_config_add = [
  "//build/config/compiler:no_size_t_to_int_warning",
  "//build/config/compiler:wexit_time_destructors",
  "//third_party/blink/renderer:config",
  "//third_party/blink/renderer:inside_blink",
  "//third_party/blink/renderer:non_test_config",
  "//third_party/blink/renderer/platform:blink_platform_config",
  "//third_party/blink/renderer/platform:blink_platform_implementation",
  "//third_party/blink/renderer/platform:blink_platform_pch",
]
platform_config_remove = []

template("blink_platform_sources") {
  jumbo_source_set(target_name) {
    # Only platform can directly depend on this.
    # Any target outside platform should instead depend on platform.
    visibility = [ "//third_party/blink/renderer/platform" ]

    assert(
        !defined(invoker.public_deps),
        "$target_name's public_deps should be moved to //third_party/blink/renderer/platform:blink_platform_public_deps")
    deps = [
      "//third_party/blink/renderer/platform:blink_platform_public_deps",
    ]
    if (defined(invoker.deps)) {
      deps += invoker.deps
    }

    assert(
        !defined(invoker.public_configs),
        "$target_name's public_configs should be moved to //third_party/blink/renderer/platform:blink_platform_public_deps")
    assert(
        !defined(invoker.all_dependent_configs),
        "$target_name's all_dependent_configs should be moved to //third_party/blink/renderer/platform:blink_platform_public_deps")
    configs = []
    if (defined(invoker.configs)) {
      configs += invoker.configs
    }

    forward_variables_from(invoker,
                           "*",
                           [
                             "deps",
                             "configs",
                           ])
  }
}

set_defaults("blink_platform_sources") {
  configs =
      default_compiler_configs + platform_config_add - platform_config_remove
}
