## Derived from this project: https://github.com/jobroe/cmake-arm-embedded ## ## MIT License ## ## Copyright (c) 2018 Johannes Bruder ## ## Permission is hereby granted, free of charge, to any person obtaining a copy ## of this software and associated documentation files (the "Software"), to deal ## in the Software without restriction, including without limitation the rights ## to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ## copies of the Software, and to permit persons to whom the Software is ## furnished to do so, subject to the following conditions: ## ## The above copyright notice and this permission notice shall be included in all ## copies or substantial portions of the Software. ## ## THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ## IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ## FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ## AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ## LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ## OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ## SOFTWARE. ## ## CMake arm-none-eabi toolchain file ## # Target definition set(CMAKE_SYSTEM_NAME Generic) set(CMAKE_SYSTEM_PROCESSOR ARM) #--------------------------------------------------------------------------------------- # Set toolchain paths #--------------------------------------------------------------------------------------- set(TOOLCHAIN arm-none-eabi) if(NOT DEFINED TOOLCHAIN_PREFIX) if(CMAKE_HOST_SYSTEM_NAME STREQUAL Linux) set(TOOLCHAIN_PREFIX "/usr") elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL Darwin) set(TOOLCHAIN_PREFIX "/usr/local") elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL Windows) message(STATUS "Please specify the TOOLCHAIN_PREFIX !\n For example: -DTOOLCHAIN_PREFIX=\"C:/Program Files/GNU Tools ARM Embedded\" ") else() set(TOOLCHAIN_PREFIX "/usr") message(STATUS "No TOOLCHAIN_PREFIX specified, using default: " ${TOOLCHAIN_PREFIX}) endif() endif() set(TOOLCHAIN_BIN_DIR ${TOOLCHAIN_PREFIX}/bin) set(TOOLCHAIN_INC_DIR ${TOOLCHAIN_PREFIX}/${TOOLCHAIN}/include) set(TOOLCHAIN_LIB_DIR ${TOOLCHAIN_PREFIX}/${TOOLCHAIN}/lib) # Set system depended extensions if(WIN32) set(TOOLCHAIN_EXT ".exe" ) else() set(TOOLCHAIN_EXT "" ) endif() # Perform compiler test with static library set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) #--------------------------------------------------------------------------------------- # Set compiler/linker flags #--------------------------------------------------------------------------------------- # Object build options # -O0 No optimizations, reduce compilation time and make debugging produce the expected results. # -mthumb Generat thumb instructions. # -fno-builtin Do not use built-in functions provided by GCC. # -Wall Print only standard warnings, for all use Wextra # -ffunction-sections Place each function item into its own section in the output file. # -fdata-sections Place each data item into its own section in the output file. # -fomit-frame-pointer Omit the frame pointer in functions that don’t need one. # -mabi=aapcs Defines enums to be a variable sized type. set(OBJECT_GEN_FLAGS "-O0 -mthumb -fno-builtin -Wall -ffunction-sections -fdata-sections -fomit-frame-pointer -mabi=aapcs") set(CMAKE_C_FLAGS "${OBJECT_GEN_FLAGS} -std=gnu99 " CACHE INTERNAL "C Compiler options") set(CMAKE_CXX_FLAGS "${OBJECT_GEN_FLAGS} -std=c++11 -fno-threadsafe-statics -fno-rtti -fno-exceptions" CACHE INTERNAL "C++ Compiler options") set(CMAKE_ASM_FLAGS "${OBJECT_GEN_FLAGS} -x assembler-with-cpp " CACHE INTERNAL "ASM Compiler options") # -Wl,--gc-sections Perform the dead code elimination. # --specs=nano.specs Link with newlib-nano. # --specs=nosys.specs No syscalls, provide empty implementations for the POSIX system calls. set(CMAKE_EXE_LINKER_FLAGS "-Wl,--gc-sections --specs=nano.specs --specs=nosys.specs -mthumb -mabi=aapcs -Wl,-Map=${CMAKE_PROJECT_NAME}.map" CACHE INTERNAL "Linker options") #--------------------------------------------------------------------------------------- # Set debug/release build configuration Options #--------------------------------------------------------------------------------------- # Options for DEBUG build # -Og Enables optimizations that do not interfere with debugging. # -g Produce debugging information in the operating system’s native format. set(CMAKE_C_FLAGS_DEBUG "-Og -g -gstrict-dwarf" CACHE INTERNAL "C Compiler options for debug build type") set(CMAKE_CXX_FLAGS_DEBUG "-Og -g -gstrict-dwarf" CACHE INTERNAL "C++ Compiler options for debug build type") set(CMAKE_ASM_FLAGS_DEBUG "-g -gstrict-dwarf" CACHE INTERNAL "ASM Compiler options for debug build type") set(CMAKE_EXE_LINKER_FLAGS_DEBUG "" CACHE INTERNAL "Linker options for debug build type") # Options for RELEASE build # -Os Optimize for size. -Os enables all -O2 optimizations. # -flto Runs the standard link-time optimizer. set(CMAKE_C_FLAGS_RELEASE "-Os -flto" CACHE INTERNAL "C Compiler options for release build type") set(CMAKE_CXX_FLAGS_RELEASE "-Os -flto" CACHE INTERNAL "C++ Compiler options for release build type") set(CMAKE_ASM_FLAGS_RELEASE "" CACHE INTERNAL "ASM Compiler options for release build type") set(CMAKE_EXE_LINKER_FLAGS_RELEASE "-flto" CACHE INTERNAL "Linker options for release build type") #--------------------------------------------------------------------------------------- # Set compilers #--------------------------------------------------------------------------------------- set(CMAKE_C_COMPILER ${TOOLCHAIN_BIN_DIR}/${TOOLCHAIN}-gcc${TOOLCHAIN_EXT} CACHE INTERNAL "C Compiler") set(CMAKE_CXX_COMPILER ${TOOLCHAIN_BIN_DIR}/${TOOLCHAIN}-g++${TOOLCHAIN_EXT} CACHE INTERNAL "C++ Compiler") set(CMAKE_ASM_COMPILER ${TOOLCHAIN_BIN_DIR}/${TOOLCHAIN}-gcc${TOOLCHAIN_EXT} CACHE INTERNAL "ASM Compiler") set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)