1# Distributed under the OSI-approved BSD 3-Clause License. See accompanying 2# file Copyright.txt or https://cmake.org/licensing for details. 3 4 5# determine the compiler to use for ASM programs 6 7include(${CMAKE_ROOT}/Modules/CMakeDetermineCompiler.cmake) 8 9if(NOT CMAKE_ASM${ASM_DIALECT}_COMPILER) 10 # prefer the environment variable ASM 11 if(NOT $ENV{ASM${ASM_DIALECT}} STREQUAL "") 12 get_filename_component(CMAKE_ASM${ASM_DIALECT}_COMPILER_INIT $ENV{ASM${ASM_DIALECT}} PROGRAM PROGRAM_ARGS CMAKE_ASM${ASM_DIALECT}_FLAGS_ENV_INIT) 13 if(CMAKE_ASM${ASM_DIALECT}_FLAGS_ENV_INIT) 14 set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ARG1 "${CMAKE_ASM${ASM_DIALECT}_FLAGS_ENV_INIT}" CACHE STRING "Arguments to ASM${ASM_DIALECT} compiler") 15 endif() 16 if(NOT EXISTS ${CMAKE_ASM${ASM_DIALECT}_COMPILER_INIT}) 17 message(FATAL_ERROR "Could not find compiler set in environment variable ASM${ASM_DIALECT}:\n$ENV{ASM${ASM_DIALECT}}.") 18 endif() 19 endif() 20 21 # finally list compilers to try 22 if("ASM${ASM_DIALECT}" STREQUAL "ASM") # the generic assembler support 23 if(NOT CMAKE_ASM_COMPILER_INIT) 24 if(CMAKE_C_COMPILER) 25 set(CMAKE_ASM${ASM_DIALECT}_COMPILER_LIST ${CMAKE_C_COMPILER}) 26 elseif(CMAKE_CXX_COMPILER) 27 set(CMAKE_ASM${ASM_DIALECT}_COMPILER_LIST ${CMAKE_CXX_COMPILER}) 28 else() 29 # List all default C and CXX compilers 30 set(CMAKE_ASM${ASM_DIALECT}_COMPILER_LIST 31 ${_CMAKE_TOOLCHAIN_PREFIX}cc ${_CMAKE_TOOLCHAIN_PREFIX}gcc cl bcc xlc 32 CC ${_CMAKE_TOOLCHAIN_PREFIX}c++ ${_CMAKE_TOOLCHAIN_PREFIX}g++ aCC cl bcc xlC) 33 endif() 34 endif() 35 else() # some specific assembler "dialect" 36 if(NOT CMAKE_ASM${ASM_DIALECT}_COMPILER_INIT AND NOT CMAKE_ASM${ASM_DIALECT}_COMPILER_LIST) 37 message(FATAL_ERROR "CMAKE_ASM${ASM_DIALECT}_COMPILER_INIT or CMAKE_ASM${ASM_DIALECT}_COMPILER_LIST must be preset !") 38 endif() 39 endif() 40 41 # Find the compiler. 42 _cmake_find_compiler(ASM${ASM_DIALECT}) 43 44else() 45 _cmake_find_compiler_path(ASM${ASM_DIALECT}) 46endif() 47mark_as_advanced(CMAKE_ASM${ASM_DIALECT}_COMPILER) 48 49if (NOT _CMAKE_TOOLCHAIN_LOCATION) 50 get_filename_component(_CMAKE_TOOLCHAIN_LOCATION "${CMAKE_ASM${ASM_DIALECT}_COMPILER}" PATH) 51endif () 52 53 54if(NOT CMAKE_ASM${ASM_DIALECT}_COMPILER_ID) 55 56 # Table of per-vendor compiler id flags with expected output. 57 list(APPEND CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDORS GNU ) 58 set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_FLAGS_GNU "--version") 59 set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_REGEX_GNU "(GNU assembler)|(GCC)|(Free Software Foundation)") 60 61 list(APPEND CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDORS Clang ) 62 set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_FLAGS_Clang "--version") 63 set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_REGEX_Clang "(clang version)") 64 65 list(APPEND CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDORS AppleClang ) 66 set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_FLAGS_AppleClang "--version") 67 set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_REGEX_AppleClang "(Apple LLVM version)") 68 69 list(APPEND CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDORS ARMClang ) 70 set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_FLAGS_ARMClang "--version") 71 set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_REGEX_ARMClang "armclang") 72 73 list(APPEND CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDORS HP ) 74 set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_FLAGS_HP "-V") 75 set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_REGEX_HP "HP C") 76 77 list(APPEND CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDORS Intel ) 78 set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_FLAGS_Intel "--version") 79 set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_REGEX_Intel "(ICC)") 80 81 list(APPEND CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDORS IntelLLVM ) 82 set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_FLAGS_IntelLLVM "--version") 83 set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_REGEX_IntelLLVM "(Intel[^\n]+oneAPI)") 84 85 list(APPEND CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDORS SunPro ) 86 set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_FLAGS_SunPro "-V") 87 set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_REGEX_SunPro "Sun C") 88 89 list(APPEND CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDORS XL ) 90 set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_FLAGS_XL "-qversion") 91 set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_REGEX_XL "XL C") 92 93 list(APPEND CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDORS MSVC ) 94 set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_FLAGS_MSVC "-?") 95 set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_REGEX_MSVC "Microsoft") 96 97 list(APPEND CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDORS TI ) 98 set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_FLAGS_TI "-h") 99 set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_REGEX_TI "Texas Instruments") 100 101 list(APPEND CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDORS IAR) 102 set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_FLAGS_IAR ) 103 set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_REGEX_IAR "IAR Assembler") 104 105 list(APPEND CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDORS ARMCC) 106 set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_FLAGS_ARMCC ) 107 set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_REGEX_ARMCC "(ARM Compiler)|(ARM Assembler)") 108 109 list(APPEND CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDORS NASM) 110 set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_FLAGS_NASM "-v") 111 set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_REGEX_NASM "(NASM version)") 112 113 list(APPEND CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDORS YASM) 114 set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_FLAGS_YASM "--version") 115 set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_REGEX_YASM "(yasm)") 116 117 list(APPEND CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDORS ADSP) 118 set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_FLAGS_ADSP "-version") 119 set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_REGEX_ADSP "Analog Devices") 120 121 list(APPEND CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDORS QCC) 122 set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_FLAGS_QCC "-V") 123 set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_REGEX_QCC "gcc_nto") 124 125 include(CMakeDetermineCompilerId) 126 set(userflags) 127 CMAKE_DETERMINE_COMPILER_ID_VENDOR(ASM${ASM_DIALECT} "${userflags}") 128 set(_variant "") 129 if("x${CMAKE_ASM${ASM_DIALECT}_COMPILER_ID}" STREQUAL "xIAR") 130 # primary necessary to detect architecture, so the right archiver and linker can be picked 131 # eg. "IAR Assembler V8.10.1.12857/W32 for ARM" or "IAR Assembler V4.11.1.4666 for Renesas RX" 132 # Cut out identification first, newline handling is a pain 133 string(REGEX MATCH "IAR Assembler[^\r\n]*" _compileid "${CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_OUTPUT}") 134 if("${_compileid}" MATCHES "V([0-9]+\\.[0-9]+\\.[0-9]+)") 135 set(CMAKE_ASM${ASM_DIALECT}_COMPILER_VERSION ${CMAKE_MATCH_1}) 136 endif() 137 string(REGEX MATCHALL "([A-Za-z0-9-]+)" _all_compileid_matches "${_compileid}") 138 if(_all_compileid_matches) 139 list(GET _all_compileid_matches "-1" CMAKE_ASM${ASM_DIALECT}_COMPILER_ARCHITECTURE_ID) 140 endif() 141 elseif("x${CMAKE_ASM${ASM_DIALECT}_COMPILER_ID}" STREQUAL "xClang") 142 # Test whether an MSVC-like command-line option works. 143 execute_process(COMMAND ${CMAKE_ASM${ASM_DIALECT}_COMPILER} -? 144 OUTPUT_VARIABLE _clang_output 145 ERROR_VARIABLE _clang_output 146 RESULT_VARIABLE _clang_result) 147 if(_clang_result EQUAL 0) 148 set(CMAKE_ASM${ASM_DIALECT}_COMPILER_FRONTEND_VARIANT "MSVC") 149 set(CMAKE_ASM${ASM_DIALECT}_SIMULATE_ID MSVC) 150 else() 151 set(CMAKE_ASM${ASM_DIALECT}_COMPILER_FRONTEND_VARIANT "GNU") 152 endif() 153 set(_variant " with ${CMAKE_ASM${ASM_DIALECT}_COMPILER_FRONTEND_VARIANT}-like command-line") 154 endif() 155 156 _cmake_find_compiler_sysroot(ASM${ASM_DIALECT}) 157 158 unset(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_OUTPUT) 159 unset(_all_compileid_matches) 160 unset(_compileid) 161 unset(_clang_result) 162 unset(_clang_output) 163endif() 164 165if(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID) 166 if(CMAKE_ASM${ASM_DIALECT}_COMPILER_VERSION) 167 set(_version " ${CMAKE_ASM${ASM_DIALECT}_COMPILER_VERSION}") 168 else() 169 set(_version "") 170 endif() 171 if(CMAKE_ASM${ASM_DIALECT}_COMPILER_ARCHITECTURE_ID AND "x${CMAKE_ASM${ASM_DIALECT}_COMPILER_ID}" STREQUAL "xIAR") 172 set(_archid " ${CMAKE_ASM${ASM_DIALECT}_COMPILER_ARCHITECTURE_ID}") 173 else() 174 set(_archid "") 175 endif() 176 message(STATUS "The ASM${ASM_DIALECT} compiler identification is ${CMAKE_ASM${ASM_DIALECT}_COMPILER_ID}${_archid}${_version}${_variant}") 177 unset(_archid) 178 unset(_version) 179 unset(_variant) 180else() 181 message(STATUS "The ASM${ASM_DIALECT} compiler identification is unknown") 182endif() 183 184# If we have a gas/as cross compiler, they have usually some prefix, like 185# e.g. powerpc-linux-gas, arm-elf-gas or i586-mingw32msvc-gas , optionally 186# with a 3-component version number at the end 187# The other tools of the toolchain usually have the same prefix 188# NAME_WE cannot be used since then this test will fail for names like 189# "arm-unknown-nto-qnx6.3.0-gas.exe", where BASENAME would be 190# "arm-unknown-nto-qnx6" instead of the correct "arm-unknown-nto-qnx6.3.0-" 191if (NOT _CMAKE_TOOLCHAIN_PREFIX) 192 get_filename_component(COMPILER_BASENAME "${CMAKE_ASM${ASM_DIALECT}_COMPILER}" NAME) 193 if (COMPILER_BASENAME MATCHES "^(.+-)g?as(-[0-9]+\\.[0-9]+\\.[0-9]+)?(\\.exe)?$") 194 set(_CMAKE_TOOLCHAIN_PREFIX ${CMAKE_MATCH_1}) 195 endif () 196endif () 197 198# Now try the C compiler regexp: 199if (NOT _CMAKE_TOOLCHAIN_PREFIX) 200 if (COMPILER_BASENAME MATCHES "^(.+-)g?cc(-[0-9]+\\.[0-9]+\\.[0-9]+)?(\\.exe)?$") 201 set(_CMAKE_TOOLCHAIN_PREFIX ${CMAKE_MATCH_1}) 202 endif () 203endif () 204 205# Finally try the CXX compiler regexp: 206if (NOT _CMAKE_TOOLCHAIN_PREFIX) 207 if (COMPILER_BASENAME MATCHES "^(.+-)[gc]\\+\\+(-[0-9]+\\.[0-9]+\\.[0-9]+)?(\\.exe)?$") 208 set(_CMAKE_TOOLCHAIN_PREFIX ${CMAKE_MATCH_1}) 209 endif () 210endif () 211 212 213set(_CMAKE_PROCESSING_LANGUAGE "ASM") 214include(CMakeFindBinUtils) 215include(Compiler/${CMAKE_ASM${ASM_DIALECT}_COMPILER_ID}-FindBinUtils OPTIONAL) 216unset(_CMAKE_PROCESSING_LANGUAGE) 217 218set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ENV_VAR "ASM${ASM_DIALECT}") 219 220if(CMAKE_ASM${ASM_DIALECT}_COMPILER) 221 message(STATUS "Found assembler: ${CMAKE_ASM${ASM_DIALECT}_COMPILER}") 222else() 223 message(STATUS "Didn't find assembler") 224endif() 225 226foreach(_var 227 COMPILER 228 COMPILER_ID 229 COMPILER_ARG1 230 COMPILER_ENV_VAR 231 COMPILER_AR 232 COMPILER_RANLIB 233 COMPILER_VERSION 234 ) 235 set(_CMAKE_ASM_${_var} "${CMAKE_ASM${ASM_DIALECT}_${_var}}") 236endforeach() 237 238if(CMAKE_ASM${ASM_DIALECT}_COMPILER_SYSROOT) 239 string(CONCAT _SET_CMAKE_ASM_COMPILER_SYSROOT 240 "set(CMAKE_ASM${ASM_DIALECT}_COMPILER_SYSROOT \"${CMAKE_ASM${ASM_DIALECT}_COMPILER_SYSROOT}\")\n" 241 "set(CMAKE_COMPILER_SYSROOT \"${CMAKE_ASM${ASM_DIALECT}_COMPILER_SYSROOT}\")") 242else() 243 set(_SET_CMAKE_ASM_COMPILER_SYSROOT "") 244endif() 245 246if(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_MATCH) 247 set(_SET_CMAKE_ASM_COMPILER_ID_VENDOR_MATCH 248 "set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_MATCH [==[${CMAKE_ASM${ASM_DIALECT}_COMPILER_ID_VENDOR_MATCH}]==])") 249else() 250 set(_SET_CMAKE_ASM_COMPILER_ID_VENDOR_MATCH "") 251endif() 252 253if(CMAKE_ASM${ASM_DIALECT}_COMPILER_ARCHITECTURE_ID) 254 set(_SET_CMAKE_ASM_COMPILER_ARCHITECTURE_ID 255 "set(CMAKE_ASM${ASM_DIALECT}_COMPILER_ARCHITECTURE_ID ${CMAKE_ASM${ASM_DIALECT}_COMPILER_ARCHITECTURE_ID})") 256else() 257 set(_SET_CMAKE_ASM_COMPILER_ARCHITECTURE_ID "") 258endif() 259 260# configure variables set in this file for fast reload later on 261configure_file(${CMAKE_ROOT}/Modules/CMakeASMCompiler.cmake.in 262 ${CMAKE_PLATFORM_INFO_DIR}/CMakeASM${ASM_DIALECT}Compiler.cmake @ONLY) 263 264foreach(_var 265 COMPILER 266 COMPILER_ID 267 COMPILER_ARG1 268 COMPILER_ENV_VAR 269 COMPILER_AR 270 COMPILER_RANLIB 271 COMPILER_VERSION 272 ) 273 unset(_CMAKE_ASM_${_var}) 274endforeach() 275