#
# Copyright (c) 2020 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 "armclang")
set(CMAKE_CXX_COMPILER "armclang")
set(CMAKE_LINKER "armlink")

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

# Link target
set(__LINK_TARGET ${CMAKE_SYSTEM_PROCESSOR})

if ("nodsp" IN_LIST __CPU_FEATURES)
    string(APPEND __LINK_TARGET ".no_dsp")
endif()

if ("nofp" IN_LIST __CPU_FEATURES)
    string(APPEND __LINK_TARGET ".no_fp")
endif()

if (CMAKE_SYSTEM_PROCESSOR STREQUAL "cortex-m55")
    set(__LINK_TARGET 8.1-M.Main.dsp)
endif()

# Define C/C++ standards
set(CMAKE_C_STANDARD 99)
set(CMAKE_CXX_STANDARD 14)

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

# Link options
add_link_options(
    --cpu=${__LINK_TARGET}
    --lto
    --info common,debug,sizes,totals,veneers,unused
    --symbols
    --diag_suppress=L6439W)

# 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-label
    -Wno-missing-field-initializers
    -Wno-return-type)
