cmake: Add gcc support
This commit adds the option to cmake to build TF-M with GCC.
Change-Id: I7a5e3c915efa61620f1f0d34ed42cba5c174c562
Signed-off-by: Mate Toth-Pal <mate.toth-pal@arm.com>
diff --git a/cmake/Common/FindGNUARM.cmake b/cmake/Common/FindGNUARM.cmake
new file mode 100644
index 0000000..274bbc1
--- /dev/null
+++ b/cmake/Common/FindGNUARM.cmake
@@ -0,0 +1,152 @@
+#-------------------------------------------------------------------------------
+# 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.
+#
+#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)
+
+set(_GCC_BINARY_NAME "arm-none-eabi-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}
+ 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()