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

# gn-format disable
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
  }
}
