# Copyright 2021 The Pigweed Authors
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.

import("//build_overrides/pigweed.gni")

import("$dir_pw_build/gn_internal/build_target.gni")

# Note: In general, prefer to import target_types.gni rather than this file.
# cc_executable.gni and cc_library.gni are both provided by target_types.gni.
#
# cc_library.gni is split out from cc_executable.gni because pw_executable
# templates may need to create pw_source_set targets internally, and can't
# import target_types.gni because it creates a circular import path.

# These templates are wrappers for GN's built-in source_set, static_library,
# and shared_library targets.
#
# For more information on the features provided by these templates, see the full
# docs at https://pigweed.dev/pw_build/?highlight=pw_executable#target-types.
#
# In addition to the arguments supported by the underlying native target types,
# these templates introduce the following arguments:
#
#  remove_configs: (optional) A list of configs to remove from the set of
#    default configs specified by the current toolchain configuration.
#  remove_public_deps: (optional) A list of targets to remove from the set of
#    default public_deps specified by the current toolchain configuration.

template("pw_source_set") {
  pw_internal_build_target(target_name) {
    forward_variables_from(invoker, "*")
    if (!defined(add_global_link_deps)) {
      add_global_link_deps = false
    }
    underlying_target_type = "source_set"
  }
}

template("pw_static_library") {
  pw_internal_build_target(target_name) {
    forward_variables_from(invoker, "*")
    if (!defined(add_global_link_deps)) {
      add_global_link_deps = false
    }
    underlying_target_type = "static_library"
  }
}

template("pw_shared_library") {
  pw_internal_build_target(target_name) {
    forward_variables_from(invoker, "*")
    if (!defined(add_global_link_deps)) {
      add_global_link_deps = false
    }
    underlying_target_type = "shared_library"
  }
}
