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

import("$dir_pw_build/target_types.gni")

# Creates a source set for an MCUXpresso SDK.
#
# In addition to the named source set, two configs are created; one named
# `${target_name}__defines` contains pre-processor definitions for the SDK
# project and the other named `${target_name}__includes` defines the include
# paths. These may be used to break circular dependencies.
#
# Args:
#  manifest: The MCUXpresso SDK manifest XML file describing the components of
#    the SDK.
#
#  sdk_dir: Optional path to directory containing the SDK. When ommitted the
#    parent of `manifest` is used, which is usually the correct definition.
#
#  include: list of SDK components to include in the project.
#
#  exclude: Optional list of SDK components to exclude from the project.
#
#  allow_circular_includes_from, configs, deps, public_configs, public_deps:
#    Optional extra properties for the source set.
#
# Example:
#
#   pw_mcuxpresso_sdk("sample_project_sdk") {
#     manifest = "$dir_pw_third_party/mcuxpresso/EVK-MIMXRT595_manifest_v3_8.xml"
#     include = [ "project_template.evkmimxrt595.MIMXRT595S" ]
#   }
#
#   pw_executable("hello_world") {
#     sources = [ "hello_world.cc "]
#     deps = [ ":sample_project_sdk" ]
#   }
#
template("pw_mcuxpresso_sdk") {
  assert(defined(invoker.manifest), "pw_mcuxpresso_sdk requires a manifest")

  if (defined(invoker.sdk_dir)) {
    _sdk_dir = invoker.sdk_dir
  } else {
    _sdk_dir = get_path_info(invoker.manifest, "dir")
  }

  _script_args = [
    "project",
    rebase_path(invoker.manifest),
    "--prefix=$_sdk_dir",
  ]

  if (defined(invoker.include)) {
    foreach(dependency, invoker.include) {
      _script_args += [
        "--include",
        dependency,
      ]
    }
  }

  if (defined(invoker.exclude)) {
    foreach(dependency, invoker.exclude) {
      _script_args += [
        "--exclude",
        dependency,
      ]
    }
  }

  # This script finds the components distributed with the SDK.
  _script = "$dir_pw_build_mcuxpresso/py/pw_build_mcuxpresso/__main__.py"
  _project = exec_script(_script, _script_args, "scope", [ invoker.manifest ])

  config("${target_name}__defines") {
    forward_variables_from(_project, [ "defines" ])
  }

  config("${target_name}__includes") {
    forward_variables_from(_project, [ "include_dirs" ])
  }

  pw_source_set(target_name) {
    forward_variables_from(_project,
                           [
                             "libs",
                             "public",
                             "sources",
                           ])

    public_configs = [
      ":${target_name}__defines",
      ":${target_name}__includes",
    ]
    if (defined(invoker.public_configs)) {
      public_configs += invoker.public_configs
    }

    forward_variables_from(invoker,
                           [
                             "configs",
                             "deps",
                             "public_deps",
                             "allow_circular_includes_from",
                           ])
  }
}
