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/BuildSys.cmake b/cmake/Common/BuildSys.cmake
index 43e1b90..81c204d 100644
--- a/cmake/Common/BuildSys.cmake
+++ b/cmake/Common/BuildSys.cmake
@@ -1,5 +1,5 @@
 #-------------------------------------------------------------------------------
-# Copyright (c) 2017, Arm Limited. All rights reserved.
+# Copyright (c) 2017-2018, Arm Limited. All rights reserved.
 #
 # SPDX-License-Identifier: BSD-3-Clause
 #
@@ -47,9 +47,9 @@
 	endif()
 
 	set( _OPTIONS_ARGS )					#No option (on/off) arguments
-    set( _ONE_VALUE_ARGS CONFIG)	#Single option arguments (e.g. PROJ_NAME "bubu_project")
-    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} )
+	set( _ONE_VALUE_ARGS CONFIG)	#Single option arguments (e.g. PROJ_NAME "bubu_project")
+	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} )
 
 	#Cehck passed parameters
 	if(NOT _MY_PARAMS_CONFIG)
@@ -583,15 +583,15 @@
 # See: _embedded_apply_linker_cmd_file_setting()
 #
 #Examples:
-#  embedded_set_target_linker_file(my_app "foo/my_linker_cmd.sct")
+#  embedded_set_target_linker_file(TARGET my_app PATH "foo/my_linker_cmd.sct")
 #
 #INPUTS:
-#   TARGET  - (mandatory) - The target to apply settings to.
-#	PATH - (mandatory)	  - Path to linker script.
+#  TARGET  - (mandatory) - The target to apply settings to.
+#  PATH - (mandatory)    - Path to linker script.
 #
 #OUTPUTS
-#	Directory property EMBEDDED_LINKER_CMD_FILE_TTT is set, where TTT is the
-#	target name.
+#  Directory property EMBEDDED_LINKER_CMD_FILE_TTT is set, where TTT is the
+#  target name.
 #
 function(embedded_set_target_linker_file)
 	set( _OPTIONS_ARGS )				#Option (on/off) arguments (e.g. IGNORE_CASE)
@@ -610,29 +610,103 @@
 	set_property(GLOBAL PROPERTY EMBEDDED_LINKER_CMD_FILE_${_MY_PARAMS_TARGET} ${_MY_PARAMS_PATH})
 endfunction()
 
+#Set pre-processor defines for the linker command file.
+#
+# Store preprocessor defines for the linker command file of the specified target
+# in a global property.
+#
+# See: _embedded_apply_linker_cmd_file_setting()
+#
+#Examples:
+#  embedded_set_target_link_defines(my_app "BL2=1" "USE_TLS=1")
+#
+#INPUTS:
+#   TARGET  - (mandatory) - The target to apply settings to.
+#   DEFINES - (mandatory) - List of macro value definitions.
+#
+#OUTPUTS
+#   Directory property EMBEDDED_LINKER_DEFINES_TTT is set, where TTT is the
+#   target name.
+#
+function(embedded_set_target_link_defines)
+	set( _OPTIONS_ARGS )				#Option (on/off) arguments (e.g. IGNORE_CASE)
+	set( _ONE_VALUE_ARGS  TARGET DEFINES)	#Single option arguments (e.g. PATH "./foo/bar")
+	set( _MULTI_VALUE_ARGS )			#List arguments (e.g. LANGUAGES C ASM CXX)
+	cmake_parse_arguments(_MY_PARAMS "${_OPTIONS_ARGS}" "${_ONE_VALUE_ARGS}" "${_MULTI_VALUE_ARGS}" ${ARGN} )
+
+	if (NOT DEFINED _MY_PARAMS_TARGET)
+		message(FATAL_ERROR "embedded_set_target_link_defines(): mandatory parameter 'TARGET' missing.")
+	endif()
+
+	if (NOT DEFINED _MY_PARAMS_DEFINES)
+		message(FATAL_ERROR "embedded_set_target_link_defines(): mandatory parameter 'DEFINES' missing.")
+	endif()
+
+	set_property(GLOBAL APPEND PROPERTY EMBEDDED_LINKER_DEFINES_${_MY_PARAMS_TARGET} ${_MY_PARAMS_DEFINES})
+endfunction()
+
+
+#Set pre-processor include paths for the linker command file.
+#
+# Store preprocessor include paths for the linker command file of the specified
+# target in a global property.
+#
+# See: _embedded_apply_linker_cmd_file_setting()
+#
+#Examples:
+#  embedded_set_target_link_includes(my_app "c:/foo" "../bar")
+#
+#INPUTS:
+#   TARGET  - (mandatory)  - The target to apply settings to.
+#   INCLUDES - (mandatory) - List of include paths.
+#
+#OUTPUTS
+#   Directory property EMBEDDED_LINKER_INCLUDES_TTT is set, where TTT is the
+#   target name.
+#
+function(embedded_set_target_link_includes)
+	set( _OPTIONS_ARGS )				#Option (on/off) arguments (e.g. IGNORE_CASE)
+	set( _ONE_VALUE_ARGS  TARGET INCLUDES)	#Single option arguments (e.g. PATH "./foo/bar")
+	set( _MULTI_VALUE_ARGS )			#List arguments (e.g. LANGUAGES C ASM CXX)
+	cmake_parse_arguments(_MY_PARAMS "${_OPTIONS_ARGS}" "${_ONE_VALUE_ARGS}" "${_MULTI_VALUE_ARGS}" ${ARGN} )
+
+	if (NOT DEFINED _MY_PARAMS_TARGET)
+		message(FATAL_ERROR "embedded_set_target_link_includes(): mandatory parameter 'TARGET' missing.")
+	endif()
+
+	if (NOT DEFINED _MY_PARAMS_DEFINES)
+		message(FATAL_ERROR "embedded_set_target_link_includes(): mandatory parameter 'DEFINES' missing.")
+	endif()
+
+	set_property(GLOBAL APPEND PROPERTY EMBEDDED_LINKER_INCLUDES_${_MY_PARAMS_TARGET} ${_MY_PARAMS_DEFINES})
+endfunction()
+
+
 #Apply linker linker command file setting for the specified target.
 #
-# Path to linker command file stored in a global property is applied.
+# Path to linker command file, macro definitions and include paths stored in
+# global properties are applied.
 #
 # Note:
-#	- Directory property name must follow a specific scheme.
-#	- This is an internal function.
+#  - Directory property names must follow a specific scheme.
+#  - This is an internal function.
 #
-# See: embedded_set_target_linker_file()
+# See: embedded_set_target_linker_file(), embedded_set_target_link_includes()
+#      embedded_set_target_link_defines()
 #
 #Examples:
 #  _embedded_apply_linker_cmd_file_setting(my_app)
 #
 #INPUTS:
-#   TARGET  - (mandatory) 			- The target to apply settings to.
-#	Directory property - (optional) - Flags to apply.
+#   TARGET  - (mandatory) - The target to apply settings to.
+#   Directory properties
 #
 #OUTPUTS
 #    n/a
 #
 function(_embedded_apply_linker_cmd_file_setting TARGET)
 	#Check if the parameter is a target.
-  	if(NOT TARGET ${TARGET})
+	if(NOT TARGET ${TARGET})
 		message(FATAL_ERROR "_embedded_apply_linker_cmd_file_setting(): target '${TARGET}' is not defined.")
 	endif()
 	#Check if target is an executable.
@@ -648,6 +722,9 @@
 	endif()
 	#Get the path to the linker command file.
 	get_property(_LINKER_CMD_FILE GLOBAL PROPERTY EMBEDDED_LINKER_CMD_FILE_${TARGET})
-	#Set the path
-	compiler_set_linkercmdfile(${TARGET} ${_LINKER_CMD_FILE})
+
+	#Get macro defines and include paths set for the target.
+	get_property(_LINKER_DEFINES GLOBAL PROPERTY EMBEDDED_LINKER_DEFINES_${TARGET})
+	get_property(_LINKER_INCLUDES GLOBAL PROPERTY EMBEDDED_LINKER_INCLUDES_${TARGET})
+	compiler_set_linkercmdfile(TARGET ${TARGET} PATH ${_LINKER_CMD_FILE} DEFINES ${_LINKER_DEFINES} INCLUDES ${_LINKER_INCLUDES})
 endfunction()