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

declare_args() {
  # Additional build targets to add as dependencies for pw_executable,
  # pw_static_library, and pw_shared_library targets. The
  # $dir_pw_build:link_deps target pulls in these libraries.
  #
  # pw_build_LINK_DEPS can be used to break circular dependencies for low-level
  # libraries such as pw_assert.
  pw_build_LINK_DEPS = []
}

# 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_c_language_build_target(target_name) {
    forward_variables_from(invoker, "*")
    add_global_link_deps = false
    underlying_target_type = "source_set"
  }
}

template("pw_static_library") {
  pw_internal_c_language_build_target(target_name) {
    forward_variables_from(invoker, "*")
    add_global_link_deps = true
    underlying_target_type = "static_library"
  }
}

template("pw_shared_library") {
  pw_internal_c_language_build_target(target_name) {
    forward_variables_from(invoker, "*")
    add_global_link_deps = true
    underlying_target_type = "shared_library"
  }
}
