# Copyright 2016 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")
import("//testing/test.gni")

cc_remove_configs = []
cc_add_configs = [ "//build/config:precompiled_headers" ]

if (!is_debug && (is_win || is_android)) {
  cc_remove_configs += [ "//build/config/compiler:default_optimization" ]
  cc_add_configs += [ "//build/config/compiler:optimize_max" ]
}

template("cc_source_set") {
  jumbo_source_set(target_name) {
    forward_variables_from(invoker, "*", [ "configs" ])
    if (defined(invoker.configs)) {
      configs += invoker.configs
    }
    configs -= cc_remove_configs
    configs += cc_add_configs
  }
}

template("cc_component") {
  jumbo_component(target_name) {
    forward_variables_from(invoker, "*", [ "configs" ])
    if (defined(invoker.configs)) {
      configs += invoker.configs
    }
    configs -= cc_remove_configs
    configs += cc_add_configs
  }
}

template("cc_static_library") {
  jumbo_static_library(target_name) {
    forward_variables_from(invoker, "*", [ "configs" ])
    if (defined(invoker.configs)) {
      configs += invoker.configs
    }
    configs -= cc_remove_configs
    configs += cc_add_configs
  }
}

template("cc_test") {
  test(target_name) {
    forward_variables_from(invoker, "*", [ "configs" ])
    if (defined(invoker.configs)) {
      configs += invoker.configs
    }
    configs -= cc_remove_configs
    configs += cc_add_configs
  }
}
