From 97fa0ee9b1cffbb4b97ee35365afa7afcf50e174 Mon Sep 17 00:00:00 2001 From: Yingke Liu Date: Thu, 28 Aug 2014 13:53:34 +0000 Subject: License header updated to match correct format. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Yingke Liu Reviewed-by: Liming Gao git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15971 6f19259b-4bc3-4df7-8a09-765794883524 --- BaseTools/Source/Python/Common/DataType.py | 2 +- BaseTools/Source/Python/Common/GlobalData.py | 10 +- BaseTools/Source/Python/Common/Misc.py | 124 +++++++++++++++++++++ .../Source/Python/Common/TargetTxtClassObject.py | 34 +++++- .../Source/Python/Common/ToolDefClassObject.py | 19 ++-- 5 files changed, 174 insertions(+), 15 deletions(-) (limited to 'BaseTools/Source/Python/Common') diff --git a/BaseTools/Source/Python/Common/DataType.py b/BaseTools/Source/Python/Common/DataType.py index f1408569e0..57e5063ff2 100644 --- a/BaseTools/Source/Python/Common/DataType.py +++ b/BaseTools/Source/Python/Common/DataType.py @@ -373,7 +373,7 @@ TAB_INF_GUIDTYPE_TSG = 'TokenSpaceGuid' TAB_INF_GUIDTYPE_VAR = 'Variable' TAB_INF_GUIDTYPE_PROTOCOL = 'PROTOCOL' TAB_INF_GUIDTYPE_PPI = 'PPI' -TAB_INF_GUIDTYPE_UNDEFINED = 'UNDEFINED' +TAB_INF_USAGE_UNDEFINED = 'UNDEFINED' # # Dec Definitions diff --git a/BaseTools/Source/Python/Common/GlobalData.py b/BaseTools/Source/Python/Common/GlobalData.py index 1f9d91c5d8..218034ba33 100644 --- a/BaseTools/Source/Python/Common/GlobalData.py +++ b/BaseTools/Source/Python/Common/GlobalData.py @@ -1,7 +1,7 @@ ## @file # This file is used to define common static strings used by INF/DEC/DSC files # -# Copyright (c) 2007, Intel Corporation. All rights reserved.
+# Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.
# This program and the accompanying materials # are licensed and made available under the terms and conditions of the BSD License # which accompanies this distribution. The full text of the license may be found at @@ -69,3 +69,11 @@ gIgnoreSource = False # FDF parser # gFdfParser = None + +# +# If a module is built more than once with different PCDs or library classes +# a temporary INF file with same content is created, the temporary file is removed +# when build exits. +# +gTempInfs = [] + diff --git a/BaseTools/Source/Python/Common/Misc.py b/BaseTools/Source/Python/Common/Misc.py index e9e41de02e..01297cd0a9 100644 --- a/BaseTools/Source/Python/Common/Misc.py +++ b/BaseTools/Source/Python/Common/Misc.py @@ -23,6 +23,7 @@ import time import re import cPickle import array +import shutil from UserDict import IterableUserDict from UserList import UserList @@ -43,6 +44,90 @@ gFileTimeStampCache = {} # {file path : file time stamp} ## Dictionary used to store dependencies of files gDependencyDatabase = {} # arch : {file path : [dependent files list]} +## Routine to process duplicated INF +# +# This function is called by following two cases: +# Case 1 in DSC: +# [components.arch] +# Pkg/module/module.inf +# Pkg/module/module.inf { +# +# FILE_GUID = 0D1B936F-68F3-4589-AFCC-FB8B7AEBC836 +# } +# Case 2 in FDF: +# INF Pkg/module/module.inf +# INF FILE_GUID = 0D1B936F-68F3-4589-AFCC-FB8B7AEBC836 Pkg/module/module.inf +# +# This function copies Pkg/module/module.inf to +# Conf/.cache/0D1B936F-68F3-4589-AFCC-FB8B7AEBC836module.inf +# +# @param Path Original PathClass object +# @param BaseName New file base name +# +# @retval return the new PathClass object +# +def ProcessDuplicatedInf(Path, BaseName, Workspace): + Filename = os.path.split(Path.File)[1] + if '.' in Filename: + Filename = BaseName + Path.BaseName + Filename[Filename.rfind('.'):] + else: + Filename = BaseName + Path.BaseName + + # + # If -N is specified on command line, cache is disabled + # The directory has to be created + # + DbDir = os.path.split(GlobalData.gDatabasePath)[0] + if not os.path.exists(DbDir): + os.makedirs(DbDir) + # + # A temporary INF is copied to database path which must have write permission + # The temporary will be removed at the end of build + # In case of name conflict, the file name is + # FILE_GUIDBaseName (0D1B936F-68F3-4589-AFCC-FB8B7AEBC836module.inf) + # + TempFullPath = os.path.join(DbDir, + Filename) + RtPath = PathClass(Path.File, Workspace) + # + # Modify the full path to temporary path, keep other unchanged + # + # To build same module more than once, the module path with FILE_GUID overridden has + # the file name FILE_GUIDmodule.inf, but the relative path (self.MetaFile.File) is the real path + # in DSC which is used as relative path by C files and other files in INF. + # A trick was used: all module paths are PathClass instances, after the initialization + # of PathClass, the PathClass.Path is overridden by the temporary INF path. + # + # The reason for creating a temporary INF is: + # Platform.Modules which is the base to create ModuleAutoGen objects is a dictionary, + # the key is the full path of INF, the value is an object to save overridden library instances, PCDs. + # A different key for the same module is needed to create different output directory, + # retrieve overridden PCDs, library instances. + # + # The BaseName is the FILE_GUID which is also the output directory name. + # + # + RtPath.Path = TempFullPath + RtPath.BaseName = BaseName + # + # If file exists, compare contents + # + if os.path.exists(TempFullPath): + with open(str(Path), 'rb') as f1: Src = f1.read() + with open(TempFullPath, 'rb') as f2: Dst = f2.read() + if Src == Dst: + return RtPath + GlobalData.gTempInfs.append(TempFullPath) + shutil.copy2(str(Path), TempFullPath) + return RtPath + +## Remove temporary created INFs whose paths were saved in gTempInfs +# +def ClearDuplicatedInf(): + for File in GlobalData.gTempInfs: + if os.path.exists(File): + os.remove(File) + ## callback routine for processing variable option # # This function can be used to process variable number of option values. The @@ -1456,6 +1541,45 @@ def CommonPath(PathList): return os.path.sep.join(P1[:Index]) return os.path.sep.join(P1) +# +# Convert string to C format array +# +def ConvertStringToByteArray(Value): + Value = Value.strip() + if not Value: + return None + if Value[0] == '{': + if not Value.endswith('}'): + return None + Value = Value.replace(' ', '').replace('{', '').replace('}', '') + ValFields = Value.split(',') + try: + for Index in range(len(ValFields)): + ValFields[Index] = str(int(ValFields[Index], 0)) + except ValueError: + return None + Value = '{' + ','.join(ValFields) + '}' + return Value + + Unicode = False + if Value.startswith('L"'): + if not Value.endswith('"'): + return None + Value = Value[1:] + Unicode = True + elif not Value.startswith('"') or not Value.endswith('"'): + return None + + Value = eval(Value) # translate escape character + NewValue = '{' + for Index in range(0,len(Value)): + if Unicode: + NewValue = NewValue + str(ord(Value[Index]) % 0x10000) + ',' + else: + NewValue = NewValue + str(ord(Value[Index]) % 0x100) + ',' + Value = NewValue + '0}' + return Value + class PathClass(object): def __init__(self, File='', Root='', AlterRoot='', Type='', IsBinary=False, Arch='COMMON', ToolChainFamily='', Target='', TagName='', ToolCode=''): diff --git a/BaseTools/Source/Python/Common/TargetTxtClassObject.py b/BaseTools/Source/Python/Common/TargetTxtClassObject.py index 89e3937086..387e515230 100644 --- a/BaseTools/Source/Python/Common/TargetTxtClassObject.py +++ b/BaseTools/Source/Python/Common/TargetTxtClassObject.py @@ -21,7 +21,7 @@ from BuildToolError import * import GlobalData from Common.LongFilePathSupport import OpenLongFilePath as open -gDefaultTargetTxtFile = "Conf/target.txt" +gDefaultTargetTxtFile = "target.txt" ## TargetTxtClassObject # @@ -44,6 +44,7 @@ class TargetTxtClassObject(object): DataType.TAB_TAT_DEFINES_TARGET_ARCH : [], DataType.TAB_TAT_DEFINES_BUILD_RULE_CONF : '', } + self.ConfDirectoryPath = "" if Filename != None: self.LoadTargetTxtFile(Filename) @@ -78,7 +79,8 @@ class TargetTxtClassObject(object): def ConvertTextFileToDict(self, FileName, CommentCharacter, KeySplitCharacter): F = None try: - F = open(FileName,'r') + F = open(FileName, 'r') + self.ConfDirectoryPath = os.path.dirname(FileName) except: EdkLogger.error("build", FILE_OPEN_FAILURE, ExtraData=FileName) if F != None: @@ -99,6 +101,26 @@ class TargetTxtClassObject(object): if Key in [DataType.TAB_TAT_DEFINES_ACTIVE_PLATFORM, DataType.TAB_TAT_DEFINES_TOOL_CHAIN_CONF, \ DataType.TAB_TAT_DEFINES_ACTIVE_MODULE, DataType.TAB_TAT_DEFINES_BUILD_RULE_CONF]: self.TargetTxtDictionary[Key] = Value.replace('\\', '/') + if Key == DataType.TAB_TAT_DEFINES_TOOL_CHAIN_CONF and self.TargetTxtDictionary[Key]: + if self.TargetTxtDictionary[Key].startswith("Conf/"): + Tools_Def = os.path.join(self.ConfDirectoryPath, self.TargetTxtDictionary[Key].strip()) + if not os.path.exists(Tools_Def) or not os.path.isfile(Tools_Def): + # If Conf/Conf does not exist, try just the Conf/ directory + Tools_Def = os.path.join(self.ConfDirectoryPath, self.TargetTxtDictionary[Key].replace("Conf/", "", 1).strip()) + else: + # The File pointed to by TOOL_CHAIN_CONF is not in a Conf/ directory + Tools_Def = os.path.join(self.ConfDirectoryPath, self.TargetTxtDictionary[Key].strip()) + self.TargetTxtDictionary[Key] = Tools_Def + if Key == DataType.TAB_TAT_DEFINES_BUILD_RULE_CONF and self.TargetTxtDictionary[Key]: + if self.TargetTxtDictionary[Key].startswith("Conf/"): + Build_Rule = os.path.join(self.ConfDirectoryPath, self.TargetTxtDictionary[Key].strip()) + if not os.path.exists(Build_Rule) or not os.path.isfile(Build_Rule): + # If Conf/Conf does not exist, try just the Conf/ directory + Build_Rule = os.path.join(self.ConfDirectoryPath, self.TargetTxtDictionary[Key].replace("Conf/", "", 1).strip()) + else: + # The File pointed to by BUILD_RULE_CONF is not in a Conf/ directory + Build_Rule = os.path.join(self.ConfDirectoryPath, self.TargetTxtDictionary[Key].strip()) + self.TargetTxtDictionary[Key] = Build_Rule elif Key in [DataType.TAB_TAT_DEFINES_TARGET, DataType.TAB_TAT_DEFINES_TARGET_ARCH, \ DataType.TAB_TAT_DEFINES_TOOL_CHAIN_TAG]: self.TargetTxtDictionary[Key] = Value.split() @@ -144,15 +166,15 @@ class TargetTxtClassObject(object): print Item ## TargetTxtDict # -# Load target.txt in input workspace dir +# Load target.txt in input Conf dir # -# @param WorkSpace: Workspace dir +# @param ConfDir: Conf dir # # @retval Target An instance of TargetTxtClassObject() with loaded target.txt # -def TargetTxtDict(WorkSpace): +def TargetTxtDict(ConfDir): Target = TargetTxtClassObject() - Target.LoadTargetTxtFile(os.path.normpath(os.path.join(WorkSpace, gDefaultTargetTxtFile))) + Target.LoadTargetTxtFile(os.path.normpath(os.path.join(ConfDir, gDefaultTargetTxtFile))) return Target ## diff --git a/BaseTools/Source/Python/Common/ToolDefClassObject.py b/BaseTools/Source/Python/Common/ToolDefClassObject.py index 583d51b513..4fefbd91e0 100644 --- a/BaseTools/Source/Python/Common/ToolDefClassObject.py +++ b/BaseTools/Source/Python/Common/ToolDefClassObject.py @@ -29,7 +29,7 @@ from Common.LongFilePathSupport import OpenLongFilePath as open gMacroRefPattern = re.compile('(DEF\([^\(\)]+\))') gEnvRefPattern = re.compile('(ENV\([^\(\)]+\))') gMacroDefPattern = re.compile("DEFINE\s+([^\s]+)") -gDefaultToolsDefFile = "Conf/tools_def.txt" +gDefaultToolsDefFile = "tools_def.txt" ## ToolDefClassObject # @@ -196,18 +196,23 @@ class ToolDefClassObject(object): ## ToolDefDict # -# Load tools_def.txt in input workspace dir +# Load tools_def.txt in input Conf dir # -# @param WorkSpace: Workspace dir +# @param ConfDir: Conf dir # # @retval ToolDef An instance of ToolDefClassObject() with loaded tools_def.txt # -def ToolDefDict(WorkSpace): - Target = TargetTxtDict(WorkSpace) +def ToolDefDict(ConfDir): + Target = TargetTxtDict(ConfDir) ToolDef = ToolDefClassObject() if DataType.TAB_TAT_DEFINES_TOOL_CHAIN_CONF in Target.TargetTxtDictionary: - gDefaultToolsDefFile = Target.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_TOOL_CHAIN_CONF] - ToolDef.LoadToolDefFile(os.path.normpath(os.path.join(WorkSpace, gDefaultToolsDefFile))) + ToolsDefFile = Target.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_TOOL_CHAIN_CONF] + if ToolsDefFile: + ToolDef.LoadToolDefFile(os.path.normpath(ToolsDefFile)) + else: + ToolDef.LoadToolDefFile(os.path.normpath(os.path.join(ConfDir, gDefaultToolsDefFile))) + else: + ToolDef.LoadToolDefFile(os.path.normpath(os.path.join(ConfDir, gDefaultToolsDefFile))) return ToolDef ## -- cgit v1.2.3