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

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

  # 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 = []
}

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

# TODO(frolv): The code in all of the templates below is duplicated, with the
# exception of the target type. This file could be auto-generated with Python.

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

template("pw_source_set") {
  source_set(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
    }

    if (defined(pw_build_defaults.public_deps)) {
      public_deps = pw_build_defaults.public_deps
    } else {
      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
    }
  }
}

template("pw_static_library") {
  _library_output_dir = "${target_out_dir}/lib"
  if (defined(invoker.output_dir)) {
    _library_output_dir = invoker.output_dir
  }

  static_library(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 = _library_output_dir
  }
}

template("pw_shared_library") {
  _library_output_dir = "${target_out_dir}/lib"
  if (defined(invoker.output_dir)) {
    _library_output_dir = invoker.output_dir
  }

  shared_library(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 = _library_output_dir
  }
}

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