# Copyright 2022 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_arduino_build/arduino.gni")
import("$dir_pw_build/target_types.gni")

if (pw_arduino_build_CORE_PATH != "") {
  config("default_config") {
    include_dirs = [ "public" ]
  }

  # Common library arguments to the arduino_builder tool.
  _library_args = [
    "--library-path",
    rebase_path(
        "$pw_arduino_build_CORE_PATH/teensy/hardware/teensy/avr/libraries"),
    "--library-names",

    # Arduino Core Libaries. The c/c++ files for these should only be included
    # once in any given pw_executable.
    "SPI",
  ]

  _library_include_dirs =
      exec_script(arduino_builder_script,
                  arduino_show_command_args + _library_args +
                      [ "--library-include-dirs" ],
                  "list lines")

  config("arduino_spi_config") {
    include_dirs = _library_include_dirs
  }

  _library_c_files = exec_script(
          arduino_builder_script,
          arduino_show_command_args + _library_args + [ "--library-c-files" ],
          "list lines")

  _library_cpp_files = exec_script(
          arduino_builder_script,
          arduino_show_command_args + _library_args + [ "--library-cpp-files" ],
          "list lines")

  pw_source_set("arduino_spi_sources") {
    public_configs = [ ":arduino_spi_config" ]
    deps = [ "$dir_pw_third_party/arduino:arduino_core_sources" ]
    sources = _library_c_files + _library_cpp_files
    include_dirs = _library_include_dirs
    remove_configs = [ "$dir_pw_build:strict_warnings" ]
  }
}

pw_source_set("pw_spi_arduino") {
  public_configs = [ ":default_config" ]
  public = [
    "public/pw_spi_arduino/chip_selector.h",
    "public/pw_spi_arduino/initiator.h",
  ]
  public_deps = [
    ":arduino_spi_sources",
    "$dir_pw_status",
  ]
  deps = [
    "$dir_pw_digital_io",
    "$dir_pw_log",
    "$dir_pw_spi:chip_selector",
    "$dir_pw_spi:initiator",
  ]
  sources = [
    "chip_selector.cc",
    "initiator.cc",
  ]
  remove_configs = [ "$dir_pw_build:strict_warnings" ]
}
