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

# 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") {
  import("$dir_pw_build/defaults.gni")

  source_set(target_name) {
    forward_variables_from(invoker, "*", _supported_toolchain_defaults)

    if (defined(pw_build_defaults.configs)) {
      configs = pw_build_defaults.configs
    } else {
      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") {
  import("$dir_pw_build/defaults.gni")

  static_library(target_name) {
    forward_variables_from(invoker, "*", _supported_toolchain_defaults)

    if (defined(pw_build_defaults.configs)) {
      configs = pw_build_defaults.configs
    } else {
      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_shared_library") {
  import("$dir_pw_build/defaults.gni")

  shared_library(target_name) {
    forward_variables_from(invoker, "*", _supported_toolchain_defaults)

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

# Wrapper for Pigweed executable build targets which uses a globally-defined,
# configurable target type.
template("pw_executable") {
  import("$dir_pw_build/defaults.gni")

  target(pw_build_EXECUTABLE_TARGET_TYPE, target_name) {
    forward_variables_from(invoker, "*", _supported_toolchain_defaults)

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