diff options
Diffstat (limited to 'scripts/cmake/toolchains/bare-metal-gcc.cmake')
-rw-r--r-- | scripts/cmake/toolchains/bare-metal-gcc.cmake | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/scripts/cmake/toolchains/bare-metal-gcc.cmake b/scripts/cmake/toolchains/bare-metal-gcc.cmake new file mode 100644 index 0000000..2ffc1bb --- /dev/null +++ b/scripts/cmake/toolchains/bare-metal-gcc.cmake @@ -0,0 +1,145 @@ +#---------------------------------------------------------------------------- +# Copyright (c) 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 +# +# http://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. +#---------------------------------------------------------------------------- +# specify the cross compiler +set(TRIPLET arm-none-eabi) + +set(CMAKE_C_COMPILER ${TRIPLET}-gcc) +set(CMAKE_CXX_COMPILER ${TRIPLET}-g++) + +set(CMAKE_CROSSCOMPILING true) +set(CMAKE_SYSTEM_NAME Generic) + +set(MIN_GCC_VERSION 10.2.1) + +# Skip compiler test execution +set(CMAKE_C_COMPILER_WORKS 1) +set(CMAKE_CXX_COMPILER_WORKS 1) +set(PLATFORM_HAL 1) + +if (NOT DEFINED CMAKE_SYSTEM_PROCESSOR) + set(CMAKE_SYSTEM_PROCESSOR cortex-m55) +endif() + +if (CMAKE_SYSTEM_PROCESSOR STREQUAL cortex-m55) + # Flags for cortex-m55 + set(CPU_COMPILE_DEF CPU_CORTEX_M55) + set(CPU_NAME ${CMAKE_SYSTEM_PROCESSOR}) + set(FLOAT_ABI hard) + set(ARM_MATH_DSP 1) + set(ARM_MATH_LOOPUNROLL 1) +elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL cortex-m33) + # Flags for cortex-m33 to go here +endif() + +set(${CPU_COMPILE_DEF} 1) + +# Warning options +add_compile_options( + -Wall + -Wextra + -Wvla + -Wno-psabi) + +# General purpose compile options: +add_compile_options( + -funsigned-char + -fno-function-sections + "$<$<COMPILE_LANGUAGE:CXX>:-fno-unwind-tables;-fno-rtti;-fno-exceptions>") + +# Arch compile options: +add_compile_options( + -mthumb + -mcpu=${CPU_NAME} + -mfloat-abi=${FLOAT_ABI} + -mlittle-endian + -MD) + +# Compile definitions: +add_compile_definitions( + PLATFORM_HAL=${PLATFORM_HAL} + ${CPU_COMPILE_DEF}=1 + $<$<BOOL:${ARM_MATH_DSP}>:ARM_MATH_DSP> + $<$<BOOL:${ARM_MATH_LOOPUNROLL}>:ARM_MATH_LOOPUNROLL>) + +# Link options: +add_link_options( + -mthumb + -mcpu=${CPU_NAME} + -mfloat-abi=${FLOAT_ABI} + -mlittle-endian + --specs=nosys.specs + --stats + "$<$<CONFIG:RELEASE>:--no-debug>") + +# Function to add a map file output for the linker to dump diagnostic information to. +function(add_target_map_file TARGET_NAME MAP_FILE_PATH) + target_link_options(${TARGET_NAME} PUBLIC + -Xlinker -Map=${MAP_FILE_PATH}) +endfunction() + +# Function to add linker option to use the chosen linker script. +function(add_linker_script SCRIPT_DIR SCRIPT_NAME) + set(LINKER_SCRIPT_PATH ${SCRIPT_DIR}/${SCRIPT_NAME}.ld + CACHE STRING "Linker script path") + if (NOT EXISTS ${LINKER_SCRIPT_PATH}) + message(FATAL_ERROR "Linker script not found: ${LINKER_SCRIPT_PATH}") + endif() + message(STATUS "Using linker script: ${LINKER_SCRIPT_PATH}") + add_link_options("SHELL:-T ${LINKER_SCRIPT_PATH}") +endfunction() + +# Function to set the command to copy/extract contents from an elf +# into a binary file. +function(add_bin_generation_command) + + set(multiValueArgs SECTION_PATTERNS OUTPUT_BIN_NAMES) + set(oneValueArgs TARGET_NAME OUTPUT_DIR AXF_PATH) + cmake_parse_arguments(PARSED "" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + list(LENGTH PARSED_SECTION_PATTERNS N_SECTION_PATTERNS) + list(LENGTH PARSED_OUTPUT_BIN_NAMES N_OUTPUT_BIN_NAMES) + + if (NOT ${N_SECTION_PATTERNS} STREQUAL ${N_OUTPUT_BIN_NAMES}) + message(FATAL_ERROR "Section patterns and the output binary names " + "should be of the same length") + endif() + + message(STATUS "${TRIPLET}-objcopy requested to generate " + "${N_OUTPUT_BIN_NAMES} bin files.") + + math(EXPR MAX_IDX "${N_SECTION_PATTERNS} - 1") + + foreach(IDX RANGE ${MAX_IDX}) + + list(GET PARSED_OUTPUT_BIN_NAMES ${IDX} OUTPUT_BIN_NAME) + list(GET PARSED_SECTION_PATTERNS ${IDX} SECTION_PATTERN) + + add_custom_command(TARGET ${PARSED_TARGET_NAME} + POST_BUILD + COMMAND ${TRIPLET}-objcopy -O binary + --only-section ${SECTION_PATTERN} ${PARSED_AXF_PATH} + ${PARSED_OUTPUT_DIR}/${OUTPUT_BIN_NAME}) + endforeach() + +endfunction() + +# Function to assert the compiler version +function(enforce_compiler_version) + if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${MIN_GCC_VERSION}) + message( FATAL_ERROR "arm-none-eabi-gcc version must be ${MIN_GCC_VERSION} or greater to support ${CMAKE_SYSTEM_PROCESSOR} architecture." ) + endif() +endfunction() |