gcc_stm32.cmake 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. GET_FILENAME_COMPONENT(STM32_CMAKE_DIR ${CMAKE_CURRENT_LIST_FILE} DIRECTORY)
  2. SET(CMAKE_MODULE_PATH ${STM32_CMAKE_DIR} ${CMAKE_MODULE_PATH})
  3. SET(STM32_SUPPORTED_FAMILIES L0 F0 F1 F2 F3 F4 F7 CACHE INTERNAL "stm32 supported families")
  4. IF(NOT TOOLCHAIN_PREFIX)
  5. SET(TOOLCHAIN_PREFIX "/usr")
  6. MESSAGE(STATUS "No TOOLCHAIN_PREFIX specified, using default: " ${TOOLCHAIN_PREFIX})
  7. ENDIF()
  8. IF(NOT TARGET_TRIPLET)
  9. SET(TARGET_TRIPLET "arm-none-eabi")
  10. MESSAGE(STATUS "No TARGET_TRIPLET specified, using default: " ${TARGET_TRIPLET})
  11. ENDIF()
  12. IF(NOT STM32_FAMILY)
  13. MESSAGE(STATUS "No STM32_FAMILY specified, trying to get it from STM32_CHIP")
  14. IF(NOT STM32_CHIP)
  15. SET(STM32_FAMILY "F1" CACHE INTERNAL "stm32 family")
  16. MESSAGE(STATUS "Neither STM32_FAMILY nor STM32_CHIP specified, using default STM32_FAMILY: ${STM32_FAMILY}")
  17. ELSE()
  18. STRING(REGEX REPLACE "^[sS][tT][mM]32(([fF][0-47])|([lL][0-1])|([tT])|([wW])).+$" "\\1" STM32_FAMILY ${STM32_CHIP})
  19. STRING(TOUPPER ${STM32_FAMILY} STM32_FAMILY)
  20. MESSAGE(STATUS "Selected STM32 family: ${STM32_FAMILY}")
  21. ENDIF()
  22. ENDIF()
  23. STRING(TOUPPER ${STM32_FAMILY} STM32_FAMILY)
  24. LIST(FIND STM32_SUPPORTED_FAMILIES ${STM32_FAMILY} FAMILY_INDEX)
  25. IF(FAMILY_INDEX EQUAL -1)
  26. MESSAGE(FATAL_ERROR "Invalid/unsupported STM32 family: ${STM32_FAMILY}")
  27. ENDIF()
  28. SET(TOOLCHAIN_BIN_DIR ${TOOLCHAIN_PREFIX}/bin)
  29. SET(TOOLCHAIN_INC_DIR ${TOOLCHAIN_PREFIX}/${TARGET_TRIPLET}/include)
  30. SET(TOOLCHAIN_LIB_DIR ${TOOLCHAIN_PREFIX}/${TARGET_TRIPLET}/lib)
  31. SET(CMAKE_SYSTEM_NAME Generic)
  32. SET(CMAKE_SYSTEM_PROCESSOR arm)
  33. IF (WIN32)
  34. SET(TOOL_EXECUTABLE_SUFFIX ".exe")
  35. ELSE()
  36. SET(TOOL_EXECUTABLE_SUFFIX "")
  37. ENDIF()
  38. IF(${CMAKE_VERSION} VERSION_LESS 3.6.0)
  39. INCLUDE(CMakeForceCompiler)
  40. CMAKE_FORCE_C_COMPILER(${TOOLCHAIN_BIN_DIR}/${TARGET_TRIPLET}-gcc${TOOL_EXECUTABLE_SUFFIX} GNU)
  41. CMAKE_FORCE_CXX_COMPILER(${TOOLCHAIN_BIN_DIR}/${TARGET_TRIPLET}-g++${TOOL_EXECUTABLE_SUFFIX} GNU)
  42. ELSE()
  43. SET(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
  44. SET(CMAKE_C_COMPILER ${TOOLCHAIN_BIN_DIR}/${TARGET_TRIPLET}-gcc${TOOL_EXECUTABLE_SUFFIX})
  45. SET(CMAKE_CXX_COMPILER ${TOOLCHAIN_BIN_DIR}/${TARGET_TRIPLET}-g++${TOOL_EXECUTABLE_SUFFIX})
  46. ENDIF()
  47. SET(CMAKE_ASM_COMPILER ${TOOLCHAIN_BIN_DIR}/${TARGET_TRIPLET}-gcc${TOOL_EXECUTABLE_SUFFIX})
  48. SET(CMAKE_OBJCOPY ${TOOLCHAIN_BIN_DIR}/${TARGET_TRIPLET}-objcopy${TOOL_EXECUTABLE_SUFFIX} CACHE INTERNAL "objcopy tool")
  49. SET(CMAKE_OBJDUMP ${TOOLCHAIN_BIN_DIR}/${TARGET_TRIPLET}-objdump${TOOL_EXECUTABLE_SUFFIX} CACHE INTERNAL "objdump tool")
  50. SET(CMAKE_SIZE ${TOOLCHAIN_BIN_DIR}/${TARGET_TRIPLET}-size${TOOL_EXECUTABLE_SUFFIX} CACHE INTERNAL "size tool")
  51. SET(CMAKE_DEBUGER ${TOOLCHAIN_BIN_DIR}/${TARGET_TRIPLET}-gdb${TOOL_EXECUTABLE_SUFFIX} CACHE INTERNAL "debuger")
  52. SET(CMAKE_C_FLAGS_DEBUG "-Og -g" CACHE INTERNAL "c compiler flags debug")
  53. SET(CMAKE_CXX_FLAGS_DEBUG "-Og -g" CACHE INTERNAL "cxx compiler flags debug")
  54. SET(CMAKE_ASM_FLAGS_DEBUG "-g" CACHE INTERNAL "asm compiler flags debug")
  55. SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "" CACHE INTERNAL "linker flags debug")
  56. SET(CMAKE_C_FLAGS_RELEASE "-Os -flto" CACHE INTERNAL "c compiler flags release")
  57. SET(CMAKE_CXX_FLAGS_RELEASE "-Os -flto" CACHE INTERNAL "cxx compiler flags release")
  58. SET(CMAKE_ASM_FLAGS_RELEASE "" CACHE INTERNAL "asm compiler flags release")
  59. SET(CMAKE_EXE_LINKER_FLAGS_RELEASE "-flto" CACHE INTERNAL "linker flags release")
  60. SET(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN_PREFIX}/${TARGET_TRIPLET} ${EXTRA_FIND_PATH})
  61. SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
  62. SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
  63. SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
  64. FUNCTION(STM32_ADD_HEX_BIN_TARGETS TARGET)
  65. IF(EXECUTABLE_OUTPUT_PATH)
  66. SET(FILENAME "${EXECUTABLE_OUTPUT_PATH}/${TARGET}")
  67. ELSE()
  68. SET(FILENAME "${TARGET}")
  69. ENDIF()
  70. ADD_CUSTOM_TARGET(${TARGET}.hex DEPENDS ${TARGET} COMMAND ${CMAKE_OBJCOPY} -Oihex ${FILENAME} ${FILENAME}.hex)
  71. ADD_CUSTOM_TARGET(${TARGET}.bin DEPENDS ${TARGET} COMMAND ${CMAKE_OBJCOPY} -Obinary ${FILENAME} ${FILENAME}.bin)
  72. ENDFUNCTION()
  73. FUNCTION(STM32_PRINT_SIZE_OF_TARGETS TARGET)
  74. IF(EXECUTABLE_OUTPUT_PATH)
  75. SET(FILENAME "${EXECUTABLE_OUTPUT_PATH}/${TARGET}")
  76. ELSE()
  77. SET(FILENAME "${TARGET}")
  78. ENDIF()
  79. add_custom_command(TARGET ${TARGET} POST_BUILD COMMAND ${CMAKE_SIZE} ${FILENAME})
  80. ENDFUNCTION()
  81. STRING(TOLOWER ${STM32_FAMILY} STM32_FAMILY_LOWER)
  82. INCLUDE(gcc_stm32${STM32_FAMILY_LOWER})
  83. FUNCTION(STM32_SET_FLASH_PARAMS TARGET STM32_FLASH_SIZE STM32_RAM_SIZE STM32_CCRAM_SIZE STM32_MIN_STACK_SIZE STM32_MIN_HEAP_SIZE STM32_FLASH_ORIGIN STM32_RAM_ORIGIN STM32_CCRAM_ORIGIN)
  84. IF(NOT STM32_LINKER_SCRIPT)
  85. MESSAGE(STATUS "No linker script specified, generating default")
  86. INCLUDE(stm32_linker)
  87. FILE(WRITE ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_flash.ld ${STM32_LINKER_SCRIPT_TEXT})
  88. ELSE()
  89. CONFIGURE_FILE(${STM32_LINKER_SCRIPT} ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_flash.ld)
  90. ENDIF()
  91. GET_TARGET_PROPERTY(TARGET_LD_FLAGS ${TARGET} LINK_FLAGS)
  92. IF(TARGET_LD_FLAGS)
  93. SET(TARGET_LD_FLAGS "-T${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_flash.ld ${TARGET_LD_FLAGS}")
  94. ELSE()
  95. SET(TARGET_LD_FLAGS "-T${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_flash.ld")
  96. ENDIF()
  97. SET_TARGET_PROPERTIES(${TARGET} PROPERTIES LINK_FLAGS ${TARGET_LD_FLAGS})
  98. ENDFUNCTION()
  99. FUNCTION(STM32_SET_FLASH_PARAMS TARGET FLASH_SIZE RAM_SIZE)
  100. IF(NOT STM32_FLASH_ORIGIN)
  101. SET(STM32_FLASH_ORIGIN "0x08000000")
  102. ENDIF()
  103. IF(NOT STM32_RAM_ORIGIN)
  104. SET(STM32_RAM_ORIGIN "0x20000000")
  105. ENDIF()
  106. IF(NOT STM32_MIN_STACK_SIZE)
  107. SET(STM32_MIN_STACK_SIZE "0x200")
  108. ENDIF()
  109. IF(NOT STM32_MIN_HEAP_SIZE)
  110. SET(STM32_MIN_HEAP_SIZE "0")
  111. ENDIF()
  112. IF(NOT STM32_CCRAM_ORIGIN)
  113. SET(STM32_CCRAM_ORIGIN "0x10000000")
  114. ENDIF()
  115. IF(NOT STM32_CCRAM_SIZE)
  116. SET(STM32_CCRAM_SIZE "64K")
  117. ENDIF()
  118. IF(NOT STM32_LINKER_SCRIPT)
  119. MESSAGE(STATUS "No linker script specified, generating default")
  120. INCLUDE(stm32_linker)
  121. FILE(WRITE ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_flash.ld ${STM32_LINKER_SCRIPT_TEXT})
  122. ELSE()
  123. CONFIGURE_FILE(${STM32_LINKER_SCRIPT} ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_flash.ld)
  124. ENDIF()
  125. GET_TARGET_PROPERTY(TARGET_LD_FLAGS ${TARGET} LINK_FLAGS)
  126. IF(TARGET_LD_FLAGS)
  127. SET(TARGET_LD_FLAGS "-T${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_flash.ld ${TARGET_LD_FLAGS}")
  128. ELSE()
  129. SET(TARGET_LD_FLAGS "-T${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_flash.ld")
  130. ENDIF()
  131. SET_TARGET_PROPERTIES(${TARGET} PROPERTIES LINK_FLAGS ${TARGET_LD_FLAGS})
  132. ENDFUNCTION()
  133. FUNCTION(STM32_SET_TARGET_PROPERTIES TARGET)
  134. IF(NOT STM32_CHIP_TYPE)
  135. IF(NOT STM32_CHIP)
  136. MESSAGE(WARNING "Neither STM32_CHIP_TYPE nor STM32_CHIP selected, you'll have to use STM32_SET_CHIP_DEFINITIONS directly")
  137. ELSE()
  138. STM32_GET_CHIP_TYPE(${STM32_CHIP} STM32_CHIP_TYPE)
  139. ENDIF()
  140. ENDIF()
  141. STM32_SET_CHIP_DEFINITIONS(${TARGET} ${STM32_CHIP_TYPE})
  142. IF(((NOT STM32_FLASH_SIZE) OR (NOT STM32_RAM_SIZE)) AND (NOT STM32_CHIP))
  143. MESSAGE(FATAL_ERROR "Cannot get chip parameters. Please specify either STM32_CHIP or STM32_FLASH_SIZE/STM32_RAM_SIZE")
  144. ENDIF()
  145. IF((NOT STM32_FLASH_SIZE) OR (NOT STM32_RAM_SIZE))
  146. STM32_GET_CHIP_PARAMETERS(${STM32_CHIP} STM32_FLASH_SIZE STM32_RAM_SIZE)
  147. IF((NOT STM32_FLASH_SIZE) OR (NOT STM32_RAM_SIZE))
  148. MESSAGE(FATAL_ERROR "Unknown chip: ${STM32_CHIP}. Try to use STM32_FLASH_SIZE/STM32_RAM_SIZE directly.")
  149. ENDIF()
  150. ENDIF()
  151. STM32_SET_FLASH_PARAMS(${TARGET} ${STM32_FLASH_SIZE} ${STM32_RAM_SIZE})
  152. MESSAGE(STATUS "${STM32_CHIP} has ${STM32_FLASH_SIZE}iB of flash memory and ${STM32_RAM_SIZE}iB of RAM")
  153. ENDFUNCTION()
  154. FUNCTION(STM32_SET_HSE_VALUE TARGET STM32_HSE_VALUE)
  155. GET_TARGET_PROPERTY(TARGET_DEFS ${TARGET} COMPILE_DEFINITIONS)
  156. IF(TARGET_DEFS)
  157. SET(TARGET_DEFS "HSE_VALUE=${STM32_HSE_VALUE};${TARGET_DEFS}")
  158. ELSE()
  159. SET(TARGET_DEFS "HSE_VALUE=${STM32_HSE_VALUE}")
  160. ENDIF()
  161. SET_TARGET_PROPERTIES(${TARGET} PROPERTIES COMPILE_DEFINITIONS "${TARGET_DEFS}")
  162. ENDFUNCTION()
  163. MACRO(STM32_GENERATE_LIBRARIES NAME SOURCES LIBRARIES)
  164. STRING(TOLOWER ${STM32_FAMILY} STM32_FAMILY_LOWER)
  165. FOREACH(CHIP_TYPE ${STM32_CHIP_TYPES})
  166. STRING(TOLOWER ${CHIP_TYPE} CHIP_TYPE_LOWER)
  167. LIST(APPEND ${LIBRARIES} ${NAME}_${STM32_FAMILY_LOWER}_${CHIP_TYPE_LOWER})
  168. ADD_LIBRARY(${NAME}_${STM32_FAMILY_LOWER}_${CHIP_TYPE_LOWER} ${SOURCES})
  169. STM32_SET_CHIP_DEFINITIONS(${NAME}_${STM32_FAMILY_LOWER}_${CHIP_TYPE_LOWER} ${CHIP_TYPE})
  170. ENDFOREACH()
  171. ENDMACRO()