From 39b5f58b55e89ae8aabd8672d773b182be32bd6e Mon Sep 17 00:00:00 2001
From: Olivier Martin <olivier.martin@arm.com>
Date: Thu, 2 May 2013 10:42:34 +0100
Subject: [PATCH] BaseTools: Added support for a CROSS_COMPILE ELFGCC

This change allows to use ELFGCC for any architecture (support Intel and ARM architecture).

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Olivier Martin <olivier.martin@arm.com>

---
 BaseTools/Conf/build_rule.template |    2 +-
 BaseTools/Conf/tools_def.template  |  112 +++++++++++++++++-------------------
 2 files changed, 54 insertions(+), 60 deletions(-)

diff --git a/BaseTools/Conf/build_rule.template b/BaseTools/Conf/build_rule.template
index 107e783..80d8261 100644
--- a/BaseTools/Conf/build_rule.template
+++ b/BaseTools/Conf/build_rule.template
@@ -214,7 +214,7 @@
         "$(SLINK)" $(SLINK_FLAGS) /OUT:${dst} @$(OBJECT_FILES_LIST)
 
     <Command.GCC>
-        "$(SLINK)" -cr ${dst} $(SLINK_FLAGS) @$(OBJECT_FILES_LIST)
+        "$(SLINK)" $(SLINK_FLAGS) ${dst} @$(OBJECT_FILES_LIST)
     
     <Command.RVCT>
         "$(SLINK)" $(SLINK_FLAGS) ${dst} --via $(OBJECT_FILES_LIST)
diff --git a/BaseTools/Conf/tools_def.template b/BaseTools/Conf/tools_def.template
index a82404a..f3af18b 100644
--- a/BaseTools/Conf/tools_def.template
+++ b/BaseTools/Conf/tools_def.template
@@ -1,6 +1,7 @@
 #
 #  Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
 #  Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
+#  Portions copyright (c) 2011-2013, ARM Ltd. All rights reserved.<BR>
 #
 #  This program and the accompanying materials
 #  are licensed and made available under the terms and conditions of the BSD License
@@ -105,8 +106,6 @@ DEFINE ICC11_BIN64x86     = C:\Program Files (x86)\Intel\Compiler\DEF(ICC11_VERS
 DEFINE EBC_BIN          = C:\Program Files\Intel\EBC\Bin
 DEFINE EBC_BINx86       = C:\Program Files (x86)\Intel\EBC\Bin
 
-DEFINE ELFGCC_BIN       = /usr/bin
-
 #
 # Option 1: Hard coded full path to compiler suite
 DEFINE UNIXGCC_IA32_PETOOLS_PREFIX = /opt/tiano/i386-tiano-pe/i386-tiano-pe/bin/
@@ -2541,7 +2540,7 @@ DEFINE GCC_ALL_CC_FLAGS            = -g -Os -fshort-wchar -fno-strict-aliasing -
 DEFINE GCC_IA32_CC_FLAGS           = DEF(GCC_ALL_CC_FLAGS) -m32 -malign-double -freorder-blocks -freorder-blocks-and-partition -O2 -mno-stack-arg-probe
 DEFINE GCC_X64_CC_FLAGS            = DEF(GCC_ALL_CC_FLAGS) -mno-red-zone -Wno-address -mno-stack-arg-probe
 DEFINE GCC_IPF_CC_FLAGS            = DEF(GCC_ALL_CC_FLAGS) -minline-int-divide-min-latency
-DEFINE GCC_ARMGCC_CC_FLAGS         = DEF(GCC_ALL_CC_FLAGS) -mword-relocations -mlittle-endian -mabi=aapcs -mapcs -fno-short-enums -save-temps -fsigned-char  -ffunction-sections -fdata-sections -fomit-frame-pointer
+DEFINE GCC_ARM_CC_FLAGS            = DEF(GCC_ALL_CC_FLAGS) -mword-relocations -mlittle-endian -mabi=aapcs -mapcs -fno-short-enums -save-temps -fsigned-char -ffunction-sections -fdata-sections -fomit-frame-pointer -Wno-address
 DEFINE GCC_DLINK_FLAGS_COMMON      = -nostdlib --pie
 DEFINE GCC_IA32_X64_DLINK_COMMON   = DEF(GCC_DLINK_FLAGS_COMMON) --gc-sections
 DEFINE GCC_IA32_X64_ASLDLINK_FLAGS = DEF(GCC_IA32_X64_DLINK_COMMON) --entry _ReferenceAcpiTable -u $(IMAGE_ENTRY_POINT)
@@ -3083,8 +3082,17 @@ DEFINE GCC46_ASM_FLAGS               = DEF(GCC45_ASM_FLAGS)
 *_ELFGCC_*_*_FAMILY                 = GCC
 *_ELFGCC_*_MAKE_PATH                = make
 
-*_ELFGCC_*_PP_FLAGS                     = -E -x assembler-with-cpp -include AutoGen.h
-*_ELFGCC_*_VFRPP_FLAGS                  = -x c -E -P -DVFRCOMPILE --include $(MODULE_NAME)StrDefs.h
+*_ELFGCC_*_OBJCOPY_PATH          = ENV(CROSS_COMPILE)objcopy
+*_ELFGCC_*_CC_PATH               = ENV(CROSS_COMPILE)gcc
+*_ELFGCC_*_SLINK_PATH            = ENV(CROSS_COMPILE)ar
+*_ELFGCC_*_DLINK_PATH            = ENV(CROSS_COMPILE)ld
+*_ELFGCC_*_ASM_PATH              = ENV(CROSS_COMPILE)gcc
+*_ELFGCC_*_PP_PATH               = ENV(CROSS_COMPILE)gcc
+*_ELFGCC_*_VFRPP_PATH            = ENV(CROSS_COMPILE)gcc
+*_ELFGCC32_*_ASLCC_PATH          = ENV(CROSS_COMPILE)gcc
+*_ELFGCC32_*_ASLPP_PATH          = ENV(CROSS_COMPILE)gcc
+*_ELFGCC32_*_ASLDLINK_PATH       = ENV(CROSS_COMPILE)ld
+*_ELFGCC_*_RC_PATH               = ENV(CROSS_COMPILE)objcopy
 
 ##################
 # ASL definitions
@@ -3099,72 +3107,58 @@ DEFINE GCC46_ASM_FLAGS               = DEF(GCC45_ASM_FLAGS)
 ##################
 # IA32 definitions
 ##################
-*_ELFGCC_IA32_OBJCOPY_PATH          = DEF(ELFGCC_BIN)/objcopy
-*_ELFGCC_IA32_CC_PATH               = DEF(ELFGCC_BIN)/gcc
-*_ELFGCC_IA32_SLINK_PATH            = DEF(ELFGCC_BIN)/ar
-*_ELFGCC_IA32_DLINK_PATH            = DEF(ELFGCC_BIN)/ld
-*_ELFGCC_IA32_ASM_PATH              = DEF(ELFGCC_BIN)/gcc
-*_ELFGCC_IA32_PP_PATH               = DEF(ELFGCC_BIN)/gcc
-*_ELFGCC_IA32_VFRPP_PATH            = DEF(ELFGCC_BIN)/gcc
-*_ELFGCC32_IA32_ASLCC_PATH          = DEF(ELFGCC_BIN)/gcc
-*_ELFGCC32_IA32_ASLPP_PATH          = DEF(ELFGCC_BIN)/gcc
-*_ELFGCC32_IA32_ASLDLINK_PATH       = DEF(ELFGCC_BIN)/ld
-*_ELFGCC_IA32_RC_PATH               = DEF(ELFGCC_BIN)/objcopy
-
-*_ELFGCC_IA32_CC_FLAGS              = -m32 -g -fshort-wchar -fno-strict-aliasing -Wall -malign-double -c -include $(DEST_DIR_DEBUG)/AutoGen.h -DSTRING_ARRAY_NAME=$(BASE_NAME)Strings
-*_ELFGCC_IA32_SLINK_FLAGS           =
-*_ELFGCC_IA32_DLINK_FLAGS           = -melf_i386 -nostdlib --shared --entry $(IMAGE_ENTRY_POINT) -u $(IMAGE_ENTRY_POINT) -Map $(DEST_DIR_DEBUG)/$(BASE_NAME).map
-#*_ELFGCC_IA32_DLINK_FLAGS          = -melf_i386 -nostdlib -n -q -Ttext 0x220 --entry $(IMAGE_ENTRY_POINT) -u $(IMAGE_ENTRY_POINT)
-*_ELFGCC_IA32_ASM_FLAGS             = -m32 -c -x assembler -imacros $(DEST_DIR_DEBUG)/AutoGen.h
+*_ELFGCC_IA32_ARCHCC_FLAGS          = DEF(GCC_IA32_CC_FLAGS) -include $(DEST_DIR_DEBUG)/AutoGen.h -DSTRING_ARRAY_NAME=$(BASE_NAME)Strings
+*_ELFGCC_IA32_SLINK_FLAGS           = -cr
+*_ELFGCC_IA32_ARCHDLINK_FLAGS       = -melf_i386 --shared
+#*_ELFGCC_IA32_DLINK_FLAGS          = -melf_i386 -n -q -Ttext 0x220
+*_ELFGCC_IA32_ARCHASM_FLAGS         = -m32
 *_ELFGCC_IA32_PP_FLAGS              = -m32 -E -x assembler-with-cpp -include $(DEST_DIR_DEBUG)/AutoGen.h
-*_ELFGCC_IA32_VFRPP_FLAGS           = -x c -E -P -DVFRCOMPILE --include $(DEST_DIR_DEBUG)/$(MODULE_NAME)StrDefs.h
 *_ELFGCC_IA32_RC_FLAGS              = DEF(GCC_IA32_RC_FLAGS)
 *_ELFGCC_IA32_OBJCOPY_FLAGS         =
 
 ##################
 # X64 definitions
 ##################
-*_ELFGCC_X64_CC_PATH               = DEF(ELFGCC_BIN)/gcc
-*_ELFGCC_X64_ASLCC_PATH            = DEF(ELFGCC_BIN)/gcc
-*_ELFGCC_X64_SLINK_PATH            = DEF(ELFGCC_BIN)/ar
-*_ELFGCC_X64_DLINK_PATH            = DEF(ELFGCC_BIN)/ld
-*_ELFGCC_X64_ASLDLINK_PATH         = DEF(ELFGCC_BIN)/ld
-*_ELFGCC_X64_ASM_PATH              = DEF(ELFGCC_BIN)/gcc
-*_ELFGCC_X64_PP_PATH               = DEF(ELFGCC_BIN)/gcc
-*_ELFGCC_X64_ASLPP_PATH            = DEF(ELFGCC_BIN)/gcc
-*_ELFGCC_X64_VFRPP_PATH            = DEF(ELFGCC_BIN)/gcc
-*_ELFGCC_X64_RC_PATH               = DEF(ELFGCC_BIN)/objcopy
-
-*_ELFGCC_X64_CC_FLAGS              = -Os -fshort-wchar -fno-strict-aliasing -Wall -Werror -Wno-missing-braces -Wno-address -Wno-array-bounds -c -include AutoGen.h -D_EFI_P64
-*_ELFGCC_X64_DLINK_FLAGS           = -nostdlib --shared --entry $(IMAGE_ENTRY_POINT) -u $(IMAGE_ENTRY_POINT) -Map $(DEST_DIR_DEBUG)/$(BASE_NAME).map
-*_ELFGCC_X64_SLINK_FLAGS           =
-*_ELFGCC_X64_ASM_FLAGS             = -c -x assembler -imacros $(DEST_DIR_DEBUG)/AutoGen.h
+*_ELFGCC_X64_ARCHCC_FLAGS          = DEF(GCC_X64_CC_FLAGS) -include AutoGen.h -D_EFI_P64
+*_ELFGCC_X64_ARCHDLINK_FLAGS       = --shared
+*_ELFGCC_X64_SLINK_FLAGS           = -cr
+*_ELFGCC_X64_ARCHASM_FLAGS         =
 *_ELFGCC_X64_PP_FLAGS              = -E -x assembler-with-cpp -include $(DEST_DIR_DEBUG)/AutoGen.h
-*_ELFGCC_X64_VFRPP_FLAGS           = -x c -E -P -DVFRCOMPILE --include $(DEST_DIR_DEBUG)/$(MODULE_NAME)StrDefs.h
 *_ELFGCC_X64_RC_FLAGS              = DEF(GCC_X64_RC_FLAGS)
 
 ##################
 # IPF definitions
 ##################
-*_ELFGCC_IPF_CC_PATH              = DEF(ELFGCC_BIN)/gcc
-*_ELFGCC_IPF_ASLCC_PATH           = DEF(ELFGCC_BIN)/gcc
-*_ELFGCC_IPF_SLINK_PATH           = DEF(ELFGCC_BIN)/ar
-*_ELFGCC_IPF_DLINK_PATH           = DEF(ELFGCC_BIN)/ld
-*_ELFGCC_IPF_ASLDLINK_PATH        = DEF(ELFGCC_BIN)/ld
-*_ELFGCC_IPF_ASM_PATH             = DEF(ELFGCC_BIN)/gcc
-*_ELFGCC_IPF_PP_PATH              = DEF(ELFGCC_BIN)/gcc
-*_ELFGCC_IPF_ASLPP_PATH           = DEF(ELFGCC_BIN)/gcc
-*_ELFGCC_IPF_VFRPP_PATH           = DEF(ELFGCC_BIN)/gcc
-*_ELFGCC_IPF_RC_PATH              = DEF(ELFGCC_BIN)/objcopy
-
-*_ELFGCC_IPF_CC_FLAGS             = -Os -fshort-wchar -Wall -Werror -c -include AutoGen.h -D_EFI_P64
-*_ELFGCC_IPF_DLINK_FLAGS          = -nostdlib --shared --entry $(IMAGE_ENTRY_POINT) -u $(IMAGE_ENTRY_POINT) -Map $(DEST_DIR_DEBUG)/$(BASE_NAME).map
-*_ELFGCC_IPF_SLINK_FLAGS          =
-*_ELFGCC_IPF_ASM_FLAGS            = -c -x assembler -imacros $(DEST_DIR_DEBUG)/AutoGen.h
+*_ELFGCC_IPF_ARCHCC_FLAGS         = -c -include AutoGen.h -D_EFI_P64
+*_ELFGCC_IPF_ARCHDLINK_FLAGS      = --shared
+*_ELFGCC_IPF_SLINK_FLAGS          = -cr
+*_ELFGCC_IPF_ARCHASM_FLAGS        =
 *_ELFGCC_IPF_PP_FLAGS             = -E -x assembler-with-cpp -include $(DEST_DIR_DEBUG)/AutoGen.h
-*_ELFGCC_IPF_VFRPP_FLAGS          = -x c -E -P -DVFRCOMPILE --include $(DEST_DIR_DEBUG)/$(MODULE_NAME)StrDefs.h
 *_ELFGCC_IPF_RC_FLAGS             = DEF(GCC_IPF_RC_FLAGS)
 
+##################
+# ARM definitions
+##################
+*_ELFGCC_ARM_ARCHCC_FLAGS         = DEF(GCC_ARM_CC_FLAGS) -mthumb -fno-stack-protector
+*_ELFGCC_ARM_SLINK_FLAGS          = -rc
+*_ELFGCC_ARM_ARCHASM_FLAGS        = -mlittle-endian
+*_ELFGCC_ARM_ARCHDLINK_FLAGS      = -Ttext=0x0 --oformat=elf32-littlearm --emit-relocs
+*_ELFGCC_ARM_RC_FLAGS             = -I binary -O elf32-littlearm -B arm --rename-section .data=.hii
+*_ELFGCC_ARM_PLATFORM_FLAGS       = -march=armv7-a
+*_ELFGCC_ARM_OBJCOPY_PATH         = echo
+
+##################
+# Common definitions
+##################
+*_ELFGCC_*_ASM_FLAGS              = -c -x assembler -g $(ARCHASM_FLAGS) $(PLATFORM_FLAGS) -imacros $(DEST_DIR_DEBUG)/AutoGen.h
+*_ELFGCC_*_PP_FLAGS               = DEF(GCC_PP_FLAGS) $(ARCHCC_FLAGS) $(PLATFORM_FLAGS)
+*_ELFGCC_*_VFRPP_FLAGS            = DEF(GCC_VFRPP_FLAGS)
+*_ELFGCC_*_DLINK_FLAGS            = $(ARCHDLINK_FLAGS) -nostdlib --entry $(IMAGE_ENTRY_POINT) -u $(IMAGE_ENTRY_POINT) -Map $(DEST_DIR_DEBUG)/$(BASE_NAME).map
+
+  DEBUG_ELFGCC_*_CC_FLAGS         = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) -O0
+RELEASE_ELFGCC_*_CC_FLAGS         = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) -Wno-unused-but-set-variable
+
+
 ####################################################################################
 #
 # Intel(R) C++ Compiler Version 9.1
@@ -4813,8 +4807,8 @@ RELEASE_ARMGCC_ARM_ASM_FLAGS   = $(ARCHASM_FLAGS) $(PLATFORM_FLAGS) -mlittle-end
 *_ARMGCC_ARM_SLINK_FLAGS =  -rc
 *_ARMGCC_ARM_DLINK_FLAGS =  $(ARCHDLINK_FLAGS) -Ttext=0x0 --oformat=elf32-littlearm --emit-relocs -nostdlib -u $(IMAGE_ENTRY_POINT) -e $(IMAGE_ENTRY_POINT) -Map $(DEST_DIR_DEBUG)/$(BASE_NAME).map
 
-  DEBUG_ARMGCC_ARM_CC_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) DEF(GCC_ARMGCC_CC_FLAGS) -combine -O0
-RELEASE_ARMGCC_ARM_CC_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) DEF(GCC_ARMGCC_CC_FLAGS) -combine -Wno-unused
+  DEBUG_ARMGCC_ARM_CC_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) DEF(GCC_ARM_CC_FLAGS) -O0
+RELEASE_ARMGCC_ARM_CC_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) DEF(GCC_ARM_CC_FLAGS) -Wno-unused
 
 ####################################################################################
 #
@@ -4871,8 +4865,8 @@ RELEASE_ARMLINUXGCC_ARM_ASM_FLAGS   = $(ARCHASM_FLAGS) $(PLATFORM_FLAGS) -mlittl
 *_ARMLINUXGCC_ARM_SLINK_FLAGS =  -rc
 *_ARMLINUXGCC_ARM_DLINK_FLAGS =  $(ARCHDLINK_FLAGS) -Ttext=0x0 --oformat=elf32-littlearm --emit-relocs -nostdlib -u $(IMAGE_ENTRY_POINT) -e $(IMAGE_ENTRY_POINT) -Map $(DEST_DIR_DEBUG)/$(BASE_NAME).map
 
-  DEBUG_ARMLINUXGCC_ARM_CC_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) DEF(GCC_ARMGCC_CC_FLAGS) -Wno-address -O0
-RELEASE_ARMLINUXGCC_ARM_CC_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) DEF(GCC_ARMGCC_CC_FLAGS) -Wno-address -Wno-unused-but-set-variable
+  DEBUG_ARMLINUXGCC_ARM_CC_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) DEF(GCC_ARM_CC_FLAGS) -Wno-address -O0
+RELEASE_ARMLINUXGCC_ARM_CC_FLAGS = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) DEF(GCC_ARM_CC_FLAGS) -Wno-address -Wno-unused-but-set-variable
 
 #################
 # ASM 16 linker defintions
-- 
1.7.0.4

