FindCMSIS.cmake 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. if(NOT CMSIS_FIND_COMPONENTS)
  2. set(CMSIS_FIND_COMPONENTS
  3. STM32F0 STM32F1 STM32F2 STM32F3 STM32F4 STM32F7
  4. STM32G0 STM32G4
  5. STM32H7
  6. STM32L0 STM32L1 STM32L4
  7. )
  8. endif()
  9. include(stm32/devices)
  10. function(cmsis_generate_default_linker_script FAMILY DEVICE CORE)
  11. string(REPLACE "_" "::" CORE_C ${CORE})
  12. stm32_get_memory_info(${FAMILY} ${DEVICE} ${CORE}
  13. FLASH_SIZE RAM_SIZE CCRAM_SIZE STACK_SIZE HEAP_SIZE
  14. FLASH_ORIGIN RAM_ORIGIN CCRAM_ORIGIN
  15. )
  16. add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${DEVICE}${CORE}.ld"
  17. COMMAND ${CMAKE_COMMAND}
  18. -DFLASH_ORIGIN="${FLASH_ORIGIN}"
  19. -DRAM_ORIGIN="${RAM_ORIGIN}"
  20. -DCCRAM_ORIGIN="${CCRAM_ORIGIN}"
  21. -DFLASH_SIZE="${FLASH_SIZE}"
  22. -DRAM_SIZE="${RAM_SIZE}"
  23. -DCCRAM_SIZE="${CCRAM_SIZE}"
  24. -DSTACK_SIZE="${STACK_SIZE}"
  25. -DHEAP_SIZE="${HEAP_SIZE}"
  26. -DLINKER_SCRIPT="${CMAKE_CURRENT_BINARY_DIR}/${DEVICE}${CORE}.ld"
  27. -P "${STM32_CMAKE_DIR}/stm32/linker_ld.cmake"
  28. )
  29. add_custom_target(CMSIS_LD_${DEVICE}${CORE} DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${DEVICE}${CORE}.ld)
  30. add_dependencies(CMSIS::STM32::${DEVICE}${CORE_C} CMSIS_LD_${DEVICE}${CORE})
  31. stm32_add_linker_script(CMSIS::STM32::${DEVICE}${CORE_C} INTERFACE "${CMAKE_CURRENT_BINARY_DIR}/${DEVICE}${CORE}.ld")
  32. endfunction()
  33. foreach(COMP ${CMSIS_FIND_COMPONENTS})
  34. string(TOLOWER ${COMP} COMP_L)
  35. string(TOUPPER ${COMP} COMP)
  36. string(REGEX MATCH "^STM32([A-Z][0-9])([0-9A-Z][0-9][A-Z][0-9A-Z])?(_M[47])?.*$" COMP ${COMP})
  37. if((NOT CMAKE_MATCH_1) AND (NOT CMAKE_MATCH_2))
  38. message(FATAL_ERROR "Unknown CMSIS component: ${COMP}")
  39. endif()
  40. if(CMAKE_MATCH_2)
  41. set(FAMILY ${CMAKE_MATCH_1})
  42. set(DEVICES "${CMAKE_MATCH_1}${CMAKE_MATCH_2}")
  43. else()
  44. set(FAMILY ${CMAKE_MATCH_1})
  45. stm32_get_devices_by_family(${FAMILY} DEVICES)
  46. endif()
  47. if(CMAKE_MATCH_3)
  48. set(CORE ${CMAKE_MATCH_3})
  49. string(REGEX REPLACE "_" "::" CORE_C ${CORE})
  50. endif()
  51. string(TOLOWER ${FAMILY} FAMILY_L)
  52. if(NOT STM32_CUBE_${FAMILY}_PATH)
  53. set(STM32_CUBE_${FAMILY}_PATH /opt/STM32Cube${FAMILY} CACHE PATH "Path to STM32Cube${FAMILY}")
  54. message(STATUS "No STM32_CUBE_${FAMILY}_PATH specified using default: ${STM32_CUBE_${FAMILY}_PATH}")
  55. endif()
  56. find_path(CMSIS_${FAMILY}${CORE}_PATH
  57. NAMES Include/cmsis_gcc.h
  58. PATHS "${STM32_CUBE_${FAMILY}_PATH}/Drivers/CMSIS"
  59. NO_DEFAULT_PATH
  60. )
  61. if (NOT CMSIS_${FAMILY}${CORE}_PATH)
  62. continue()
  63. endif()
  64. if(NOT CMSIS_${FAMILY}${CORE}_VERSION)
  65. find_file(CMSIS_${FAMILY}${CORE}_PDSC
  66. NAMES ARM.CMSIS.pdsc
  67. PATHS "${CMSIS_${FAMILY}${CORE}_PATH}"
  68. NO_DEFAULT_PATH
  69. )
  70. if (NOT CMSIS_${FAMILY}${CORE}_PDSC)
  71. set(CMSIS_${FAMILY}${CORE}_VERSION "0.0.0")
  72. else()
  73. file(STRINGS "${CMSIS_${FAMILY}${CORE}_PDSC}" VERSION_STRINGS REGEX "<release version=\"([0-9]*\\.[0-9]*\\.[0-9]*)\" date=\"[0-9]+\\-[0-9]+\\-[0-9]+\">")
  74. list(GET VERSION_STRINGS 0 STR)
  75. string(REGEX MATCH "<release version=\"([0-9]*)\\.([0-9]*)\\.([0-9]*)\" date=\"[0-9]+\\-[0-9]+\\-[0-9]+\">" MATCHED ${STR})
  76. set(CMSIS_${FAMILY}${CORE}_VERSION "${CMAKE_MATCH_1}.${CMAKE_MATCH_2}.${CMAKE_MATCH_3}" CACHE INTERNAL "CMSIS STM32${FAMILY}${CORE} version")
  77. endif()
  78. endif()
  79. set(CMSIS_${COMP}_VERSION ${CMSIS_${FAMILY}${CORE}_VERSION})
  80. set(CMSIS_VERSION ${CMSIS_${COMP}_VERSION})
  81. find_path(CMSIS_${FAMILY}${CORE}_COMMON_INCLUDE
  82. NAMES cmsis_gcc.h
  83. PATHS "${CMSIS_${FAMILY}${CORE}_PATH}/Include"
  84. NO_DEFAULT_PATH
  85. )
  86. list(APPEND CMSIS_INCLUDE_DIRS "${CMSIS_${FAMILY}${CORE}_COMMON_INCLUDE}")
  87. find_path(CMSIS_${FAMILY}${CORE}_INCLUDE
  88. NAMES stm32${FAMILY_L}xx.h
  89. PATHS "${CMSIS_${FAMILY}${CORE}_PATH}/Device/ST/STM32${FAMILY}xx/Include"
  90. NO_DEFAULT_PATH
  91. )
  92. list(APPEND CMSIS_INCLUDE_DIRS "${CMSIS_${FAMILY}${CORE}_INCLUDE}")
  93. find_file(CMSIS_${FAMILY}${CORE}_SOURCE
  94. NAMES system_stm32${FAMILY_L}xx.c
  95. PATHS "${CMSIS_${FAMILY}${CORE}_PATH}/Device/ST/STM32${FAMILY}xx/Source/Templates"
  96. NO_DEFAULT_PATH
  97. )
  98. list(APPEND CMSIS_SOURCES "${CMSIS_${FAMILY}${CORE}_SOURCE}")
  99. if ((NOT CMSIS_${FAMILY}${CORE}_COMMON_INCLUDE) OR
  100. (NOT CMSIS_${FAMILY}${CORE}_INCLUDE) OR
  101. (NOT CMSIS_${FAMILY}${CORE}_SOURCE))
  102. continue()
  103. endif()
  104. if(NOT (TARGET CMSIS::STM32::${FAMILY}${CORE_C}))
  105. add_library(CMSIS::STM32::${FAMILY}${CORE_C} INTERFACE IMPORTED)
  106. target_link_libraries(CMSIS::STM32::${FAMILY}${CORE_C} INTERFACE STM32::${FAMILY}${CORE_C})
  107. target_include_directories(CMSIS::STM32::${FAMILY}${CORE_C} INTERFACE "${CMSIS_${FAMILY}${CORE}_COMMON_INCLUDE}")
  108. target_include_directories(CMSIS::STM32::${FAMILY}${CORE_C} INTERFACE "${CMSIS_${FAMILY}${CORE}_INCLUDE}")
  109. target_sources(CMSIS::STM32::${FAMILY}${CORE_C} INTERFACE "${CMSIS_${FAMILY}${CORE}_SOURCE}")
  110. endif()
  111. set(DEVICES_FOUND TRUE)
  112. foreach(DEVICE ${DEVICES})
  113. stm32_get_chip_type(${FAMILY} ${DEVICE} TYPE)
  114. string(TOLOWER ${DEVICE} DEVICE_L)
  115. string(TOLOWER ${TYPE} TYPE_L)
  116. find_file(CMSIS_${FAMILY}${CORE}_${TYPE}_STARTUP
  117. NAMES startup_stm32${TYPE_L}.s
  118. PATHS "${CMSIS_${FAMILY}${CORE}_PATH}/Device/ST/STM32${FAMILY}xx/Source/Templates/gcc"
  119. NO_DEFAULT_PATH
  120. )
  121. list(APPEND CMSIS_SOURCES "${CMSIS_${FAMILY}${CORE}_${TYPE}_STARTUP}")
  122. if(NOT CMSIS_${FAMILY}${CORE}_${TYPE}_STARTUP)
  123. set(DEVICES_FOUND FALSE)
  124. break()
  125. endif()
  126. if(NOT (TARGET CMSIS::STM32::${TYPE}${CORE}))
  127. add_library(CMSIS::STM32::${TYPE}${CORE_C} INTERFACE IMPORTED)
  128. target_link_libraries(CMSIS::STM32::${TYPE}${CORE_C} INTERFACE CMSIS::STM32::${FAMILY}${CORE_C} STM32::${TYPE}${CORE_C})
  129. target_sources(CMSIS::STM32::${TYPE}${CORE_C} INTERFACE "${CMSIS_${FAMILY}${CORE}_${TYPE}_STARTUP}")
  130. endif()
  131. add_library(CMSIS::STM32::${DEVICE}${CORE_C} INTERFACE IMPORTED)
  132. target_link_libraries(CMSIS::STM32::${DEVICE}${CORE_C} INTERFACE CMSIS::STM32::${TYPE}${CORE_C})
  133. cmsis_generate_default_linker_script(${FAMILY} ${DEVICE} ${CORE})
  134. endforeach()
  135. if(CMSIS_${FAMILY}${CORE}_COMMON_INCLUDE AND
  136. CMSIS_${FAMILY}${CORE}_INCLUDE AND
  137. CMSIS_${FAMILY}${CORE}_SOURCE AND
  138. DEVICES_FOUND)
  139. set(CMSIS_${COMP}_FOUND TRUE)
  140. else()
  141. set(CMSIS_${COMP}_FOUND FALSE)
  142. endif()
  143. list(REMOVE_DUPLICATES CMSIS_INCLUDE_DIRS)
  144. list(REMOVE_DUPLICATES CMSIS_SOURCES)
  145. endforeach()
  146. include(FindPackageHandleStandardArgs)
  147. find_package_handle_standard_args(CMSIS
  148. REQUIRED_VARS CMSIS_INCLUDE_DIRS CMSIS_SOURCES
  149. FOUND_VAR CMSIS_FOUND
  150. VERSION_VAR CMSIS_VERSION
  151. HANDLE_COMPONENTS
  152. )