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

declare_args() {
  # Location of MCUXpresso SDK directory
  dir_pw_third_party_mcuxpresso = ""

  # If compiling a project against an MCUXpresso SDK, this variable can be set
  # to the name of the pw_source_set you create using `pw_mcuxpresso_sdk` to
  # enable additional Pigweed support.
  pw_third_party_mcuxpresso_SDK = ""
}

# 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 = [
    "gn",
    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",
                           ])
  }
}
