#------------------------------------------------------------------------------- # Copyright (c) 2017, Arm Limited. All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause # #------------------------------------------------------------------------------- #Find the location of the ARMClang C/C++ compiler. # # Find armclang on the specified location or on the PATH and optionally validate its version. # #Inputs: # ARMCLANG_PATH - (optional)- install path of armclang compiler to use. If not set the # compiler on the PATH is used. # ARMCLANG_VER - (optional)- version number. If set the module will validate the compiler version. # #outputs: # ARMCLANG_PATH - will be set to the root directory of the compiler. Only set if undefined. # ARMCLANG_VER - will be set to the version number found. Only set if undefined. # ARMCLANG_MODULE - set to the name of the cmake module to be included for this ARMClang version. # #Include some dependencies Include(Common/Utils) #Get the version of armasm. # # Execute armasm and extract its version number for its output. # #Exmaples: # Get the version reported by armasm at location c:/foo/bin/armasm to variable VER # get_armasm_version(ARMASM "c:/foo/bin/armasm" RES VER) # #INPUTS: # ARMASM - (mandatory) - armasm executable # RES - (mandatory) - variable name to put result to # #OUTPUTS # The variable named after "RES" will be set to the version number matches # function(get_armasm_version) #Parse our arguments set( _OPTIONS_ARGS ) #No option (on/off) arguments (e.g. IGNORE_CASE) set( _ONE_VALUE_ARGS ARMASM RES) #Single option arguments (e.g. PATH "./foo/bar") set( _MULTI_VALUE_ARGS ) #One list argument (e.g. LANGUAGES C ASM CXX) cmake_parse_arguments(_MY_PARAMS "${_OPTIONS_ARGS}" "${_ONE_VALUE_ARGS}" "${_MULTI_VALUE_ARGS}" ${ARGN} ) #Check mandatory parameters if(NOT _MY_PARAMS_RES) message (FATAL_ERROR "get_armasm_version(): Missing result parameter!") endif() set (_RES ${_MY_PARAMS_RES}) if(NOT _MY_PARAMS_ARMASM) message (FATAL_ERROR "get_armasm_version(): Missing ARMASM parameter!") endif() set (_ARMASM ${_MY_PARAMS_ARMASM}) #Call specified executable execute_process(COMMAND "${_ARMASM}" OUTPUT_VARIABLE _OUTPUT ERROR_VARIABLE _OUTPUT ) #Cut off version number. Just the numbers ignore anything after. STRING(REGEX REPLACE ".*ARM Compiler (([0-9]+\.)+[0-9]+).*" "\\1" _VER "${_OUTPUT}") if (NOT _VER) message (FATAL_ERROR "get_armasm_version(): Failed to extract version number from armasm output.") endif() set(${_RES} ${_VER} PARENT_SCOPE) endfunction() #If the install location needs to be found. if(NOT DEFINED ARMCLANG_PATH) #Set ARMCLANG_PATH to default value. set (ARMCLANG_PATH "ARMCLANG_PATH-NOTFOUND") #First check if armclang is on the PATH #find_program puts() its output to the cmake cache. We don't want that, so we use a local variable, which #is unset later. find_program ( _ARMCLANG_PATH armclang PATHS env PATH DOC "ARMCLANG compiler location." ) #Yes, check the version number if it is specified. if(_ARMCLANG_PATH STREQUAL "_ARMCLANG_PATH-NOTFOUND") message (FATAL_ERROR "armclang install location is unset. Either put armclang on the PATH or set ARMCLANG_PATH.") endif() #Cut off executable name directory name to get install location. STRING(REGEX REPLACE "(.*)/bin/armclang.*" "\\1" ARMCLANG_PATH "${_ARMCLANG_PATH}") #Remove unwanted junk from CMake cache. unset(_ARMCLANG_PATH CACHE) endif() get_armasm_version(ARMASM "${ARMCLANG_PATH}/bin/armasm" RES _VER) #Check the version if needed if(NOT DEFINED ARMCLANG_VER) set(ARMCLANG_VER ${_VER}) endif() if(NOT "${ARMCLANG_VER}" VERSION_EQUAL "${_VER}") message (FATAL_ERROR "FindArmClang.cmake: armclang compiler version ${_VER} does not match ${ARMCLANG_VER}.") endif() STRING(REGEX REPLACE "([0-9]+)\.([0-9]+)(\.[0-9]+)*.*" "CompilerArmClang\\1\\2" ARMCLANG_MODULE "${ARMCLANG_VER}") if(NOT EXISTS "${CMAKE_CURRENT_LIST_DIR}/${ARMCLANG_MODULE}.cmake") message(FATAL_ERROR "ERROR: Unsupported ARMCLANG compiler version found on PATH.") endif()