#
# Copyright (c) 2019-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 (__TOOLCHAIN_LOADED)
    return()
endif()
set(__TOOLCHAIN_LOADED TRUE)

set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_C_COMPILER "armclang")
set(CMAKE_CXX_COMPILER "armclang")
set(CMAKE_ASM_COMPILER "armclang")
set(CMAKE_SYSTEM_PROCESSOR "cortex-m33+nodsp" CACHE STRING "Select Cortex-M architure. (cortex-m0, cortex-m3, cortex-m33, cortex-m4, cortex-m55, cortex-m7, etc)")

set(CMAKE_C_STANDARD 99)
set(CMAKE_CXX_STANDARD 11)

# The system processor could for example be set to cortex-m33+nodsp+nofp.
set(__CPU_COMPILE_TARGET ${CMAKE_SYSTEM_PROCESSOR})
string(REPLACE "+" ";" __CPU_FEATURES ${__CPU_COMPILE_TARGET})
list(POP_FRONT __CPU_FEATURES CMAKE_SYSTEM_PROCESSOR)

string(FIND ${__CPU_COMPILE_TARGET} "+" __OFFSET)
if(__OFFSET GREATER_EQUAL 0)
    string(SUBSTRING ${__CPU_COMPILE_TARGET} ${__OFFSET} -1 CPU_FEATURES)
endif()

# Add -mcpu to the compile options to override the -mcpu the CMake toolchain adds
add_compile_options(
    -mcpu=${__CPU_COMPILE_TARGET}
    "$<$<COMPILE_LANGUAGE:ASM>:-masm=auto;--target=arm-arm-none-eabi>")

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

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

# Link target
set(__CPU_LINK_TARGET ${CMAKE_SYSTEM_PROCESSOR})
if("nodsp" IN_LIST __CPU_FEATURES)
    string(APPEND __CPU_LINK_TARGET ".no_dsp")
endif()
if("nofp" IN_LIST __CPU_FEATURES)
    string(APPEND __CPU_LINK_TARGET ".no_fp")
endif()

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

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

#
# Compile options
#

add_compile_options(-Wall -Wextra
                    -Wsign-compare
                    -Wunused
                    -Wswitch-default
                    -Wformat
                    -Wdouble-promotion
                    -Wredundant-decls
                    -Wshadow
                    -Wcast-align
                    -Wnull-dereference
                    -Wno-deprecated-register
                    -Wno-format-extra-args
                    -Wno-missing-field-initializers
                    -Wno-unused-function
                    -Wno-unused-label
                    -Wno-unused-parameter
                    -Wno-return-type)
add_compile_options(-fno-unwind-tables -fno-rtti -fno-exceptions)
add_compile_options(-mthumb)
add_compile_options("$<$<CONFIG:DEBUG>:-gdwarf-3>")
