FindCMSIS.cmake 6.2 KB

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