common.cmake 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. set(STM32_SUPPORTED_FAMILIES L0 L1 L4 F0 F1 F2 F3 F4 F7 H7)
  2. if(NOT STM32_TOOLCHAIN_PATH)
  3. set(STM32_TOOLCHAIN_PATH "/usr")
  4. message(STATUS "No STM32_TOOLCHAIN_PATH specified, using default: " ${STM32_TOOLCHAIN_PATH})
  5. else()
  6. file(TO_CMAKE_PATH "${STM32_TOOLCHAIN_PATH}" STM32_TOOLCHAIN_PATH)
  7. endif()
  8. if(NOT STM32_TARGET_TRIPLET)
  9. set(STM32_TARGET_TRIPLET "arm-none-eabi")
  10. message(STATUS "No STM32_TARGET_TRIPLET specified, using default: " ${STM32_TARGET_TRIPLET})
  11. endif()
  12. set(CMAKE_SYSTEM_NAME Generic)
  13. set(CMAKE_SYSTEM_PROCESSOR arm)
  14. set(TOOLCHAIN_SYSROOT "${STM32_TOOLCHAIN_PATH}/${STM32_TARGET_TRIPLET}")
  15. set(TOOLCHAIN_BIN_PATH "${STM32_TOOLCHAIN_PATH}/bin")
  16. set(TOOLCHAIN_INC_PATH "${STM32_TOOLCHAIN_PATH}/${STM32_TARGET_TRIPLET}/include")
  17. set(TOOLCHAIN_LIB_PATH "${STM32_TOOLCHAIN_PATH}/${STM32_TARGET_TRIPLET}/lib")
  18. find_program(CMAKE_OBJCOPY NAMES ${STM32_TARGET_TRIPLET}-objcopy PATHS ${TOOLCHAIN_BIN_PATH})
  19. find_program(CMAKE_OBJDUMP NAMES ${STM32_TARGET_TRIPLET}-objdump PATHS ${TOOLCHAIN_BIN_PATH})
  20. find_program(CMAKE_SIZE NAMES ${STM32_TARGET_TRIPLET}-size PATHS ${TOOLCHAIN_BIN_PATH})
  21. find_program(CMAKE_DEBUGGER NAMES ${STM32_TARGET_TRIPLET}-gdb PATHS ${TOOLCHAIN_BIN_PATH})
  22. find_program(CMAKE_CPPFILT NAMES ${STM32_TARGET_TRIPLET}-c++filt PATHS ${TOOLCHAIN_BIN_PATH})
  23. include(stm32/f4)
  24. include(stm32/linker)
  25. include(stm32/cmsis)
  26. function(stm32_get_chip TARGET FAMILY DEVICE)
  27. get_target_property(CHIP ${TARGET} STM32_CHIP)
  28. string(TOUPPER ${CHIP} CHIP)
  29. if(NOT CHIP)
  30. message(FATAL_ERROR "Please specify STM32 chip for target ${TARGET} using STM32_CHIP property")
  31. endif()
  32. string(REGEX MATCH "^STM32([A-Z][0-9])([0-9][0-9][A-Z][0-9A-Z]).*$" CHIP ${CHIP})
  33. if((NOT CMAKE_MATCH_1) OR (NOT CMAKE_MATCH_2))
  34. message(FATAL_ERROR "Unknown chip ${CHIP}")
  35. endif()
  36. set(STM32_FAMILY ${CMAKE_MATCH_1})
  37. set(STM32_DEVICE "${CMAKE_MATCH_1}${CMAKE_MATCH_2}")
  38. list(FIND STM32_SUPPORTED_FAMILIES ${STM32_FAMILY} STM32_FAMILY_INDEX)
  39. if (STM32_FAMILY_INDEX EQUAL -1)
  40. message(FATAL_ERROR "Unsupported family ${STM32_FAMILY} for device ${CHIP}")
  41. endif()
  42. set(${FAMILY} ${STM32_FAMILY} PARENT_SCOPE)
  43. set(${DEVICE} ${STM32_DEVICE} PARENT_SCOPE)
  44. endfunction()
  45. function(stm32_get_type FAMILY DEVICE TYPE)
  46. if(${FAMILY} STREQUAL "F4")
  47. stm32f4_get_type(${DEVICE} T)
  48. endif()
  49. set(${TYPE} ${T} PARENT_SCOPE)
  50. endfunction()
  51. function(stm32_configure_compiler TARGET)
  52. stm32_get_chip(${TARGET} STM32_FAMILY STM32_DEVICE)
  53. target_compile_options(${TARGET} PRIVATE
  54. --sysroot="${TOOLCHAIN_SYSROOT}"
  55. -mthumb -mabi=aapcs -Wall -ffunction-sections -fdata-sections -fno-strict-aliasing -fno-builtin -ffast-math
  56. $<$<CONFIG:Debug>:-Og>
  57. $<$<CONFIG:Release>:-Os>
  58. )
  59. target_link_options(${TARGET} PRIVATE
  60. --sysroot="${TOOLCHAIN_SYSROOT}"
  61. -mthumb -mabi=aapcs -Wl,--gc-sections
  62. $<$<CONFIG:Debug>:-Og>
  63. $<$<CONFIG:Release>:-Os -s>
  64. )
  65. get_target_property(SPECS ${TARGET} STM32_GCC_SPECS)
  66. if(SPECS)
  67. target_compile_options(${TARGET} PRIVATE $<$<C_COMPILER_ID:GNU>:--specs=${SPECS}.specs>)
  68. target_link_options(${TARGET} PRIVATE $<$<C_COMPILER_ID:GNU>:--specs=${SPECS}.specs>)
  69. endif()
  70. if(${STM32_FAMILY} STREQUAL "F4")
  71. stm32f4_configure_compiler(${TARGET})
  72. endif()
  73. endfunction()
  74. function(stm32_target TARGET)
  75. get_target_property(TARGET_TYPE ${TARGET} TYPE)
  76. stm32_configure_compiler(${TARGET})
  77. if(TARGET_TYPE STREQUAL EXECUTABLE)
  78. get_target_property(NO_LINKER_SCRIPT ${TARGET} STM32_NO_LINKER_SCRIPT)
  79. if(NOT NO_LINKER_SCRIPT)
  80. stm32_generate_linker_script(${TARGET})
  81. endif()
  82. get_target_property(NO_CMSIS ${TARGET} STM32_NO_CMSIS)
  83. if(NOT NO_CMSIS)
  84. stm32_add_cmsis(${TARGET})
  85. endif()
  86. endif()
  87. endfunction()
  88. # function(nrf52_add_sdk_startup TARGET)
  89. # get_target_property(TARGET_NO_SDK ${TARGET} STM32_NO_SDK)
  90. # if(TARGET_NO_SDK)
  91. # return()
  92. # endif()
  93. #
  94. # target_include_directories(${TARGET} PRIVATE "${NRF5_SDK_PATH}/components/toolchain/cmsis/include")
  95. # target_include_directories(${TARGET} PRIVATE "${NRF5_SDK_PATH}/modules/nrfx/mdk")
  96. #
  97. # nrf52_get_chip(${TARGET} STM32_CHIP STM32_CHIP_VARIANT)
  98. #
  99. # unset(STM32_STARTUP_FILE CACHE)
  100. # find_file(STM32_STARTUP_FILE
  101. # NAMES gcc_startup_nrf52${STM32_CHIP}.S gcc_startup_nrf52.S
  102. # PATHS "${NRF5_SDK_PATH}/modules/nrfx/mdk"
  103. # NO_DEFAULT_PATH
  104. # )
  105. #
  106. # unset(STM32_SYSTEM_FILE CACHE)
  107. # find_file(STM32_SYSTEM_FILE
  108. # NAMES system_nrf52${STM32_CHIP}.c system_nrf52.c
  109. # PATHS "${NRF5_SDK_PATH}/modules/nrfx/mdk"
  110. # NO_DEFAULT_PATH
  111. # )
  112. #
  113. # if((NOT STM32_STARTUP_FILE) OR (NOT STM32_SYSTEM_FILE))
  114. # message(WARNING "Cannot find startup sources for target ${TARGET}, check NRF5_SDK_PATH variable")
  115. # else()
  116. # target_sources(${TARGET} PRIVATE "${STM32_STARTUP_FILE}" "${STM32_SYSTEM_FILE}")
  117. # endif()
  118. # endfunction()
  119. #
  120. # function(nrf52_add_linker_script TARGET SCRIPT)
  121. # target_link_options(${TARGET} PRIVATE -T "${SCRIPT}")
  122. # target_link_options(${TARGET} PRIVATE -L "${NRF5_SDK_PATH}/modules/nrfx/mdk")
  123. # endfunction()
  124. #
  125. # function(nrf52_generate_linker_script TARGET)
  126. # get_target_property(TARGET_NO_LINKER_SCRIPT ${TARGET} STM32_NO_LINKER_SCRIPT)
  127. # if(TARGET_NO_LINKER_SCRIPT)
  128. # return()
  129. # endif()
  130. # set(STM32_LINKER_FILE ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}.ld)
  131. # nrf52_linker_generate_script(${TARGET} "${STM32_LINKER_FILE}")
  132. # nrf52_add_linker_script(${TARGET} "${STM32_LINKER_FILE}")
  133. # endfunction()
  134. #
  135. # function(nrf52_configure_compiler TARGET)
  136. # nrf52_get_chip(${TARGET} STM32_CHIP STM32_CHIP_VARIANT)
  137. #
  138. # if(STM32_CHIP EQUAL 840)
  139. # target_compile_options(${TARGET} PRIVATE -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16)
  140. # target_compile_definitions(${TARGET} PRIVATE -DFLOAT_ABI_HARD)
  141. # target_link_options(${TARGET} PRIVATE -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16)
  142. # elseif(STM32_CHIP EQUAL 832)
  143. # target_compile_options(${TARGET} PRIVATE -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16)
  144. # target_link_options(${TARGET} PRIVATE -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16)
  145. # target_compile_definitions(${TARGET} PRIVATE -DFLOAT_ABI_HARD)
  146. # elseif(STM32_CHIP EQUAL 811)
  147. # target_compile_options(${TARGET} PRIVATE -mcpu=cortex-m4 -mfloat-abi=soft)
  148. # target_compile_definitions(${TARGET} PRIVATE -DFLOAT_ABI_SOFT)
  149. # target_link_options(${TARGET} PRIVATE -mcpu=cortex-m4 -mfloat-abi=soft)
  150. # elseif(STM32_CHIP EQUAL 810)
  151. # target_compile_options(${TARGET} PRIVATE -mcpu=cortex-m4 -mfloat-abi=soft)
  152. # target_compile_definitions(${TARGET} PRIVATE -DFLOAT_ABI_SOFT)
  153. # target_link_options(${TARGET} PRIVATE -mcpu=cortex-m4 -mfloat-abi=soft)
  154. # endif()
  155. #
  156. # target_compile_options(${TARGET} PRIVATE -mthumb -mabi=aapcs -Wall -ffunction-sections -fdata-sections -fno-strict-aliasing -fno-builtin -fshort-enums $<$<CONFIG:Release>:-Os>)
  157. # target_compile_definitions(${TARGET} PRIVATE -DSTM32${STM32_CHIP}_XX${STM32_CHIP_VARIANT})
  158. # target_link_options(${TARGET} PRIVATE -mthumb -mabi=aapcs -Wl,--gc-sections --specs=nano.specs $<$<CONFIG:Release>:-Os>)
  159. # endfunction()
  160. #
  161. # function(nrf52_target TARGET)
  162. # get_target_property(TARGET_TYPE ${TARGET} TYPE)
  163. # nrf52_configure_compiler(${TARGET})
  164. # if(TARGET_TYPE STREQUAL EXECUTABLE)
  165. # nrf52_add_sdk_startup(${TARGET})
  166. # nrf52_generate_linker_script(${TARGET})
  167. # target_link_libraries(${TARGET} PRIVATE -lc -lnosys -lm)
  168. # endif()
  169. # endfunction()