common.cmake 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  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. function(stm32_get_chip_type FAMILY DEVICE TYPE)
  24. if(${FAMILY} STREQUAL "F4")
  25. stm32f4_get_type(${DEVICE} T)
  26. endif()
  27. set(${TYPE} ${T} PARENT_SCOPE)
  28. endfunction()
  29. function(stm32_get_chip_info CHIP FAMILY TYPE DEVICE)
  30. string(TOUPPER ${CHIP} CHIP)
  31. string(REGEX MATCH "^STM32([A-Z][0-9])([0-9][0-9][A-Z][0-9A-Z]).*$" CHIP ${CHIP})
  32. if((NOT CMAKE_MATCH_1) OR (NOT CMAKE_MATCH_2))
  33. message(FATAL_ERROR "Unknown chip ${CHIP}")
  34. endif()
  35. set(STM32_FAMILY ${CMAKE_MATCH_1})
  36. set(STM32_DEVICE "${CMAKE_MATCH_1}${CMAKE_MATCH_2}")
  37. list(FIND STM32_SUPPORTED_FAMILIES ${STM32_FAMILY} STM32_FAMILY_INDEX)
  38. if (STM32_FAMILY_INDEX EQUAL -1)
  39. message(FATAL_ERROR "Unsupported family ${STM32_FAMILY} for device ${CHIP}")
  40. endif()
  41. stm32_get_chip_type(${STM32_FAMILY} ${STM32_DEVICE} STM32_TYPE)
  42. set(${FAMILY} ${STM32_FAMILY} PARENT_SCOPE)
  43. set(${DEVICE} ${STM32_DEVICE} PARENT_SCOPE)
  44. set(${TYPE} ${STM32_TYPE} PARENT_SCOPE)
  45. endfunction()
  46. function(stm32_add_linker_script TARGET VISIBILITY SCRIPT)
  47. get_filename_component(SCRIPT "${SCRIPT}" ABSOLUTE)
  48. target_link_options(${TARGET} ${VISIBILITY} -T "${SCRIPT}")
  49. endfunction()
  50. foreach(FAMILY ${STM32_SUPPORTED_FAMILIES})
  51. if(NOT (TARGET STM32::${FAMILY}))
  52. add_library(STM32::${FAMILY} INTERFACE IMPORTED)
  53. target_compile_options(STM32::${FAMILY} INTERFACE
  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(STM32::${FAMILY} INTERFACE
  60. --sysroot="${TOOLCHAIN_SYSROOT}"
  61. -mthumb -mabi=aapcs -Wl,--gc-sections
  62. $<$<CONFIG:Debug>:-Og>
  63. $<$<CONFIG:Release>:-Os -s>
  64. )
  65. endif()
  66. endforeach()
  67. if(NOT (TARGET STM32::NoSys))
  68. add_library(STM32::NoSys INTERFACE IMPORTED)
  69. target_compile_options(STM32::NoSys INTERFACE $<$<C_COMPILER_ID:GNU>:--specs=nosys.specs>)
  70. target_link_options(STM32::NoSys INTERFACE $<$<C_COMPILER_ID:GNU>:--specs=nosys.specs>)
  71. endif()
  72. include(stm32/f4)