GCC.cmake 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  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)
  12. get_target_property(DISABLEOPTIM ${PROJECTNAME} DISABLEOPTIMIZATION)
  13. if ((OPTIMIZED) AND (NOT DISABLEOPTIM))
  14. target_compile_options(${PROJECTNAME} PUBLIC "-O2")
  15. endif()
  16. if (FASTMATHCOMPUTATIONS)
  17. target_compile_options(${PROJECTNAME} PUBLIC "-ffast-math")
  18. endif()
  19. if (HARDFP)
  20. target_compile_options(${PROJECTNAME} PUBLIC "-mfloat-abi=hard")
  21. target_link_options(${PROJECTNAME} PUBLIC "-mfloat-abi=hard")
  22. endif()
  23. if (LITTLEENDIAN)
  24. target_compile_options(${PROJECTNAME} PUBLIC "-mlittle-endian")
  25. endif()
  26. if (CORTEXM)
  27. target_compile_options(${PROJECTNAME} PUBLIC "-mthumb")
  28. endif()
  29. # Need to add other gcc config for other cortex-m cores
  30. if (ARM_CPU STREQUAL "cortex-m7" )
  31. target_compile_options(${PROJECTNAME} PUBLIC "-march=armv7e-m;-mfpu=fpv5-d16")
  32. target_link_options(${PROJECTNAME} PUBLIC "-march=armv7e-m;-mfpu=fpv5-d16")
  33. endif()
  34. if (ARM_CPU STREQUAL "cortex-m0" )
  35. target_compile_options(${PROJECTNAME} PUBLIC "-march=armv6-m")
  36. target_link_options(${PROJECTNAME} PUBLIC "-march=armv6-m")
  37. endif()
  38. if (ARM_CPU STREQUAL "cortex-a9" )
  39. if (NOT (NEON OR NEONEXPERIMENTAL))
  40. target_compile_options(${PROJECTNAME} PUBLIC "-march=armv7-a;-mfpu=vfpv3-d16")
  41. target_link_options(${PROJECTNAME} PUBLIC "-march=armv7-a;-mfpu=vfpv3-d16")
  42. endif()
  43. endif()
  44. if (ARM_CPU STREQUAL "cortex-a7" )
  45. if (NOT (NEON OR NEONEXPERIMENTAL))
  46. target_compile_options(${PROJECTNAME} PUBLIC "-march=armv7-a;-mfpu=vfpv3-d16")
  47. target_link_options(${PROJECTNAME} PUBLIC "-march=armv7-a;-mfpu=vfpv3-d16")
  48. endif()
  49. endif()
  50. if (ARM_CPU STREQUAL "cortex-a5" )
  51. if ((NEON OR NEONEXPERIMENTAL))
  52. target_compile_options(${PROJECTNAME} PUBLIC "-march=armv7-a;-mfpu=neon-vfpv4")
  53. target_link_options(${PROJECTNAME} PUBLIC "-march=armv7-a;-mfpu=neon-vfpv4")
  54. else()
  55. target_compile_options(${PROJECTNAME} PUBLIC "-march=armv7-a;-mfpu=vfpv3-d16")
  56. target_link_options(${PROJECTNAME} PUBLIC "-march=armv7-a;-mfpu=vfpv3-d16")
  57. endif()
  58. endif()
  59. endfunction()
  60. function(preprocessScatter CORE PLATFORMFOLDER SCATTERFILE)
  61. file(REMOVE ${SCATTERFILE})
  62. # Copy the mem file to the build directory
  63. # so that it can be find when preprocessing the scatter file
  64. # since we cannot pass an include path to armlink
  65. add_custom_command(
  66. OUTPUT
  67. ${SCATTERFILE}
  68. COMMAND
  69. ${CMAKE_C_COMPILER} -E -x c -I${PLATFORMFOLDER}/${CORE}/LinkScripts/GCC -o ${SCATTERFILE} ${PLATFORMFOLDER}/${CORE}/LinkScripts/GCC/lnk.ld
  70. COMMAND
  71. python ${ROOT}/CMSIS/DSP/filterLinkScript.py ${SCATTERFILE}
  72. DEPENDS
  73. "${PLATFORMFOLDER}/${CORE}/LinkScripts/GCC/lnk.ld;${PLATFORMFOLDER}/${CORE}/LinkScripts/GCC/mem_${CORE}.h"
  74. )
  75. add_custom_target(
  76. scatter ALL
  77. DEPENDS "${SCATTERFILE};${PLATFORMFOLDER}/${CORE}/LinkScripts/GCC/mem_${CORE}.h"
  78. )
  79. add_dependencies(${PROJECTNAME} scatter)
  80. endfunction()
  81. function(toolchainSpecificLinkForCortexM PROJECTNAME ROOT CORE PLATFORMFOLDER HASCSTARTUP)
  82. target_sources(${PROJECTNAME} PRIVATE ${PLATFORMFOLDER}/${CORE}/Startup/GCC/startup_${CORE}.S)
  83. target_sources(${PROJECTNAME} PRIVATE ${PLATFORMFOLDER}/${CORE}/Startup/GCC/support.c)
  84. target_include_directories(${PROJECTNAME} PRIVATE ${PLATFORMFOLDER}/${CORE}/LinkScripts/GCC)
  85. file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/tempLink)
  86. set(SCATTERFILE ${CMAKE_CURRENT_BINARY_DIR}/tempLink/lnk.ld)
  87. preprocessScatter(${CORE} ${PLATFORMFOLDER} ${SCATTERFILE})
  88. set_target_properties(${PROJECTNAME} PROPERTIES LINK_DEPENDS "${SCATTERFILE}")
  89. target_link_options(${PROJECTNAME} PRIVATE "--entry=Reset_Handler;-T${SCATTERFILE}")
  90. endfunction()
  91. function(toolchainSpecificLinkForCortexA PROJECTNAME ROOT CORE PLATFORMFOLDER)
  92. target_sources(${PROJECTNAME} PRIVATE ${PLATFORMFOLDER}/${CORE}/Startup/GCC/startup_${CORE}.c)
  93. target_sources(${PROJECTNAME} PRIVATE ${PLATFORMFOLDER}/${CORE}/Startup/GCC/support.c)
  94. # RTE Components
  95. target_include_directories(${PROJECTNAME} PRIVATE ${ROOT}/CMSIS/DSP/Testing)
  96. target_include_directories(${PROJECTNAME} PRIVATE ${PLATFORMFOLDER}/${CORE}/LinkScripts/GCC)
  97. file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/tempLink)
  98. set(SCATTERFILE ${CMAKE_CURRENT_BINARY_DIR}/tempLink/lnk.ld)
  99. preprocessScatter(${CORE} ${PLATFORMFOLDER} ${SCATTERFILE})
  100. set_target_properties(${PROJECTNAME} PROPERTIES LINK_DEPENDS "${SCATTERFILE}")
  101. target_link_options(${PROJECTNAME} PRIVATE "--entry=Reset_Handler;-T${SCATTERFILE}")
  102. endfunction()
  103. function(compilerSpecificPlatformConfigLibForM PROJECTNAME ROOT)
  104. if (SEMIHOSTING)
  105. target_link_options(${PROJECTNAME} PRIVATE "--specs=rdimon.specs")
  106. target_compile_options(${PROJECTNAME} PRIVATE "--specs=rdimon.specs")
  107. else()
  108. target_link_options(${PROJECTNAME} PRIVATE "--specs=nosys.specs")
  109. target_compile_options(${PROJECTNAME} PRIVATE "--specs=nosys.specs")
  110. endif()
  111. endfunction()
  112. function(compilerSpecificPlatformConfigLibForA PROJECTNAME ROOT)
  113. if (SEMIHOSTING)
  114. target_link_options(${PROJECTNAME} PRIVATE "--specs=rdimon.specs")
  115. target_compile_options(${PROJECTNAME} PRIVATE "--specs=rdimon.specs")
  116. else()
  117. target_link_options(${PROJECTNAME} PRIVATE "--specs=nosys.specs")
  118. target_compile_options(${PROJECTNAME} PRIVATE "--specs=nosys.specs")
  119. endif()
  120. endfunction()
  121. function(compilerSpecificPlatformConfigAppForM PROJECTNAME ROOT)
  122. if (SEMIHOSTING)
  123. target_link_options(${PROJECTNAME} PRIVATE "--specs=rdimon.specs")
  124. target_compile_options(${PROJECTNAME} PRIVATE "--specs=rdimon.specs")
  125. else()
  126. target_link_options(${PROJECTNAME} PRIVATE "--specs=nosys.specs")
  127. target_compile_options(${PROJECTNAME} PRIVATE "--specs=nosys.specs")
  128. endif()
  129. endfunction()
  130. function(compilerSpecificPlatformConfigAppForA PROJECTNAME ROOT)
  131. if (SEMIHOSTING)
  132. target_link_options(${PROJECTNAME} PRIVATE "--specs=rdimon.specs")
  133. target_compile_options(${PROJECTNAME} PRIVATE "--specs=rdimon.specs")
  134. else()
  135. target_link_options(${PROJECTNAME} PRIVATE "--specs=nosys.specs")
  136. target_compile_options(${PROJECTNAME} PRIVATE "--specs=nosys.specs")
  137. endif()
  138. endfunction()