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

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

# 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") {
  _pw_source_files = []

  # Boilerplate for tracking target sources.  For more information see
  # https://pigweed.dev/pw_build/#target-types
  if (defined(invoker.sources)) {
    foreach(path, invoker.sources) {
      _pw_source_files += [ path ]
    }
  }
  if (defined(invoker.public)) {
    foreach(path, invoker.public) {
      _pw_source_files += [ path ]
    }
  }

  source_set(target_name) {
    import("$dir_pw_build/defaults.gni")
    forward_variables_from(invoker, "*", _supported_toolchain_defaults)

    # Ensure that we don't overwrite metadata forwared from the invoker above.
    if (defined(metadata)) {
      metadata.pw_source_files = _pw_source_files
    } else {
      metadata = {
        pw_source_files = _pw_source_files
      }
    }

    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") {
  _pw_source_files = []

  # Boilerplate for tracking target sources.  For more information see
  # https://pigweed.dev/pw_build/#target-types
  if (defined(invoker.sources)) {
    foreach(path, invoker.sources) {
      _pw_source_files += [ path ]
    }
  }
  if (defined(invoker.public)) {
    foreach(path, invoker.public) {
      _pw_source_files += [ path ]
    }
  }

  _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)

    # Ensure that we don't overwrite metadata forwared from the invoker above.
    if (defined(metadata)) {
      metadata.pw_source_files = _pw_source_files
    } else {
      metadata = {
        pw_source_files = _pw_source_files
      }
    }

    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") {
  _pw_source_files = []

  # Boilerplate for tracking target sources.  For more information see
  # https://pigweed.dev/pw_build/#target-types
  if (defined(invoker.sources)) {
    foreach(path, invoker.sources) {
      _pw_source_files += [ path ]
    }
  }
  if (defined(invoker.public)) {
    foreach(path, invoker.public) {
      _pw_source_files += [ path ]
    }
  }

  _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)

    # Ensure that we don't overwrite metadata forwared from the invoker above.
    if (defined(metadata)) {
      metadata.pw_source_files = _pw_source_files
    } else {
      metadata = {
        pw_source_files = _pw_source_files
      }
    }

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