Last active
August 18, 2024 12:50
-
-
Save elmot/3b4f0e9f8b23864fdf8bb509c329d051 to your computer and use it in GitHub Desktop.
CMakeLists.txt template for ARM GCC projects
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
cmake_minimum_required(VERSION 3.17) | |
set(CMAKE_SYSTEM_NAME Generic) | |
set(CMAKE_SYSTEM_VERSION 1) | |
# specify cross compilers and tools | |
set(CMAKE_C_COMPILER arm-none-eabi-gcc) | |
set(CMAKE_CXX_COMPILER arm-none-eabi-g++) | |
set(CMAKE_ASM_COMPILER arm-none-eabi-gcc) | |
set(CMAKE_AR arm-none-eabi-ar) | |
set(CMAKE_OBJCOPY arm-none-eabi-objcopy) | |
set(CMAKE_OBJDUMP arm-none-eabi-objdump) | |
set(SIZE arm-none-eabi-size) | |
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) | |
# project settings | |
project(#[[TODO project name]] C CXX ASM) | |
set(CMAKE_CXX_STANDARD 17) | |
set(CMAKE_C_STANDARD 11) | |
set(MCPU #[[TODO kernel type, ex cortex-m4]]) | |
#Uncomment for hardware floating point | |
#add_compile_definitions(ARM_MATH_CM4;ARM_MATH_MATRIX_CHECK;ARM_MATH_ROUNDING) | |
#add_compile_options(-mfloat-abi=hard -mfpu=fpv4-sp-d16) | |
#add_link_options(-mfloat-abi=hard -mfpu=fpv4-sp-d16) | |
#Uncomment for software floating point | |
#add_compile_options(-mfloat-abi=soft) | |
add_compile_options(-mcpu=${MCPU} -mthumb -mthumb-interwork) | |
add_compile_options(-ffunction-sections -fdata-sections -fno-common -fmessage-length=0) | |
# uncomment to mitigate c++17 absolute addresses warnings | |
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-register") | |
if ("${CMAKE_BUILD_TYPE}" STREQUAL "Release") | |
message(STATUS "Maximum optimization for speed") | |
add_compile_options(-Ofast) | |
elseif ("${CMAKE_BUILD_TYPE}" STREQUAL "RelWithDebInfo") | |
message(STATUS "Maximum optimization for speed, debug info included") | |
add_compile_options(-Ofast -g) | |
elseif ("${CMAKE_BUILD_TYPE}" STREQUAL "MinSizeRel") | |
message(STATUS "Maximum optimization for size") | |
add_compile_options(-Os) | |
else () | |
message(STATUS "Minimal optimization, debug info included") | |
add_compile_options(-Og -g) | |
endif () | |
include_directories( | |
${CMAKE_SOURCE_DIR}/Core/Inc | |
${CMAKE_SOURCE_DIR}/../Drivers/CMSIS/Include | |
#[[ TODO rest of include folder locations ex.: | |
${CMAKE_SOURCE_DIR}/../Drivers/STM32H7xx_HAL_Driver/Inc | |
${CMAKE_SOURCE_DIR}/../Drivers/STM32H7xx_HAL_Driver/Inc/Legacy | |
${CMAKE_SOURCE_DIR}/../Drivers/CMSIS/Device/ST/STM32H7xx/Include | |
]] | |
) | |
add_definitions(#[[TODO insert definitions, ex. -DUSE_HAL_DRIVER -DCORE_CM4 -DDEBUG -DSTM32H745xx]]) | |
file(GLOB_RECURSE SOURCES | |
"Core/*.*" "Core/Startup/*.*" | |
"Drivers/*.*" "../Drivers/*.*" | |
"../Common/*.*" | |
#[[TODO rest of cource locations]] | |
) | |
set(LINKER_SCRIPT ${CMAKE_SOURCE_DIR}/#[[TODO linker script name, ex STM32H745ZITX_FLASH.ld]]) | |
add_link_options(-Wl,-gc-sections,--print-memory-usage,-Map=${PROJECT_BINARY_DIR}/${PROJECT_NAME}.map) | |
add_link_options(-mcpu=${MCPU} -mthumb -mthumb-interwork) | |
add_link_options(-T ${LINKER_SCRIPT}) | |
add_executable(${PROJECT_NAME}.elf ${SOURCES} ${LINKER_SCRIPT}) | |
set(HEX_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.hex) | |
set(BIN_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.bin) | |
add_custom_command(TARGET ${PROJECT_NAME}.elf POST_BUILD | |
COMMAND ${CMAKE_OBJCOPY} -Oihex $<TARGET_FILE:${PROJECT_NAME}.elf> ${HEX_FILE} | |
COMMAND ${CMAKE_OBJCOPY} -Obinary $<TARGET_FILE:${PROJECT_NAME}.elf> ${BIN_FILE} | |
COMMENT "Building ${HEX_FILE} | |
Building ${BIN_FILE}") |
Thanks @elmot for sharing this! Just discovered it and looks very helpful for my project.
One question: if I want to use the stm project as a CMake submodule rather than the entire project (higher level framework that uses the stm code as the infrastructure), what do I need to change in this Cmakefile?
Thanks!
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Excellent.