#
# Copyright (c) 2020-2021 Arm Limited. All rights reserved.
#
# SPDX-License-Identifier: Apache-2.0
#
# 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
#
# 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.
#

if (NOT TARGET_CPU)
    set(TARGET_CPU "cortex-m4")
endif()

set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_C_COMPILER "arm-none-eabi-gcc")
set(CMAKE_CXX_COMPILER "arm-none-eabi-g++")

# Convert TARGET_CPU=Cortex-M33+nofp+nodsp into
#   - CMAKE_SYSTEM_PROCESSOR=cortex-m33
#   - TARGET_CPU_FEATURES=no-fp;no-dsp
string(REPLACE "+" ";" TARGET_CPU_FEATURES ${TARGET_CPU})
list(POP_FRONT TARGET_CPU_FEATURES CMAKE_SYSTEM_PROCESSOR)
string(TOLOWER ${CMAKE_SYSTEM_PROCESSOR} CMAKE_SYSTEM_PROCESSOR)

set(CMAKE_EXECUTABLE_SUFFIX ".elf")
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

# Select C/C++ version
set(CMAKE_C_STANDARD 99)
set(CMAKE_CXX_STANDARD 14)

# Compile options
add_compile_options(
    -mcpu=${TARGET_CPU}
    -mthumb
    "$<$<COMPILE_LANGUAGE:CXX>:-fno-unwind-tables;-fno-rtti;-fno-exceptions>")

# Compile defines
add_compile_definitions(
    "$<$<NOT:$<CONFIG:DEBUG>>:NDEBUG>")

# Link options
add_link_options(
    -mcpu=${TARGET_CPU}
    -mthumb
    --specs=nosys.specs)

# Set floating point unit
if("${TARGET_CPU}" MATCHES "\\+fp")
    set(FLOAT hard)
elseif("${TARGET_CPU}" MATCHES "\\+nofp")
    set(FLOAT soft)
elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "cortex-m33" OR
       "${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "cortex-m55")
    set(FLOAT hard)
else()
    set(FLOAT soft)
endif()

if (FLOAT)
    add_compile_options(-mfloat-abi=${FLOAT})
    add_link_options(-mfloat-abi=${FLOAT})
endif()

# Compilation warnings
add_compile_options(
    -Wall
    -Wextra
    -Wsign-compare
    -Wunused
    -Wswitch-default
#    -Wformat
    -Wdouble-promotion
    -Wredundant-decls
    -Wshadow
#    -Wcast-align
    -Wnull-dereference
    -Wno-format-extra-args
    -Wno-unused-function
    -Wno-unused-parameter
    -Wno-unused-label
    -Wno-missing-field-initializers
    -Wno-return-type)
