From b427fbca6872ded7401468ebf9bf9bd9a6f0ba09 Mon Sep 17 00:00:00 2001 From: robtor Date: Tue, 17 Jun 2025 16:13:51 +0200 Subject: [PATCH] Restructure cmake project with separate toolchain file --- CMakeLists.txt | 119 ++---------------- Tests/CMakeLists.txt | 4 + Tests/experiments/example-test.cpp | 14 +++ floatpump/CMakeLists.txt | 51 ++++++++ .../STM32F411CEUX_FLASH.ld | 0 .../STM32F411CEUX_RAM.ld | 0 ...rm-none-eabi-stm32f411ceu6-toolchain.cmake | 53 ++++++++ 7 files changed, 131 insertions(+), 110 deletions(-) create mode 100644 Tests/CMakeLists.txt create mode 100644 Tests/experiments/example-test.cpp create mode 100644 floatpump/CMakeLists.txt rename STM32F411CEUX_FLASH.ld => toolchain/STM32F411CEUX_FLASH.ld (100%) rename STM32F411CEUX_RAM.ld => toolchain/STM32F411CEUX_RAM.ld (100%) create mode 100644 toolchain/arm-none-eabi-stm32f411ceu6-toolchain.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index e4bf8b5..c201ebd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,115 +1,14 @@ -#THIS FILE IS AUTO GENERATED FROM THE TEMPLATE! DO NOT CHANGE! -set(CMAKE_SYSTEM_NAME Generic) -set(CMAKE_SYSTEM_VERSION 1) -cmake_minimum_required(VERSION 3.2) - -# 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(FloatPUMP C CXX ASM) +cmake_minimum_required(VERSION 3.22) +project(FloatPUMP VERSION 2.0.0 LANGUAGES C CXX ASM ) + + set(CMAKE_CXX_STANDARD 17) set(CMAKE_C_STANDARD 11) -# custom options -#execute_process( -# COMMAND git log -1 --format=%h -# WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} -# OUTPUT_VARIABLE GIT_HASH -# OUTPUT_STRIP_TRAILING_WHITESPACE -#) -# -#add_definitions(-DGIT_HASH=${GIT_HASH}) +# General Project +add_subdirectory(floatpump) -set(GIT_HASH "undefined") -find_package(Git QUIET) -if(GIT_FOUND) - execute_process( - COMMAND ${GIT_EXECUTABLE} log -1 --pretty=format:%h - OUTPUT_VARIABLE GIT_HASH - OUTPUT_STRIP_TRAILING_WHITESPACE - ERROR_QUIET - ) -endif() - -message(STATUS "Burning in git hash: ${GIT_HASH}") - -add_definitions("-DGIT_HASH=\"${GIT_HASH}\"") - - -#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=cortex-m4 -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") - -# Enable assembler files preprocessing -add_compile_options($<$:-x$assembler-with-cpp>) - -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 () - - -add_definitions(-DDEBUG -DUSE_HAL_DRIVER -DSTM32F411xE) - -include_directories( - floatpump/USB_DEVICE/App - floatpump/USB_DEVICE/Target - floatpump/Core/Inc - floatpump/Drivers/STM32F4xx_HAL_Driver/Inc - floatpump/Drivers/STM32F4xx_HAL_Driver/Inc/Legacy - floatpump/Middlewares/ST/STM32_USB_Device_Library/Core/Inc - floatpump/Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc - floatpump/Drivers/CMSIS/Device/ST/STM32F4xx/Include floatpump/Drivers/CMSIS/Include - floatpump/Middlewares/floatpump/Inc - ) - -file(GLOB_RECURSE SOURCES - "floatpump/Core/*.*" - "floatpump/Middlewares/*.*" - "floatpump/Drivers/*.*" - "floatpump/USB_DEVICE/*.*" - ) - -set(LINKER_SCRIPT ${CMAKE_SOURCE_DIR}/STM32F411CEUX_FLASH.ld) - -add_link_options(-Wl,-gc-sections,--print-memory-usage,-Map=${PROJECT_BINARY_DIR}/${PROJECT_NAME}.map) -add_link_options(-mcpu=cortex-m4 -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 $ ${HEX_FILE} - COMMAND ${CMAKE_OBJCOPY} -Obinary $ ${BIN_FILE} - COMMENT "Building ${HEX_FILE} -Building ${BIN_FILE}") \ No newline at end of file +# All UnitTest Related stuff +add_subdirectory(Catch2) +add_subdirectory(Tests) \ No newline at end of file diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt new file mode 100644 index 0000000..9b96e29 --- /dev/null +++ b/Tests/CMakeLists.txt @@ -0,0 +1,4 @@ +find_package(Catch2 REQUIRED) + +add_executable(testtests experiments/example-test.cpp) +target_link_libraries(testtests PRIVATE Catch2::Catch2WithMain) \ No newline at end of file diff --git a/Tests/experiments/example-test.cpp b/Tests/experiments/example-test.cpp new file mode 100644 index 0000000..e10ced2 --- /dev/null +++ b/Tests/experiments/example-test.cpp @@ -0,0 +1,14 @@ +#include + +#include + +uint32_t factorial( uint32_t number ) { + return number <= 1 ? number : factorial(number-1) * number; +} + +TEST_CASE( "Factorials are computed", "[factorial]" ) { + REQUIRE( factorial( 1) == 1 ); + REQUIRE( factorial( 2) == 2 ); + REQUIRE( factorial( 3) == 6 ); + REQUIRE( factorial(10) == 3'628'800 ); +} \ No newline at end of file diff --git a/floatpump/CMakeLists.txt b/floatpump/CMakeLists.txt new file mode 100644 index 0000000..05b91df --- /dev/null +++ b/floatpump/CMakeLists.txt @@ -0,0 +1,51 @@ +set(GIT_HASH "undefined") +find_package(Git QUIET) +if(GIT_FOUND) + execute_process( + COMMAND ${GIT_EXECUTABLE} log -1 --pretty=format:%h + OUTPUT_VARIABLE GIT_HASH + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_QUIET + ) +endif() + +message(STATUS "Burning in git hash: ${GIT_HASH}") + +add_definitions("-DGIT_HASH=\"${GIT_HASH}\"") + +#include(${CMAKE_CURRENT_LIST_DIR}/../toolchain/arm-none-eabi-stm32f411ceu6-toolchain.cmake) +# uncomment to mitigate c++17 absolute addresses warnings +#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-register") + +file(GLOB_RECURSE SOURCES + "Core/*.*" + "Middlewares/*.*" + "Drivers/*.*" + "USB_DEVICE/*.*" +) + +message(WARNING "linker script is : ${LINKER_SCRIPT}") + +add_executable(${PROJECT_NAME}.elf ${SOURCES} ${LINKER_SCRIPT}) + +target_include_directories(${PROJECT_NAME}.elf PUBLIC + USB_DEVICE/App + USB_DEVICE/Target + Core/Inc + Drivers/STM32F4xx_HAL_Driver/Inc + Drivers/STM32F4xx_HAL_Driver/Inc/Legacy + Middlewares/ST/STM32_USB_Device_Library/Core/Inc + Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc + Drivers/CMSIS/Device/ST/STM32F4xx/Include + Drivers/CMSIS/Include + Middlewares/floatpump/Inc +) + +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 $ ${HEX_FILE} + COMMAND ${CMAKE_OBJCOPY} -Obinary $ ${BIN_FILE} + COMMENT "Building ${HEX_FILE} +Building ${BIN_FILE}") \ No newline at end of file diff --git a/STM32F411CEUX_FLASH.ld b/toolchain/STM32F411CEUX_FLASH.ld similarity index 100% rename from STM32F411CEUX_FLASH.ld rename to toolchain/STM32F411CEUX_FLASH.ld diff --git a/STM32F411CEUX_RAM.ld b/toolchain/STM32F411CEUX_RAM.ld similarity index 100% rename from STM32F411CEUX_RAM.ld rename to toolchain/STM32F411CEUX_RAM.ld diff --git a/toolchain/arm-none-eabi-stm32f411ceu6-toolchain.cmake b/toolchain/arm-none-eabi-stm32f411ceu6-toolchain.cmake new file mode 100644 index 0000000..7680782 --- /dev/null +++ b/toolchain/arm-none-eabi-stm32f411ceu6-toolchain.cmake @@ -0,0 +1,53 @@ +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) + + +#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) + + +# Enable assembler files preprocessing +add_compile_options($<$:-x$assembler-with-cpp>) + +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 () + + +add_compile_options(-mcpu=cortex-m4 -mthumb -mthumb-interwork) +add_compile_options(-ffunction-sections -fdata-sections -fno-common -fmessage-length=0) + + +add_definitions(-DDEBUG -DUSE_HAL_DRIVER -DSTM32F411xE) + + +set(LINKER_SCRIPT ${CMAKE_SOURCE_DIR}/toolchain/STM32F411CEUX_FLASH.ld CACHE FILEPATH "STM specific linker script") + +add_link_options(-Wl,-gc-sections,--print-memory-usage,-Map=${PROJECT_BINARY_DIR}/${PROJECT_NAME}.map) +add_link_options(-mcpu=cortex-m4 -mthumb -mthumb-interwork) +add_link_options(-T ${LINKER_SCRIPT}) \ No newline at end of file