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

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[0] == "*") {
        configs = []
      } else {
        configs -= remove_configs
      }
    }
    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[0] == "*") {
        public_deps = []
      } else {
        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[0] == "*") {
        configs = []
      } else {
        configs -= remove_configs
      }
    }
    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[0] == "*") {
        public_deps = []
      } else {
        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[0] == "*") {
        configs = []
      } else {
        configs -= remove_configs
      }
    }
    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[0] == "*") {
        public_deps = []
      } else {
        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[0] == "*") {
        configs = []
      } else {
        configs -= remove_configs
      }
    }
    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[0] == "*") {
        public_deps = []
      } else {
        public_deps -= remove_public_deps
      }
    }
    if (defined(invoker.public_deps)) {
      public_deps += invoker.public_deps
    }

    output_dir = _executable_output_dir
  }
}
