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

# gn-format disable
import("//build_overrides/pigweed.gni")

import("$dir_pw_arduino_build/arduino.gni")
import("$dir_pw_build/target_types.gni")
if (dir_pw_third_party_arduino != "") {
  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")

    sources = _core_c_files + _core_s_files + _core_cpp_files +
              _variant_c_files + _variant_s_files + _variant_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") {
  }
}
