summaryrefslogtreecommitdiffstats
path: root/Modules/Compiler
diff options
context:
space:
mode:
authorLingkai Dong <lingkai.dong@arm.com>2021-04-21 16:07:22 (GMT)
committerBrad King <brad.king@kitware.com>2021-04-27 18:03:15 (GMT)
commitc4941b7e66cd3a0a9de5ed8189ef025fcd6f3122 (patch)
treec5158533c814362581c1423834fd2238d529e266 /Modules/Compiler
parent0078db3888e01343d26c1f695b250663bbcb7ac2 (diff)
downloadCMake-c4941b7e66cd3a0a9de5ed8189ef025fcd6f3122.zip
CMake-c4941b7e66cd3a0a9de5ed8189ef025fcd6f3122.tar.gz
CMake-c4941b7e66cd3a0a9de5ed8189ef025fcd6f3122.tar.bz2
ARMClang: Do not automatically add cpu/arch compile or link options
The compile options `--march=<arch>` and `--mcpu=<cpu>` and the link option `--cpu=<cpu>` are automatically added by CMake based on `CMAKE_SYSTEM_PROCESSOR` or `CMAKE_SYSTEM_ARCH`. But this is not sufficient, because armclang also supports enabling or disabling features using `+<feature>`: -mcpu=<name>[+[no]<feature>+...] For example: -mcpu=cortex-a57+nocrypto+nofp+nosimd+crc (Reference: https://developer.arm.com/documentation/dui0774/k/Compiler-Command-line-Options/-mcpu?lang=en) The problem is, even if a project adds a flag with features it needs, CMake still adds flags, resulting in code that is compiled with wrong CPU features and unable to run. Add policy `CMP0123` to not automatically add compile or link options, and let projects set them instead. Co-Author: Brad King <brad.king@kitware.com> Fixes: #21173
Diffstat (limited to 'Modules/Compiler')
-rw-r--r--Modules/Compiler/ARMClang.cmake72
1 files changed, 46 insertions, 26 deletions
diff --git a/Modules/Compiler/ARMClang.cmake b/Modules/Compiler/ARMClang.cmake
index 66b7c2e..354c11d 100644
--- a/Modules/Compiler/ARMClang.cmake
+++ b/Modules/Compiler/ARMClang.cmake
@@ -3,6 +3,9 @@ if(_ARMClang_CMAKE_LOADED)
endif()
set(_ARMClang_CMAKE_LOADED TRUE)
+# Save the CMP0123 setting in a variable used both below and by try_compile.
+cmake_policy(GET CMP0123 CMAKE_ARMClang_CMP0123)
+
cmake_policy(PUSH)
cmake_policy(SET CMP0057 NEW) # if IN_LIST
@@ -82,36 +85,53 @@ macro(__compiler_armclang lang)
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_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)
+
+ # CMAKE_SYSTEM_PROCESSOR and CMAKE_SYSTEM_ARCH are not sufficient because they provide no
+ # information of additional CPU features needed in `-mcpu=<name>[+[no]<feature>+...]`.
+ # The automatic setting of compile and link options is deprecated and projects should specify their own.
+ cmake_policy(GET CMP0123 policy_CMP0123)
+ if(NOT "x${CMAKE_ARMClang_CMP0123}x" STREQUAL "xNEWx")
+ if(NOT "x${CMAKE_ARMClang_CMP0123}x" STREQUAL "xOLDx")
+ cmake_policy(GET_WARNING CMP0123 _cmp0123_warning)
+ message(AUTHOR_WARNING
+ "${_cmp0123_warning}\n"
+ "For compatibility, CMake will automatically add cpu/arch flags based "
+ "on the CMAKE_SYSTEM_PROCESSOR and/or CMAKE_SYSTEM_ARCH variables."
+ )
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)
+
+ 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_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()
+ if(NOT __march_flag_set AND NOT __mcpu_flag_set)
+ message(FATAL_ERROR "At least 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()
- if(NOT __march_flag_set AND NOT __mcpu_flag_set)
- message(FATAL_ERROR "At least 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}")
+
+ #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()
- 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()
if(__CMAKE_ARMClang_USING_armlink)