# 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_pigweed/targets/stm32f429i_disc1/target_toolchains.gni")
import("$dir_pigweed_experimental/targets/common_backends.gni")
import("$dir_pw_toolchain_extra/cortex_m/gcc_toolchain.gni")

_toolchain_base = pw_target_toolchain_stm32f429i_disc1.debug
_excluded_defaults = [
  "pw_cpu_exception_ENTRY_BACKEND",
  "pw_cpu_exception_HANDLER_BACKEND",
  "pw_cpu_exception_SUPPORT_BACKEND",
  "default_configs",
]

pw_cortex_m_gcc_toolchain("stm32f429i_disc1_debug") {
  cpu = pw_toolchain_CORTEX_M_CPU.M4
  fpu = pw_toolchain_CORTEX_M_FPU.FPV4_SP
  final_binary_extension = ".elf"
  default_configs = [
    "$dir_pw_build:extra_strict_warnings",
    "$dir_pw_toolchain/arm_gcc:enable_float_printf",
    "$dir_pw_build:optimize_debugging",
  ]
  toolchain_args = {
    forward_variables_from(_toolchain_base.defaults, "*", _excluded_defaults)
    app_common_BACKEND =
        "$dir_pigweed_experimental/applications/app_common_impl:stm32"
    pw_board_led_BACKEND = "$dir_pw_board_led_stm32f429i_disc1"
    pw_spin_delay_BACKEND = "$dir_pw_spin_delay_stm32f429i_disc1"
  }
}

pw_cortex_m_gcc_toolchain("stm32f429i_disc1_debug_tests") {
  cpu = pw_toolchain_CORTEX_M_CPU.M4
  fpu = pw_toolchain_CORTEX_M_FPU.FPV4_SP
  final_binary_extension = ".elf"
  default_configs = [
    "$dir_pw_build:extra_strict_warnings",
    "$dir_pw_toolchain/arm_gcc:enable_float_printf",
    "$dir_pw_build:optimize_size",
  ]
  toolchain_args = {
    forward_variables_from(_toolchain_base.defaults, "*", _excluded_defaults)

    # Force tests to use basic log backend to avoid generating and loading its
    # own tokenized database.
    pw_log_BACKEND = dir_pw_log_basic
  }
}
