├── LICENSE ├── README.md ├── arm-cortex-gnu ├── arm-cortex-gnu-toolchain.cmake ├── arm-cortex-m4-gnu.cmake └── arm-cortex-m7-gnu.cmake ├── arm-cortex-iar ├── arm-cortex-iar-toolchain.cmake ├── arm-cortex-m4-iar.cmake └── arm-cortex-m7-iar.cmake ├── arm-cortex-keil ├── arm-cortex-keil-toolchain.cmake └── arm-cortex-m4-keil.cmake ├── find_compiler.cmake ├── renensas-rx-gcc ├── renesas-rx-gcc-rx65n.cmake └── renesas-rx-gcc-toolchain.cmake └── target_link.cmake /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Ryan Winter 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # cmake-embedded-toolchains -------------------------------------------------------------------------------- /arm-cortex-gnu/arm-cortex-gnu-toolchain.cmake: -------------------------------------------------------------------------------- 1 | include("${CMAKE_CURRENT_LIST_DIR}/../find_compiler.cmake") 2 | 3 | set(CMAKE_SYSTEM_NAME Generic) 4 | set(CMAKE_SYSTEM_PROCESSOR arm) 5 | set(TARGET_TRIPLET "arm-none-eabi-") 6 | 7 | # Find the compiler path 8 | find_compiler(ARM_COMPILER_PATH ARM_COMPILER_EXT "${TARGET_TRIPLET}gcc") 9 | 10 | # Perform compiler test with the static library 11 | set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) 12 | 13 | set(CMAKE_C_COMPILER ${ARM_COMPILER_PATH}/${TARGET_TRIPLET}gcc${ARM_COMPILER_EXT}) 14 | set(CMAKE_CXX_COMPILER ${ARM_COMPILER_PATH}/${TARGET_TRIPLET}g++${ARM_COMPILER_EXT}) 15 | set(CMAKE_ASM_COMPILER ${ARM_COMPILER_PATH}/${TARGET_TRIPLET}gcc${ARM_COMPILER_EXT}) 16 | set(CMAKE_LINKER ${ARM_COMPILER_PATH}/${TARGET_TRIPLET}gcc${ARM_COMPILER_EXT}) 17 | set(CMAKE_SIZE_UTIL ${ARM_COMPILER_PATH}/${TARGET_TRIPLET}size${ARM_COMPILER_EXT}) 18 | set(CMAKE_OBJCOPY ${ARM_COMPILER_PATH}/${TARGET_TRIPLET}objcopy${ARM_COMPILER_EXT}) 19 | set(CMAKE_OBJDUMP ${ARM_COMPILER_PATH}/${TARGET_TRIPLET}objdump${ARM_COMPILER_EXT}) 20 | set(CMAKE_NM_UTIL ${ARM_COMPILER_PATH}/${TARGET_TRIPLET}gcc-nm${ARM_COMPILER_EXT}) 21 | set(CMAKE_AR ${ARM_COMPILER_PATH}/${TARGET_TRIPLET}gcc-ar${ARM_COMPILER_EXT}) 22 | set(CMAKE_RANLIB ${ARM_COMPILER_PATH}/${TARGET_TRIPLET}gcc-ranlib${ARM_COMPILER_EXT}) 23 | 24 | set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) 25 | set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) 26 | 27 | # Compiler and linker flags 28 | set(CMAKE_COMMON_FLAGS "${MCPU_FLAGS} ${VFP_FLAGS} -g3 -ffunction-sections -fdata-sections -fno-strict-aliasing -fno-builtin -fno-common -Wall -Wshadow -Wdouble-promotion -Werror -Wno-unused-parameter") 29 | 30 | set(CMAKE_C_FLAGS_INIT "${CMAKE_COMMON_FLAGS}") 31 | set(CMAKE_CXX_FLAGS_INIT "${CMAKE_COMMON_FLAGS}") 32 | set(CMAKE_ASM_FLAGS_INIT "${CMAKE_COMMON_FLAGS}") 33 | set(CMAKE_EXE_LINKER_FLAGS_INIT "${LD_FLAGS} --specs=nano.specs -Wl,--gc-sections,-print-memory-usage") 34 | 35 | set(CMAKE_C_FLAGS_DEBUG_INIT "-O0") 36 | set(CMAKE_CXX_ASM_FLAGS_DEBUG_INIT "-O0") 37 | set(CMAKE_ASM_FLAGS_DEBUG_INIT "") 38 | set(CMAKE_EXE_LINKER_FLAGS_DEBUG_INIT "") 39 | 40 | set(CMAKE_C_FLAGS_RELEASE_INIT "-Os -flto") 41 | set(CMAKE_CXX_FLAGS_RELEASE_INIT "-Os -flto") 42 | set(CMAKE_ASM_FLAGS_RELEASE_INIT "") 43 | set(CMAKE_EXE_LINKER_FLAGS_RELEASE_INIT "-flto") 44 | -------------------------------------------------------------------------------- /arm-cortex-gnu/arm-cortex-m4-gnu.cmake: -------------------------------------------------------------------------------- 1 | set(MCPU_FLAGS "-mthumb -mcpu=cortex-m4") 2 | set(VFP_FLAGS "-mfloat-abi=hard -mfpu=fpv4-sp-d16") 3 | 4 | include(${CMAKE_CURRENT_LIST_DIR}/arm-cortex-gnu-toolchain.cmake) 5 | -------------------------------------------------------------------------------- /arm-cortex-gnu/arm-cortex-m7-gnu.cmake: -------------------------------------------------------------------------------- 1 | set(MCPU_FLAGS "-mthumb -mcpu=cortex-m7") 2 | set(VFP_FLAGS "-mfloat-abi=hard -mfpu=fpv5-sp-d16") 3 | 4 | include(${CMAKE_CURRENT_LIST_DIR}/arm-cortex-gnu-toolchain.cmake) 5 | -------------------------------------------------------------------------------- /arm-cortex-iar/arm-cortex-iar-toolchain.cmake: -------------------------------------------------------------------------------- 1 | include("${CMAKE_CURRENT_LIST_DIR}/../find_compiler.cmake") 2 | 3 | set(CMAKE_SYSTEM_NAME Generic) 4 | set(CMAKE_SYSTEM_PROCESSOR arm) 5 | 6 | # Find the compiler path 7 | find_compiler(EWARM_COMPILER_PATH EWARM_COMPILER_EXT "iccarm.exe") 8 | 9 | # Set up the CMake variables for compiler and assembler 10 | set(CMAKE_C_COMPILER "${EWARM_COMPILER_PATH}/iccarm.exe") 11 | set(CMAKE_CXX_COMPILER "${EWARM_COMPILER_PATH}/iccarm.exe") 12 | set(CMAKE_ASM_COMPILER "${EWARM_COMPILER_PATH}/iasmarm.exe") 13 | 14 | set(CMAKE_C_FLAGS_INIT "${CPU_FLAGS} -e") 15 | set(CMAKE_CXX_FLAGS_INIT "${CPU_FLAGS} --c++") 16 | set(CMAKE_ASM_FLAGS_INIT "${CPU_FLAGS}") 17 | set(CMAKE_EXE_LINKER_FLAGS_INIT "--semihosting") 18 | 19 | set(CMAKE_C_FLAGS_DEBUG_INIT "-On") 20 | set(CMAKE_CXX_FLAGS_DEBUG_INIT "-On") 21 | -------------------------------------------------------------------------------- /arm-cortex-iar/arm-cortex-m4-iar.cmake: -------------------------------------------------------------------------------- 1 | # Compiler flags needed to compile for this CPU 2 | set(CPU_FLAGS "--cpu Cortex-M4 --fpu VFPv4_sp") 3 | 4 | include(${CMAKE_CURRENT_LIST_DIR}/arm-cortex-iar-toolchain.cmake) 5 | -------------------------------------------------------------------------------- /arm-cortex-iar/arm-cortex-m7-iar.cmake: -------------------------------------------------------------------------------- 1 | # Compiler flags needed to compile for this CPU 2 | set(CPU_FLAGS "--cpu Cortex-M7 --fpu VFPv5_sp") 3 | 4 | include(${CMAKE_CURRENT_LIST_DIR}/arm-cortex-iar-toolchain.cmake) 5 | -------------------------------------------------------------------------------- /arm-cortex-keil/arm-cortex-keil-toolchain.cmake: -------------------------------------------------------------------------------- 1 | include("${CMAKE_CURRENT_LIST_DIR}/../find_compiler.cmake") 2 | 3 | cmake_policy(SET CMP0123 NEW) 4 | 5 | set(CMAKE_SYSTEM_NAME Generic) 6 | set(CMAKE_SYSTEM_PROCESSOR arm) 7 | 8 | # Find the compiler path 9 | find_compiler(KEIL_COMPILER_PATH KEIL_COMPILER_EXT "armclang.exe") 10 | 11 | # Set up the CMake variables for compiler and assembler 12 | set(CMAKE_C_COMPILER "${KEIL_COMPILER_PATH}/armclang.exe") 13 | set(CMAKE_CXX_COMPILER "${KEIL_COMPILER_PATH}/armclang.exe") 14 | set(CMAKE_ASM_COMPILER "${KEIL_COMPILER_PATH}/armasm.exe") 15 | set(CMAKE_FROMELF "${KEIL_COMPILER_PATH}/fromelf.exe") 16 | 17 | set(CMAKE_COMMON_FLAGS "${CPU_FLAGS} ${VFP_FLAGS} -gdwarf-4 -ffunction-sections -fdata-sections -Wall -Werror") 18 | 19 | set(CMAKE_C_FLAGS_INIT "${CMAKE_COMMON_FLAGS}") 20 | set(CMAKE_CXX_FLAGS_INIT "${CMAKE_COMMON_FLAGS}") 21 | set(CMAKE_ASM_FLAGS_INIT "${CMAKE_COMMON_FLAGS}") 22 | set(CMAKE_EXE_LINKER_FLAGS_INIT "${LD_FLAGS} ${LINK_FLAGS} --callgraph --remove --info summarysizes --info unused --symbols --xref") 23 | 24 | set(CMAKE_C_FLAGS_DEBUG_INIT "-O0") 25 | set(CMAKE_CXX_ASM_FLAGS_DEBUG_INIT "-O0") 26 | set(CMAKE_ASM_FLAGS_DEBUG_INIT "") 27 | set(CMAKE_EXE_LINKER_FLAGS_DEBUG_INIT "") 28 | 29 | set(CMAKE_C_FLAGS_RELEASE_INIT "-Os -flto") 30 | set(CMAKE_CXX_FLAGS_RELEASE_INIT "-Os -flto") 31 | set(CMAKE_ASM_FLAGS_RELEASE_INIT "") 32 | set(CMAKE_EXE_LINKER_FLAGS_RELEASE_INIT "-flto") -------------------------------------------------------------------------------- /arm-cortex-keil/arm-cortex-m4-keil.cmake: -------------------------------------------------------------------------------- 1 | # Compiler flags needed to compile for this CPU 2 | #set(CMAKE_SYSTEM_PROCESSOR cortex-m4) 3 | #set(CMAKE_SYSTEM_ARCH armv7e-m) 4 | set(CPU_FLAGS "--target=arm-arm-none-eabi -mthumb -mcpu=cortex-m4 -march=armv7e-m") 5 | set(VFP_FLAGS "-mfloat-abi=hard -mfpu=fpv4-sp-d16") 6 | set(LINK_FLAGS "--cpu=Cortex-M4.fp.sp") 7 | 8 | include(${CMAKE_CURRENT_LIST_DIR}/arm-cortex-keil-toolchain.cmake) 9 | -------------------------------------------------------------------------------- /find_compiler.cmake: -------------------------------------------------------------------------------- 1 | function(find_compiler compiler_path compiler_ext compiler_exe) 2 | find_program( 3 | _compiler ${compiler_exe} 4 | PATHS $ENV{CMAKE_TOOLCHAIN_PATH} PATH_SUFFIXES bin 5 | ) 6 | 7 | if("${_compiler}" STREQUAL "${_compiler}-NOTFOUND") 8 | message(FATAL_ERROR "Compiler not found, you can specify search path with \"CMAKE_TOOLCHAIN_PATH\".") 9 | else() 10 | message(STATUS "Found compiler ${_compiler}") 11 | get_filename_component(${compiler_path} ${_compiler} DIRECTORY CACHE) 12 | get_filename_component(${compiler_ext} ${_compiler} EXT CACHE) 13 | endif() 14 | endfunction() 15 | -------------------------------------------------------------------------------- /renensas-rx-gcc/renesas-rx-gcc-rx65n.cmake: -------------------------------------------------------------------------------- 1 | # Define the CPU architecture for Threadx 2 | set(THREADX_ARCH "rxv2") 3 | set(THREADX_TOOLCHAIN "gnu") 4 | 5 | set(MCPU_FLAGS "-m64bit-doubles -mcpu=rx64m -misa=v2 -mlittle-endian-data") 6 | 7 | include(${CMAKE_CURRENT_LIST_DIR}/renesas-rx-gcc-toolchain.cmake) 8 | -------------------------------------------------------------------------------- /renensas-rx-gcc/renesas-rx-gcc-toolchain.cmake: -------------------------------------------------------------------------------- 1 | include("${CMAKE_CURRENT_LIST_DIR}/../find_compiler.cmake") 2 | 3 | set(CMAKE_SYSTEM_NAME Generic) 4 | set(CMAKE_SYSTEM_PROCESSOR rx) 5 | set(TARGET_TRIPLET "rx-elf-") 6 | 7 | # Find the compiler path 8 | find_compiler(RX_COMPILER_PATH RX_COMPILER_EXT "iccarm.exe") 9 | 10 | # perform compiler test with the static library 11 | set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) 12 | 13 | set(CMAKE_C_COMPILER ${RX_COMPILER_PATH}/${TARGET_TRIPLET}gcc${RX_COMPILER_EXT}) 14 | set(CMAKE_CXX_COMPILER ${RX_COMPILER_PATH}/${TARGET_TRIPLET}g++${RX_COMPILER_EXT}) 15 | set(CMAKE_ASM_COMPILER ${RX_COMPILER_PATH}/${TARGET_TRIPLET}gcc${RX_COMPILER_EXT}) 16 | set(CMAKE_LINKER ${RX_COMPILER_PATH}/${TARGET_TRIPLET}gcc${RX_COMPILER_EXT}) 17 | set(CMAKE_SIZE_UTIL ${RX_COMPILER_PATH}/${TARGET_TRIPLET}size${RX_COMPILER_EXT}) 18 | set(CMAKE_OBJCOPY ${RX_COMPILER_PATH}/${TARGET_TRIPLET}objcopy${RX_COMPILER_EXT}) 19 | set(CMAKE_OBJDUMP ${RX_COMPILER_PATH}/${TARGET_TRIPLET}objdump${RX_COMPILER_EXT}) 20 | set(CMAKE_NM_UTIL ${RX_COMPILER_PATH}/${TARGET_TRIPLET}nm${RX_COMPILER_EXT}) 21 | 22 | set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) 23 | set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) 24 | 25 | set(CMAKE_COMMON_FLAGS "-ffunction-sections -fdata-sections -fdiagnostics-parseable-fixits -fno-strict-aliasing -fno-builtin -fshort-enums -Wuninitialized -Wdouble-promotion -Werror -Wno-unused-function -Wno-unused-parameter -Wno-incompatible-pointer-types") 26 | set(CMAKE_C_FLAGS_INIT "${MCPU_FLAGS} ${VFP_FLAGS} ${CMAKE_COMMON_FLAGS} ${LIBC_INCLUDE}") 27 | set(CMAKE_CXX_FLAGS_INIT "${MCPU_FLAGS} ${VFP_FLAGS} ${CMAKE_COMMON_FLAGS}") 28 | set(CMAKE_ASM_FLAGS_INIT "${MCPU_FLAGS} ${VFP_FLAGS}") 29 | set(CMAKE_EXE_LINKER_FLAGS_INIT "${LD_FLAGS} -fno-common -nostartfiles -Wl,--gc-sections --specs=nano.specs") 30 | 31 | set(CMAKE_C_FLAGS_DEBUG_INIT "-O0 -g3") 32 | set(CMAKE_CXX_ASM_FLAGS_DEBUG_INIT "-O0 -g3") 33 | set(CMAKE_ASM_FLAGS_DEBUG_INIT "-g3") 34 | 35 | set(CMAKE_C_FLAGS_RELEASE_INIT "-Os") 36 | set(CMAKE_CXX_FLAGS_RELEASE_INIT "-Os") 37 | set(CMAKE_ASM_FLAGS_RELEASE_INIT "") 38 | -------------------------------------------------------------------------------- /target_link.cmake: -------------------------------------------------------------------------------- 1 | function(target_link TARGET LINKER_SCRIPT) 2 | set_target_properties(${TARGET} PROPERTIES SUFFIX ".elf") 3 | 4 | if(CMAKE_C_COMPILER_ID STREQUAL "GNU") 5 | target_link_options(${TARGET} 6 | PRIVATE 7 | -T${LINKER_SCRIPT}.ld 8 | -Wl,-Map=${TARGET}.map 9 | ) 10 | add_custom_target(${TARGET}.bin ALL 11 | DEPENDS ${TARGET} 12 | COMMAND ${CMAKE_OBJCOPY} -Obinary ${TARGET}.elf ${TARGET}.bin 13 | COMMAND ${CMAKE_OBJCOPY} -Oihex ${TARGET}.elf ${TARGET}.hex 14 | ) 15 | 16 | elseif(CMAKE_C_COMPILER_ID STREQUAL "IAR") 17 | target_link_options(${TARGET} 18 | PRIVATE 19 | --config ${LINKER_SCRIPT}.icf 20 | --map=${TARGET}.map 21 | ) 22 | add_custom_target(${TARGET}.bin ALL 23 | DEPENDS ${TARGET} 24 | COMMAND ${CMAKE_IAR_ELFTOOL} --bin ${TARGET}.elf ${TARGET}.bin 25 | ) 26 | 27 | elseif(CMAKE_C_COMPILER_ID STREQUAL "ARMClang") 28 | target_link_options(${TARGET} 29 | PRIVATE 30 | --scatter ${LINKER_SCRIPT}.sct 31 | --map 32 | ) 33 | add_custom_target(${TARGET}.bin ALL 34 | DEPENDS ${TARGET} 35 | COMMAND ${CMAKE_FROMELF} --bin --output=${TARGET}.bin ${TARGET}.elf 36 | COMMAND ${CMAKE_FROMELF} --i32combined --output=${TARGET}.hex ${TARGET}.elf 37 | ) 38 | else() 39 | message(FATAL_ERROR "Unknown CMAKE_C_COMPILER_ID ${CMAKE_C_COMPILER_ID}") 40 | endif() 41 | endfunction() 42 | --------------------------------------------------------------------------------