summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
authorOsama Moharam <osama.moharam.uw@renesas.com>2020-06-03 14:49:11 (GMT)
committerOsama Moharam <osama.moharam.uw@renesas.com>2020-06-03 14:58:31 (GMT)
commitef816610be082ede9d3ba5fa95e45a0968eef6a6 (patch)
treece93273c101791552fe3c024dc1bea809a8b11a2 /Modules
parent85a9f056a12582028123e88c4c9985ab2bf1220a (diff)
downloadCMake-ef816610be082ede9d3ba5fa95e45a0968eef6a6.zip
CMake-ef816610be082ede9d3ba5fa95e45a0968eef6a6.tar.gz
CMake-ef816610be082ede9d3ba5fa95e45a0968eef6a6.tar.bz2
ARMClang: allow fallback to -march and correct setting of --cpu flags
allows cmake to fall back to CMAKE_SYSTEM_ARCH in case CMAKE_SYSTEM_PROCESSOR is not in armclang -mcpu=list additionally checks if CMAKE_SYSTEM_PROCESSOR belongs to armlink --cpu=list Fixes: #19962
Diffstat (limited to 'Modules')
-rw-r--r--Modules/Compiler/ARMClang.cmake67
1 files changed, 57 insertions, 10 deletions
diff --git a/Modules/Compiler/ARMClang.cmake b/Modules/Compiler/ARMClang.cmake
index f0fdcd5..d412399 100644
--- a/Modules/Compiler/ARMClang.cmake
+++ b/Modules/Compiler/ARMClang.cmake
@@ -46,6 +46,32 @@ function(__armclang_check_processor processor list out_var)
endif()
endfunction()
+# get compiler supported arch list
+function(__armclang_set_arch_list lang out_var)
+ execute_process(COMMAND "${CMAKE_${lang}_COMPILER}" --target=${CMAKE_${lang}_COMPILER_TARGET} -march=list
+ OUTPUT_VARIABLE arch_list
+ ERROR_VARIABLE arch_list)
+ string(REGEX MATCHALL "-march=([^ \n]*)" arch_list "${arch_list}")
+ string(REGEX REPLACE "-march=" "" arch_list "${arch_list}")
+ set(${out_var} "${arch_list}" PARENT_SCOPE)
+endfunction()
+
+# get linker supported cpu list
+function(__armlink_set_cpu_list lang out_var)
+ if(__CMAKE_ARMClang_USING_armlink)
+ set(__linker_wrapper_flags "")
+ else()
+ set(__linker_wrapper_flags --target=${CMAKE_${lang}_COMPILER_TARGET} -XLinker)
+ endif()
+
+ execute_process(COMMAND "${CMAKE_LINKER}" ${__linker_wrapper_flags} --cpu=list
+ OUTPUT_VARIABLE cpu_list
+ ERROR_VARIABLE cpu_list)
+ string(REGEX MATCHALL "--cpu=([^ \n]*)" cpu_list "${cpu_list}")
+ string(REGEX REPLACE "--cpu=" "" cpu_list "${cpu_list}")
+ set(${out_var} "${cpu_list}" PARENT_SCOPE)
+endfunction()
+
macro(__compiler_armclang lang)
if(NOT CMAKE_${lang}_COMPILER_TARGET)
set(CMAKE_${lang}_COMPILER_TARGET arm-arm-none-eabi)
@@ -53,19 +79,40 @@ macro(__compiler_armclang lang)
if(NOT CMAKE_${lang}_COMPILER_PROCESSOR_LIST)
__armclang_set_processor_list(${lang} CMAKE_${lang}_COMPILER_PROCESSOR_LIST)
endif()
- if(NOT CMAKE_SYSTEM_PROCESSOR)
- message(FATAL_ERROR " CMAKE_SYSTEM_PROCESSOR must be set for ARMClang\n"
- " Supported processor: ${CMAKE_${lang}_COMPILER_PROCESSOR_LIST}\n")
+ if(NOT CMAKE_${lang}_COMPILER_ARCH_LIST)
+ __armclang_set_arch_list(${lang} CMAKE_${lang}_COMPILER_ARCH_LIST)
+ endif()
+ if(NOT CMAKE_SYSTEM_PROCESSOR AND NOT CMAKE_SYSTEM_ARCH)
+ message(FATAL_ERROR " CMAKE_SYSTEM_PROCESSOR or CMAKE_SYSTEM_ARCH must be set for ARMClang\n"
+ " Supported processor: ${CMAKE_${lang}_COMPILER_PROCESSOR_LIST}\n"
+ " Supported Architecture: ${CMAKE_${lang}_COMPILER_ARCH_LIST}")
else()
- __armclang_check_processor("${CMAKE_SYSTEM_PROCESSOR}" "${CMAKE_${lang}_COMPILER_PROCESSOR_LIST}" _CMAKE_${lang}_CHECK_RESULT)
- if(NOT _CMAKE_${lang}_CHECK_RESULT)
- message(FATAL_ERROR " System processor '${CMAKE_SYSTEM_PROCESSOR}' not supported by ARMClang ${lang} compiler\n"
- " Supported processor: ${CMAKE_${lang}_COMPILER_PROCESSOR_LIST}\n")
+ __armclang_check_processor("${CMAKE_SYSTEM_ARCH}" "${CMAKE_${lang}_COMPILER_ARCH_LIST}" _CMAKE_${lang}_CHECK_ARCH_RESULT)
+ if( _CMAKE_${lang}_CHECK_ARCH_RESULT)
+ string(APPEND CMAKE_${lang}_FLAGS_INIT "-march=${CMAKE_SYSTEM_ARCH}")
+ set(__march_flag_set TRUE)
+ endif()
+ __armclang_check_processor("${CMAKE_SYSTEM_PROCESSOR}" "${CMAKE_${lang}_COMPILER_PROCESSOR_LIST}" _CMAKE_${lang}_CHECK_PROCESSOR_RESULT)
+ if(_CMAKE_${lang}_CHECK_PROCESSOR_RESULT)
+ string(APPEND CMAKE_${lang}_FLAGS_INIT "-mcpu=${CMAKE_SYSTEM_PROCESSOR}")
+ set(__mcpu_flag_set TRUE)
endif()
- unset(_CMAKE_${lang}_CHECK_RESULT)
+ if(NOT __march_flag_set AND NOT __mcpu_flag_set)
+ message(FATAL_ERROR "Atleast one of the variables CMAKE_SYSTEM_PROCESSOR or CMAKE_SYSTEM_ARCH must be set for ARMClang\n"
+ "Supported processor: ${CMAKE_${lang}_COMPILER_PROCESSOR_LIST}\n"
+ " Supported Architecture: ${CMAKE_${lang}_COMPILER_ARCH_LIST}")
+ endif()
+ unset(_CMAKE_${lang}_CHECK_PROCESSOR_RESULT)
+ unset(_CMAKE_${lang}_CHECK_ARCH_RESULT)
+ endif()
+
+ #check if CMAKE_SYSTEM_PROCESSOR belongs to supported cpu list for armlink
+ __armlink_set_cpu_list( ${lang} CMAKE_LINKER_CPU_LIST)
+ list(TRANSFORM CMAKE_LINKER_CPU_LIST TOLOWER)
+ __armclang_check_processor("${CMAKE_SYSTEM_PROCESSOR}" "${CMAKE_LINKER_CPU_LIST}" _CMAKE_CHECK_LINK_CPU_RESULT)
+ if(_CMAKE_CHECK_LINK_CPU_RESULT)
+ string(APPEND CMAKE_${lang}_LINK_FLAGS "--cpu=${CMAKE_SYSTEM_PROCESSOR}")
endif()
- string(APPEND CMAKE_${lang}_FLAGS_INIT "-mcpu=${CMAKE_SYSTEM_PROCESSOR}")
- string(APPEND CMAKE_${lang}_LINK_FLAGS "--cpu=${CMAKE_SYSTEM_PROCESSOR}")
if(__CMAKE_ARMClang_USING_armlink)
set(__CMAKE_ARMClang_USING_armlink_WRAPPER "")