mirror of
https://github.com/Kitware/CMake.git
synced 2026-01-06 05:40:54 -06:00
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
This commit is contained in:
@@ -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)
|
||||
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()
|
||||
|
||||
#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}")
|
||||
# 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()
|
||||
|
||||
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()
|
||||
|
||||
#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()
|
||||
|
||||
endif()
|
||||
|
||||
if(__CMAKE_ARMClang_USING_armlink)
|
||||
|
||||
Reference in New Issue
Block a user