# 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.

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 != "") {
  pw_source_set("arduino_core_sources") {
    remove_configs = [ "$dir_pw_build:strict_warnings" ]

    _core_c_files =
        exec_script(arduino_builder_script,
                    arduino_show_command_args + [ "--core-c-files" ],
                    "list lines")
    _core_s_files = filter_exclude(
            exec_script(arduino_builder_script,
                        arduino_show_command_args + [ "--core-s-files" ],
                        "list lines"),
            # TODO(tonymd): Conditionally remove this source file unless building for cortex-m0.
            # Exception for adafruit-samd core
            # pulse_asm.S is for: '.cpu cortex-m0plus .fpu softvfp'
            [ "*pulse_asm.S\b" ])

    _core_cpp_files =
        exec_script(arduino_builder_script,
                    arduino_show_command_args + [ "--core-cpp-files" ],
                    "list lines")
    _variant_c_files =
        exec_script(arduino_builder_script,
                    arduino_show_command_args + [ "--variant-c-files" ],
                    "list lines")
    _variant_s_files =
        exec_script(arduino_builder_script,
                    arduino_show_command_args + [ "--variant-s-files" ],
                    "list lines")
    _variant_cpp_files =
        exec_script(arduino_builder_script,
                    arduino_show_command_args + [ "--variant-cpp-files" ],
                    "list lines")

    # Some cores have required built in libraries:
    # - stm32duino requires SrcWrapper.
    _library_c_files =
        exec_script(arduino_builder_script,
                    arduino_show_command_args + [ "--library-c-files" ],
                    "list lines")
    _library_s_files =
        exec_script(arduino_builder_script,
                    arduino_show_command_args + [ "--library-s-files" ],
                    "list lines")
    _library_cpp_files =
        exec_script(arduino_builder_script,
                    arduino_show_command_args + [ "--library-cpp-files" ],
                    "list lines")

    sources = _core_c_files + _core_s_files + _core_cpp_files +
              _variant_c_files + _variant_s_files + _variant_cpp_files +
              _library_c_files + _library_s_files + _library_cpp_files

    # Rename main() to ArduinoMain()
    # See //pw_arduino_build/docs.rst for details on this approach.
    defines = [ "main(...)=ArduinoMain()" ]
  }
} else {
  group("arduino_core_sources") {
  }
}
