GCC.cmake 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. function(compilerVersion)
  2. execute_process(COMMAND "${CMAKE_C_COMPILER}" -dumpversion
  3. OUTPUT_VARIABLE CVERSION
  4. ERROR_VARIABLE CVERSION
  5. )
  6. SET(COMPILERVERSION ${CVERSION} PARENT_SCOPE)
  7. #cmake_print_variables(CVERSION)
  8. #cmake_print_variables(CMAKE_C_COMPILER)
  9. #MESSAGE( STATUS "CMD_OUTPUT:" ${CVERSION})
  10. endfunction()
  11. function(compilerSpecificCompileOptions PROJECTNAME ROOT)
  12. get_target_property(DISABLEOPTIM ${PROJECTNAME} DISABLEOPTIMIZATION)
  13. # Add support for the type __fp16 even if there is no HW
  14. # support for it.
  15. if (FLOAT16)
  16. target_compile_options(${PROJECTNAME} PUBLIC "-mfp16-format=ieee")
  17. endif()
  18. if ((OPTIMIZED) AND (NOT DISABLEOPTIM))
  19. target_compile_options(${PROJECTNAME} PUBLIC "-Ofast")
  20. endif()
  21. if (FASTMATHCOMPUTATIONS)
  22. target_compile_options(${PROJECTNAME} PUBLIC "-ffast-math")
  23. endif()
  24. if (HARDFP)
  25. target_compile_options(${PROJECTNAME} PUBLIC "-mfloat-abi=hard")
  26. target_link_options(${PROJECTNAME} PUBLIC "-mfloat-abi=hard")
  27. endif()
  28. if (LITTLEENDIAN)
  29. target_compile_options(${PROJECTNAME} PUBLIC "-mlittle-endian")
  30. endif()
  31. if (CORTEXM OR CORTEXR)
  32. target_compile_options(${PROJECTNAME} PUBLIC "-mthumb")
  33. endif()
  34. target_link_options(${PROJECTNAME} PUBLIC "-mcpu=${ARM_CPU}")
  35. # Need to add other gcc config for other cortex-m cores
  36. if (ARM_CPU STREQUAL "cortex-m55" )
  37. target_compile_options(${PROJECTNAME} PUBLIC "-march=armv8.1-m.main+mve.fp+fp.dp")
  38. target_compile_options(${PROJECTNAME} PUBLIC "-mfpu=fpv5-d16")
  39. target_link_options(${PROJECTNAME} PUBLIC "-mfpu=fpv5-d16")
  40. endif()
  41. if (ARM_CPU STREQUAL "cortex-m55+nomve.fp+nofp" )
  42. target_compile_options(${PROJECTNAME} PUBLIC "-march=armv8.1-m.main+dsp+fp.dp")
  43. target_compile_options(${PROJECTNAME} PUBLIC "-mfpu=fpv5-d16")
  44. target_link_options(${PROJECTNAME} PUBLIC "-mfpu=fpv5-d16")
  45. endif()
  46. if (ARM_CPU STREQUAL "cortex-m33" )
  47. target_compile_options(${PROJECTNAME} PUBLIC "-mfpu=fpv5-sp-d16")
  48. target_link_options(${PROJECTNAME} PUBLIC "-mfpu=fpv5-sp-d16")
  49. endif()
  50. if (ARM_CPU STREQUAL "cortex-m7" )
  51. target_compile_options(${PROJECTNAME} PUBLIC "-mfpu=fpv5-d16")
  52. target_link_options(${PROJECTNAME} PUBLIC "-mfpu=fpv5-d16")
  53. endif()
  54. if (ARM_CPU STREQUAL "cortex-m4" )
  55. target_compile_options(${PROJECTNAME} PUBLIC "-mfpu=fpv4-sp-d16")
  56. target_link_options(${PROJECTNAME} PUBLIC "-mfpu=fpv4-sp-d16")
  57. endif()
  58. #if (ARM_CPU STREQUAL "cortex-m0" )
  59. # target_compile_options(${PROJECTNAME} PUBLIC "")
  60. # target_link_options(${PROJECTNAME} PUBLIC "")
  61. #endif()
  62. if (ARM_CPU STREQUAL "cortex-a32" )
  63. if (NOT (NEON OR NEONEXPERIMENTAL))
  64. target_compile_options(${PROJECTNAME} PUBLIC "-march=armv8-a;-mfpu=vfpv3-d16")
  65. target_link_options(${PROJECTNAME} PUBLIC "-march=armv8-a;-mfpu=vfpv3-d16")
  66. endif()
  67. endif()
  68. if (ARM_CPU STREQUAL "cortex-a9" )
  69. if (NOT (NEON OR NEONEXPERIMENTAL))
  70. target_compile_options(${PROJECTNAME} PUBLIC "-march=armv7-a;-mfpu=vfpv3-d16")
  71. target_link_options(${PROJECTNAME} PUBLIC "-march=armv7-a;-mfpu=vfpv3-d16")
  72. endif()
  73. endif()
  74. if (ARM_CPU STREQUAL "cortex-a7" )
  75. if (NOT (NEON OR NEONEXPERIMENTAL))
  76. target_compile_options(${PROJECTNAME} PUBLIC "-march=armv7-a;-mfpu=vfpv3-d16")
  77. target_link_options(${PROJECTNAME} PUBLIC "-march=armv7-a;-mfpu=vfpv3-d16")
  78. endif()
  79. endif()
  80. if (ARM_CPU STREQUAL "cortex-a5" )
  81. if ((NEON OR NEONEXPERIMENTAL))
  82. target_compile_options(${PROJECTNAME} PUBLIC "-march=armv7-a;-mfpu=neon-vfpv4")
  83. target_link_options(${PROJECTNAME} PUBLIC "-march=armv7-a;-mfpu=neon-vfpv4")
  84. else()
  85. target_compile_options(${PROJECTNAME} PUBLIC "-march=armv7-a;-mfpu=vfpv3-d16")
  86. target_link_options(${PROJECTNAME} PUBLIC "-march=armv7-a;-mfpu=vfpv3-d16")
  87. endif()
  88. endif()
  89. endfunction()
  90. function(preprocessScatter CORE PLATFORMFOLDER SCATTERFILE)
  91. file(REMOVE ${SCATTERFILE})
  92. # Copy the mem file to the build directory
  93. # so that it can be find when preprocessing the scatter file
  94. # since we cannot pass an include path to armlink
  95. add_custom_command(
  96. OUTPUT
  97. ${SCATTERFILE}
  98. COMMAND
  99. ${CMAKE_C_COMPILER} -E -x c -I${PLATFORMFOLDER}/${CORE}/LinkScripts/GCC -o ${SCATTERFILE} ${PLATFORMFOLDER}/${CORE}/LinkScripts/GCC/lnk.ld
  100. COMMAND
  101. python ${ROOT}/CMSIS/DSP/filterLinkScript.py ${SCATTERFILE}
  102. DEPENDS
  103. "${PLATFORMFOLDER}/${CORE}/LinkScripts/GCC/lnk.ld;${PLATFORMFOLDER}/${CORE}/LinkScripts/GCC/mem_${CORE}.h"
  104. )
  105. add_custom_target(
  106. scatter ALL
  107. DEPENDS "${SCATTERFILE};${PLATFORMFOLDER}/${CORE}/LinkScripts/GCC/mem_${CORE}.h"
  108. )
  109. add_dependencies(${PROJECTNAME} scatter)
  110. endfunction()
  111. function(toolchainSpecificLinkForCortexM PROJECTNAME ROOT CORE PLATFORMFOLDER HASCSTARTUP)
  112. if (HASCSTARTUP)
  113. target_sources(${PROJECTNAME} PRIVATE ${PLATFORMFOLDER}/${CORE}/Startup/GCC/startup_${CORE}.c)
  114. else()
  115. target_sources(${PROJECTNAME} PRIVATE ${PLATFORMFOLDER}/${CORE}/Startup/GCC/startup_${CORE}.S)
  116. endif()
  117. target_sources(${PROJECTNAME} PRIVATE ${PLATFORMFOLDER}/${CORE}/Startup/GCC/support.c)
  118. target_include_directories(${PROJECTNAME} PRIVATE ${PLATFORMFOLDER}/${CORE}/LinkScripts/GCC)
  119. file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/tempLink)
  120. set(SCATTERFILE ${CMAKE_CURRENT_BINARY_DIR}/tempLink/lnk.ld)
  121. preprocessScatter(${CORE} ${PLATFORMFOLDER} ${SCATTERFILE})
  122. set_target_properties(${PROJECTNAME} PROPERTIES LINK_DEPENDS "${SCATTERFILE}")
  123. target_link_options(${PROJECTNAME} PRIVATE "--entry=Reset_Handler;-T${SCATTERFILE}")
  124. endfunction()
  125. function(toolchainSpecificLinkForCortexA PROJECTNAME ROOT CORE PLATFORMFOLDER)
  126. target_sources(${PROJECTNAME} PRIVATE ${PLATFORMFOLDER}/${CORE}/Startup/GCC/startup_${CORE}.c)
  127. target_sources(${PROJECTNAME} PRIVATE ${PLATFORMFOLDER}/${CORE}/Startup/GCC/support.c)
  128. # RTE Components
  129. target_include_directories(${PROJECTNAME} PRIVATE ${ROOT}/CMSIS/DSP/Testing)
  130. target_include_directories(${PROJECTNAME} PRIVATE ${PLATFORMFOLDER}/${CORE}/LinkScripts/GCC)
  131. file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/tempLink)
  132. set(SCATTERFILE ${CMAKE_CURRENT_BINARY_DIR}/tempLink/lnk.ld)
  133. preprocessScatter(${CORE} ${PLATFORMFOLDER} ${SCATTERFILE})
  134. set_target_properties(${PROJECTNAME} PROPERTIES LINK_DEPENDS "${SCATTERFILE}")
  135. target_link_options(${PROJECTNAME} PRIVATE "--entry=Reset_Handler;-T${SCATTERFILE}")
  136. endfunction()
  137. function(toolchainSpecificLinkForCortexR PROJECTNAME ROOT CORE PLATFORMFOLDER)
  138. target_sources(${PROJECTNAME} PRIVATE ${PLATFORMFOLDER}/${CORE}/Startup/GCC/startup_${CORE}.c)
  139. target_sources(${PROJECTNAME} PRIVATE ${PLATFORMFOLDER}/${CORE}/Startup/GCC/support.c)
  140. # RTE Components
  141. target_include_directories(${PROJECTNAME} PRIVATE ${ROOT}/CMSIS/DSP/Testing)
  142. target_include_directories(${PROJECTNAME} PRIVATE ${PLATFORMFOLDER}/${CORE}/LinkScripts/GCC)
  143. file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/tempLink)
  144. set(SCATTERFILE ${CMAKE_CURRENT_BINARY_DIR}/tempLink/lnk.ld)
  145. preprocessScatter(${CORE} ${PLATFORMFOLDER} ${SCATTERFILE})
  146. set_target_properties(${PROJECTNAME} PROPERTIES LINK_DEPENDS "${SCATTERFILE}")
  147. target_link_options(${PROJECTNAME} PRIVATE "--entry=Reset_Handler;-T${SCATTERFILE}")
  148. endfunction()
  149. function(compilerSpecificPlatformConfigLibForM PROJECTNAME ROOT)
  150. if (SEMIHOSTING)
  151. target_link_options(${PROJECTNAME} PRIVATE "--specs=rdimon.specs")
  152. target_compile_options(${PROJECTNAME} PRIVATE "--specs=rdimon.specs")
  153. else()
  154. target_link_options(${PROJECTNAME} PRIVATE "--specs=nosys.specs")
  155. target_compile_options(${PROJECTNAME} PRIVATE "--specs=nosys.specs")
  156. endif()
  157. endfunction()
  158. function(compilerSpecificPlatformConfigLibForA PROJECTNAME ROOT)
  159. if (SEMIHOSTING)
  160. target_link_options(${PROJECTNAME} PRIVATE "--specs=rdimon.specs")
  161. target_compile_options(${PROJECTNAME} PRIVATE "--specs=rdimon.specs")
  162. else()
  163. target_link_options(${PROJECTNAME} PRIVATE "--specs=nosys.specs")
  164. target_compile_options(${PROJECTNAME} PRIVATE "--specs=nosys.specs")
  165. endif()
  166. endfunction()
  167. function(compilerSpecificPlatformConfigLibForR PROJECTNAME ROOT)
  168. if (SEMIHOSTING)
  169. target_link_options(${PROJECTNAME} PRIVATE "--specs=rdimon.specs")
  170. target_compile_options(${PROJECTNAME} PRIVATE "--specs=rdimon.specs")
  171. else()
  172. target_link_options(${PROJECTNAME} PRIVATE "--specs=nosys.specs")
  173. target_compile_options(${PROJECTNAME} PRIVATE "--specs=nosys.specs")
  174. endif()
  175. endfunction()
  176. function(compilerSpecificPlatformConfigAppForM PROJECTNAME ROOT)
  177. if (SEMIHOSTING)
  178. target_link_options(${PROJECTNAME} PRIVATE "--specs=rdimon.specs")
  179. target_compile_options(${PROJECTNAME} PRIVATE "--specs=rdimon.specs")
  180. else()
  181. target_link_options(${PROJECTNAME} PRIVATE "--specs=nosys.specs")
  182. target_compile_options(${PROJECTNAME} PRIVATE "--specs=nosys.specs")
  183. endif()
  184. target_link_options(${PROJECTNAME} PUBLIC "-Wl,--gc-sections")
  185. endfunction()
  186. function(compilerSpecificPlatformConfigAppForA PROJECTNAME ROOT)
  187. if (SEMIHOSTING)
  188. target_link_options(${PROJECTNAME} PRIVATE "--specs=rdimon.specs")
  189. target_compile_options(${PROJECTNAME} PRIVATE "--specs=rdimon.specs")
  190. else()
  191. target_link_options(${PROJECTNAME} PRIVATE "--specs=nosys.specs")
  192. target_compile_options(${PROJECTNAME} PRIVATE "--specs=nosys.specs")
  193. endif()
  194. endfunction()
  195. function(compilerSpecificPlatformConfigAppForR PROJECTNAME ROOT)
  196. if (SEMIHOSTING)
  197. target_link_options(${PROJECTNAME} PRIVATE "--specs=rdimon.specs")
  198. target_compile_options(${PROJECTNAME} PRIVATE "--specs=rdimon.specs")
  199. else()
  200. target_link_options(${PROJECTNAME} PRIVATE "--specs=nosys.specs")
  201. target_compile_options(${PROJECTNAME} PRIVATE "--specs=nosys.specs")
  202. endif()
  203. endfunction()