diff --git a/cmake/FindCMSIS.cmake b/cmake/FindCMSIS.cmake index 7f6c01d6..5a202dca 100644 --- a/cmake/FindCMSIS.cmake +++ b/cmake/FindCMSIS.cmake @@ -19,7 +19,16 @@ endif() # Find CMSIS components one by one file(GLOB_RECURSE DEVICE_INCLUDE ${CMSIS_ROOT}/*/${DEVICE_INCLUDE_FILENAME}) +list(LENGTH DEVICE_INCLUDE DEVICE_INCLUDE_LEN) +if (NOT "${DEVICE_INCLUDE_LEN}" EQUAL "1") + message(SEND_ERROR "Unable to find CMSIS device header ${DEVICE_INCLUDE_FILENAME}! Check if the device name passed in `DEVICE` variable is correct. If device header filename differs from device name (e.g. stm32f4xx.h vs. stm32f411xx) then explicitly specify device include filename in `DEVICE_INCLUDE_FILENAME` variable before including FindCMSIS.") +endif() + file(GLOB_RECURSE SYSTEM_INCLUDE ${CMSIS_ROOT}/*/${SYSTEM_INCLUDE_FILENAME}) +list(LENGTH SYSTEM_INCLUDE SYSTEM_INCLUDE_LEN) +if (NOT "${SYSTEM_INCLUDE_LEN}" EQUAL "1") + message(SEND_ERROR "Unable to find CMSIS system header ${SYSTEM_INCLUDE_FILENAME}! Check if the device name passed in `DEVICE` variable is correct. If system header filename differs from device name (e.g. system_stm32f4xx.h vs. stm32f411xx) then explicitly specify system include filename in `SYSTEM_INCLUDE_FILENAME` variable before including FindCMSIS.") +endif() file(GLOB_RECURSE CORES_INCLUDE ${CMSIS_ROOT}/*/core_cm*.h) file(GLOB_RECURSE SYSTEM_SOURCE RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${CMSIS_ROOT}/*/system_${DEVICE}.c) file(GLOB_RECURSE STARTUP_SOURCE RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${CMSIS_ROOT}/*/startup_${DEVICE}.c) @@ -52,7 +61,7 @@ file(COPY_FILE ${CMSIS_LINKER_FILE} ${CMAKE_BINARY_DIR}/gen.${DEVICE}.ld) file(WRITE ${CMAKE_BINARY_DIR}/cmsis_conf.h "#pragma once " - "#define CMSIS_device_header \"${DEVICE}.h\" + "#define CMSIS_device_header \"${DEVICE_INCLUDE_FILENAME}\" " ) @@ -62,6 +71,6 @@ set(CMSIS_SRCS ${SYSTEM_SOURCE} ${STARTUP_SOURCE}) add_library(cmsis_headers INTERFACE) set_property(TARGET cmsis_headers PROPERTY - INTERFACE_INCLUDE_DIRECTORIES ${INCLUDE_DIRS}) + INTERFACE_INCLUDE_DIRECTORIES ${INCLUDE_DIRS} ${CMAKE_BINARY_DIR}) diff --git a/cmake/platform/stm32.cmake b/cmake/platform/stm32.cmake index c6badf39..3f0b0add 100644 --- a/cmake/platform/stm32.cmake +++ b/cmake/platform/stm32.cmake @@ -7,8 +7,10 @@ string(TOUPPER "${CMRX_DEVICE}" _CMRX_DEVICE_UPCASE) add_definitions(-D${_CMRX_DEVICE_UPCASE}) string(SUBSTRING "${CMRX_DEVICE}" 0 7 _STM_FAMILY) string(TOLOWER "${_STM_FAMILY}" _STM_FAMILY) +string(TOUPPER "${_STM_FAMILY}" _STM_FAMILY_UC) set(SYSTEM_INCLUDE_FILENAME system_${_STM_FAMILY}xx.h) +set(DEVICE_INCLUDE_FILENAME ${_STM_FAMILY}xx.h) # Assume default CubeMX CMake project layout if (NOT EXISTS ${CMAKE_SOURCE_DIR}/Drivers/CMSIS) @@ -23,23 +25,35 @@ if (DEFINED CMRX_LINKER_FILE) endif() set(CMSIS_LINKER_FILE "${CMRX_LINKER_FILE}") else() - file(GLOB CMSIS_LINKER_FILE LIST_DIRECTORIES false "${CMAKE_SOURCE_DIR}/${_STM_FAMILY}*.ld") + file(GLOB CMSIS_LINKER_FILE LIST_DIRECTORIES false "${CMAKE_SOURCE_DIR}/${_STM_FAMILY}*.ld" "${CMAKE_SOURCE_DIR}/${_STM_FAMILY_UC}*.ld") list(LENGTH CMSIS_LINKER_FILE _LINKER_FILES_FOUND) if (NOT "${_LINKER_FILES_FOUND}" STREQUAL 1) message(FATAL_ERROR "Unable to identify project linker file automatically! Either set variable `CMRX_LINKER_FILE` to contain path to linker file used or place exactly one linker file having pattern ${_STM_FAMILY}*.ld into ${CMAKE_SOURCE_DIR}") endif() endif() +add_definitions(-D${CMRX_DEVICE}) include(${CMAKE_CURRENT_LIST_DIR}/../FindCMSIS.cmake) -if (NOT TARGET stm32cubemx) - message(FATAL_ERROR "Target stm32cubemx not defined! Please, add directory cmake/stm32cubemx before including CMRX CMake module so CubeMX can be detected properly.") -endif() +function(_create_stm32cube_headers) + if (NOT TARGET stm32cubemx) + message(FATAL_ERROR "Target stm32cubemx not defined! Your project is not including subdirectory cmake/stm32cubemx or the generated project is not compatible with this STM32 platform support module!") + endif() + get_target_property(CUBEMX_INCLUDE_DIRECTORIES stm32cubemx INTERFACE_INCLUDE_DIRECTORIES) + get_target_property(CUBEMX_COMPILE_DEFINITIONS stm32cubemx INTERFACE_COMPILE_DEFINITIONS) -get_target_property(CUBEMX_INCLUDE_DIRECTORIES stm32cubemx INTERFACE_INCLUDE_DIRECTORIES) -get_target_property(CUBEMX_COMPILE_DEFINITIONS stm32cubemx INTERFACE_COMPILE_DEFINITIONS) + add_library(stm32cubemx_headers INTERFACE) + target_include_directories(stm32cubemx_headers INTERFACE ${CUBEMX_INCLUDE_DIRECTORIES}) + target_compile_definitions(stm32cubemx_headers INTERFACE ${CUBEMX_COMPILE_DEFINITIONS}) + get_property(LINK_OPTS TARGET ${CMAKE_PROJECT_NAME} PROPERTY LINK_OPTIONS) +endfunction() -add_library(stm32cubemx_headers INTERFACE) -target_include_directories(stm32cubemx_headers INTERFACE ${CUBEMX_INCLUDE_DIRECTORIES}) -target_compile_definitions(stm32cubemx_headers INTERFACE ${CUBEMX_COMPILE_DEFINITIONS}) +if (TARGET stm32cubemx) + _create_stm32cube_headers() +else() + message(STATUS "Target stm32cubemx not defined. Deferring creation of stm32cubemx_headers.") + cmake_language(DEFER DIRECTORY ${CMAKE_SOURCE_DIR} CALL _create_stm32cube_headers) +endif() +string(REGEX REPLACE "-T \"[^\"]\+\"" "" CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}") +message("Linker flags: ${CMAKE_EXE_LINKER_FLAGS}") diff --git a/testing/clang-tidy/mock/cmsis/include/system_cortex-m0+.h b/testing/clang-tidy/mock/cmsis/include/system_cortex-m0+.h new file mode 100644 index 00000000..70d8089c --- /dev/null +++ b/testing/clang-tidy/mock/cmsis/include/system_cortex-m0+.h @@ -0,0 +1,3 @@ +#pragma once + +/* This file is intentionally left empty */ diff --git a/testing/clang-tidy/mock/cmsis/include/system_cortex-m23.h b/testing/clang-tidy/mock/cmsis/include/system_cortex-m23.h new file mode 100644 index 00000000..70d8089c --- /dev/null +++ b/testing/clang-tidy/mock/cmsis/include/system_cortex-m23.h @@ -0,0 +1,3 @@ +#pragma once + +/* This file is intentionally left empty */ diff --git a/testing/clang-tidy/mock/cmsis/include/system_cortex-m3.h b/testing/clang-tidy/mock/cmsis/include/system_cortex-m3.h new file mode 100644 index 00000000..70d8089c --- /dev/null +++ b/testing/clang-tidy/mock/cmsis/include/system_cortex-m3.h @@ -0,0 +1,3 @@ +#pragma once + +/* This file is intentionally left empty */ diff --git a/testing/clang-tidy/mock/cmsis/include/system_cortex-m33.h b/testing/clang-tidy/mock/cmsis/include/system_cortex-m33.h new file mode 100644 index 00000000..70d8089c --- /dev/null +++ b/testing/clang-tidy/mock/cmsis/include/system_cortex-m33.h @@ -0,0 +1,3 @@ +#pragma once + +/* This file is intentionally left empty */ diff --git a/testing/clang-tidy/mock/cmsis/include/system_cortex-m4f.h b/testing/clang-tidy/mock/cmsis/include/system_cortex-m4f.h new file mode 100644 index 00000000..70d8089c --- /dev/null +++ b/testing/clang-tidy/mock/cmsis/include/system_cortex-m4f.h @@ -0,0 +1,3 @@ +#pragma once + +/* This file is intentionally left empty */