158 lines
5.0 KiB
CMake
158 lines
5.0 KiB
CMake
#-------------------------------------------------------------------------------
|
|
# Copyright (c) 2017-2018, Arm Limited. All rights reserved.
|
|
#
|
|
# SPDX-License-Identifier: BSD-3-Clause
|
|
#
|
|
#-------------------------------------------------------------------------------
|
|
|
|
#Find the location of the GNUARM C/C++ compiler.
|
|
#
|
|
# Find gnuarm on the specified location or on the PATH and optionally validate
|
|
# its version.
|
|
#
|
|
#Inputs:
|
|
# GNUARM_PATH - (optional)- install path of GNUARM compiler to use. If not set
|
|
# the compiler on the PATH is used.
|
|
# GNUARM_VER - (optional)- version number. If set the module will validate
|
|
# the compiler version.
|
|
# GNUARM_PREFIX (optional)- execute prefix for toolchain, allow for vendor
|
|
# toolchains, default to arm-none-eabi
|
|
#
|
|
#outputs:
|
|
# GNUARM_PATH - will be set to the root directory of the compiler. Only set
|
|
# if undefined.
|
|
# GNUARM_VER - will be set to the version number found. Only set if
|
|
# undefined.
|
|
# GNUARM_MODULE - set to the name of the cmake module to be included for this
|
|
# GNUARM version.
|
|
#
|
|
|
|
#Include some dependencies
|
|
Include(Common/Utils)
|
|
|
|
if(NOT DEFINED GNUARM_PREFIX)
|
|
set(GNUARM_PREFIX "arm-none-eabi")
|
|
endif()
|
|
set(_GCC_BINARY_NAME "${GNUARM_PREFIX}-gcc")
|
|
|
|
#Get the version of armgcc.
|
|
#
|
|
# Execute gcc and extract the version number for its output.
|
|
#
|
|
#Examples:
|
|
# Get the version reported by gcc at location c:/foo/bin/ to
|
|
# variable VER get_armgcc_version(GCC "c:/foo/bin/arm-none-eabi-gcc" RES VER)
|
|
#
|
|
#INPUTS:
|
|
# GCC - (mandatory) - gcc executable
|
|
# RES - (mandatory) - variable name to put result to
|
|
#
|
|
#OUTPUTS
|
|
# The variable named after "RES" will be set to the version number
|
|
#
|
|
function(get_armgcc_version)
|
|
###Parse our arguments
|
|
#No option (on/off) arguments (e.g. IGNORE_CASE)
|
|
set( _OPTIONS_ARGS )
|
|
#Single option arguments (e.g. PATH "./foo/bar")
|
|
set( _ONE_VALUE_ARGS GCC RES)
|
|
#List arguments (e.g. LANGUAGES C ASM CXX)
|
|
set( _MULTI_VALUE_ARGS )
|
|
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_armgcc_version(): Missing result parameter!")
|
|
endif()
|
|
set (_RES ${_MY_PARAMS_RES})
|
|
|
|
if(NOT _MY_PARAMS_GCC)
|
|
message (FATAL_ERROR "get_armgcc_version(): Missing GCC parameter!")
|
|
endif()
|
|
set (_GCC ${_MY_PARAMS_GCC})
|
|
|
|
#Call specified executable
|
|
execute_process(COMMAND "${_GCC}" -v
|
|
OUTPUT_VARIABLE _OUTPUT
|
|
ERROR_VARIABLE _OUTPUT
|
|
)
|
|
#Cut off version number. Just the numbers ignore anything after.
|
|
STRING(REGEX REPLACE ".*gcc version ([0-9.]+) .*" "\\1" _VER "${_OUTPUT}")
|
|
|
|
if (NOT _VER)
|
|
string(CONCAT _msg "get_armgcc_version(): Failed to extract version"
|
|
" number from ${_GCC_BINARY_NAME} output.")
|
|
message (FATAL_ERROR "${_msg}")
|
|
endif()
|
|
|
|
set(${_RES} ${_VER} PARENT_SCOPE)
|
|
endfunction()
|
|
|
|
#Check if the executable is present
|
|
if(NOT DEFINED GNUARM_PATH)
|
|
#If the location is not set, try to find executable on PATH.
|
|
#Set GNUARM_PATH to default value.
|
|
set (GNUARM_PATH "GNUARM_PATH-NOTFOUND")
|
|
|
|
#First check if gcc 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 (
|
|
_GNUARM_PATH
|
|
${_GCC_BINARY_NAME}
|
|
PATHS env PATH
|
|
DOC "GNUARM compiler location."
|
|
)
|
|
else()
|
|
#Check executable is available on the specified 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 (
|
|
_GNUARM_PATH
|
|
${_GCC_BINARY_NAME}
|
|
PATHS ${GNUARM_PATH}/bin NO_DEFAULT_PATH
|
|
DOC "GNUARM compiler location."
|
|
)
|
|
endif()
|
|
|
|
#Is executable present?
|
|
if(_GNUARM_PATH STREQUAL "_GNUARM_PATH-NOTFOUND")
|
|
string(CONCAT _msg "${_GCC_BINARY_NAME} can not be found. Either put"
|
|
" ${_GCC_BINARY_NAME} on the PATH or set GNUARM_PATH"
|
|
" properly.")
|
|
message (FATAL_ERROR ${_msg})
|
|
endif()
|
|
|
|
#Cut off executable and directory name to get install location.
|
|
STRING(REGEX REPLACE "(.*)/bin/${_GCC_BINARY_NAME}.*"
|
|
"\\1" GNUARM_PATH "${_GNUARM_PATH}")
|
|
|
|
#Remove unwanted junk from CMake cache.
|
|
unset(_GNUARM_PATH CACHE)
|
|
|
|
get_armgcc_version(GCC "${GNUARM_PATH}/bin/${_GCC_BINARY_NAME}" RES _VER)
|
|
|
|
#Check the version if needed
|
|
if(NOT DEFINED GNUARM_VER)
|
|
set(GNUARM_VER ${_VER})
|
|
endif()
|
|
|
|
if(NOT "${GNUARM_VER}" VERSION_EQUAL "${_VER}")
|
|
string(CONCAT _msg "FindGNUARM.cmake: ${_GCC_BINARY_NAME} compiler version"
|
|
" ${_VER} does not match ${GNUARM_VER}.")
|
|
message (FATAL_ERROR "${_msg}")
|
|
endif()
|
|
|
|
|
|
STRING(REGEX REPLACE "([0-9]+)\.([0-9]+)(\.[0-9]+)*.*" "CompilerGNUARM\\1\\2"
|
|
GNUARM_MODULE "${GNUARM_VER}")
|
|
|
|
if(NOT EXISTS "${CMAKE_CURRENT_LIST_DIR}/${GNUARM_MODULE}.cmake")
|
|
string(CONCAT _msg "ERROR: Unsupported GNUARM compiler version found on"
|
|
" PATH.")
|
|
message(FATAL_ERROR "${_msg}")
|
|
endif()
|