# 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/cc_library.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() {
  # The name of the GN target type used to build Pigweed executables.
  #
  # If this is a custom template, the .gni file containing the template must
  # be imported at the top of the target configuration file to make it globally
  # available.
  pw_build_EXECUTABLE_TARGET_TYPE = "executable"

  # The path to the .gni file that defines pw_build_EXECUTABLE_TARGET_TYPE.
  #
  # If pw_build_EXECUTABLE_TARGET_TYPE is not the default of `executable`, this
  # .gni file is imported to provide the template definition.
  pw_build_EXECUTABLE_TARGET_TYPE_FILE = ""
}

# This template wraps a configurable target type specified by the current
# toolchain to be used for all pw_executable targets. This allows projects to
# stamp out unique build logic for each pw_executable target, such as generating
# .bin files from .elf files, creating token databases, injecting custom data
# as late-bound build steps, and more.
#
# Like pw_source_set, pw_static_library, and pw_shared_library, default configs
# default visibility, and link deps are applied to the target before forwarding
# to the underlying type as specified by pw_build_EXECUTABLE_TARGET_TYPE.
#
# For more information on the features provided by this template, see the full
# docs at https://pigweed.dev/pw_build/?highlight=pw_executable#target-types.
#
# In addition to the arguments supported by a native executable target, this
# template introduces 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_executable") {
  pw_internal_c_language_build_target(target_name) {
    forward_variables_from(invoker, "*")
    if (!defined(output_dir)) {
      output_dir = "${target_out_dir}/bin"
    }
    add_global_link_deps = true
    underlying_target_type = pw_build_EXECUTABLE_TARGET_TYPE
    target_type_file = pw_build_EXECUTABLE_TARGET_TYPE_FILE
  }
}
