ARMClang.cmake 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. if(_ARMClang_CMAKE_LOADED)
  2. return()
  3. endif()
  4. set(_ARMClang_CMAKE_LOADED TRUE)
  5. cmake_policy(PUSH)
  6. cmake_policy(SET CMP0057 NEW) # if IN_LIST
  7. get_filename_component(_CMAKE_C_TOOLCHAIN_LOCATION "${CMAKE_C_COMPILER}" PATH)
  8. get_filename_component(_CMAKE_CXX_TOOLCHAIN_LOCATION "${CMAKE_CXX_COMPILER}" PATH)
  9. set(CMAKE_EXECUTABLE_SUFFIX ".elf")
  10. find_program(CMAKE_ARMClang_LINKER armlink HINTS "${_CMAKE_C_TOOLCHAIN_LOCATION}" "${_CMAKE_CXX_TOOLCHAIN_LOCATION}" )
  11. find_program(CMAKE_ARMClang_AR armar HINTS "${_CMAKE_C_TOOLCHAIN_LOCATION}" "${_CMAKE_CXX_TOOLCHAIN_LOCATION}" )
  12. set(CMAKE_LINKER "${CMAKE_ARMClang_LINKER}" CACHE FILEPATH "The ARMClang linker" FORCE)
  13. mark_as_advanced(CMAKE_ARMClang_LINKER)
  14. set(CMAKE_AR "${CMAKE_ARMClang_AR}" CACHE FILEPATH "The ARMClang archiver" FORCE)
  15. mark_as_advanced(CMAKE_ARMClang_AR)
  16. if (CMAKE_LINKER MATCHES "armlink")
  17. set(__CMAKE_ARMClang_USING_armlink TRUE)
  18. set(CMAKE_LIBRARY_PATH_FLAG "--userlibpath=")
  19. else()
  20. set(__CMAKE_ARMClang_USING_armlink FALSE)
  21. endif()
  22. # get compiler supported cpu list
  23. function(__armclang_set_processor_list lang out_var)
  24. execute_process(COMMAND "${CMAKE_${lang}_COMPILER}" --target=${CMAKE_${lang}_COMPILER_TARGET} -mcpu=list
  25. OUTPUT_VARIABLE processor_list
  26. ERROR_VARIABLE processor_list)
  27. string(REGEX MATCHALL "-mcpu=([^ \n]*)" processor_list "${processor_list}")
  28. string(REGEX REPLACE "-mcpu=" "" processor_list "${processor_list}")
  29. set(${out_var} "${processor_list}" PARENT_SCOPE)
  30. endfunction()
  31. # check processor is in list
  32. function(__armclang_check_processor processor list out_var)
  33. string(TOLOWER "${processor}" processor)
  34. if(processor IN_LIST list)
  35. set(${out_var} TRUE PARENT_SCOPE)
  36. else()
  37. set(${out_var} FALSE PARENT_SCOPE)
  38. endif()
  39. endfunction()
  40. # get compiler supported arch list
  41. function(__armclang_set_arch_list lang out_var)
  42. execute_process(COMMAND "${CMAKE_${lang}_COMPILER}" --target=${CMAKE_${lang}_COMPILER_TARGET} -march=list
  43. OUTPUT_VARIABLE arch_list
  44. ERROR_VARIABLE arch_list)
  45. string(REGEX MATCHALL "-march=([^ \n]*)" arch_list "${arch_list}")
  46. string(REGEX REPLACE "-march=" "" arch_list "${arch_list}")
  47. set(${out_var} "${arch_list}" PARENT_SCOPE)
  48. endfunction()
  49. # get linker supported cpu list
  50. function(__armlink_set_cpu_list lang out_var)
  51. if(__CMAKE_ARMClang_USING_armlink)
  52. set(__linker_wrapper_flags "")
  53. else()
  54. set(__linker_wrapper_flags --target=${CMAKE_${lang}_COMPILER_TARGET} -XLinker)
  55. endif()
  56. execute_process(COMMAND "${CMAKE_LINKER}" ${__linker_wrapper_flags} --cpu=list
  57. OUTPUT_VARIABLE cpu_list
  58. ERROR_VARIABLE cpu_list)
  59. string(REGEX MATCHALL "--cpu=([^ \n]*)" cpu_list "${cpu_list}")
  60. string(REGEX REPLACE "--cpu=" "" cpu_list "${cpu_list}")
  61. set(${out_var} "${cpu_list}" PARENT_SCOPE)
  62. endfunction()
  63. macro(__compiler_armclang lang)
  64. if(NOT CMAKE_${lang}_COMPILER_TARGET)
  65. set(CMAKE_${lang}_COMPILER_TARGET arm-arm-none-eabi)
  66. endif()
  67. if(NOT CMAKE_${lang}_COMPILER_PROCESSOR_LIST)
  68. __armclang_set_processor_list(${lang} CMAKE_${lang}_COMPILER_PROCESSOR_LIST)
  69. endif()
  70. if(NOT CMAKE_${lang}_COMPILER_ARCH_LIST)
  71. __armclang_set_arch_list(${lang} CMAKE_${lang}_COMPILER_ARCH_LIST)
  72. endif()
  73. if(NOT CMAKE_SYSTEM_PROCESSOR AND NOT CMAKE_SYSTEM_ARCH)
  74. message(FATAL_ERROR " CMAKE_SYSTEM_PROCESSOR or CMAKE_SYSTEM_ARCH must be set for ARMClang\n"
  75. " Supported processor: ${CMAKE_${lang}_COMPILER_PROCESSOR_LIST}\n"
  76. " Supported Architecture: ${CMAKE_${lang}_COMPILER_ARCH_LIST}")
  77. else()
  78. __armclang_check_processor("${CMAKE_SYSTEM_ARCH}" "${CMAKE_${lang}_COMPILER_ARCH_LIST}" _CMAKE_${lang}_CHECK_ARCH_RESULT)
  79. if( _CMAKE_${lang}_CHECK_ARCH_RESULT)
  80. string(APPEND CMAKE_${lang}_FLAGS_INIT "-march=${CMAKE_SYSTEM_ARCH}")
  81. set(__march_flag_set TRUE)
  82. endif()
  83. __armclang_check_processor("${CMAKE_SYSTEM_PROCESSOR}" "${CMAKE_${lang}_COMPILER_PROCESSOR_LIST}" _CMAKE_${lang}_CHECK_PROCESSOR_RESULT)
  84. if(_CMAKE_${lang}_CHECK_PROCESSOR_RESULT)
  85. string(APPEND CMAKE_${lang}_FLAGS_INIT "-mcpu=${CMAKE_SYSTEM_PROCESSOR}")
  86. set(__mcpu_flag_set TRUE)
  87. endif()
  88. if(NOT __march_flag_set AND NOT __mcpu_flag_set)
  89. message(FATAL_ERROR "Atleast one of the variables CMAKE_SYSTEM_PROCESSOR or CMAKE_SYSTEM_ARCH must be set for ARMClang\n"
  90. "Supported processor: ${CMAKE_${lang}_COMPILER_PROCESSOR_LIST}\n"
  91. " Supported Architecture: ${CMAKE_${lang}_COMPILER_ARCH_LIST}")
  92. endif()
  93. unset(_CMAKE_${lang}_CHECK_PROCESSOR_RESULT)
  94. unset(_CMAKE_${lang}_CHECK_ARCH_RESULT)
  95. endif()
  96. #check if CMAKE_SYSTEM_PROCESSOR belongs to supported cpu list for armlink
  97. __armlink_set_cpu_list( ${lang} CMAKE_LINKER_CPU_LIST)
  98. list(TRANSFORM CMAKE_LINKER_CPU_LIST TOLOWER)
  99. __armclang_check_processor("${CMAKE_SYSTEM_PROCESSOR}" "${CMAKE_LINKER_CPU_LIST}" _CMAKE_CHECK_LINK_CPU_RESULT)
  100. if(_CMAKE_CHECK_LINK_CPU_RESULT)
  101. string(APPEND CMAKE_${lang}_LINK_FLAGS "--cpu=${CMAKE_SYSTEM_PROCESSOR}")
  102. endif()
  103. if(__CMAKE_ARMClang_USING_armlink)
  104. set(__CMAKE_ARMClang_USING_armlink_WRAPPER "")
  105. else()
  106. set(__CMAKE_ARMClang_USING_armlink_WRAPPER ${CMAKE_${lang}_LINKER_WRAPPER_FLAG})
  107. endif()
  108. set(CMAKE_${lang}_LINK_EXECUTABLE "<CMAKE_LINKER> <CMAKE_${lang}_LINK_FLAGS> <LINK_FLAGS> <LINK_LIBRARIES> <OBJECTS> -o <TARGET> ${__CMAKE_ARMClang_USING_armlink_WRAPPER} --list <TARGET_BASE>.map")
  109. set(CMAKE_${lang}_CREATE_STATIC_LIBRARY "<CMAKE_AR> --create -cr <TARGET> <LINK_FLAGS> <OBJECTS>")
  110. set(CMAKE_${lang}_ARCHIVE_CREATE "<CMAKE_AR> --create -cr <TARGET> <LINK_FLAGS> <OBJECTS>")
  111. set(CMAKE_${lang}_RESPONSE_FILE_LINK_FLAG "${__CMAKE_ARMClang_USING_armlink_WRAPPER} --via=")
  112. set(CMAKE_${lang}_OUTPUT_EXTENSION ".o")
  113. set(CMAKE_${lang}_OUTPUT_EXTENSION_REPLACE 1)
  114. endmacro()
  115. cmake_policy(POP)