# 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")

# 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 = ""
}

if (pw_build_EXECUTABLE_TARGET_TYPE != "executable" &&
    pw_build_EXECUTABLE_TARGET_TYPE_FILE != "") {
  import(pw_build_EXECUTABLE_TARGET_TYPE_FILE)
}

_supported_toolchain_defaults = [
  "configs",
  "public_deps",
]

# Wrapper for Pigweed executable build targets which uses a globally-defined,
# configurable target type.
template("pw_executable") {
  _executable_output_dir = "${target_out_dir}/bin"
  if (defined(invoker.output_dir)) {
    _executable_output_dir = invoker.output_dir
  }

  target(pw_build_EXECUTABLE_TARGET_TYPE, target_name) {
    import("$dir_pw_build/defaults.gni")

    forward_variables_from(invoker, "*", _supported_toolchain_defaults)

    if (!defined(configs)) {
      configs = []
    }
    if (defined(pw_build_defaults.configs)) {
      configs += pw_build_defaults.configs
    }
    if (defined(remove_configs)) {
      if (remove_configs != [] && remove_configs[0] == "*") {
        configs = []
      } else {
        configs += remove_configs  # Add configs in case they aren't already
        configs -= remove_configs  # present, then remove them.
      }
    }
    if (defined(invoker.configs)) {
      configs += invoker.configs
    }

    public_deps = [ "$dir_pw_build:link_deps" ]
    if (defined(pw_build_defaults.public_deps)) {
      public_deps += pw_build_defaults.public_deps
    }
    if (defined(remove_public_deps)) {
      if (remove_public_deps != [] && remove_public_deps[0] == "*") {
        public_deps = []
      } else {
        public_deps += remove_public_deps
        public_deps -= remove_public_deps
      }
    }
    if (defined(invoker.public_deps)) {
      public_deps += invoker.public_deps
    }

    output_dir = _executable_output_dir
  }
}
