# Copyright 2023 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")
import("$dir_pw_toolchain/generate_toolchain.gni")

if (pw_arduino_build_CORE_PATH != "") {
  import("target_toolchains.gni")

  generate_toolchains("target_toolchains") {
    toolchains = pw_target_toolchain_arduino_list
  }

  if (current_toolchain ==
      "//targets/stm32f730r8tx_arduino:arduino_size_optimized") {
    _ldscript = "ldscript_variant.ld"

    config("arduino_build") {
      exec_script(arduino_builder_script,
                  filter_exclude(arduino_run_command_args,
                                 [ "--save-config" ]) + [ "--run-prebuilds" ],
                  "string")

      _exclude_flags = [ "-std=gnu++14" ]

      _cflags = exec_script(arduino_builder_script,
                            arduino_show_command_args + [ "--c-flags" ],
                            "list lines")
      cflags = filter_exclude(_cflags, _exclude_flags)

      asmflags = exec_script(arduino_builder_script,
                             arduino_show_command_args + [ "--s-only-flags" ],
                             "list lines")

      _cflags_cc =
          exec_script(arduino_builder_script,
                      arduino_show_command_args + [ "--cpp-only-flags" ],
                      "list lines")
      cflags_cc = filter_exclude(_cflags_cc, _exclude_flags)

      _ldflags = exec_script(arduino_builder_script,
                             arduino_show_command_args + [ "--ld-flags" ],
                             "list lines")
      ldflags = filter_exclude(
              _ldflags,
              [
                # Remove arguments ending in 'core.a', for example:
                # C:/Users/username/pigweed/out/core.a
                "*core.a\b",

                # Remove .elf output file, for example:
                # -o C:/Users/username/pigweed/out/pigweed.elf
                "\b-o\b",
                "*.elf\b",

                # Remove the Arduino {object_files} variable
                "{object_files}",

                # Remove default STM32 F730R8T linker script args.
                "-Wl,--default-script=*../../third_party/stm32duino/hardware/stm32/2.6.0/variants/STM32F7xx/F722R\(C-E\)T_F730R8T_F732RET/ldscript.ld",
                "-Wl,--script=*../../third_party/stm32duino/hardware/stm32/2.6.0/system/ldscript.ld",
              ])

      # Add the replacement ldscript
      ldflags += [ "-Wl,--script=" + rebase_path(_ldscript, root_build_dir) ]

      # Teensy4 core recipe uses: '-larm_cortexM7lfsp_math -lm -lstdc++'
      libs = filter_exclude(
              exec_script(arduino_builder_script,
                          arduino_show_command_args + [ "--ld-lib-names" ],
                          "list lines"),
              [
                # Exclude stdc++ and precompiled math libraries which causes
                # linking errors for teensy cores.
                "\bstdc++\b",
                "\barm_cortexM0l_math\b",
                "\barm_cortexM4lf_math\b",
                "\barm_cortexM4l_math\b",
                "\barm_cortexM7lfsp_math\b",
              ])
    }

    pw_source_set("pre_init") {
      inputs = [ _ldscript ]
      sources = [ "init.cc" ]
      public_deps = [
        "$dir_pw_sys_io_arduino",
        "$dir_pw_third_party/arduino:arduino_core_sources",
      ]
      deps = [
        "$dir_pw_arduino_build:arduino_init.facade",
        "$dir_pw_preprocessor",
      ]
    }
  }
} else {
  config("arduino_build") {
  }
  group("pre_init") {
  }
}
