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()