You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
147 lines
6.1 KiB
147 lines
6.1 KiB
if(_ARMClang_CMAKE_LOADED)
|
|
return()
|
|
endif()
|
|
|
|
# This file requires CMAKE_LINKER and CMAKE_AR set by CMakeFindBinUtils.cmake.
|
|
if(NOT (DEFINED CMAKE_LINKER AND DEFINED CMAKE_AR))
|
|
return()
|
|
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
|
|
|
|
set(CMAKE_EXECUTABLE_SUFFIX ".elf")
|
|
|
|
if (CMAKE_LINKER MATCHES "armlink")
|
|
set(__CMAKE_ARMClang_USING_armlink TRUE)
|
|
set(CMAKE_LIBRARY_PATH_FLAG "--userlibpath=")
|
|
else()
|
|
set(__CMAKE_ARMClang_USING_armlink FALSE)
|
|
endif()
|
|
|
|
# get compiler supported cpu list
|
|
function(__armclang_set_processor_list lang out_var)
|
|
execute_process(COMMAND "${CMAKE_${lang}_COMPILER}" --target=${CMAKE_${lang}_COMPILER_TARGET} -mcpu=list
|
|
OUTPUT_VARIABLE processor_list
|
|
ERROR_VARIABLE processor_list)
|
|
string(REGEX MATCHALL "-mcpu=([^ \n]*)" processor_list "${processor_list}")
|
|
string(REGEX REPLACE "-mcpu=" "" processor_list "${processor_list}")
|
|
set(${out_var} "${processor_list}" PARENT_SCOPE)
|
|
endfunction()
|
|
|
|
# check processor is in list
|
|
function(__armclang_check_processor processor list out_var)
|
|
string(TOLOWER "${processor}" processor)
|
|
if(processor IN_LIST list)
|
|
set(${out_var} TRUE PARENT_SCOPE)
|
|
else()
|
|
set(${out_var} FALSE PARENT_SCOPE)
|
|
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)
|
|
endif()
|
|
if(NOT CMAKE_${lang}_COMPILER_PROCESSOR_LIST)
|
|
__armclang_set_processor_list(${lang} CMAKE_${lang}_COMPILER_PROCESSOR_LIST)
|
|
endif()
|
|
if(NOT CMAKE_${lang}_COMPILER_ARCH_LIST)
|
|
__armclang_set_arch_list(${lang} CMAKE_${lang}_COMPILER_ARCH_LIST)
|
|
endif()
|
|
|
|
# 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)
|
|
unset(CMAKE_${lang}_LINKER_WRAPPER_FLAG)
|
|
set(__CMAKE_ARMClang_USING_armlink_WRAPPER "")
|
|
else()
|
|
set(__CMAKE_ARMClang_USING_armlink_WRAPPER "-Xlinker")
|
|
endif()
|
|
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")
|
|
set(CMAKE_${lang}_CREATE_STATIC_LIBRARY "<CMAKE_AR> --create -cr <TARGET> <LINK_FLAGS> <OBJECTS>")
|
|
set(CMAKE_${lang}_ARCHIVE_CREATE "<CMAKE_AR> --create -cr <TARGET> <LINK_FLAGS> <OBJECTS>")
|
|
set(CMAKE_${lang}_RESPONSE_FILE_LINK_FLAG "${__CMAKE_ARMClang_USING_armlink_WRAPPER} --via=")
|
|
set(CMAKE_${lang}_OUTPUT_EXTENSION ".o")
|
|
set(CMAKE_${lang}_OUTPUT_EXTENSION_REPLACE 1)
|
|
endmacro()
|
|
|
|
cmake_policy(POP)
|