From 2bcc713e74b944bb5aefb433ef33fb4002a62d76 Mon Sep 17 00:00:00 2001 From: lgao4 Date: Fri, 25 Nov 2011 06:21:03 +0000 Subject: Sync BaseTool trunk (version r2423) into EDKII BaseTools. The change mainly includes: 1. Fix !include issues 2. Fix Trim to skip the postfix 'U' for hexadecimal and decimal numbers 3. Fix building error C2733 when building C++ code. 4. Add GCC46 tool chain definition 5. Add new RVCT and RVCTLINUX tool chains Signed-off-by: lgao4 git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12782 6f19259b-4bc3-4df7-8a09-765794883524 --- BaseTools/Source/Python/AutoGen/GenC.py | 6 +- BaseTools/Source/Python/AutoGen/GenMake.py | 101 +- BaseTools/Source/Python/AutoGen/StrGather.py | 2 +- BaseTools/Source/Python/AutoGen/UniClassObject.py | 2 +- BaseTools/Source/Python/Common/BuildVersion.py | 2 +- .../Source/Python/Common/DecClassObjectLight.py | 580 ------- .../Source/Python/Common/InfClassObjectLight.py | 877 ---------- BaseTools/Source/Python/Common/XmlParser.py | 1754 -------------------- BaseTools/Source/Python/Common/XmlRoutines.py | 228 --- .../CommonDataClass/DistributionPackageClass.py | 158 -- BaseTools/Source/Python/Ecc/Check.py | 16 +- BaseTools/Source/Python/Ecc/EccToolError.py | 2 + BaseTools/Source/Python/Ecc/Exception.py | 2 +- BaseTools/Source/Python/Ecc/Xml/XmlRoutines.py | 228 +++ BaseTools/Source/Python/Ecc/Xml/__init__.py | 20 + BaseTools/Source/Python/GenFds/FdfParser.py | 53 +- BaseTools/Source/Python/Makefile | 7 +- BaseTools/Source/Python/Trim/Trim.py | 11 +- BaseTools/Source/Python/UPT/BuildVersion.py | 3 + BaseTools/Source/Python/UPT/Library/Misc.py | 53 + BaseTools/Source/Python/UPT/Logger/StringTable.py | 1 + BaseTools/Source/Python/UPT/Makefile | 4 +- BaseTools/Source/Python/UPT/Parser/InfParser.py | 18 + BaseTools/Source/Python/UPT/UPT.py | 2 +- .../Source/Python/Workspace/MetaFileParser.py | 54 +- 25 files changed, 495 insertions(+), 3689 deletions(-) delete mode 100644 BaseTools/Source/Python/Common/DecClassObjectLight.py delete mode 100644 BaseTools/Source/Python/Common/InfClassObjectLight.py delete mode 100644 BaseTools/Source/Python/Common/XmlParser.py delete mode 100644 BaseTools/Source/Python/Common/XmlRoutines.py delete mode 100644 BaseTools/Source/Python/CommonDataClass/DistributionPackageClass.py create mode 100644 BaseTools/Source/Python/Ecc/Xml/XmlRoutines.py create mode 100644 BaseTools/Source/Python/Ecc/Xml/__init__.py create mode 100644 BaseTools/Source/Python/UPT/BuildVersion.py (limited to 'BaseTools/Source/Python') diff --git a/BaseTools/Source/Python/AutoGen/GenC.py b/BaseTools/Source/Python/AutoGen/GenC.py index 561114d141..5638bfd043 100644 --- a/BaseTools/Source/Python/AutoGen/GenC.py +++ b/BaseTools/Source/Python/AutoGen/GenC.py @@ -310,11 +310,14 @@ gAutoGenHPrologueString = TemplateString(""" #ifndef _${File}_${Guid} #define _${File}_${Guid} +""") + +gAutoGenHCppPrologueString = """ #ifdef __cplusplus extern "C" { #endif -""") +""" gAutoGenHEpilogueString = """ @@ -1970,6 +1973,7 @@ def CreateHeaderCode(Info, AutoGenC, AutoGenH): AutoGenH.Append(gAutoGenHeaderString.Replace({'FileName':'AutoGen.h'})) # header file Prologue AutoGenH.Append(gAutoGenHPrologueString.Replace({'File':'AUTOGENH','Guid':Info.Guid.replace('-','_')})) + AutoGenH.Append(gAutoGenHCppPrologueString) if Info.AutoGenVersion >= 0x00010005: # header files includes AutoGenH.Append("#include <%s>\n" % gBasicHeaderFile) diff --git a/BaseTools/Source/Python/AutoGen/GenMake.py b/BaseTools/Source/Python/AutoGen/GenMake.py index b34977d7a9..b2ebff324d 100644 --- a/BaseTools/Source/Python/AutoGen/GenMake.py +++ b/BaseTools/Source/Python/AutoGen/GenMake.py @@ -31,6 +31,8 @@ gIncludePattern = re.compile(r"^[ \t]*#?[ \t]*include(?:[ \t]*(?:\\(?:\r\n|\r|\n ## Regular expression for matching macro used in header file inclusion gMacroPattern = re.compile("([_A-Z][_A-Z0-9]*)[ \t]*\((.+)\)", re.UNICODE) +gIsFileMap = {} + ## pattern for include style in Edk.x code gProtocolDefinition = "Protocol/%(HeaderKey)s/%(HeaderKey)s.h" gGuidDefinition = "Guid/%(HeaderKey)s/%(HeaderKey)s.h" @@ -421,6 +423,7 @@ cleanlib: self.FileListMacros = {} self.ListFileMacros = {} + self.FileCache = {} self.FileDependency = [] self.LibraryBuildCommandList = [] self.LibraryFileList = [] @@ -722,24 +725,26 @@ cleanlib: EdkLogger.debug(EdkLogger.DEBUG_1, "Try to get dependency files for %s" % File) FileStack = [File] + ForceList DependencySet = set() - MacroUsedByIncludedFile = False if self._AutoGenObject.Arch not in gDependencyDatabase: gDependencyDatabase[self._AutoGenObject.Arch] = {} DepDb = gDependencyDatabase[self._AutoGenObject.Arch] - # add path of given source file into search path list. - if File.Dir not in SearchPathList: - SearchPathList.append(File.Dir) while len(FileStack) > 0: F = FileStack.pop() + FullPathDependList = [] + if F in self.FileCache: + for CacheFile in self.FileCache[F]: + FullPathDependList.append(CacheFile) + if CacheFile not in DependencySet: + FileStack.append(CacheFile) + DependencySet.update(FullPathDependList) + continue + CurrentFileDependencyList = [] if F in DepDb: CurrentFileDependencyList = DepDb[F] - for Dep in CurrentFileDependencyList: - if Dep not in FileStack and Dep not in DependencySet: - FileStack.append(Dep) else: try: Fd = open(F.Path, 'r') @@ -755,7 +760,6 @@ cleanlib: FileContent = unicode(FileContent, "utf-16") IncludedFileList = gIncludePattern.findall(FileContent) - CurrentFilePath = F.Dir for Inc in IncludedFileList: Inc = Inc.strip() # if there's macro used to reference header file, expand it @@ -766,41 +770,44 @@ cleanlib: if HeaderType in gIncludeMacroConversion: Inc = gIncludeMacroConversion[HeaderType] % {"HeaderKey" : HeaderKey} else: - # not known macro used in #include - MacroUsedByIncludedFile = True - continue + # not known macro used in #include, always build the file by + # returning a empty dependency + self.FileCache[File] = [] + return [] Inc = os.path.normpath(Inc) - for SearchPath in [CurrentFilePath] + SearchPathList: - FilePath = os.path.join(SearchPath, Inc) - if not os.path.isfile(FilePath) or FilePath in CurrentFileDependencyList: + CurrentFileDependencyList.append(Inc) + DepDb[F] = CurrentFileDependencyList + + CurrentFilePath = F.Dir + PathList = [CurrentFilePath] + SearchPathList + for Inc in CurrentFileDependencyList: + for SearchPath in PathList: + FilePath = os.path.join(SearchPath, Inc) + if FilePath in gIsFileMap: + if not gIsFileMap[FilePath]: continue - FilePath = PathClass(FilePath) - CurrentFileDependencyList.append(FilePath) - if FilePath not in FileStack and FilePath not in DependencySet: - FileStack.append(FilePath) - break + # If isfile is called too many times, the performance is slow down. + elif not os.path.isfile(FilePath): + gIsFileMap[FilePath] = False + continue else: - EdkLogger.debug(EdkLogger.DEBUG_9, "%s included by %s was not found "\ - "in any given path:\n\t%s" % (Inc, F, "\n\t".join(SearchPathList))) - - if not MacroUsedByIncludedFile: - if F == File: - CurrentFileDependencyList += ForceList - # - # Don't keep the file in cache if it uses macro in included file. - # So it will be scanned again if another file includes this file. - # - DepDb[F] = CurrentFileDependencyList - DependencySet.update(CurrentFileDependencyList) + gIsFileMap[FilePath] = True + FilePath = PathClass(FilePath) + FullPathDependList.append(FilePath) + if FilePath not in DependencySet: + FileStack.append(FilePath) + break + else: + EdkLogger.debug(EdkLogger.DEBUG_9, "%s included by %s was not found "\ + "in any given path:\n\t%s" % (Inc, F, "\n\t".join(SearchPathList))) - # - # If there's macro used in included file, always build the file by - # returning a empty dependency - # - if MacroUsedByIncludedFile: - DependencyList = [] - else: - DependencyList = list(DependencySet) # remove duplicate ones + self.FileCache[F] = FullPathDependList + DependencySet.update(FullPathDependList) + + DependencySet.update(ForceList) + if File in DependencySet: + DependencySet.remove(File) + DependencyList = list(DependencySet) # remove duplicate ones return DependencyList @@ -1314,16 +1321,16 @@ ${END}\t@cd $(BUILD_DIR)\n # macros passed to GenFds MacroList.append('"%s=%s"' % ("EFI_SOURCE", GlobalData.gEfiSource.replace('\\', '\\\\'))) MacroList.append('"%s=%s"' % ("EDK_SOURCE", GlobalData.gEdkSource.replace('\\', '\\\\'))) - for MacroName in GlobalData.gGlobalDefines: - if GlobalData.gGlobalDefines[MacroName] != "": - MacroList.append('"%s=%s"' % (MacroName, GlobalData.gGlobalDefines[MacroName].replace('\\', '\\\\'))) + MacroDict = {} + MacroDict.update(GlobalData.gGlobalDefines) + MacroDict.update(GlobalData.gCommandLineDefines) + MacroDict.pop("EFI_SOURCE", "dummy") + MacroDict.pop("EDK_SOURCE", "dummy") + for MacroName in MacroDict: + if MacroDict[MacroName] != "": + MacroList.append('"%s=%s"' % (MacroName, MacroDict[MacroName].replace('\\', '\\\\'))) else: MacroList.append('"%s"' % MacroName) - for MacroName in GlobalData.gCommandLineDefines: - if GlobalData.gCommandLineDefines[MacroName] != "": - MacroList.append('"%s=%s"' % (MacroName, GlobalData.gCommandLineDefines[MacroName].replace('\\', '\\\\'))) - else: - MacroList.append('"%s"' % MacroName) else: FdfFileList = [] diff --git a/BaseTools/Source/Python/AutoGen/StrGather.py b/BaseTools/Source/Python/AutoGen/StrGather.py index 7187f0a440..b84d9f90aa 100644 --- a/BaseTools/Source/Python/AutoGen/StrGather.py +++ b/BaseTools/Source/Python/AutoGen/StrGather.py @@ -62,7 +62,7 @@ OFFSET = 'offset' STRING = 'string' TO = 'to' STRING_TOKEN = re.compile('STRING_TOKEN *\(([A-Z0-9_]+) *\)', re.MULTILINE | re.UNICODE) -COMPATIBLE_STRING_TOKEN = re.compile('STRING_TOKEN *\(([A-Za-z0-9_]+) *\)', re.MULTILINE | re.UNICODE) +COMPATIBLE_STRING_TOKEN = re.compile('STRING_TOKEN *\(([A-Z0-9_]+) *\)', re.MULTILINE | re.UNICODE) EFI_HII_ARRAY_SIZE_LENGTH = 4 EFI_HII_PACKAGE_HEADER_LENGTH = 4 diff --git a/BaseTools/Source/Python/AutoGen/UniClassObject.py b/BaseTools/Source/Python/AutoGen/UniClassObject.py index 54751bab4e..ea27607fce 100644 --- a/BaseTools/Source/Python/AutoGen/UniClassObject.py +++ b/BaseTools/Source/Python/AutoGen/UniClassObject.py @@ -260,7 +260,7 @@ class UniFileClassObject(object): Name = Item.split()[1] # Check the string name is the upper character - if not self.IsCompatibleMode and Name != '': + if Name != '': MatchString = re.match('[A-Z0-9_]+', Name, re.UNICODE) if MatchString == None or MatchString.end(0) != len(Name): EdkLogger.error('Unicode File Parser', FORMAT_INVALID, 'The string token name %s defined in UNI file %s contains the invalid lower case character.' %(Name, self.File)) diff --git a/BaseTools/Source/Python/Common/BuildVersion.py b/BaseTools/Source/Python/Common/BuildVersion.py index 97c1094205..4bb9a8b521 100644 --- a/BaseTools/Source/Python/Common/BuildVersion.py +++ b/BaseTools/Source/Python/Common/BuildVersion.py @@ -1,3 +1,3 @@ #This file is for build version number auto generation # -gBUILD_VERSION = "Build 2396" +gBUILD_VERSION = "Build 2423" diff --git a/BaseTools/Source/Python/Common/DecClassObjectLight.py b/BaseTools/Source/Python/Common/DecClassObjectLight.py deleted file mode 100644 index 7fb41a2359..0000000000 --- a/BaseTools/Source/Python/Common/DecClassObjectLight.py +++ /dev/null @@ -1,580 +0,0 @@ -## @file -# This file is used to define each component of DEC file in light mode -# -# Copyright (c) 2008, 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 -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# - -## -# Import Modules -# -import os -from Misc import GetFiles -from String import * -from DataType import * -from CommonDataClass.PackageClass import * -from CommonDataClass import CommonClass -from BuildToolError import * -from Parsing import * - -# Global variable -Section = {TAB_UNKNOWN.upper() : MODEL_UNKNOWN, - TAB_DEC_DEFINES.upper() : MODEL_META_DATA_HEADER, - TAB_INCLUDES.upper() : MODEL_EFI_INCLUDE, - TAB_LIBRARY_CLASSES.upper() : MODEL_EFI_LIBRARY_CLASS, - TAB_COMPONENTS.upper() : MODEL_META_DATA_COMPONENT, - TAB_GUIDS.upper() : MODEL_EFI_GUID, - TAB_PROTOCOLS.upper() : MODEL_EFI_PROTOCOL, - TAB_PPIS.upper() : MODEL_EFI_PPI, - TAB_PCDS_FIXED_AT_BUILD_NULL.upper() : MODEL_PCD_FIXED_AT_BUILD, - TAB_PCDS_PATCHABLE_IN_MODULE_NULL.upper() : MODEL_PCD_PATCHABLE_IN_MODULE, - TAB_PCDS_FEATURE_FLAG_NULL.upper() : MODEL_PCD_FEATURE_FLAG, - TAB_PCDS_DYNAMIC_EX_NULL.upper() : MODEL_PCD_DYNAMIC_EX, - TAB_PCDS_DYNAMIC_NULL.upper() : MODEL_PCD_DYNAMIC, - TAB_USER_EXTENSIONS.upper() : MODEL_META_DATA_USER_EXTENSION - } - -## DecObject -# -# This class defined basic Dec object which is used by inheriting -# -# @param object: Inherited from object class -# -class DecObject(object): - def __init__(self): - object.__init__() - -## Dec -# -# This class defined the structure used in Dec object -# -# @param DecObject: Inherited from DecObject class -# @param Filename: Input value for Filename of Dec file, default is None -# @param IsMergeAllArches: Input value for IsMergeAllArches -# True is to merge all arches -# Fales is not to merge all arches -# default is False -# @param IsToPackage: Input value for IsToPackage -# True is to transfer to PackageObject automatically -# False is not to transfer to PackageObject automatically -# default is False -# @param WorkspaceDir: Input value for current workspace directory, default is None -# -# @var Identification: To store value for Identification, it is a structure as Identification -# @var Defines: To store value for Defines, it is a structure as DecDefines -# @var UserExtensions: To store value for UserExtensions -# @var Package: To store value for Package, it is a structure as PackageClass -# @var WorkspaceDir: To store value for WorkspaceDir -# @var Contents: To store value for Contents, it is a structure as DecContents -# @var KeyList: To store value for KeyList, a list for all Keys used in Dec -# -class Dec(DecObject): - def __init__(self, Filename=None, IsToPackage=False, WorkspaceDir=None, AllGuidVersionDict=None, SupArchList=DataType.ARCH_LIST): - self.Identification = IdentificationClass() - self.Package = PackageClass() - self.UserExtensions = '' - self.WorkspaceDir = WorkspaceDir - self.SupArchList = SupArchList - self.AllGuidVersionDict = {} - if AllGuidVersionDict: - self.AllGuidVersionDict = AllGuidVersionDict - - self.KeyList = [ - TAB_INCLUDES, TAB_GUIDS, TAB_PROTOCOLS, TAB_PPIS, TAB_LIBRARY_CLASSES, \ - TAB_PCDS_FIXED_AT_BUILD_NULL, TAB_PCDS_PATCHABLE_IN_MODULE_NULL, TAB_PCDS_FEATURE_FLAG_NULL, \ - TAB_PCDS_DYNAMIC_NULL, TAB_PCDS_DYNAMIC_EX_NULL, TAB_DEC_DEFINES - ] - # Upper all KEYs to ignore case sensitive when parsing - self.KeyList = map(lambda c: c.upper(), self.KeyList) - - # Init RecordSet - self.RecordSet = {} - for Key in self.KeyList: - self.RecordSet[Section[Key]] = [] - - # Init Comment - self.SectionHeaderCommentDict = {} - - # Load Dec file if filename is not None - if Filename != None: - self.LoadDecFile(Filename) - - # Transfer to Package Object if IsToPackage is True - if IsToPackage: - self.DecToPackage() - - ## Load Dec file - # - # Load the file if it exists - # - # @param Filename: Input value for filename of Dec file - # - def LoadDecFile(self, Filename): - # Insert a record for file - Filename = NormPath(Filename) - self.Identification.FullPath = Filename - (self.Identification.RelaPath, self.Identification.FileName) = os.path.split(Filename) - if self.Identification.FullPath.find(self.WorkspaceDir) > -1: - self.Identification.PackagePath = os.path.dirname(self.Identification.FullPath[len(self.WorkspaceDir) + 1:]) - - # Init common datas - IfDefList, SectionItemList, CurrentSection, ArchList, ThirdList, IncludeFiles = \ - [], [], TAB_UNKNOWN, [], [], [] - LineNo = 0 - - # Parse file content - IsFindBlockComment = False - ReservedLine = '' - Comment = '' - for Line in open(Filename, 'r'): - LineNo = LineNo + 1 - # Remove comment block - if Line.find(TAB_COMMENT_EDK_START) > -1: - ReservedLine = GetSplitList(Line, TAB_COMMENT_EDK_START, 1)[0] - if ReservedLine.strip().startswith(TAB_COMMENT_SPLIT): - Comment = Comment + Line.strip() + '\n' - ReservedLine = '' - else: - Comment = Comment + Line[len(ReservedLine):] + '\n' - IsFindBlockComment = True - if not ReservedLine: - continue - if Line.find(TAB_COMMENT_EDK_END) > -1: - Comment = Comment + Line[:Line.find(TAB_COMMENT_EDK_END) + len(TAB_COMMENT_EDK_END)] + '\n' - Line = ReservedLine + GetSplitList(Line, TAB_COMMENT_EDK_END, 1)[1] - ReservedLine = '' - IsFindBlockComment = False - if IsFindBlockComment: - Comment = Comment + Line.strip() + '\n' - continue - - # Remove comments at tail and remove spaces again - if Line.strip().startswith(TAB_COMMENT_SPLIT) or Line.strip().startswith('--/'): - Comment = Comment + Line.strip() + '\n' - Line = CleanString(Line) - if Line == '': - continue - - ## Find a new section tab - # First insert previous section items - # And then parse the content of the new section - # - if Line.startswith(TAB_SECTION_START) and Line.endswith(TAB_SECTION_END): - # Insert items data of previous section - Model = Section[CurrentSection.upper()] - InsertSectionItems(Model, CurrentSection, SectionItemList, ArchList, ThirdList, self.RecordSet) - # Parse the new section - SectionItemList = [] - ArchList = [] - ThirdList = [] - - CurrentSection = '' - LineList = GetSplitValueList(Line[len(TAB_SECTION_START):len(Line) - len(TAB_SECTION_END)], TAB_COMMA_SPLIT) - for Item in LineList: - ItemList = GetSplitValueList(Item, TAB_SPLIT) - if CurrentSection == '': - CurrentSection = ItemList[0] - else: - if CurrentSection != ItemList[0]: - EdkLogger.error("Parser", PARSER_ERROR, "Different section names '%s' and '%s' are found in one section definition, this is not allowed." % (CurrentSection, ItemList[0]), File=Filename, Line=LineNo, RaiseError=EdkLogger.IsRaiseError) - if CurrentSection.upper() not in self.KeyList: - RaiseParserError(Line, CurrentSection, Filename, '', LineNo) - ItemList.append('') - ItemList.append('') - if len(ItemList) > 5: - RaiseParserError(Line, CurrentSection, Filename, '', LineNo) - else: - if ItemList[1] != '' and ItemList[1].upper() not in ARCH_LIST_FULL: - EdkLogger.error("Parser", PARSER_ERROR, "Invalid Arch definition '%s' found" % ItemList[1], File=Filename, Line=LineNo, RaiseError=EdkLogger.IsRaiseError) - ArchList.append(ItemList[1].upper()) - ThirdList.append(ItemList[2]) - - if Comment: - if Comment.endswith('\n'): - Comment = Comment[:len(Comment) - len('\n')] - self.SectionHeaderCommentDict[Section[CurrentSection.upper()]] = Comment - Comment = '' - continue - - # Not in any defined section - if CurrentSection == TAB_UNKNOWN: - ErrorMsg = "%s is not in any defined section" % Line - EdkLogger.error("Parser", PARSER_ERROR, ErrorMsg, File=Filename, Line=LineNo, RaiseError=EdkLogger.IsRaiseError) - - # Add a section item - SectionItemList.append([Line, LineNo, Comment]) - Comment = '' - # End of parse - #End of For - - # - # Insert items data of last section - # - Model = Section[CurrentSection.upper()] - InsertSectionItems(Model, CurrentSection, SectionItemList, ArchList, ThirdList, self.RecordSet) - if Comment != '': - self.SectionHeaderCommentDict[Model] = Comment - Comment = '' - - ## Package Object to DEC file - def PackageToDec(self, Package): - Dec = '' - DecList = sdict() - SectionHeaderCommentDict = {} - if Package == None: - return Dec - - PackageHeader = Package.PackageHeader - TmpList = [] - if PackageHeader.Name: - TmpList.append(TAB_DEC_DEFINES_PACKAGE_NAME + ' = ' + PackageHeader.Name) - if PackageHeader.Guid: - TmpList.append(TAB_DEC_DEFINES_PACKAGE_GUID + ' = ' + PackageHeader.Guid) - if PackageHeader.Version: - TmpList.append(TAB_DEC_DEFINES_PACKAGE_VERSION + ' = ' + PackageHeader.Version) - if PackageHeader.DecSpecification: - TmpList.append(TAB_DEC_DEFINES_DEC_SPECIFICATION + ' = ' + PackageHeader.DecSpecification) - if Package.UserExtensions != None: - for Item in Package.UserExtensions.Defines: - TmpList.append(Item) - DecList['Defines'] = TmpList - if PackageHeader.Description != '': - SectionHeaderCommentDict['Defines'] = PackageHeader.Description - - for Item in Package.Includes: - Key = 'Includes.' + Item.SupArchList - Value = Item.FilePath - GenMetaDatSectionItem(Key, Value, DecList) - - for Item in Package.GuidDeclarations: - Key = 'Guids.' + Item.SupArchList - Value = Item.CName + '=' + Item.Guid - GenMetaDatSectionItem(Key, Value, DecList) - - for Item in Package.ProtocolDeclarations: - Key = 'Protocols.' + Item.SupArchList - Value = Item.CName + '=' + Item.Guid - GenMetaDatSectionItem(Key, Value, DecList) - - for Item in Package.PpiDeclarations: - Key = 'Ppis.' + Item.SupArchList - Value = Item.CName + '=' + Item.Guid - GenMetaDatSectionItem(Key, Value, DecList) - - for Item in Package.LibraryClassDeclarations: - Key = 'LibraryClasses.' + Item.SupArchList - Value = Item.LibraryClass + '|' + Item.RecommendedInstance - GenMetaDatSectionItem(Key, Value, DecList) - - for Item in Package.PcdDeclarations: - Key = 'Pcds' + Item.ItemType + '.' + Item.SupArchList - Value = Item.TokenSpaceGuidCName + '.' + Item.CName - if Item.DefaultValue != '': - Value = Value + '|' + Item.DefaultValue - if Item.DatumType != '': - Value = Value + '|' + Item.DatumType - if Item.Token != '': - Value = Value + '|' + Item.Token - GenMetaDatSectionItem(Key, Value, DecList) - - # Transfer Package to Inf - for Key in DecList: - if Key in SectionHeaderCommentDict: - List = SectionHeaderCommentDict[Key].split('\r') - for Item in List: - Dec = Dec + Item + '\n' - Dec = Dec + '[' + Key + ']' + '\n' - for Value in DecList[Key]: - if type(Value) == type([]): - for SubValue in Value: - Dec = Dec + ' ' + SubValue + '\n' - else: - Dec = Dec + ' ' + Value + '\n' - Dec = Dec + '\n' - - return Dec - - ## Transfer to Package Object - # - # Transfer all contents of a Dec file to a standard Package Object - # - def DecToPackage(self): - # Init global information for the file - ContainerFile = self.Identification.FullPath - - # Generate Package Header - self.GenPackageHeader(ContainerFile) - - # Generate Includes - # Only for Edk - self.GenIncludes(ContainerFile) - - # Generate Guids - self.GenGuidProtocolPpis(DataType.TAB_GUIDS, ContainerFile) - - # Generate Protocols - self.GenGuidProtocolPpis(DataType.TAB_PROTOCOLS, ContainerFile) - - # Generate Ppis - self.GenGuidProtocolPpis(DataType.TAB_PPIS, ContainerFile) - - # Generate LibraryClasses - self.GenLibraryClasses(ContainerFile) - - # Generate Pcds - self.GenPcds(ContainerFile) - - # Init MiscFiles - self.GenMiscFiles(ContainerFile) - - ## GenMiscFiles - # - def GenMiscFiles(self, ContainerFile): - MiscFiles = MiscFileClass() - MiscFiles.Name = 'ModuleFiles' - for Item in GetFiles(os.path.dirname(ContainerFile), ['CVS', '.svn'], False): - File = CommonClass.FileClass() - File.Filename = Item - MiscFiles.Files.append(File) - self.Package.MiscFiles = MiscFiles - - ## Get Package Header - # - # Gen Package Header of Dec as = - # - # @param ContainerFile: The Dec file full path - # - def GenPackageHeader(self, ContainerFile): - EdkLogger.debug(2, "Generate PackageHeader ...") - # - # Update all defines item in database - # - RecordSet = self.RecordSet[MODEL_META_DATA_HEADER] - PackageHeader = PackageHeaderClass() - OtherDefines = [] - for Record in RecordSet: - ValueList = GetSplitValueList(Record[0], TAB_EQUAL_SPLIT) - if len(ValueList) != 2: - OtherDefines.append(Record[0]) - else: - Name = ValueList[0] - Value = ValueList[1] - if Name == TAB_DEC_DEFINES_PACKAGE_NAME: - PackageHeader.Name = Value - elif Name == TAB_DEC_DEFINES_PACKAGE_GUID: - PackageHeader.Guid = Value - elif Name == TAB_DEC_DEFINES_PACKAGE_VERSION: - PackageHeader.Version = Value - elif Name == TAB_DEC_DEFINES_DEC_SPECIFICATION: - PackageHeader.DecSpecification = Value - else: - OtherDefines.append(Record[0]) - - PackageHeader.FileName = self.Identification.FileName - PackageHeader.FullPath = self.Identification.FullPath - PackageHeader.RelaPath = self.Identification.RelaPath - PackageHeader.PackagePath = self.Identification.PackagePath - PackageHeader.ModulePath = self.Identification.ModulePath - PackageHeader.CombinePath = os.path.normpath(os.path.join(PackageHeader.PackagePath, PackageHeader.ModulePath, PackageHeader.FileName)) - - if MODEL_META_DATA_HEADER in self.SectionHeaderCommentDict: - PackageHeader.Description = self.SectionHeaderCommentDict[MODEL_META_DATA_HEADER] - - self.Package.PackageHeader = PackageHeader - UE = UserExtensionsClass() - UE.Defines = OtherDefines - self.Package.UserExtensions = UE - - - ## GenIncludes - # - # Gen Includes of Dec - # - # @param ContainerFile: The Dec file full path - # - def GenIncludes(self, ContainerFile): - EdkLogger.debug(2, "Generate %s ..." % TAB_INCLUDES) - Includes = {} - # Get all Includes - RecordSet = self.RecordSet[MODEL_EFI_INCLUDE] - - # Go through each arch - for Record in RecordSet: - Arch = Record[1] - Key = Record[0] - Include = IncludeClass() - Include.FilePath = NormPath(Key) - Include.SupArchList = Arch - self.Package.Includes.append(Include) - - ## GenPpis - # - # Gen Ppis of Dec - # = - # - # @param ContainerFile: The Dec file full path - # - def GenGuidProtocolPpis(self, Type, ContainerFile): - EdkLogger.debug(2, "Generate %s ..." % Type) - Lists = {} - # Get all Items - RecordSet = self.RecordSet[Section[Type.upper()]] - - # Go through each arch - for Record in RecordSet: - Arch = Record[1] - (Name, Value) = GetGuidsProtocolsPpisOfDec(Record[0], Type, ContainerFile, Record[2]) - - ListMember = None - if Type == TAB_GUIDS: - ListMember = self.Package.GuidDeclarations - elif Type == TAB_PROTOCOLS: - ListMember = self.Package.ProtocolDeclarations - elif Type == TAB_PPIS: - ListMember = self.Package.PpiDeclarations - - ListClass = GuidProtocolPpiCommonClass() - ListClass.CName = Name - ListClass.Guid = Value - ListClass.SupArchList = Arch - ListMember.append(ListClass) - - ## GenLibraryClasses - # - # Gen LibraryClasses of Dec - # = - # - # @param ContainerFile: The Dec file full path - # - def GenLibraryClasses(self, ContainerFile): - EdkLogger.debug(2, "Generate %s ..." % TAB_LIBRARY_CLASSES) - LibraryClasses = {} - # Get all Guids - RecordSet = self.RecordSet[MODEL_EFI_LIBRARY_CLASS] - - # Go through each arch - for Record in RecordSet: - Arch = Record[1] - List = GetSplitValueList(Record[0], DataType.TAB_VALUE_SPLIT) - if len(List) != 2: - continue - LibraryClass = LibraryClassClass() - LibraryClass.LibraryClass = List[0] - LibraryClass.RecommendedInstance = NormPath(List[1]) - LibraryClass.SupArchList = Arch - self.Package.LibraryClassDeclarations.append(LibraryClass) - - def AddPcd(self, CName, Token, TokenSpaceGuidCName, DatumType, DefaultValue, ItemType, Arch): - Pcd = CommonClass.PcdClass() - Pcd.CName = CName - Pcd.Token = Token - Pcd.TokenSpaceGuidCName = TokenSpaceGuidCName - Pcd.DatumType = DatumType - Pcd.DefaultValue = DefaultValue - Pcd.ItemType = ItemType - Pcd.SupArchList = Arch - self.Package.PcdDeclarations.append(Pcd) - - ## GenPcds - # - # Gen Pcds of Dec - # .||| - # - # @param ContainerFile: The Dec file full path - # - def GenPcds(self, ContainerFile): - EdkLogger.debug(2, "Generate %s ..." % TAB_PCDS) - Pcds = {} - PcdToken = {} - # Get all Pcds - RecordSet1 = self.RecordSet[MODEL_PCD_FIXED_AT_BUILD] - RecordSet2 = self.RecordSet[MODEL_PCD_PATCHABLE_IN_MODULE] - RecordSet3 = self.RecordSet[MODEL_PCD_FEATURE_FLAG] - RecordSet4 = self.RecordSet[MODEL_PCD_DYNAMIC_EX] - RecordSet5 = self.RecordSet[MODEL_PCD_DYNAMIC] - - # Go through each pcd - for Record in RecordSet1: - Arch = Record[1] - (TokenGuidCName, TokenName, DefaultValue, DatumType, Token, ItemType) = GetPcdOfDec(Record[0], TAB_PCDS_FIXED_AT_BUILD, ContainerFile, Record[2]) - self.AddPcd(TokenName, Token, TokenGuidCName, DatumType, DefaultValue, ItemType, Arch) - for Record in RecordSet2: - Arch = Record[1] - (TokenGuidCName, TokenName, DefaultValue, DatumType, Token, ItemType) = GetPcdOfDec(Record[0], TAB_PCDS_PATCHABLE_IN_MODULE, ContainerFile, Record[2]) - self.AddPcd(TokenName, Token, TokenGuidCName, DatumType, DefaultValue, ItemType, Arch) - for Record in RecordSet3: - Arch = Record[1] - (TokenGuidCName, TokenName, DefaultValue, DatumType, Token, ItemType) = GetPcdOfDec(Record[0], TAB_PCDS_FEATURE_FLAG, ContainerFile, Record[2]) - self.AddPcd(TokenName, Token, TokenGuidCName, DatumType, DefaultValue, ItemType, Arch) - for Record in RecordSet4: - Arch = Record[1] - (TokenGuidCName, TokenName, DefaultValue, DatumType, Token, ItemType) = GetPcdOfDec(Record[0], TAB_PCDS_DYNAMIC_EX, ContainerFile, Record[2]) - self.AddPcd(TokenName, Token, TokenGuidCName, DatumType, DefaultValue, ItemType, Arch) - for Record in RecordSet5: - Arch = Record[1] - (TokenGuidCName, TokenName, DefaultValue, DatumType, Token, ItemType) = GetPcdOfDec(Record[0], TAB_PCDS_DYNAMIC, ContainerFile, Record[2]) - self.AddPcd(TokenName, Token, TokenGuidCName, DatumType, DefaultValue, ItemType, Arch) - - ## Show detailed information of Package - # - # Print all members and their values of Package class - # - def ShowPackage(self): - M = self.Package - print 'Filename =', M.PackageHeader.FileName - print 'FullPath =', M.PackageHeader.FullPath - print 'RelaPath =', M.PackageHeader.RelaPath - print 'PackagePath =', M.PackageHeader.PackagePath - print 'ModulePath =', M.PackageHeader.ModulePath - print 'CombinePath =', M.PackageHeader.CombinePath - - print 'BaseName =', M.PackageHeader.Name - print 'Guid =', M.PackageHeader.Guid - print 'Version =', M.PackageHeader.Version - print 'DecSpecification =', M.PackageHeader.DecSpecification - - print '\nIncludes ='#, M.Includes - for Item in M.Includes: - print Item.FilePath, Item.SupArchList - print '\nGuids ='#, M.GuidDeclarations - for Item in M.GuidDeclarations: - print Item.CName, Item.Guid, Item.SupArchList - print '\nProtocols ='#, M.ProtocolDeclarations - for Item in M.ProtocolDeclarations: - print Item.CName, Item.Guid, Item.SupArchList - print '\nPpis ='#, M.PpiDeclarations - for Item in M.PpiDeclarations: - print Item.CName, Item.Guid, Item.SupArchList - print '\nLibraryClasses ='#, M.LibraryClassDeclarations - for Item in M.LibraryClassDeclarations: - print Item.LibraryClass, Item.RecommendedInstance, Item.SupModuleList, Item.SupArchList - print '\nPcds ='#, M.PcdDeclarations - for Item in M.PcdDeclarations: - print 'CName=', Item.CName, 'TokenSpaceGuidCName=', Item.TokenSpaceGuidCName, 'DefaultValue=', Item.DefaultValue, 'ItemType=', Item.ItemType, 'Token=', Item.Token, 'DatumType=', Item.DatumType, Item.SupArchList - print '\nUserExtensions =', M.UserExtensions.Defines - print '\n*** FileList ***' - for Item in M.MiscFiles.Files: - print Item.Filename - print '****************\n' - -## -# -# This acts like the main() function for the script, unless it is 'import'ed into another -# script. -# -if __name__ == '__main__': - EdkLogger.Initialize() - EdkLogger.SetLevel(EdkLogger.QUIET) - - W = os.getenv('WORKSPACE') - F = os.path.join(W, 'MdeModulePkg/MdeModulePkg.dec') - - P = Dec(os.path.normpath(F), True, W) - P.ShowPackage() - print P.PackageToDec(P.Package) diff --git a/BaseTools/Source/Python/Common/InfClassObjectLight.py b/BaseTools/Source/Python/Common/InfClassObjectLight.py deleted file mode 100644 index 44f922340b..0000000000 --- a/BaseTools/Source/Python/Common/InfClassObjectLight.py +++ /dev/null @@ -1,877 +0,0 @@ -## @file -# This file is used to define each component of INF file -# -# Copyright (c) 2007 - 2010, 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 -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# - -## -# Import Modules -# -import os -import re -import EdkLogger - -from CommonDataClass.ModuleClass import * -from CommonDataClass import CommonClass -from String import * -from DataType import * -from BuildToolError import * -from Misc import sdict -from Misc import GetFiles -from Parsing import * - -# Global variable -Section = {TAB_UNKNOWN.upper() : MODEL_UNKNOWN, - TAB_INF_DEFINES.upper() : MODEL_META_DATA_HEADER, - TAB_BUILD_OPTIONS.upper() : MODEL_META_DATA_BUILD_OPTION, - TAB_INCLUDES.upper() : MODEL_EFI_INCLUDE, - TAB_LIBRARIES.upper() : MODEL_EFI_LIBRARY_INSTANCE, - TAB_LIBRARY_CLASSES.upper() : MODEL_EFI_LIBRARY_CLASS, - TAB_PACKAGES.upper() : MODEL_META_DATA_PACKAGE, - TAB_NMAKE.upper() : MODEL_META_DATA_NMAKE, - TAB_INF_FIXED_PCD.upper() : MODEL_PCD_FIXED_AT_BUILD, - TAB_INF_PATCH_PCD.upper() : MODEL_PCD_PATCHABLE_IN_MODULE, - TAB_INF_FEATURE_PCD.upper() : MODEL_PCD_FEATURE_FLAG, - TAB_INF_PCD_EX.upper() : MODEL_PCD_DYNAMIC_EX, - TAB_INF_PCD.upper() : MODEL_PCD_DYNAMIC, - TAB_SOURCES.upper() : MODEL_EFI_SOURCE_FILE, - TAB_GUIDS.upper() : MODEL_EFI_GUID, - TAB_PROTOCOLS.upper() : MODEL_EFI_PROTOCOL, - TAB_PPIS.upper() : MODEL_EFI_PPI, - TAB_DEPEX.upper() : MODEL_EFI_DEPEX, - TAB_BINARIES.upper() : MODEL_EFI_BINARY_FILE, - TAB_USER_EXTENSIONS.upper() : MODEL_META_DATA_USER_EXTENSION - } - -gComponentType2ModuleType = { - "LIBRARY" : "BASE", - "SECURITY_CORE" : "SEC", - "PEI_CORE" : "PEI_CORE", - "COMBINED_PEIM_DRIVER" : "PEIM", - "PIC_PEIM" : "PEIM", - "RELOCATABLE_PEIM" : "PEIM", - "PE32_PEIM" : "PEIM", - "BS_DRIVER" : "DXE_DRIVER", - "RT_DRIVER" : "DXE_RUNTIME_DRIVER", - "SAL_RT_DRIVER" : "DXE_SAL_DRIVER", - "APPLICATION" : "UEFI_APPLICATION", - "LOGO" : "BASE", -} - -class InfHeader(ModuleHeaderClass): - _Mapping_ = { - # Required Fields - TAB_INF_DEFINES_BASE_NAME : "Name", - TAB_INF_DEFINES_FILE_GUID : "Guid", - TAB_INF_DEFINES_MODULE_TYPE : "ModuleType", - TAB_INF_DEFINES_EFI_SPECIFICATION_VERSION : "UefiSpecificationVersion", - TAB_INF_DEFINES_UEFI_SPECIFICATION_VERSION : "UefiSpecificationVersion", - TAB_INF_DEFINES_EDK_RELEASE_VERSION : "EdkReleaseVersion", - - # Optional Fields - TAB_INF_DEFINES_INF_VERSION : "InfVersion", - TAB_INF_DEFINES_BINARY_MODULE : "BinaryModule", - TAB_INF_DEFINES_COMPONENT_TYPE : "ComponentType", - TAB_INF_DEFINES_MAKEFILE_NAME : "MakefileName", - TAB_INF_DEFINES_BUILD_NUMBER : "BuildNumber", - TAB_INF_DEFINES_BUILD_TYPE : "BuildType", - TAB_INF_DEFINES_FFS_EXT : "FfsExt", - TAB_INF_DEFINES_FV_EXT : "FvExt", - TAB_INF_DEFINES_SOURCE_FV : "SourceFv", - TAB_INF_DEFINES_VERSION_NUMBER : "VersionNumber", - TAB_INF_DEFINES_VERSION_STRING : "VersionString", - TAB_INF_DEFINES_VERSION : "Version", - TAB_INF_DEFINES_PCD_IS_DRIVER : "PcdIsDriver", - TAB_INF_DEFINES_TIANO_EDK_FLASHMAP_H : "TianoEdkFlashMap_h", - TAB_INF_DEFINES_SHADOW : "Shadow", - } - - def __init__(self): - ModuleHeaderClass.__init__(self) - self.VersionNumber = '' - self.VersionString = '' - #print self.__dict__ - def __setitem__(self, key, value): - self.__dict__[self._Mapping_[key]] = value - def __getitem__(self, key): - return self.__dict__[self._Mapping_[key]] - ## "in" test support - def __contains__(self, key): - return key in self._Mapping_ - -## InfObject -# -# This class defined basic Inf object which is used by inheriting -# -# @param object: Inherited from object class -# -class InfObject(object): - def __init__(self): - object.__init__() - -## Inf -# -# This class defined the structure used in Inf object -# -# @param InfObject: Inherited from InfObject class -# @param Ffilename: Input value for Ffilename of Inf file, default is None -# @param IsMergeAllArches: Input value for IsMergeAllArches -# True is to merge all arches -# Fales is not to merge all arches -# default is False -# @param IsToModule: Input value for IsToModule -# True is to transfer to ModuleObject automatically -# False is not to transfer to ModuleObject automatically -# default is False -# @param WorkspaceDir: Input value for current workspace directory, default is None -# -# @var Identification: To store value for Identification, it is a structure as Identification -# @var UserExtensions: To store value for UserExtensions -# @var Module: To store value for Module, it is a structure as ModuleClass -# @var WorkspaceDir: To store value for WorkspaceDir -# @var KeyList: To store value for KeyList, a list for all Keys used in Inf -# -class Inf(InfObject): - def __init__(self, Filename=None, IsToModule=False, WorkspaceDir=None, PackageDir=None, SupArchList=DataType.ARCH_LIST): - self.Identification = IdentificationClass() - self.Module = ModuleClass() - self.WorkspaceDir = WorkspaceDir - self.PackageDir = PackageDir - self.SupArchList = SupArchList - - self.KeyList = [ - TAB_SOURCES, TAB_BUILD_OPTIONS, TAB_BINARIES, TAB_INCLUDES, TAB_GUIDS, - TAB_PROTOCOLS, TAB_PPIS, TAB_LIBRARY_CLASSES, TAB_PACKAGES, TAB_INF_FIXED_PCD, - TAB_INF_PATCH_PCD, TAB_INF_FEATURE_PCD, TAB_INF_PCD, TAB_INF_PCD_EX, - TAB_DEPEX, TAB_INF_DEFINES - ] - # Upper all KEYs to ignore case sensitive when parsing - self.KeyList = map(lambda c: c.upper(), self.KeyList) - - # Init RecordSet - self.RecordSet = {} - for Key in self.KeyList: - self.RecordSet[Section[Key]] = [] - - # Init Comment - self.SectionHeaderCommentDict = {} - - # Load Inf file if filename is not None - if Filename != None: - self.LoadInfFile(Filename) - - # Transfer to Module Object if IsToModule is True - if IsToModule: - self.InfToModule() - - ## Module Object to INF file - def ModuleToInf(self, Module): - Inf = '' - InfList = sdict() - SectionHeaderCommentDict = {} - if Module == None: - return Inf - - ModuleHeader = Module.ModuleHeader - TmpList = [] - # Common define items - if ModuleHeader.Name: - TmpList.append(TAB_INF_DEFINES_BASE_NAME + ' = ' + ModuleHeader.Name) - if ModuleHeader.Guid: - TmpList.append(TAB_INF_DEFINES_FILE_GUID + ' = ' + ModuleHeader.Guid) - if ModuleHeader.Version: - TmpList.append(TAB_INF_DEFINES_VERSION_STRING + ' = ' + ModuleHeader.Version) - if ModuleHeader.ModuleType: - TmpList.append(TAB_INF_DEFINES_MODULE_TYPE + ' = ' + ModuleHeader.ModuleType) - if ModuleHeader.PcdIsDriver: - TmpList.append(TAB_INF_DEFINES_PCD_IS_DRIVER + ' = ' + ModuleHeader.PcdIsDriver) - # Externs - for Item in Module.Externs: - if Item.EntryPoint: - TmpList.append(TAB_INF_DEFINES_ENTRY_POINT + ' = ' + Item.EntryPoint) - if Item.UnloadImage: - TmpList.append(TAB_INF_DEFINES_UNLOAD_IMAGE + ' = ' + Item.UnloadImage) - if Item.Constructor: - TmpList.append(TAB_INF_DEFINES_CONSTRUCTOR + ' = ' + Item.Constructor) - if Item.Destructor: - TmpList.append(TAB_INF_DEFINES_DESTRUCTOR + ' = ' + Item.Destructor) - # Other define items - if Module.UserExtensions != None: - for Item in Module.UserExtensions.Defines: - TmpList.append(Item) - InfList['Defines'] = TmpList - if ModuleHeader.Description != '': - SectionHeaderCommentDict['Defines'] = ModuleHeader.Description - - if Module.UserExtensions != None: - InfList['BuildOptions'] = Module.UserExtensions.BuildOptions - - for Item in Module.Includes: - Key = 'Includes.' + GetStringOfList(Item.SupArchList) - Value = GetHelpTextList(Item.HelpTextList) - Value.append(Item.FilePath) - GenMetaDatSectionItem(Key, Value, InfList) - - for Item in Module.LibraryClasses: - Key = 'LibraryClasses.' + GetStringOfList(Item.SupArchList) - Value = GetHelpTextList(Item.HelpTextList) - NewValue = Item.LibraryClass - if Item.RecommendedInstance: - NewValue = NewValue + '|' + Item.RecommendedInstance - if Item.FeatureFlag: - NewValue = NewValue + '|' + Item.FeatureFlag - Value.append(NewValue) - GenMetaDatSectionItem(Key, Value, InfList) - - for Item in Module.PackageDependencies: - Key = 'Packages.' + GetStringOfList(Item.SupArchList) - Value = GetHelpTextList(Item.HelpTextList) - Value.append(Item.FilePath) - GenMetaDatSectionItem(Key, Value, InfList) - - for Item in Module.PcdCodes: - Key = 'Pcds' + Item.ItemType + '.' + GetStringOfList(Item.SupArchList) - Value = GetHelpTextList(Item.HelpTextList) - NewValue = Item.TokenSpaceGuidCName + '.' + Item.CName - if Item.DefaultValue != '': - NewValue = NewValue + '|' + Item.DefaultValue - Value.append(NewValue) - GenMetaDatSectionItem(Key, Value, InfList) - - for Item in Module.Sources: - Key = 'Sources.' + GetStringOfList(Item.SupArchList) - Value = GetHelpTextList(Item.HelpTextList) - NewValue = Item.SourceFile - if Item.ToolChainFamily != '': - NewValue = NewValue + '|' + Item.ToolChainFamily - if Item.TagName != '': - NewValue = NewValue + '|' + Item.TagName - if Item.ToolCode != '': - NewValue = NewValue + '|' + Item.ToolCode - if Item.FeatureFlag != '': - NewValue = NewValue + '|' + Item.FeatureFlag - Value.append(NewValue) - if Item.HelpText != '': - SectionHeaderCommentDict[Key] = Item.HelpText - GenMetaDatSectionItem(Key, Value, InfList) - - for Item in Module.Guids: - Key = 'Guids.' + GetStringOfList(Item.SupArchList) - Value = GetHelpTextList(Item.HelpTextList) - Value.append(Item.CName) - GenMetaDatSectionItem(Key, Value, InfList) - - for Item in Module.Protocols: - Key = 'Protocols.' + GetStringOfList(Item.SupArchList) - Value = GetHelpTextList(Item.HelpTextList) - Value.append(Item.CName) - GenMetaDatSectionItem(Key, Value, InfList) - - for Item in Module.Ppis: - Key = 'Ppis.' + GetStringOfList(Item.SupArchList) - Value = GetHelpTextList(Item.HelpTextList) - Value.append(Item.CName) - GenMetaDatSectionItem(Key, Value, InfList) - - if Module.PeiDepex: - Key = 'Depex' - Value = Module.PeiDepex.Depex - GenMetaDatSectionItem(Key, Value, InfList) - - if Module.DxeDepex: - Key = 'Depex' - Value = Module.DxeDepex.Depex - GenMetaDatSectionItem(Key, Value, InfList) - - if Module.SmmDepex: - Key = 'Depex' - Value = Module.SmmDepex.Depex - GenMetaDatSectionItem(Key, Value, InfList) - - for Item in Module.Binaries: - Key = 'Binaries.' + GetStringOfList(Item.SupArchList) - Value = GetHelpTextList(Item.HelpTextList) - NewValue = Item.FileType + '|' + Item.BinaryFile + '|' + Item.Target - if Item.FeatureFlag != '': - NewValue = NewValue + '|' + Item.FeatureFlag - Value.append(NewValue) - GenMetaDatSectionItem(Key, Value, InfList) - - # Transfer Module to Inf - for Key in InfList: - if Key in SectionHeaderCommentDict: - List = SectionHeaderCommentDict[Key].split('\r') - for Item in List: - Inf = Inf + Item + '\n' - Inf = Inf + '[' + Key + ']' + '\n' - for Value in InfList[Key]: - if type(Value) == type([]): - for SubValue in Value: - Inf = Inf + ' ' + SubValue + '\n' - else: - Inf = Inf + ' ' + Value + '\n' - Inf = Inf + '\n' - - return Inf - - - ## Transfer to Module Object - # - # Transfer all contents of an Inf file to a standard Module Object - # - def InfToModule(self): - # Init global information for the file - ContainerFile = self.Identification.FullPath - - # Generate Module Header - self.GenModuleHeader(ContainerFile) - - # Generate BuildOptions - self.GenBuildOptions(ContainerFile) - - # Generate Includes - self.GenIncludes(ContainerFile) - - # Generate LibraryClasses - self.GenLibraryClasses(ContainerFile) - - # Generate Packages - self.GenPackages(ContainerFile) - - # Generate Pcds - self.GenPcds(ContainerFile) - - # Generate Sources - self.GenSources(ContainerFile) - - # Generate Guids - self.GenGuidProtocolPpis(DataType.TAB_GUIDS, ContainerFile) - - # Generate Protocols - self.GenGuidProtocolPpis(DataType.TAB_PROTOCOLS, ContainerFile) - - # Generate Ppis - self.GenGuidProtocolPpis(DataType.TAB_PPIS, ContainerFile) - - # Generate Depexes - self.GenDepexes(ContainerFile) - - # Generate Binaries - self.GenBinaries(ContainerFile) - - # Init MiscFiles - self.GenMiscFiles(ContainerFile) - - ## GenMiscFiles - # - def GenMiscFiles(self, ContainerFile): - MiscFiles = MiscFileClass() - MiscFiles.Name = 'ModuleFiles' - for Item in GetFiles(os.path.dirname(ContainerFile), ['CVS', '.svn'], False): - File = CommonClass.FileClass() - File.Filename = Item - MiscFiles.Files.append(File) - self.Module.MiscFiles = MiscFiles - - ## Load Inf file - # - # Load the file if it exists - # - # @param Filename: Input value for filename of Inf file - # - def LoadInfFile(self, Filename): - # Insert a record for file - Filename = NormPath(Filename) - - self.Identification.FullPath = Filename - (self.Identification.RelaPath, self.Identification.FileName) = os.path.split(Filename) - if self.Identification.FullPath.find(self.WorkspaceDir) > -1: - self.Identification.ModulePath = os.path.dirname(self.Identification.FullPath[len(self.WorkspaceDir) + 1:]) - if self.PackageDir: - self.Identification.PackagePath = self.PackageDir - if self.Identification.ModulePath.find(self.PackageDir) == 0: - self.Identification.ModulePath = self.Identification.ModulePath[len(self.PackageDir) + 1:] - - # Init common datas - IfDefList, SectionItemList, CurrentSection, ArchList, ThirdList, IncludeFiles = \ - [], [], TAB_UNKNOWN, [], [], [] - LineNo = 0 - - # Parse file content - IsFindBlockComment = False - ReservedLine = '' - Comment = '' - for Line in open(Filename, 'r'): - LineNo = LineNo + 1 - # Remove comment block - if Line.find(TAB_COMMENT_EDK_START) > -1: - ReservedLine = GetSplitList(Line, TAB_COMMENT_EDK_START, 1)[0] - if ReservedLine.strip().startswith(TAB_COMMENT_SPLIT): - Comment = Comment + Line.strip() + '\n' - ReservedLine = '' - else: - Comment = Comment + Line[len(ReservedLine):] + '\n' - IsFindBlockComment = True - if not ReservedLine: - continue - if Line.find(TAB_COMMENT_EDK_END) > -1: - Comment = Comment + Line[:Line.find(TAB_COMMENT_EDK_END) + len(TAB_COMMENT_EDK_END)] + '\n' - Line = ReservedLine + GetSplitList(Line, TAB_COMMENT_EDK_END, 1)[1] - ReservedLine = '' - IsFindBlockComment = False - if IsFindBlockComment: - Comment = Comment + Line.strip() + '\n' - continue - - # Remove comments at tail and remove spaces again - if Line.strip().startswith(TAB_COMMENT_SPLIT) or Line.strip().startswith('--/'): - Comment = Comment + Line.strip() + '\n' - Line = CleanString(Line) - if Line == '': - continue - - ## Find a new section tab - # First insert previous section items - # And then parse the content of the new section - if Line.startswith(TAB_SECTION_START) and Line.endswith(TAB_SECTION_END): - if Line[1:3] == "--": - continue - Model = Section[CurrentSection.upper()] - # Insert items data of previous section - InsertSectionItems(Model, CurrentSection, SectionItemList, ArchList, ThirdList, self.RecordSet) - - # Parse the new section - SectionItemList = [] - ArchList = [] - ThirdList = [] - - CurrentSection = '' - LineList = GetSplitValueList(Line[len(TAB_SECTION_START):len(Line) - len(TAB_SECTION_END)], TAB_COMMA_SPLIT) - for Item in LineList: - ItemList = GetSplitValueList(Item, TAB_SPLIT) - if CurrentSection == '': - CurrentSection = ItemList[0] - else: - if CurrentSection != ItemList[0]: - EdkLogger.error("Parser", PARSER_ERROR, "Different section names '%s' and '%s' are found in one section definition, this is not allowed." % (CurrentSection, ItemList[0]), File=Filename, Line=LineNo, RaiseError=EdkLogger.IsRaiseError) - if CurrentSection.upper() not in self.KeyList: - RaiseParserError(Line, CurrentSection, Filename, '', LineNo) - ItemList.append('') - ItemList.append('') - if len(ItemList) > 5: - RaiseParserError(Line, CurrentSection, Filename, '', LineNo) - else: - if ItemList[1] != '' and ItemList[1].upper() not in ARCH_LIST_FULL: - EdkLogger.error("Parser", PARSER_ERROR, "Invalid Arch definition '%s' found" % ItemList[1], File=Filename, Line=LineNo, RaiseError=EdkLogger.IsRaiseError) - ArchList.append(ItemList[1].upper()) - ThirdList.append(ItemList[2]) - - if Comment: - if Comment.endswith('\n'): - Comment = Comment[:len(Comment) - len('\n')] - self.SectionHeaderCommentDict[Section[CurrentSection.upper()]] = Comment - Comment = '' - continue - - # Not in any defined section - if CurrentSection == TAB_UNKNOWN: - ErrorMsg = "%s is not in any defined section" % Line - EdkLogger.error("Parser", PARSER_ERROR, ErrorMsg, File=Filename, Line=LineNo, RaiseError=EdkLogger.IsRaiseError) - - # Add a section item - SectionItemList.append([Line, LineNo, Comment]) - Comment = '' - # End of parse - #End of For - - # Insert items data of last section - Model = Section[CurrentSection.upper()] - InsertSectionItems(Model, CurrentSection, SectionItemList, ArchList, ThirdList, self.RecordSet) - if Comment != '': - self.SectionHeaderCommentDict[Model] = Comment - Comment = '' - - ## Show detailed information of Module - # - # Print all members and their values of Module class - # - def ShowModule(self): - M = self.Module - print 'Filename =', M.ModuleHeader.FileName - print 'FullPath =', M.ModuleHeader.FullPath - print 'RelaPath =', M.ModuleHeader.RelaPath - print 'PackagePath =', M.ModuleHeader.PackagePath - print 'ModulePath =', M.ModuleHeader.ModulePath - print 'CombinePath =', M.ModuleHeader.CombinePath - - print 'BaseName =', M.ModuleHeader.Name - print 'Guid =', M.ModuleHeader.Guid - print 'Version =', M.ModuleHeader.Version - - print '\nIncludes =' - for Item in M.Includes: - print Item.FilePath, Item.SupArchList - print '\nLibraryClasses =' - for Item in M.LibraryClasses: - print Item.LibraryClass, Item.RecommendedInstance, Item.RecommendedInstanceGuid, Item.RecommendedInstanceVersion, Item.FeatureFlag, Item.SupModuleList, Item.SupArchList, Item.Define - print '\nPackageDependencies =' - for Item in M.PackageDependencies: - print Item.FilePath, Item.SupArchList, Item.FeatureFlag - print '\nPcds =' - for Item in M.PcdCodes: - print '\tCName=', Item.CName, 'TokenSpaceGuidCName=', Item.TokenSpaceGuidCName, 'DefaultValue=', Item.DefaultValue, 'ItemType=', Item.ItemType, Item.SupArchList - print '\nSources =' - for Source in M.Sources: - print Source.SourceFile, 'Fam=', Source.ToolChainFamily, 'Pcd=', Source.FeatureFlag, 'Tag=', Source.TagName, 'ToolCode=', Source.ToolCode, Source.SupArchList - print '\nGuids =' - for Item in M.Guids: - print Item.CName, Item.SupArchList, Item.FeatureFlag - print '\nProtocols =' - for Item in M.Protocols: - print Item.CName, Item.SupArchList, Item.FeatureFlag - print '\nPpis =' - for Item in M.Ppis: - print Item.CName, Item.SupArchList, Item.FeatureFlag - print '\nDepex =' - for Item in M.Depex: - print Item.Depex, Item.SupArchList, Item.Define - print '\nBinaries =' - for Binary in M.Binaries: - print 'Type=', Binary.FileType, 'Target=', Binary.Target, 'Name=', Binary.BinaryFile, 'FeatureFlag=', Binary.FeatureFlag, 'SupArchList=', Binary.SupArchList - print '\n*** FileList ***' - for Item in M.MiscFiles.Files: - print Item.Filename - print '****************\n' - - ## Convert [Defines] section content to ModuleHeaderClass - # - # Convert [Defines] section content to ModuleHeaderClass - # - # @param Defines The content under [Defines] section - # @param ModuleHeader An object of ModuleHeaderClass - # @param Arch The supported ARCH - # - def GenModuleHeader(self, ContainerFile): - EdkLogger.debug(2, "Generate ModuleHeader ...") - # Update all defines item in database - RecordSet = self.RecordSet[MODEL_META_DATA_HEADER] - - ModuleHeader = ModuleHeaderClass() - ModuleExtern = ModuleExternClass() - OtherDefines = [] - for Record in RecordSet: - ValueList = GetSplitValueList(Record[0], TAB_EQUAL_SPLIT) - if len(ValueList) != 2: - OtherDefines.append(Record[0]) - else: - Name = ValueList[0] - Value = ValueList[1] - if Name == TAB_INF_DEFINES_BASE_NAME: - ModuleHeader.Name = Value - ModuleHeader.BaseName = Value - elif Name == TAB_INF_DEFINES_FILE_GUID: - ModuleHeader.Guid = Value - elif Name == TAB_INF_DEFINES_VERSION_STRING: - ModuleHeader.Version = Value - elif Name == TAB_INF_DEFINES_PCD_IS_DRIVER: - ModuleHeader.PcdIsDriver = Value - elif Name == TAB_INF_DEFINES_MODULE_TYPE: - ModuleHeader.ModuleType = Value - elif Name in (TAB_INF_DEFINES_UEFI_SPECIFICATION_VERSION, TAB_INF_DEFINES_UEFI_SPECIFICATION_VERSION): - ModuleHeader.UefiSpecificationVersion = Value - elif Name == TAB_INF_DEFINES_PI_SPECIFICATION_VERSION: - ModuleHeader.PiSpecificationVersion = Value - elif Name == TAB_INF_DEFINES_ENTRY_POINT: - ModuleExtern.EntryPoint = Value - elif Name == TAB_INF_DEFINES_UNLOAD_IMAGE: - ModuleExtern.UnloadImage = Value - elif Name == TAB_INF_DEFINES_CONSTRUCTOR: - ModuleExtern.Constructor = Value - elif Name == TAB_INF_DEFINES_DESTRUCTOR: - ModuleExtern.Destructor = Value - else: - OtherDefines.append(Record[0]) - ModuleHeader.FileName = self.Identification.FileName - ModuleHeader.FullPath = self.Identification.FullPath - ModuleHeader.RelaPath = self.Identification.RelaPath - ModuleHeader.PackagePath = self.Identification.PackagePath - ModuleHeader.ModulePath = self.Identification.ModulePath - ModuleHeader.CombinePath = os.path.normpath(os.path.join(ModuleHeader.PackagePath, ModuleHeader.ModulePath, ModuleHeader.FileName)) - - if MODEL_META_DATA_HEADER in self.SectionHeaderCommentDict: - ModuleHeader.Description = self.SectionHeaderCommentDict[MODEL_META_DATA_HEADER] - self.Module.ModuleHeader = ModuleHeader - self.Module.Externs.append(ModuleExtern) - UE = self.Module.UserExtensions - if UE == None: - UE = UserExtensionsClass() - UE.Defines = OtherDefines - self.Module.UserExtensions = UE - - ## GenBuildOptions - # - # Gen BuildOptions of Inf - # [:]=Flag - # - # @param ContainerFile: The Inf file full path - # - def GenBuildOptions(self, ContainerFile): - EdkLogger.debug(2, "Generate %s ..." % TAB_BUILD_OPTIONS) - BuildOptions = {} - # Get all BuildOptions - RecordSet = self.RecordSet[MODEL_META_DATA_BUILD_OPTION] - UE = self.Module.UserExtensions - if UE == None: - UE = UserExtensionsClass() - for Record in RecordSet: - UE.BuildOptions.append(Record[0]) - self.Module.UserExtensions = UE - - ## GenIncludes - # - # Gen Includes of Inf - # - # @param ContainerFile: The Inf file full path - # - def GenIncludes(self, ContainerFile): - EdkLogger.debug(2, "Generate %s ..." % TAB_INCLUDES) - Includes = sdict() - # Get all Includes - RecordSet = self.RecordSet[MODEL_EFI_INCLUDE] - for Record in RecordSet: - Include = IncludeClass() - Include.FilePath = Record[0] - Include.SupArchList = Record[1] - if GenerateHelpText(Record[5], ''): - Include.HelpTextList.append(GenerateHelpText(Record[5], '')) - self.Module.Includes.append(Include) - #self.Module.FileList.extend(GetFiles(os.path.normpath(os.path.join(self.Identification.FileRelativePath, Include.FilePath)), ['CVS', '.svn'])) - - ## GenLibraryClasses - # - # Get LibraryClass of Inf - # | - # - # @param ContainerFile: The Inf file full path - # - def GenLibraryClasses(self, ContainerFile): - EdkLogger.debug(2, "Generate %s ..." % TAB_LIBRARY_CLASSES) - LibraryClasses = {} - # Get all LibraryClasses - RecordSet = self.RecordSet[MODEL_EFI_LIBRARY_CLASS] - for Record in RecordSet: - (LibClassName, LibClassIns, Pcd, SupModelList) = GetLibraryClassOfInf([Record[0], Record[4]], ContainerFile, self.WorkspaceDir, Record[2]) - LibraryClass = CommonClass.LibraryClassClass() - LibraryClass.LibraryClass = LibClassName - LibraryClass.RecommendedInstance = LibClassIns - LibraryClass.FeatureFlag = Pcd - LibraryClass.SupArchList = Record[1] - LibraryClass.SupModuleList = Record[4] - if GenerateHelpText(Record[5], ''): - LibraryClass.HelpTextList.append(GenerateHelpText(Record[5], '')) - self.Module.LibraryClasses.append(LibraryClass) - - ## GenPackages - # - # Gen Packages of Inf - # - # @param ContainerFile: The Inf file full path - # - def GenPackages(self, ContainerFile): - EdkLogger.debug(2, "Generate %s ..." % TAB_PACKAGES) - Packages = {} - # Get all Packages - RecordSet = self.RecordSet[MODEL_META_DATA_PACKAGE] - for Record in RecordSet: - (PackagePath, Pcd) = GetPackage(Record[0], ContainerFile, self.WorkspaceDir, Record[2]) - Package = ModulePackageDependencyClass() - Package.FilePath = NormPath(PackagePath) - Package.SupArchList = Record[1] - Package.FeatureFlag = Pcd - if GenerateHelpText(Record[5], ''): - Package.HelpTextList.append(GenerateHelpText(Record[5], '')) - self.Module.PackageDependencies.append(Package) - - def AddPcd(self, CName, TokenSpaceGuidCName, DefaultValue, ItemType, Arch, HelpTextList): - Pcd = PcdClass() - Pcd.CName = CName - Pcd.TokenSpaceGuidCName = TokenSpaceGuidCName - Pcd.DefaultValue = DefaultValue - Pcd.ItemType = ItemType - Pcd.SupArchList = Arch - if GenerateHelpText(HelpTextList, ''): - Pcd.HelpTextList.append(GenerateHelpText(HelpTextList, '')) - self.Module.PcdCodes.append(Pcd) - - ## GenPcds - # - # Gen Pcds of Inf - # .[|] - # - # @param ContainerFile: The Dec file full path - # - def GenPcds(self, ContainerFile): - EdkLogger.debug(2, "Generate %s ..." % TAB_PCDS) - Pcds = {} - PcdToken = {} - - # Get all Pcds - RecordSet1 = self.RecordSet[MODEL_PCD_FIXED_AT_BUILD] - RecordSet2 = self.RecordSet[MODEL_PCD_PATCHABLE_IN_MODULE] - RecordSet3 = self.RecordSet[MODEL_PCD_FEATURE_FLAG] - RecordSet4 = self.RecordSet[MODEL_PCD_DYNAMIC_EX] - RecordSet5 = self.RecordSet[MODEL_PCD_DYNAMIC] - - # Go through each arch - for Record in RecordSet1: - (TokenSpaceGuidCName, TokenName, Value, Type) = GetPcdOfInf(Record[0], TAB_PCDS_FIXED_AT_BUILD, ContainerFile, Record[2]) - self.AddPcd(TokenName, TokenSpaceGuidCName, Value, Type, Record[1], Record[5]) - for Record in RecordSet2: - (TokenSpaceGuidCName, TokenName, Value, Type) = GetPcdOfInf(Record[0], TAB_PCDS_PATCHABLE_IN_MODULE, ContainerFile, Record[2]) - self.AddPcd(TokenName, TokenSpaceGuidCName, Value, Type, Record[1], Record[5]) - for Record in RecordSet3: - (TokenSpaceGuidCName, TokenName, Value, Type) = GetPcdOfInf(Record[0], TAB_PCDS_FEATURE_FLAG, ContainerFile, Record[2]) - self.AddPcd(TokenName, TokenSpaceGuidCName, Value, Type, Record[1], Record[5]) - for Record in RecordSet4: - (TokenSpaceGuidCName, TokenName, Value, Type) = GetPcdOfInf(Record[0], TAB_PCDS_DYNAMIC_EX, ContainerFile, Record[2]) - self.AddPcd(TokenName, TokenSpaceGuidCName, Value, Type, Record[1], Record[5]) - for Record in RecordSet5: - (TokenSpaceGuidCName, TokenName, Value, Type) = GetPcdOfInf(Record[0], '', ContainerFile, Record[2]) - self.AddPcd(TokenName, TokenSpaceGuidCName, Value, Type, Record[1], Record[5]) - - ## GenSources - # - # Gen Sources of Inf - # [|[|[|[|]]]] - # - # @param ContainerFile: The Dec file full path - # - def GenSources(self, ContainerFile): - EdkLogger.debug(2, "Generate %s ..." % TAB_SOURCES) - Sources = {} - - # Get all Sources - RecordSet = self.RecordSet[MODEL_EFI_SOURCE_FILE] - for Record in RecordSet: - (Filename, Family, TagName, ToolCode, Pcd) = GetSource(Record[0], ContainerFile, self.Identification.RelaPath, Record[2]) - Source = ModuleSourceFileClass(Filename, TagName, ToolCode, Family, Pcd, Record[1]) - if GenerateHelpText(Record[5], ''): - Source.HelpTextList.append(GenerateHelpText(Record[5], '')) - if MODEL_EFI_SOURCE_FILE in self.SectionHeaderCommentDict: - Source.HelpText = self.SectionHeaderCommentDict[MODEL_EFI_SOURCE_FILE] - self.Module.Sources.append(Source) - #self.Module.FileList.append(os.path.normpath(os.path.join(self.Identification.RelaPath, Filename))) - - ## GenDepexes - # - # Gen Depex of Inf - # - # @param ContainerFile: The Inf file full path - # - def GenDepexes(self, ContainerFile): - EdkLogger.debug(2, "Generate %s ..." % TAB_DEPEX) - Depex = {} - # Get all Depexes - RecordSet = self.RecordSet[MODEL_EFI_DEPEX] - DepexString = '' - for Record in RecordSet: - DepexString = DepexString + Record[0] + '\n' - Dep = ModuleDepexClass() - if DepexString.endswith('\n'): - DepexString = DepexString[:len(DepexString) - len('\n')] - Dep.Depex = DepexString - if self.Module.ModuleHeader.ModuleType in ['DXE_SMM_DRIVER']: - self.Module.SmmDepex = Dep - elif self.Module.ModuleHeader.ModuleType in ['PEI_CORE', 'PEIM']: - self.Module.PeiDepex = Dep - else: - self.Module.DxeDepex = Dep -# for Record in RecordSet: -# -# Dep = ModuleDepexClass() -# Dep.Depex = Record[0] -# Dep.SupArchList = Record[1] -# if GenerateHelpText(Record[5], ''): -# Dep.HelpTextList.append(GenerateHelpText(Record[5], '')) -# DepexString = DepexString + Dep -# List.append(Dep) -# self.Module.Depex = List -# if self.Module.ModuleHeader.ModuleType in ['DXE_SMM_DRIVER']: -# self.Module.SmmDepex = List -# elif self.Module.ModuleHeader.ModuleType in ['PEI_CORE', 'PEIM']: -# self.Module.PeiDepex = List -# else: -# self.Module.DxeDepex = List - - ## GenBinaries - # - # Gen Binary of Inf - # ||[|.] - # - # @param ContainerFile: The Dec file full path - # - def GenBinaries(self, ContainerFile): - EdkLogger.debug(2, "Generate %s ..." % TAB_BINARIES) - Binaries = {} - - # Get all Guids - RecordSet = self.RecordSet[MODEL_EFI_BINARY_FILE] - for Record in RecordSet: - (FileType, Filename, Target, Pcd) = GetBinary(Record[0], ContainerFile, self.Identification.RelaPath, Record[2]) - Binary = ModuleBinaryFileClass(Filename, FileType, Target, Pcd, Record[1]) - if GenerateHelpText(Record[5], ''): - Binary.HelpTextList.append(GenerateHelpText(Record[5], '')) - self.Module.Binaries.append(Binary) - #self.Module.FileList.append(os.path.normpath(os.path.join(self.Identification.RelaPath, Filename))) - - ## GenGuids - # - # Gen Guids of Inf - # = - # - # @param ContainerFile: The Inf file full path - # - def GenGuidProtocolPpis(self, Type, ContainerFile): - EdkLogger.debug(2, "Generate %s ..." % Type) - Lists = {} - # Get all Items - if Type == TAB_GUIDS: - ListMember = self.Module.Guids - elif Type == TAB_PROTOCOLS: - ListMember = self.Module.Protocols - elif Type == TAB_PPIS: - ListMember = self.Module.Ppis - - RecordSet = self.RecordSet[Section[Type.upper()]] - for Record in RecordSet: - (Name, Value) = GetGuidsProtocolsPpisOfInf(Record[0], Type, ContainerFile, Record[2]) - ListClass = GuidProtocolPpiCommonClass() - ListClass.CName = Name - ListClass.SupArchList = Record[1] - ListClass.FeatureFlag = Value - if GenerateHelpText(Record[5], ''): - ListClass.HelpTextList.append(GenerateHelpText(Record[5], '')) - ListMember.append(ListClass) - -## -# -# This acts like the main() function for the script, unless it is 'import'ed into another -# script. -# -if __name__ == '__main__': - EdkLogger.Initialize() - EdkLogger.SetLevel(EdkLogger.QUIET) - - W = os.getenv('WORKSPACE') - F = os.path.join(W, 'MdeModulePkg/Application/HelloWorld/HelloWorld.inf') - - P = Inf(os.path.normpath(F), True, W, 'MdeModulePkg') - P.ShowModule() - print P.ModuleToInf(P.Module) diff --git a/BaseTools/Source/Python/Common/XmlParser.py b/BaseTools/Source/Python/Common/XmlParser.py deleted file mode 100644 index dcafb5f156..0000000000 --- a/BaseTools/Source/Python/Common/XmlParser.py +++ /dev/null @@ -1,1754 +0,0 @@ -## @file -# This file is used to parse a xml file of .PKG file -# -# Copyright (c) 2008, 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 -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# - -## -# Import Modules -# -from xml.dom import minidom -from XmlRoutines import * -from CommonDataClass.DistributionPackageClass import * -from CommonDataClass.PackageClass import * -from CommonDataClass.ModuleClass import * -from Common.String import GetStringOfList - -# -# Get Help Text -# -def GetHelpTextList(HelpText): - HelpTextList = [] - for HT in HelpText: - HelpTextObj = HelpTextClass() - HelpTextObj.Lang = HT.Lang - HelpTextObj.String = HT.HelpText - HelpTextList.append(HelpTextObj) - return HelpTextList - -# HeaderXml -class HeaderXml(object): - def __init__(self): - self.Name = '' - self.BaseName = '' - self.GUID = '' - self.Version = '' - self.Copyright = '' - self.License = '' - self.Abstract = '' - self.Description = '' - - def FromXml(self, Item, Key): - self.Name = XmlElement(Item, '%s/Name' % Key) - self.BaseName = XmlAttribute(XmlNode(Item, '%s/Name' % Key), 'BaseName') - self.GUID = XmlElement(Item, '%s/GUID' % Key) - self.Version = XmlAttribute(XmlNode(Item, '%s/GUID' % Key), 'Version') - self.Copyright = XmlElement(Item, '%s/Copyright' % Key) - self.License = XmlElement(Item, '%s/License' % Key) - self.Abstract = XmlElement(Item, '%s/Abstract' % Key) - self.Description = XmlElement(Item, '%s/Description' % Key) - - ModuleHeader = ModuleHeaderClass() - ModuleHeader.Name = self.Name - ModuleHeader.BaseName = self.BaseName - ModuleHeader.Guid = self.GUID - ModuleHeader.Version = self.Version - ModuleHeader.Copyright = self.Copyright - ModuleHeader.License = self.License - ModuleHeader.Abstract = self.Abstract - ModuleHeader.Description = self.Description - - return ModuleHeader - - def ToXml(self, Header, Key): - Element1 = CreateXmlElement('Name', Header.Name, [], [['BaseName', Header.BaseName]]) - Element2 = CreateXmlElement('GUID', Header.Guid, [], [['Version', Header.Version]]) - AttributeList = [] - NodeList = [Element1, - Element2, - ['Abstract', Header.Abstract], - ['Copyright', Header.Copyright], - ['License', Header.License], - ['Description', Header.Description], - ] - Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList) - - return Root - - def __str__(self): - return "Name = %s BaseName = %s GUID = %s Version = %s Copyright = %s License = %s Abstract = %s Description = %s" \ - % (self.Name, self.BaseName, self.GUID, self.Version, self.Copyright, self.License, self.Abstract, self.Description) - -# DistributionPackageHeaderXml -class DistributionPackageHeaderXml(object): - def __init__(self): - self.Header = HeaderXml() - self.ReadOnly = False - self.RePackage = True - self.Vendor = '' - self.Date = '' - self.Signature = '' - self.XmlSpecification = '' - - def FromXml(self, Item, Key): - self.ReadOnly = XmlAttribute(XmlNode(Item, '%s' % Key), 'ReadOnly') - self.RePackage = XmlAttribute(XmlNode(Item, '%s' % Key), 'RePackage') - self.Vendor = XmlElement(Item, '%s/Vendor' % Key) - self.Date = XmlElement(Item, '%s/Date' % Key) - self.Signature = XmlElement(Item, '%s/Signature' % Key) - self.XmlSpecification = XmlElement(Item, '%s/XmlSpecification' % Key) - self.Header.FromXml(Item, Key) - - DistributionPackageHeader = DistributionPackageHeaderClass() - DistributionPackageHeader.ReadOnly = self.ReadOnly - DistributionPackageHeader.RePackage = self.RePackage - DistributionPackageHeader.Name = self.Header.Name - DistributionPackageHeader.BaseName = self.Header.BaseName - DistributionPackageHeader.Guid = self.Header.GUID - DistributionPackageHeader.Version = self.Header.Version - DistributionPackageHeader.Vendor = self.Vendor - DistributionPackageHeader.Date = self.Date - DistributionPackageHeader.Copyright = self.Header.Copyright - DistributionPackageHeader.License = self.Header.License - DistributionPackageHeader.Abstract = self.Header.Abstract - DistributionPackageHeader.Description = self.Header.Description - DistributionPackageHeader.Signature = self.Signature - DistributionPackageHeader.XmlSpecification = self.XmlSpecification - - return DistributionPackageHeader - - def ToXml(self, DistributionPackageHeader, Key): - Element1 = CreateXmlElement('Name', DistributionPackageHeader.Name, [], [['BaseName', DistributionPackageHeader.BaseName]]) - Element2 = CreateXmlElement('GUID', DistributionPackageHeader.Guid, [], [['Version', DistributionPackageHeader.Version]]) - AttributeList = [['ReadOnly', str(DistributionPackageHeader.ReadOnly)], ['RePackage', str(DistributionPackageHeader.RePackage)]] - NodeList = [Element1, - Element2, - ['Vendor', DistributionPackageHeader.Vendor], - ['Date', DistributionPackageHeader.Date], - ['Copyright', DistributionPackageHeader.Copyright], - ['License', DistributionPackageHeader.License], - ['Abstract', DistributionPackageHeader.Abstract], - ['Description', DistributionPackageHeader.Description], - ['Signature', DistributionPackageHeader.Signature], - ['XmlSpecification', DistributionPackageHeader.XmlSpecification], - ] - Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList) - - return Root - - def __str__(self): - return "ReadOnly = %s RePackage = %s Vendor = %s Date = %s Signature = %s XmlSpecification = %s %s" \ - % (self.ReadOnly, self.RePackage, self.Vendor, self.Date, self.Signature, self.XmlSpecification, self.Header) - -# PackageHeaderXml -class PackageHeaderXml(object): - def __init__(self): - self.Header = HeaderXml() - self.PackagePath = '' - - def FromXml(self, Item, Key): - self.PackagePath = XmlElement(Item, '%s/PackagePath' % Key) - self.Header.FromXml(Item, Key) - - PackageHeader = PackageHeaderClass() - PackageHeader.Name = self.Header.Name - PackageHeader.BaseName = self.Header.BaseName - PackageHeader.Guid = self.Header.GUID - PackageHeader.Version = self.Header.Version - PackageHeader.Copyright = self.Header.Copyright - PackageHeader.License = self.Header.License - PackageHeader.Abstract = self.Header.Abstract - PackageHeader.Description = self.Header.Description - PackageHeader.CombinePath = self.PackagePath - - return PackageHeader - - def ToXml(self, PackageHeader, Key): - Element1 = CreateXmlElement('Name', PackageHeader.Name, [], [['BaseName', PackageHeader.BaseName]]) - Element2 = CreateXmlElement('GUID', PackageHeader.Guid, [], [['Version', PackageHeader.Version]]) - AttributeList = [] - NodeList = [Element1, - Element2, - ['Copyright', PackageHeader.Copyright], - ['License', PackageHeader.License], - ['Abstract', PackageHeader.Abstract], - ['Description', PackageHeader.Description], - ['PackagePath', PackageHeader.CombinePath], - ] - Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList) - - return Root - - def __str__(self): - return "PackagePath = %s %s" \ - % (self.PackagePath, self.Header) - -# ClonedFromXml -class ClonedFromXml(object): - def __init__(self): - self.GUID = '' - self.Version = '' - - def FromXml(self, Item, Key): - self.GUID = XmlElement(Item, '%s/GUID' % Key) - self.Version = XmlAttribute(XmlNode(Item, '%s/GUID' % Key), 'Version') - - if self.GUID == '' and self.Version == '': - return None - - ClonedFrom = ClonedRecordClass() - ClonedFrom.PackageGuid = self.GUID - ClonedFrom.PackageVersion = self.Version - - return ClonedFrom - - def ToXml(self, ClonedFrom, Key): - Root = minidom.Document() - Element1 = CreateXmlElement('GUID', ClonedFrom.PackageGuid, [], [['Version', ClonedFrom.PackageVersion]]) - AttributeList = [] - NodeList = [Element1] - Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList) - - return Root - - def __str__(self): - return "GUID = %s Version = %s" % (self.GUID, self.Version) - -# CommonDefinesXml -class CommonDefinesXml(object): - def __init__(self): - self.Usage = '' - self.SupArchList = '' - self.SupModList = '' - self.FeatureFlag = '' - - def FromXml(self, Item, Key): - self.Usage = XmlAttribute(Item, 'Usage') - self.SupArchList = XmlAttribute(Item, 'SupArchList') - self.SupModList = XmlAttribute(Item, 'SupModList') - self.FeatureFlag = XmlAttribute(Item, 'FeatureFlag') - - def ToXml(self): - pass - - def __str__(self): - return "Usage = %s SupArchList = %s SupModList = %s FeatureFlag = %s" % (self.Usage, self.SupArchList, self.SupModList, self.FeatureFlag) - -# HelpTextXml -class HelpTextXml(object): - def __init__(self): - self.HelpText = '' - self.Lang = '' - - def FromXml(self, Item, Key): - self.HelpText = XmlElement(Item, 'HelpText') - self.Lang = XmlAttribute(Item, 'Lang') - - def ToXml(self, HelpText, Key = 'HelpText'): - return CreateXmlElement('%s' % Key, HelpText.String, [], [['Lang', HelpText.Lang]]) - - def __str__(self): - return "HelpText = %s Lang = %s" % (self.HelpText, self.Lang) - -# LibraryClassXml -class LibraryClassXml(object): - def __init__(self): - self.Keyword = '' - self.HeaderFile = '' - self.RecommendedInstanceGuid = '' - self.RecommendedInstanceVersion = '' - self.CommonDefines = CommonDefinesXml() - self.HelpText = [] - - def FromXml(self, Item, Key): - self.Keyword = XmlAttribute(XmlNode(Item, '%s' % Key), 'Keyword') - if self.Keyword == '': - self.Keyword = XmlElement(Item, '%s/Keyword' % Key) - self.HeaderFile = XmlElement(Item, '%s/HeaderFile' % Key) - self.RecommendedInstanceGuid = XmlElement(Item, '%s/RecommendedInstance/GUID' % Key) - self.RecommendedInstanceVersion = XmlAttribute(XmlNode(Item, '%s/RecommendedInstance/GUID' % Key), 'Version') - self.CommonDefines.FromXml(XmlNode(Item, '%s' % Key), Key) - for HelpTextItem in XmlList(Item, '%s/HelpText' % Key): - HelpTextObj = HelpTextXml() - HelpTextObj.FromXml(HelpTextItem, '%s/HelpText' % Key) - self.HelpText.append(HelpTextObj) - - LibraryClass = LibraryClassClass() - LibraryClass.LibraryClass = self.Keyword - LibraryClass.IncludeHeader = self.HeaderFile - LibraryClass.SupArchList = self.CommonDefines.SupArchList - LibraryClass.SupModuleList = self.CommonDefines.SupModList - LibraryClass.RecommendedInstanceGuid = self.RecommendedInstanceGuid - LibraryClass.RecommendedInstanceVersion = self.RecommendedInstanceVersion - LibraryClass.HelpTextList = GetHelpTextList(self.HelpText) - - return LibraryClass - - def ToXml(self, LibraryClass, Key): - Element1 = CreateXmlElement('GUID', LibraryClass.RecommendedInstanceGuid, [], [['Version', LibraryClass.RecommendedInstanceVersion]]) - Element2 = CreateXmlElement('RecommendedInstance', '', [Element1], []) - AttributeList = [['Keyword', LibraryClass.LibraryClass], - ['SupArchList', GetStringOfList(LibraryClass.SupArchList)], - ['SupModList', GetStringOfList(LibraryClass.SupModuleList)] - ] - NodeList = [['HeaderFile', LibraryClass.IncludeHeader], - Element2 - ] - for Item in LibraryClass.HelpTextList: - Tmp = HelpTextXml() - NodeList.append(Tmp.ToXml(Item)) - Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList) - - return Root - - def __str__(self): - Str = "Keyword = %s HeaderFile = %s RecommendedInstanceGuid = %s RecommendedInstanceVersion = %s %s" \ - % (self.Keyword, self.HeaderFile, self.RecommendedInstanceGuid, self.RecommendedInstanceVersion, \ - self.CommonDefines) - for Item in self.HelpText: - Str = Str + "\n\t" + str(Item) - return Str - -# IndustryStandardHeaderXml -class IndustryStandardHeaderXml(object): - def __init__(self): - self.HeaderFile = '' - self.HelpText = [] - - def FromXml(self, Item, Key): - self.HeaderFile = XmlElement(Item, '%s/HeaderFile' % Key) - for HelpTextItem in XmlList(Item, '%s/HelpText' % Key): - HelpTextObj = HelpTextXml() - HelpTextObj.FromXml(HelpTextItem, '%s/HelpText' % Key) - self.HelpText.append(HelpTextObj) - - Include = IncludeClass() - Include.FilePath = self.HeaderFile - Include.HelpTextList = GetHelpTextList(self.HelpText) - - return Include - - def ToXml(self, IndustryStandardHeader, Key): - AttributeList = [] - NodeList = [['HeaderFile', IndustryStandardHeader.FilePath]] - for Item in IndustryStandardHeader.HelpTextList: - Tmp = HelpTextXml() - NodeList.append(Tmp.ToXml(Item)) - Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList) - - return Root - - def __str__(self): - Str = "HeaderFile = %s" % (self.HeaderFile) - for Item in self.HelpText: - Str = Str + "\n\t" + str(Item) - return Str - -# PackageIncludeHeaderXml -class PackageIncludeHeaderXml(object): - def __init__(self): - self.HeaderFile = '' - self.CommonDefines = CommonDefinesXml() - self.HelpText = [] - - def FromXml(self, Item, Key): - self.HeaderFile = XmlElement(Item, '%s/HeaderFile' % Key) - self.CommonDefines.FromXml(XmlNode(Item, '%s/HeaderFile' % Key), Key) - for HelpTextItem in XmlList(Item, '%s/HelpText' % Key): - HelpTextObj = HelpTextXml() - HelpTextObj.FromXml(HelpTextItem, '%s/HelpText' % Key) - self.HelpText.append(HelpTextObj) - - Include = IncludeClass() - Include.FilePath = self.HeaderFile - Include.SupArchList = self.CommonDefines.SupArchList - Include.SupModuleList = self.CommonDefines.SupModList - Include.HelpTextList = GetHelpTextList(self.HelpText) - - return Include - - def ToXml(self, PackageIncludeHeader, Key): - AttributeList = [['SupArchList', PackageIncludeHeader.SupArchList], - ['SupModList', PackageIncludeHeader.SupModuleList] - ] - NodeList = [['HeaderFile', PackageIncludeHeader.FilePath]] - for Item in PackageIncludeHeader.HelpTextList: - Tmp = HelpTextXml() - NodeList.append(Tmp.ToXml(Item)) - Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList) - - return Root - - def __str__(self): - Str = "HeaderFile = %s\n\t%s" % (self.HeaderFile, self.CommonDefines) - for Item in self.HelpText: - Str = Str + "\n\t" + str(Item) - return Str - -#GUID/Protocol/Ppi -class GuidProtocolPpiXml(object): - def __init__(self): - self.UiName = '' - self.GuidTypes = '' - self.Notify = '' - self.CName = '' - self.GuidValue = '' - self.CommonDefines = CommonDefinesXml() - self.HelpText = [] - - def FromXml(self, Item, Key): - self.UiName = XmlAttribute(XmlNode(Item, '%s' % Key), 'UiName') - self.GuidTypes = XmlAttribute(XmlNode(Item, '%s' % Key), 'GuidTypes') - self.GuidType = XmlAttribute(XmlNode(Item, '%s' % Key), 'GuidType') - self.Notify = XmlAttribute(XmlNode(Item, '%s' % Key), 'Notify') - self.CName = XmlElement(Item, '%s/CName' % Key) - self.GuidValue = XmlElement(Item, '%s/GuidValue' % Key) - self.VariableName = XmlElement(Item, '%s/VariableName' % Key) - self.CommonDefines.FromXml(XmlNode(Item, '%s' % Key), Key) - for HelpTextItem in XmlList(Item, '%s/HelpText' % Key): - HelpTextObj = HelpTextXml() - HelpTextObj.FromXml(HelpTextItem, '%s/HelpText' % Key) - self.HelpText.append(HelpTextObj) - - GuidProtocolPpi = GuidProtocolPpiCommonClass() - GuidProtocolPpi.Name = self.UiName - GuidProtocolPpi.CName = self.CName - GuidProtocolPpi.Guid = self.GuidValue - GuidProtocolPpi.VariableName = self.VariableName - GuidProtocolPpi.Notify = self.Notify - GuidProtocolPpi.Usage = self.CommonDefines.Usage - GuidProtocolPpi.FeatureFlag = self.CommonDefines.FeatureFlag - GuidProtocolPpi.SupArchList = self.CommonDefines.SupArchList - GuidProtocolPpi.SupModuleList = self.CommonDefines.SupModList - GuidProtocolPpi.GuidTypeLists = self.GuidTypes - GuidProtocolPpi.GuidTypeList = self.GuidType - GuidProtocolPpi.HelpTextList = GetHelpTextList(self.HelpText) - - return GuidProtocolPpi - - def ToXml(self, GuidProtocolPpi, Key): - AttributeList = [['Usage', GetStringOfList(GuidProtocolPpi.Usage)], - ['UiName', GuidProtocolPpi.Name], - ['GuidTypes', GetStringOfList(GuidProtocolPpi.GuidTypeLists)], - ['GuidType', GetStringOfList(GuidProtocolPpi.GuidTypeList)], - ['Notify', str(GuidProtocolPpi.Notify)], - ['SupArchList', GetStringOfList(GuidProtocolPpi.SupArchList)], - ['SupModList', GetStringOfList(GuidProtocolPpi.SupModuleList)], - ['FeatureFlag', GuidProtocolPpi.FeatureFlag] - ] - NodeList = [['CName', GuidProtocolPpi.CName], - ['GuidValue', GuidProtocolPpi.Guid], - ['VariableName', GuidProtocolPpi.VariableName] - ] - for Item in GuidProtocolPpi.HelpTextList: - Tmp = HelpTextXml() - NodeList.append(Tmp.ToXml(Item)) - Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList) - - return Root - - def __str__(self): - Str = "UiName = %s Notify = %s GuidTypes = %s CName = %s GuidValue = %s %s" \ - % (self.UiName, self.Notify, self.GuidTypes, self.CName, self.GuidValue, self.CommonDefines) - for Item in self.HelpText: - Str = Str + "\n\t" + str(Item) - return Str - -# PcdErrorXml -class PcdErrorXml(object): - def __init__(self): - self.ValidValueList = '' - self.ValidValueListLang = '' - self.ValidValueRange = '' - self.Expression = '' - self.ErrorNumber = '' - self.ErrorMessage = [] - - def FromXml(self, Item, Key): - self.ValidValueList = XmlElement(Item, '%s/ValidValueList' % Key) - self.ValidValueListLang = XmlAttribute(XmlNode(Item, '%s/ValidValueList' % Key), 'Lang') - self.ValidValueRange = XmlElement(Item, '%s/ValidValueRange' % Key) - self.Expression = XmlElement(Item, '%s/Expression' % Key) - self.ErrorNumber = XmlElement(Item, '%s/ErrorNumber' % Key) - for ErrMsg in XmlList(Item, '%s/ErrorMessage' % Key): - ErrorMessageString = XmlElement(ErrMsg, 'ErrorMessage') - ErrorMessageLang = XmlAttribute(XmlNode(ErrMsg, 'ErrorMessage'), 'Lang') - self.ErrorMessage.append((ErrorMessageLang, ErrorMessageString)) - - Error = PcdErrorClass() - Error.ValidValueList = self.ValidValueList - Error.ValidValueListLang = self.ValidValueListLang - Error.ValidValueRange = self.ValidValueRange - Error.Expression = self.Expression - Error.ErrorNumber = self.ErrorNumber - Error.ErrorMessage = self.ErrorMessage - - return Error - - def ToXml(self, PcdError, Key): - AttributeList = [] - Element1 = CreateXmlElement('ValidValueList', PcdError.ValidValueList, [], [['Lang', PcdError.ValidValueListLang]]) - NodeList = [Element1, - ['ValidValueRange', PcdError.ValidValueRange], - ['Expression', PcdError.Expression], - ['ErrorNumber', PcdError.ErrorNumber], - ] - for Item in PcdError.ErrorMessage: - Element = CreateXmlElement('ErrorMessage', Item[1], [], [['Lang', Item[0]]]) - NodeList.append(Element) - Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList) - - return Root - - def __str__(self): - return "ValidValueList = %s ValidValueListLang = %s ValidValueRange = %s Expression = %s ErrorNumber = %s %s" \ - % (self.ValidValueList, self.ValidValueListLang, self.ValidValueRange, self.Expression, self.ErrorNumber, self.ErrorMessage) - -# PcdEntryXml -class PcdEntryXml(object): - def __init__(self): - self.PcdItemType = '' - self.PcdUsage = '' - self.TokenSpaceGuidCName = '' - self.TokenSpaceGuidValue = '' - self.Token = '' - self.CName = '' - self.PcdCName = '' - self.DatumType = '' - self.ValidUsage = '' - self.DefaultValue = '' - self.MaxDatumSize = '' - self.Value = '' - self.Offset = '' - self.CommonDefines = CommonDefinesXml() - self.HelpText = [] - self.PcdError = [] - - def FromXml(self, Item, Key): - self.PcdItemType = XmlAttribute(XmlNode(Item, '%s' % Key), 'PcdItemType') - self.PcdUsage = XmlAttribute(XmlNode(Item, '%s' % Key), 'PcdUsage') - self.TokenSpaceGuidCName = XmlElement(Item, '%s/TokenSpaceGuidCName' % Key) - self.TokenSpaceGuidValue = XmlElement(Item, '%s/TokenSpaceGuidValue' % Key) - self.Token = XmlElement(Item, '%s/Token' % Key) - self.CName = XmlElement(Item, '%s/CName' % Key) - self.PcdCName = XmlElement(Item, '%s/PcdCName' % Key) - self.DatumType = XmlElement(Item, '%s/DatumType' % Key) - self.ValidUsage = XmlElement(Item, '%s/ValidUsage' % Key) - self.DefaultValue = XmlElement(Item, '%s/DefaultValue' % Key) - self.MaxDatumSize = XmlElement(Item, '%s/MaxDatumSize' % Key) - self.Value = XmlElement(Item, '%s/Value' % Key) - self.Offset = XmlElement(Item, '%s/Offset' % Key) - self.CommonDefines.FromXml(XmlNode(Item, '%s' % Key), Key) - for HelpTextItem in XmlList(Item, '%s/HelpText' % Key): - HelpTextObj = HelpTextXml() - HelpTextObj.FromXml(HelpTextItem, '%s/HelpText' % Key) - self.HelpText.append(HelpTextObj) - for PcdErrorItem in XmlList(Item, '%s/PcdError' % Key): - PcdErrorObj = PcdErrorXml() - PcdErrorObj.FromXml(PcdErrorItem, 'PcdError') - self.PcdError.append(PcdErrorObj) - - PcdEntry = PcdClass() - PcdEntry.SupArchList = self.CommonDefines.SupArchList - PcdEntry.SupModuleList = self.CommonDefines.SupModList - PcdEntry.TokenSpaceGuidCName = self.TokenSpaceGuidCName - PcdEntry.TokenSpaceGuidValue = self.TokenSpaceGuidValue - PcdEntry.Token = self.Token - PcdEntry.CName = self.CName - PcdEntry.PcdCName = self.PcdCName - PcdEntry.DatumType = self.DatumType - PcdEntry.ValidUsage = self.ValidUsage - PcdEntry.PcdUsage = self.PcdUsage - PcdEntry.Usage = self.CommonDefines.Usage - PcdEntry.DefaultValue = self.DefaultValue - PcdEntry.Value = self.Value - PcdEntry.Offset = self.Offset - PcdEntry.MaxDatumSize = self.MaxDatumSize - PcdEntry.FeatureFlag = self.CommonDefines.FeatureFlag - PcdEntry.PcdItemType = self.PcdItemType - PcdEntry.HelpTextList = GetHelpTextList(self.HelpText) - PcdEntry.PcdErrors = self.PcdError - - return PcdEntry - - def ToXml(self, PcdEntry, Key): - AttributeList = [['SupArchList', GetStringOfList(PcdEntry.SupArchList)], - ['PcdUsage', PcdEntry.PcdUsage], - ['PcdItemType', PcdEntry.PcdItemType], - ['FeatureFlag', PcdEntry.FeatureFlag], - ['SupModList', GetStringOfList(PcdEntry.SupModuleList)] - ] - NodeList = [['TokenSpaceGuidCName', PcdEntry.TokenSpaceGuidCName], - ['TokenSpaceGuidValue', PcdEntry.TokenSpaceGuidValue], - ['Token', PcdEntry.Token], - ['CName', PcdEntry.CName], - ['PcdCName', PcdEntry.PcdCName], - ['DatumType', PcdEntry.DatumType], - ['ValidUsage', GetStringOfList(PcdEntry.ValidUsage)], - ['DefaultValue', PcdEntry.DefaultValue], - ['Value', PcdEntry.Value], - ['Offset', PcdEntry.Offset], - ['MaxDatumSize', PcdEntry.MaxDatumSize], - ] - for Item in PcdEntry.HelpTextList: - Tmp = HelpTextXml() - NodeList.append(Tmp.ToXml(Item, 'HelpText')) - for Item in PcdEntry.PcdErrors: - Tmp = PcdErrorXml() - NodeList.append(Tmp.ToXml(Item, 'PcdError')) - - Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList) - - return Root - - def __str__(self): - Str = "PcdItemType = %s PcdUsage = %s TokenSpaceGuidCName = %s TokenSpaceGuidValue = %s Token = %s CName = %s PcdCName = %s DatumType = %s ValidUsage = %s DefaultValue = %s MaxDatumSize = %s Value = %s Offset = %s %s" \ - % (self.PcdItemType, self.PcdUsage, self.TokenSpaceGuidCName, self.TokenSpaceGuidValue, self.Token, self.CName, self.PcdCName, self.DatumType, self.ValidUsage, self.DefaultValue, self.MaxDatumSize, self.Value, self.Offset, self.CommonDefines) - for Item in self.HelpText: - Str = Str + "\n\t" + str(Item) - for Item in self.PcdError: - Str = Str + "\n\tPcdError:" + str(Item) - return Str - -# PcdCheckXml -class PcdCheckXml(object): - def __init__(self): - self.PcdCheck = '' - - def FromXml(self, Item, Key): - self.PcdCheck = XmlElement(Item, 'PcdCheck') - - return self.PcdCheck - - def ToXml(self, PcdCheck, Key): - Root = CreateXmlElement('%s' % Key, PcdCheck, [], []) - return Root - - def __str__(self): - return "PcdCheck = %s" % (self.PcdCheck) - -# MiscellaneousFileXml -class MiscellaneousFileXml(object): - def __init__(self): - self.Header = HeaderXml() - self.Files = [] - - def FromXml(self, Item, Key): - self.Header.FromXml(Item, Key) - NewItem = XmlNode(Item, '%s/Header' % Key) - self.Header.FromXml(NewItem, 'Header') - - for SubItem in XmlList(Item, '%s/Filename' % Key): - Filename = XmlElement(SubItem, '%s/Filename' % Key) - Executable = XmlAttribute(XmlNode(SubItem, '%s/Filename' % Key), 'Executable') - self.Files.append([Filename, Executable]) - - MiscFile = MiscFileClass() - MiscFile.Copyright = self.Header.Copyright - MiscFile.License = self.Header.License - MiscFile.Abstract = self.Header.Abstract - MiscFile.Description = self.Header.Description - for File in self.Files: - FileObj = FileClass() - FileObj.Filename = File[0] - FileObj.Executable = File[1] - MiscFile.Files.append(FileObj) - - return MiscFile - - def FromXml2(self, Item, Key): - NewItem = XmlNode(Item, '%s/Header' % Key) - self.Header.FromXml(NewItem, 'Header') - - for SubItem in XmlList(Item, '%s/Filename' % Key): - Filename = XmlElement(SubItem, '%s/Filename' % Key) - Executable = XmlAttribute(XmlNode(SubItem, '%s/Filename' % Key), 'Executable') - self.Files.append([Filename, Executable]) - - MiscFile = MiscFileClass() - MiscFile.Name = self.Header.Name - MiscFile.Copyright = self.Header.Copyright - MiscFile.License = self.Header.License - MiscFile.Abstract = self.Header.Abstract - MiscFile.Description = self.Header.Description - for File in self.Files: - FileObj = FileClass() - FileObj.Filename = File[0] - FileObj.Executable = File[1] - MiscFile.Files.append(FileObj) - - return MiscFile - - - def ToXml(self, MiscFile, Key): - if MiscFile: - NodeList = [['Copyright', MiscFile.Copyright], - ['License', MiscFile.License], - ['Abstract', MiscFile.Abstract], - ['Description', MiscFile.Description], - ] - if MiscFile != None: - for File in MiscFile.Files: - NodeList.append(CreateXmlElement('Filename', File.Filename, [], [['Executable', File.Executable]])) - Root = CreateXmlElement('%s' % Key, '', NodeList, []) - - return Root - - def ToXml2(self, MiscFile, Key): - if MiscFile: - NodeList = [['Name', MiscFile.Name], - ['Copyright', MiscFile.Copyright], - ['License', MiscFile.License], - ['Abstract', MiscFile.Abstract], - ['Description', MiscFile.Description], - ] - HeaderNode = CreateXmlElement('Header', '', NodeList, []) - NodeList = [HeaderNode] - - for File in MiscFile.Files: - NodeList.append(CreateXmlElement('Filename', File.Filename, [], [['Executable', File.Executable]])) - Root = CreateXmlElement('%s' % Key, '', NodeList, []) - - return Root - - def __str__(self): - Str = str(self.Header) - for Item in self.Files: - Str = Str + '\n\tFilename:' + str(Item) - return Str - -# UserExtensionsXml -class UserExtensionsXml(object): - def __init__(self): - self.UserId = '' - self.Identifier = '' - self.Defines = [] - self.BuildOptions = [] - - def FromXml(self, Item, Key): - self.UserId = XmlAttribute(XmlNode(Item, '%s' % Key), 'UserId') - self.Identifier = XmlAttribute(XmlNode(Item, '%s' % Key), 'Identifier') - for SubItem in XmlList(Item, '%s/Define' % Key): - self.Defines.append(XmlElement(SubItem, '%s/Define' % Key)) - for SubItem in XmlList(Item, '%s/BuildOption' % Key): - self.BuildOptions.append(XmlElement(SubItem, '%s/BuildOption' % Key)) - - UserExtension = UserExtensionsClass() - UserExtension.UserID = self.UserId - UserExtension.Identifier = self.Identifier - UserExtension.Defines = self.Defines - UserExtension.BuildOptions = self.BuildOptions - - return UserExtension - - def ToXml(self, UserExtension, Key): - AttributeList = [['UserId', str(UserExtension.UserID)], - ['Identifier', str(UserExtension.Identifier)] - ] - NodeList = [] - for Item in UserExtension.Defines: - NodeList.append(['Define', Item]) - for Item in UserExtension.BuildOptions: - NodeList.append(['BuildOption', Item]) - Root = CreateXmlElement('%s' % Key, UserExtension.Content, NodeList, AttributeList) - - return Root - - def __str__(self): - Str = "UserId = %s Identifier = %s" % (self.UserId, self.Identifier) - Str = Str + '\n\tDefines:' + str(self.Defines) - Str = Str + '\n\tBuildOptions:' + str(self.BuildOptions) - return Str - -# BootModeXml -class BootModeXml(object): - def __init__(self): - self.SupportedBootModes = '' - self.CommonDefines = CommonDefinesXml() - self.HelpText = [] - - def FromXml(self, Item, Key): - self.SupportedBootModes = XmlElement(Item, '%s/SupportedBootModes' % Key) - self.CommonDefines.FromXml(Item, Key) - for HelpTextItem in XmlList(Item, '%s/HelpText' % Key): - HelpTextObj = HelpTextXml() - HelpTextObj.FromXml(HelpTextItem, '%s/HelpText' % Key) - self.HelpText.append(HelpTextObj) - - BootMode = ModuleBootModeClass() - BootMode.Name = self.SupportedBootModes - BootMode.SupArchList = self.CommonDefines.SupArchList - BootMode.Usage = self.CommonDefines.Usage - BootMode.FeatureFlag = self.CommonDefines.FeatureFlag - BootMode.HelpTextList = GetHelpTextList(self.HelpText) - - return BootMode - - def ToXml(self, BootMode, Key): - AttributeList = [['Usage', BootMode.Usage], - ['SupArchList', GetStringOfList(BootMode.SupArchList)], - ['FeatureFlag', BootMode.FeatureFlag], - ] - NodeList = [['SupportedBootModes', BootMode.Name]] - for Item in BootMode.HelpTextList: - Tmp = HelpTextXml() - NodeList.append(Tmp.ToXml(Item, 'HelpText')) - Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList) - - return Root - - def __str__(self): - Str = "SupportedBootModes = %s %s" % (self.SupportedBootModes, self.CommonDefines) - for Item in self.HelpText: - Str = Str + '\n\t' + str(Item) - return Str - -# EventXml -class EventXml(object): - def __init__(self): - self.EventType = '' - self.Name = '' - self.CommonDefines = CommonDefinesXml() - self.HelpText = [] - - def FromXml(self, Item, Key): - self.EventType = XmlAttribute(XmlNode(Item, '%s' % Key), 'EventType') - self.Name = XmlElement(Item, '%s' % Key) - self.CommonDefines.FromXml(Item, Key) - for HelpTextItem in XmlList(Item, '%s/HelpText' % Key): - HelpTextObj = HelpTextXml() - HelpTextObj.FromXml(HelpTextItem, '%s/HelpText' % Key) - self.HelpText.append(HelpTextObj) - - Event = ModuleEventClass() - Event.Type = self.EventType - Event.GuidCName = self.Name - Event.SupArchList = self.CommonDefines.SupArchList - Event.Usage = self.CommonDefines.Usage - Event.FeatureFlag = self.CommonDefines.FeatureFlag - Event.HelpTextList = GetHelpTextList(self.HelpText) - - return Event - - def ToXml(self, Event, Key): - AttributeList = [['EventType', Event.Type], - ['Usage', Event.Usage], - ['SupArchList', GetStringOfList(Event.SupArchList)], - ['FeatureFlag', Event.FeatureFlag], - ] - NodeList = [] - for Item in Event.HelpTextList: - Tmp = HelpTextXml() - NodeList.append(Tmp.ToXml(Item, 'HelpText')) - Root = CreateXmlElement('%s' % Key, Event.GuidCName, NodeList, AttributeList) - - return Root - - def __str__(self): - Str = "EventType = %s %s" % (self.EventType, self.CommonDefines) - for Item in self.HelpText: - Str = Str + '\n\t' + str(Item) - return Str - -# HobXml -class HobXml(object): - def __init__(self): - self.HobType = '' - self.Name = '' - self.CommonDefines = CommonDefinesXml() - self.HelpText = [] - - def FromXml(self, Item, Key): - self.HobType = XmlAttribute(XmlNode(Item, '%s' % Key), 'HobType') - self.Name = XmlElement(Item, '%s' % Key) - self.CommonDefines.FromXml(Item, Key) - for HelpTextItem in XmlList(Item, '%s/HelpText' % Key): - HelpTextObj = HelpTextXml() - HelpTextObj.FromXml(HelpTextItem, '%s/HelpText' % Key) - self.HelpText.append(HelpTextObj) - - Hob = ModuleHobClass() - Hob.Type = self.HobType - Hob.GuidCName = self.Name - Hob.SupArchList = self.CommonDefines.SupArchList - Hob.Usage = self.CommonDefines.Usage - Hob.FeatureFlag = self.CommonDefines.FeatureFlag - Hob.HelpTextList = GetHelpTextList(self.HelpText) - - return Hob - - def ToXml(self, Hob, Key): - AttributeList = [['EventType', Hob.Type], - ['Usage', Hob.Usage], - ['SupArchList', GetStringOfList(Hob.SupArchList)], - ['FeatureFlag', Hob.FeatureFlag], - ] - NodeList = [] - for Item in Hob.HelpTextList: - Tmp = HelpTextXml() - NodeList.append(Tmp.ToXml(Item, 'HelpText')) - Root = CreateXmlElement('%s' % Key, Hob.GuidCName, NodeList, AttributeList) - - return Root - - def __str__(self): - Str = "HobType = %s %s" % (self.HobType, self.CommonDefines) - for Item in self.HelpText: - Str = Str + '\n\t' + str(Item) - return Str - -# ModulePropertyXml -class ModulePropertyXml(object): - def __init__(self): - self.CommonDefines = CommonDefinesXml() - self.ModuleType = '' - self.Path = '' - self.PcdIsDriver = '' - self.UefiSpecificationVersion = '' - self.PiSpecificationVersion = '' - self.Specification = '' - self.SpecificationVersion = '' - self.BootModes = [] - self.Events = [] - self.HOBs = [] - - def FromXml(self, Item, Key, Header = None): - self.CommonDefines.FromXml(Item, Key) - self.ModuleType = XmlElement(Item, '%s/ModuleType' % Key) - self.Path = XmlElement(Item, '%s/Path' % Key) - self.PcdIsDriver = XmlElement(Item, '%s/PcdIsDriver' % Key) - self.UefiSpecificationVersion = XmlElement(Item, '%s/UefiSpecificationVersion' % Key) - self.PiSpecificationVersion = XmlElement(Item, '%s/PiSpecificationVersion' % Key) - self.Specification = XmlElement(Item, '%s/Specification' % Key) - self.SpecificationVersion = XmlAttribute(XmlNode(Item, '%s/Specification' % Key), 'Version') - for SubItem in XmlList(Item, '%s/BootMode' % Key): - A = BootModeXml() - BootMode = A.FromXml(SubItem, 'BootMode') - self.BootModes.append(BootMode) - for SubItem in XmlList(Item, '%s/Event' % Key): - A = EventXml() - Event = A.FromXml(SubItem, 'Event') - self.Events.append(Event) - for SubItem in XmlList(Item, '%s/HOB' % Key): - A = HobXml() - Hob = A.FromXml(SubItem, 'HOB') - self.HOBs.append(Hob) - - if Header == None: - Header = ModuleHeaderClass() - - Header.ModuleType = self.ModuleType - Header.SupArchList = self.CommonDefines.SupArchList - Header.SupModuleList = self.CommonDefines.SupModList - Header.CombinePath = self.Path - Header.PcdIsDriver = self.PcdIsDriver - Header.UefiSpecificationVersion = self.UefiSpecificationVersion - Header.PiSpecificationVersion = self.PiSpecificationVersion - - return Header, self.BootModes, self.Events, self.HOBs - - - def ToXml(self, Header, BootModes, Events, Hobs, Key): - AttributeList = [['SupArchList', GetStringOfList(Header.SupArchList)], - ['SupModList', GetStringOfList(Header.SupModuleList)], - ] - NodeList = [['ModuleType', Header.ModuleType], - ['Path', Header.CombinePath], - ['PcdIsDriver', Header.PcdIsDriver], - ['UefiSpecificationVersion', Header.UefiSpecificationVersion], - ['PiSpecificationVersion', Header.PiSpecificationVersion], - ] - for Item in BootModes: - Tmp = BootModeXml() - NodeList.append(Tmp.ToXml(Item, 'BootMode')) - for Item in Events: - Tmp = EventXml() - NodeList.append(Tmp.ToXml(Item, 'Event')) - for Item in Hobs: - Tmp = HobXml() - NodeList.append(Tmp.ToXml(Item, 'Hob')) - Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList) - - return Root - - def __str__(self): - Str = "ModuleType = %s Path = %s PcdIsDriver = %s UefiSpecificationVersion = %s PiSpecificationVersion = %s Specification = %s SpecificationVersion = %s %s" \ - % (self.ModuleType, self.Path, self.PcdIsDriver, self.UefiSpecificationVersion, self.PiSpecificationVersion, \ - self.Specification, self.SpecificationVersion, self.CommonDefines) - for Item in self.BootModes: - Str = Str + '\n\t' + str(Item) - for Item in self.Events: - Str = Str + '\n\t' + str(Item) - for Item in self.HOBs: - Str = Str + '\n\t' + str(Item) - return Str - -# SourceFileXml -class SourceFileXml(object): - def __init__(self): - self.SourceFile = '' - self.ToolChainFamily = '' - self.FileType = '' - self.CommonDefines = CommonDefinesXml() - - def FromXml(self, Item, Key): - self.ToolChainFamily = XmlAttribute(Item, 'Family') - self.FileType = XmlAttribute(Item, 'FileType') - self.SourceFile = XmlElement(Item, 'Filename') - self.CommonDefines.FromXml(Item, Key) - - SourceFile = ModuleSourceFileClass() - SourceFile.SourceFile = self.SourceFile - SourceFile.FileType = self.FileType - SourceFile.ToolChainFamily = self.ToolChainFamily - SourceFile.SupArchList = self.CommonDefines.SupArchList - SourceFile.FeatureFlag = self.CommonDefines.FeatureFlag - - return SourceFile - - def ToXml(self, SourceFile, Key): - AttributeList = [['SupArchList', GetStringOfList(SourceFile.SupArchList)], - ['Family', SourceFile.ToolChainFamily], - ['FileType', SourceFile.FileType], - ['FeatureFlag', SourceFile.FeatureFlag], - ] - Root = CreateXmlElement('%s' % Key, SourceFile.SourceFile, [], AttributeList) - - return Root - -# FilenameXml -class FilenameXml(object): - def __init__(self): - self.OS = '' - self.Family = '' - self.FileType = '' - self.Filename = '' - self.Executable = '' - self.CommonDefines = CommonDefinesXml() - - def FromXml(self, Item, Key): - self.OS = XmlAttribute(Item, 'OS') - self.Family = XmlAttribute(Item, 'Family') - self.FileType = XmlAttribute(Item, 'FileType') - self.Filename = XmlElement(Item, 'Filename') - self.Executable = XmlElement(Item, 'Executable') - self.CommonDefines.FromXml(Item, Key) - - Filename = FileClass() - Filename.Family = self.Family - Filename.FileType = self.FileType - Filename.Filename = self.Filename - Filename.Executable = self.Executable - Filename.SupArchList = self.CommonDefines.SupArchList - Filename.FeatureFlag = self.CommonDefines.FeatureFlag - - return Filename - - def ToXml(self, Filename, Key): - AttributeList = [['SupArchList', GetStringOfList(Filename.SupArchList)], - ['Family', Filename.Family], - ['FileType', Filename.FileType], - ['Executable', Filename.Executable], - ['FeatureFlag', Filename.FeatureFlag], - ] - NodeList = [['Filename', Filename.Filename], - ] - Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList) - - return Root - - def __str__(self): - return "OS = %s Family = %s FileType = %s Filename = %s Executable = %s %s" \ - % (self.OS, self.Family, self.FileType, self.Filename, self.Executable, self.CommonDefines) - -class BinaryFileXml(object): - def __init__(self): - self.Filenames = [] - self.PatchPcdValues = [] - self.PcdExValues = [] - self.LibraryInstances = [] - self.BuildFlags = [] - - def FromXml(self, Item, Key): - BinaryFile = ModuleBinaryFileClass() - for SubItem in XmlList(Item, '%s/Filename' % Key): - A = FilenameXml() - B = A.FromXml(SubItem, 'Filename') - BinaryFile.Filenames.append(B) - for SubItem in XmlList(Item, '%s/AsBuilt/PatchPcdValue' % Key): - A = PcdEntryXml() - B = A.FromXml(SubItem, 'PatchPcdValue') - BinaryFile.PatchPcdValues.append(B) - for SubItem in XmlList(Item, '%s/AsBuilt/PcdExValue' % Key): - A = PcdEntryXml() - B = A.FromXml(SubItem, 'PcdExValue') - BinaryFile.PatchPcdValues.append(B) - for SubItem in XmlList(Item, '%s/AsBuilt/LibraryInstances/GUID' % Key): - GUID = XmlElement(SubItem, 'GUID') - Version = XmlAttribute(XmlNode(SubItem, 'GUID'), 'Version') - BinaryFile.LibraryInstances.append([GUID, Version]) - for SubItem in XmlList(Item, '%s/AsBuilt/BuildFlags' % Key): - BinaryFile.BuildFlags.append(XmlElement(SubItem, 'BuildFlags')) - - return BinaryFile - - def ToXml(self, BinaryFile, Key): - NodeList = [] - for Item in BinaryFile.Filenames: - Tmp = FilenameXml() - NodeList.append(Tmp.ToXml(Item, 'Filename')) - AsBuiltNodeList = [] - for Item in BinaryFile.PatchPcdValues: - Tmp = PcdEntryXml() - AsBuiltNodeList.append(Tmp.ToXml(Item, 'PatchPcdValue')) - for Item in BinaryFile.PcdExValues: - Tmp = PcdEntryXml() - AsBuiltNodeList.append(Tmp.ToXml(Item, 'PcdExValue')) - LibNodeList = [] - for Item in BinaryFile.LibraryInstances: - LibNode = CreateXmlElement('GUID', Item[0], [], [['Version', Item[1]]]) - LibNodeList.append(LibNode) - if LibNodeList: - AsBuiltNodeList.append(CreateXmlElement('LibraryInstances', '', LibNodeList, [])) - for Item in BinaryFile.BuildFlags: - AsBuiltNodeList.append(CreateXmlElement('BuildFlags', Item, [], [])) - Element = CreateXmlElement('AsBuilt', '', AsBuiltNodeList, []) - NodeList.append(Element) - - Root = CreateXmlElement('%s' % Key, '', NodeList, []) - - return Root - - def __str__(self): - Str = "BinaryFiles:" - for Item in self.Filenames: - Str = Str + '\n\t' + str(Item) - for Item in self.PatchPcdValues: - Str = Str + '\n\t' + str(Item) - for Item in self.PcdExValues: - Str = Str + '\n\t' + str(Item) - for Item in self.LibraryInstances: - Str = Str + '\n\t' + str(Item) - for Item in self.BuildFlags: - Str = Str + '\n\t' + str(Item) - return Str - -# PackageXml -class PackageXml(object): - def __init__(self): - self.Description = '' - self.Guid = '' - self.Version = '' - self.CommonDefines = CommonDefinesXml() - - def FromXml(self, Item, Key): - self.Description = XmlElement(Item, '%s/Description' % Key) - self.Guid = XmlElement(Item, '%s/GUID' % Key) - self.Version = XmlAttribute(XmlNode(Item, '%s/GUID' % Key), 'Version') - self.CommonDefines.FromXml(XmlNode(Item, '%s' % Key), Key) - - PackageDependency = ModulePackageDependencyClass() - PackageDependency.FilePath = self.Description - PackageDependency.PackageGuid = self.Guid - PackageDependency.PackageVersion = self.Version - PackageDependency.FeatureFlag = self.CommonDefines.FeatureFlag - PackageDependency.SupArchList = self.CommonDefines.SupArchList - - return PackageDependency - - def ToXml(self, PackageDependency, Key): - AttributeList = [['SupArchList', GetStringOfList(PackageDependency.SupArchList)], - ['FeatureFlag', PackageDependency.FeatureFlag], - ] - Element1 = CreateXmlElement('GUID', PackageDependency.PackageGuid, [], [['Version', PackageDependency.PackageVersion]]) - NodeList = [['Description', PackageDependency.FilePath], - Element1, - ] - - Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList) - - return Root - - def __str__(self): - Str = "Description = %s Guid = %s Version = %s %s" \ - % (self.Description, self.Guid, self.Version, self.CommonDefines) - return Str - -# ExternXml -class ExternXml(object): - def __init__(self): - self.CommonDefines = CommonDefinesXml() - self.EntryPoint = '' - self.UnloadImage = '' - self.Constructor = '' - self.Destructor = '' - self.HelpText = [] - - def FromXml(self, Item, Key): - self.CommonDefines.FromXml(Item, Key) - self.EntryPoint = XmlElement(Item, '%s/EntryPoint' % Key) - self.UnloadImage = XmlElement(Item, '%s/UnloadImage' % Key) - self.Constructor = XmlElement(Item, '%s/Constructor' % Key) - self.Destructor = XmlElement(Item, '%s/Destructor' % Key) - for HelpTextItem in XmlList(Item, '%s/HelpText' % Key): - HelpTextObj = HelpTextXml() - HelpTextObj.FromXml(HelpTextItem, '%s/HelpText' % Key) - self.HelpText.append(HelpTextObj) - - Extern = ModuleExternClass() - Extern.EntryPoint = self.EntryPoint - Extern.UnloadImage = self.UnloadImage - Extern.Constructor = self.Constructor - Extern.Destructor = self.Destructor - Extern.SupArchList = self.CommonDefines.SupArchList - Extern.FeatureFlag = self.CommonDefines.FeatureFlag - Extern.HelpTextList = GetHelpTextList(self.HelpText) - - return Extern - - def ToXml(self, Extern, Key): - AttributeList = [['SupArchList', GetStringOfList(Extern.SupArchList)], - ['FeatureFlag', Extern.FeatureFlag], - ] - NodeList = [['EntryPoint', Extern.EntryPoint], - ['UnloadImage', Extern.UnloadImage], - ['Constructor', Extern.Constructor], - ['Destructor', Extern.Destructor], - ] - for Item in Extern.HelpTextList: - Tmp = HelpTextXml() - NodeList.append(Tmp.ToXml(Item, 'HelpText')) - - Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList) - - return Root - - def __str__(self): - Str = "EntryPoint = %s UnloadImage = %s Constructor = %s Destructor = %s %s" \ - % (self.EntryPoint, self.UnloadImage, self.Constructor, self.Destructor, self.CommonDefines) - for Item in self.HelpText: - Str = Str + '\n\t' + str(Item) - return Str -# DepexXml -class DepexXml(object): - def __init__(self): - self.Expression = '' - #self.HelpText = HelpTextXml() - self.HelpText = [] - - def FromXml(self, Item, Key): - self.Expression = XmlElement(Item, '%s/Expression' % Key) - for HelpTextItem in XmlList(Item, '%s/HelpText' % Key): - HelpTextObj = HelpTextXml() - HelpTextObj.FromXml(HelpTextItem, '%s/HelpText' % Key) - self.HelpText.append(HelpTextObj) - - Depex = ModuleDepexClass() - Depex.Depex = self.Expression - Depex.HelpTextList = GetHelpTextList(self.HelpText) - - return Depex - - def ToXml(self, Depex, Key): - AttributeList = [] - NodeList = [['Expression', Depex.Depex], - ] - for Item in Depex.HelpTextList: - Tmp = HelpTextXml() - NodeList.append(Tmp.ToXml(Item, 'HelpText')) - - Root = CreateXmlElement('%s' % Key, '', NodeList, AttributeList) - - return Root - - def __str__(self): - Str = "Expression = %s" % (self.Expression) - for Item in self.HelpText: - Str = Str + '\n\t' + str(Item) - return Str - -# PackageSurfaceAreaXml -class PackageSurfaceAreaXml(object): - def __init__(self): - self.Package = None - - def FromXml(self, Item, Key): - # Create a package object - Package = PackageClass() - - # Header - Tmp = PackageHeaderXml() - PackageHeader = Tmp.FromXml(XmlNode(Item, '/PackageSurfaceArea/Header'), 'Header') - Package.PackageHeader = PackageHeader - - # ClonedFrom - Tmp = ClonedFromXml() - ClonedFrom = Tmp.FromXml(XmlNode(Item, '/PackageSurfaceArea/ClonedFrom'), 'ClonedFrom') - if ClonedFrom: - Package.PackageHeader.ClonedFrom.append(ClonedFrom) - - # LibraryClass - for SubItem in XmlList(Item, '/PackageSurfaceArea/LibraryClassDeclarations/LibraryClass'): - Tmp = LibraryClassXml() - LibraryClass = Tmp.FromXml(SubItem, 'LibraryClass') - Package.LibraryClassDeclarations.append(LibraryClass) - - # IndustryStandardHeader - for SubItem in XmlList(Item, '/PackageSurfaceArea/IndustryStandardIncludes/IndustryStandardHeader'): - Tmp = IndustryStandardHeaderXml() - Include = Tmp.FromXml(SubItem, 'IndustryStandardHeader') - Package.IndustryStdHeaders.append(Include) - - # PackageHeader - for SubItem in XmlList(Item, '/PackageSurfaceArea/PackageIncludes/PackageHeader'): - Tmp = PackageIncludeHeaderXml() - Include = Tmp.FromXml(SubItem, 'PackageHeader') - Package.PackageIncludePkgHeaders.append(Include) - - # Guid - for SubItem in XmlList(Item, '/PackageSurfaceArea/GuidDeclarations/Entry'): - Tmp = GuidProtocolPpiXml() - GuidProtocolPpi = Tmp.FromXml(SubItem, 'Entry') - Package.GuidDeclarations.append(GuidProtocolPpi) - - # Protocol - for SubItem in XmlList(Item, '/PackageSurfaceArea/ProtocolDeclarations/Entry'): - Tmp = GuidProtocolPpiXml() - GuidProtocolPpi = Tmp.FromXml(SubItem, 'Entry') - Package.ProtocolDeclarations.append(GuidProtocolPpi) - - # Ppi - for SubItem in XmlList(Item, '/PackageSurfaceArea/PpiDeclarations/Entry'): - Tmp = GuidProtocolPpiXml() - GuidProtocolPpi = Tmp.FromXml(SubItem, 'Entry') - Package.PpiDeclarations.append(GuidProtocolPpi) - - # PcdEntry - for SubItem in XmlList(Item, '/PackageSurfaceArea/PcdDeclarations/PcdEntry'): - Tmp = PcdEntryXml() - PcdEntry = Tmp.FromXml(SubItem, 'PcdEntry') - Package.PcdDeclarations.append(PcdEntry) - - # PcdCheck - for SubItem in XmlList(Item, '/PackageSurfaceArea/PcdRelationshipChecks/PcdCheck'): - Tmp = PcdCheckXml() - PcdCheck = Tmp.FromXml(SubItem, 'PcdCheck') - Package.PcdChecks.append(PcdCheck) - - # MiscellaneousFile - Tmp = MiscellaneousFileXml() - Package.MiscFiles = Tmp.FromXml(XmlNode(Item, '/PackageSurfaceArea/MiscellaneousFiles'), 'MiscellaneousFiles') - - # UserExtensions - Tmp = UserExtensionsXml() - Package.UserExtensions = Tmp.FromXml(XmlNode(Item, '/PackageSurfaceArea/UserExtensions'), 'UserExtensions') - - # Modules - for SubItem in XmlList(Item, '/PackageSurfaceArea/Modules/ModuleSurfaceArea'): - Tmp = ModuleSurfaceAreaXml() - Module = Tmp.FromXml(SubItem, 'ModuleSurfaceArea') - Package.Modules[(Module.ModuleHeader.Guid, Module.ModuleHeader.Version, Module.ModuleHeader.CombinePath)] = Module - - self.Package = Package - return self.Package - - def ToXml(self, Package): - # Create PackageSurfaceArea node - DomPackage = minidom.Document().createElement('PackageSurfaceArea') - - # Header - Tmp = PackageHeaderXml() - DomPackage.appendChild(Tmp.ToXml(Package.PackageHeader, 'Header')) - - # ClonedFrom - Tmp = ClonedFromXml() - if Package.PackageHeader.ClonedFrom != []: - DomPackage.appendChild(Tmp.ToXml(Package.PackageHeader.ClonedFrom[0], 'ClonedFrom')) - - # LibraryClass - LibraryClassNode = CreateXmlElement('LibraryClassDeclarations', '', [], []) - for LibraryClass in Package.LibraryClassDeclarations: - Tmp = LibraryClassXml() - LibraryClassNode.appendChild(Tmp.ToXml(LibraryClass, 'LibraryClass')) - DomPackage.appendChild(LibraryClassNode) - - # IndustryStandardHeader - IndustryStandardHeaderNode = CreateXmlElement('IndustryStandardIncludes', '', [], []) - for Include in Package.IndustryStdHeaders: - Tmp = IndustryStandardHeaderXml() - IndustryStandardHeaderNode.appendChild(Tmp.ToXml(Include, 'IndustryStandardHeader')) - DomPackage.appendChild(IndustryStandardHeaderNode) - - # PackageHeader - PackageIncludeHeaderNode = CreateXmlElement('PackageIncludes', '', [], []) - for Include in Package.PackageIncludePkgHeaders: - Tmp = PackageIncludeHeaderXml() - PackageIncludeHeaderNode.appendChild(Tmp.ToXml(Include, 'PackageHeader')) - DomPackage.appendChild(PackageIncludeHeaderNode) - - # Guid - GuidProtocolPpiNode = CreateXmlElement('GuidDeclarations', '', [], []) - for GuidProtocolPpi in Package.GuidDeclarations: - Tmp = GuidProtocolPpiXml() - GuidProtocolPpiNode.appendChild(Tmp.ToXml(GuidProtocolPpi, 'Entry')) - DomPackage.appendChild(GuidProtocolPpiNode) - - # Protocol - GuidProtocolPpiNode = CreateXmlElement('ProtocolDeclarations', '', [], []) - for GuidProtocolPpi in Package.ProtocolDeclarations: - Tmp = GuidProtocolPpiXml() - GuidProtocolPpiNode.appendChild(Tmp.ToXml(GuidProtocolPpi, 'Entry')) - DomPackage.appendChild(GuidProtocolPpiNode) - - # Ppi - GuidProtocolPpiNode = CreateXmlElement('PpiDeclarations', '', [], []) - for GuidProtocolPpi in Package.PpiDeclarations: - Tmp = GuidProtocolPpiXml() - GuidProtocolPpiNode.appendChild(Tmp.ToXml(GuidProtocolPpi, 'Entry')) - DomPackage.appendChild(GuidProtocolPpiNode) - - # PcdEntry - PcdEntryNode = CreateXmlElement('PcdDeclarations', '', [], []) - for PcdEntry in Package.PcdDeclarations: - Tmp = PcdEntryXml() - PcdEntryNode.appendChild(Tmp.ToXml(PcdEntry, 'PcdEntry')) - DomPackage.appendChild(PcdEntryNode) - - # PcdCheck - PcdCheckNode = CreateXmlElement('PcdRelationshipChecks', '', [], []) - for PcdCheck in Package.PcdChecks: - Tmp = PcdCheckXml() - PcdCheckNode.appendChild(Tmp.ToXml(PcdCheck, 'PcdCheck')) - DomPackage.appendChild(PcdCheckNode) - - # MiscellaneousFile - Tmp = MiscellaneousFileXml() - DomPackage.appendChild(Tmp.ToXml(Package.MiscFiles, 'MiscellaneousFiles')) - - # UserExtensions - Tmp = UserExtensionsXml() - DomPackage.appendChild(Tmp.ToXml(Package.UserExtensions, 'UserExtensions')) - - # Modules - ModuleNode = CreateXmlElement('Modules', '', [], []) - for Module in Package.Modules.values(): - Tmp = ModuleSurfaceAreaXml() - ModuleNode.appendChild(Tmp.ToXml(Module)) - DomPackage.appendChild(ModuleNode) - - return DomPackage - -# ModuleXml -class ModuleSurfaceAreaXml(object): - def __init__(self): - self.Module = None - - def FromXml(self, Item, Key): - # Create a package object - Module = ModuleClass() - - # Header - Tmp = HeaderXml() - ModuleHeader = Tmp.FromXml(XmlNode(Item, '/ModuleSurfaceArea/Header'), 'Header') - Module.ModuleHeader = ModuleHeader - - # ModuleProperties - Tmp = ModulePropertyXml() - (Header, BootModes, Events, HOBs) = Tmp.FromXml(XmlNode(Item, '/ModuleSurfaceArea/ModuleProperties'), 'ModuleProperties', ModuleHeader) - Module.ModuleHeader = Header - Module.BootModes = BootModes - Module.Events = Events - Module.Hobs = HOBs - - # ClonedFrom - Tmp = ClonedFromXml() - ClonedFrom = Tmp.FromXml(XmlNode(Item, '/ModuleSurfaceArea/ClonedFrom'), 'ClonedFrom') - if ClonedFrom: - Module.ModuleHeader.ClonedFrom.append(ClonedFrom) - - # LibraryClass - #LibraryClassNode = CreateXmlElement('LibraryClassDefinitions', '', [], []) - for SubItem in XmlList(Item, '/ModuleSurfaceArea/LibraryClassDefinitions/LibraryClass'): - Tmp = LibraryClassXml() - LibraryClass = Tmp.FromXml(SubItem, 'LibraryClass') - Module.LibraryClasses.append(LibraryClass) - - # SourceFile - #SourceFileNode = CreateXmlElement('SourceFiles', '', [], []) - for SubItem in XmlList(Item, '/ModuleSurfaceArea/SourceFiles/Filename'): - Tmp = SourceFileXml() - SourceFile = Tmp.FromXml(SubItem, 'Filename') - Module.Sources.append(SourceFile) - - # BinaryFile - #BinaryFileNode = CreateXmlElement('BinaryFiles', '', [], []) - for SubItem in XmlList(Item, '/ModuleSurfaceArea/BinaryFiles/BinaryFile'): - Tmp = BinaryFileXml() - BinaryFile = Tmp.FromXml(SubItem, 'BinaryFile') - Module.Binaries.append(BinaryFile) - - # PackageDependencies - #PackageDependencyNode = CreateXmlElement('PackageDependencies', '', [], []) - for SubItem in XmlList(Item, '/ModuleSurfaceArea/PackageDependencies/Package'): - Tmp = PackageXml() - PackageDependency = Tmp.FromXml(SubItem, 'Package') - Module.PackageDependencies.append(PackageDependency) - - # Guid - #GuidProtocolPpiNode = CreateXmlElement('Guids', '', [], []) - for SubItem in XmlList(Item, '/ModuleSurfaceArea/Guids/GuidCName'): - Tmp = GuidProtocolPpiXml() - GuidProtocolPpi = Tmp.FromXml(SubItem, 'GuidCName') - Module.Guids.append(GuidProtocolPpi) - - # Protocol - #GuidProtocolPpiNode = CreateXmlElement('Protocols', '', [], []) - for SubItem in XmlList(Item, '/ModuleSurfaceArea/Protocols/Protocol'): - Tmp = GuidProtocolPpiXml() - GuidProtocolPpi = Tmp.FromXml(SubItem, 'Protocol') - Module.Protocols.append(GuidProtocolPpi) - - # Ppi - #GuidProtocolPpiNode = CreateXmlElement('PPIs', '', [], []) - for SubItem in XmlList(Item, '/ModuleSurfaceArea/PPIs/Ppi'): - Tmp = GuidProtocolPpiXml() - GuidProtocolPpi = Tmp.FromXml(SubItem, 'Ppi') - Module.Ppis.append(GuidProtocolPpi) - - # Extern - #ExternNode = CreateXmlElement('Externs', '', [], []) - for SubItem in XmlList(Item, '/ModuleSurfaceArea/Externs/Extern'): - Tmp = ExternXml() - Extern = Tmp.FromXml(SubItem, 'Extern') - Module.Externs.append(Extern) - - # PcdCoded - #PcdEntryNode = CreateXmlElement('PcdCoded', '', [], []) - for SubItem in XmlList(Item, '/ModuleSurfaceArea/PcdCoded/PcdEntry'): - Tmp = PcdEntryXml() - PcdEntry = Tmp.FromXml(SubItem, 'PcdEntry') - Module.PcdCodes.append(PcdEntry) - - # PeiDepex - #DepexNode = CreateXmlElement('PeiDepex', '', [], []) - Tmp = DepexXml() - Module.PeiDepex = Tmp.FromXml(XmlNode(Item, '/ModuleSurfaceArea/PeiDepex'), 'PeiDepex') - - # DxeDepex - #DepexNode = CreateXmlElement('DxeDepex', '', [], []) - Tmp = DepexXml() - Module.DxeDepex = Tmp.FromXml(XmlNode(Item, '/ModuleSurfaceArea/DxeDepex'), 'DxeDepex') - - # SmmDepex - #DepexNode = CreateXmlElement('SmmDepex', '', [], []) - Tmp = DepexXml() - Module.SmmDepex = Tmp.FromXml(XmlNode(Item, '/ModuleSurfaceArea/DxeDepex'), 'SmmDepex') - - # MiscellaneousFile - Tmp = MiscellaneousFileXml() - Module.MiscFiles = Tmp.FromXml(XmlNode(Item, '/ModuleSurfaceArea/MiscellaneousFiles'), 'MiscellaneousFiles') - - # UserExtensions - Tmp = UserExtensionsXml() - Module.UserExtensions = Tmp.FromXml(XmlNode(Item, '/ModuleSurfaceArea/UserExtensions'), 'UserExtensions') - - # return the module object - self.Module = Module - return self.Module - - def ToXml(self, Module): - # Create root node of module surface area - DomModule = minidom.Document().createElement('ModuleSurfaceArea') - - # Header - Tmp = HeaderXml() - DomModule.appendChild(Tmp.ToXml(Module.ModuleHeader, 'Header')) - - # ModuleProperties - Tmp = ModulePropertyXml() - DomModule.appendChild(Tmp.ToXml(Module.ModuleHeader, Module.BootModes, Module.Events, Module.Hobs, 'ModuleProperties')) - - # ClonedFrom - Tmp = ClonedFromXml() - if Module.ModuleHeader.ClonedFrom != []: - DomModule.appendChild(Tmp.ToXml(Module.ModuleHeader.ClonedFrom[0], 'ClonedFrom')) - - # LibraryClass - LibraryClassNode = CreateXmlElement('LibraryClassDefinitions', '', [], []) - for LibraryClass in Module.LibraryClasses: - Tmp = LibraryClassXml() - LibraryClassNode.appendChild(Tmp.ToXml(LibraryClass, 'LibraryClass')) - DomModule.appendChild(LibraryClassNode) - - # SourceFile - SourceFileNode = CreateXmlElement('SourceFiles', '', [], []) - for SourceFile in Module.Sources: - Tmp = SourceFileXml() - SourceFileNode.appendChild(Tmp.ToXml(SourceFile, 'Filename')) - DomModule.appendChild(SourceFileNode) - - # BinaryFile - BinaryFileNode = CreateXmlElement('BinaryFiles', '', [], []) - for BinaryFile in Module.Binaries: - Tmp = BinaryFileXml() - BinaryFileNode.appendChild(Tmp.ToXml(BinaryFile, 'BinaryFile')) - DomModule.appendChild(BinaryFileNode) - - # PackageDependencies - PackageDependencyNode = CreateXmlElement('PackageDependencies', '', [], []) - for PackageDependency in Module.PackageDependencies: - Tmp = PackageXml() - PackageDependencyNode.appendChild(Tmp.ToXml(PackageDependency, 'Package')) - DomModule.appendChild(PackageDependencyNode) - - # Guid - GuidProtocolPpiNode = CreateXmlElement('Guids', '', [], []) - for GuidProtocolPpi in Module.Guids: - Tmp = GuidProtocolPpiXml() - GuidProtocolPpiNode.appendChild(Tmp.ToXml(GuidProtocolPpi, 'GuidCName')) - DomModule.appendChild(GuidProtocolPpiNode) - - # Protocol - GuidProtocolPpiNode = CreateXmlElement('Protocols', '', [], []) - for GuidProtocolPpi in Module.Protocols: - Tmp = GuidProtocolPpiXml() - GuidProtocolPpiNode.appendChild(Tmp.ToXml(GuidProtocolPpi, 'Protocol')) - DomModule.appendChild(GuidProtocolPpiNode) - - # Ppi - GuidProtocolPpiNode = CreateXmlElement('PPIs', '', [], []) - for GuidProtocolPpi in Module.Ppis: - Tmp = GuidProtocolPpiXml() - GuidProtocolPpiNode.appendChild(Tmp.ToXml(GuidProtocolPpi, 'Ppi')) - DomModule.appendChild(GuidProtocolPpiNode) - - # Extern - ExternNode = CreateXmlElement('Externs', '', [], []) - for Extern in Module.Externs: - Tmp = ExternXml() - ExternNode.appendChild(Tmp.ToXml(Extern, 'Extern')) - DomModule.appendChild(ExternNode) - - # PcdCoded - PcdEntryNode = CreateXmlElement('PcdCoded', '', [], []) - for PcdEntry in Module.PcdCodes: - Tmp = PcdEntryXml() - PcdEntryNode.appendChild(Tmp.ToXml(PcdEntry, 'PcdEntry')) - DomModule.appendChild(PcdEntryNode) - - # PeiDepex - if Module.PeiDepex: - DepexNode = CreateXmlElement('PeiDepex', '', [], []) - Tmp = DepexXml() - DomModule.appendChild(Tmp.ToXml(Module.PeiDepex, 'PeiDepex')) - - # DxeDepex - if Module.DxeDepex: - DepexNode = CreateXmlElement('DxeDepex', '', [], []) - Tmp = DepexXml() - DomModule.appendChild(Tmp.ToXml(Module.DxeDepex, 'DxeDepex')) - - # SmmDepex - if Module.SmmDepex: - DepexNode = CreateXmlElement('SmmDepex', '', [], []) - Tmp = DepexXml() - DomModule.appendChild(Tmp.ToXml(Module.SmmDepex, 'SmmDepex')) - - # MiscellaneousFile - Tmp = MiscellaneousFileXml() - DomModule.appendChild(Tmp.ToXml(Module.MiscFiles, 'MiscellaneousFiles')) - - # UserExtensions - Tmp = UserExtensionsXml() - DomModule.appendChild(Tmp.ToXml(Module.UserExtensions, 'UserExtensions')) - - return DomModule - -# DistributionPackageXml -class DistributionPackageXml(object): - def __init__(self): - self.Dp = DistributionPackageClass() - - def FromXml(self, Filename = None): - if Filename != None: - self.Dp = DistributionPackageClass() - - # Load to XML - self.Pkg = XmlParseFile(Filename) - - # Parse Header information - Tmp = DistributionPackageHeaderXml() - DistributionPackageHeader = Tmp.FromXml(XmlNode(self.Pkg, '/DistributionPackage/DistributionHeader'), 'DistributionHeader') - self.Dp.Header = DistributionPackageHeader - - # Parse each PackageSurfaceArea - for Item in XmlList(self.Pkg, '/DistributionPackage/PackageSurfaceArea'): - Psa = PackageSurfaceAreaXml() - Package = Psa.FromXml(Item, 'PackageSurfaceArea') - self.Dp.PackageSurfaceArea[(Package.PackageHeader.Guid, Package.PackageHeader.Version, Package.PackageHeader.CombinePath)] = Package - - # Parse each ModuleSurfaceArea - for Item in XmlList(self.Pkg, '/DistributionPackage/ModuleSurfaceArea'): - Msa = ModuleSurfaceAreaXml() - Module = Msa.FromXml(Item, 'ModuleSurfaceArea') - self.Dp.ModuleSurfaceArea[(Module.ModuleHeader.Guid, Module.ModuleHeader.Version, Module.ModuleHeader.CombinePath)] = Module - - # Parse Tools - Tmp = MiscellaneousFileXml() - self.Dp.Tools = Tmp.FromXml2(XmlNode(self.Pkg, '/DistributionPackage/Tools'), 'Tools') - - # Parse MiscFiles - Tmp = MiscellaneousFileXml() - self.Dp.MiscellaneousFiles = Tmp.FromXml2(XmlNode(self.Pkg, '/DistributionPackage/MiscellaneousFiles'), 'MiscellaneousFiles') - - return self.Dp - - def ToXml(self, Dp): - if Dp != None: - # Parse DistributionPackageHeader - Attrs = [['xmlns', 'http://www.uefi.org/2008/2.1'], - ['xmlns:xsi', 'http:/www.w3.org/2001/XMLSchema-instance'], - ] - Root = CreateXmlElement('DistributionPackage', '', [], Attrs) - - Tmp = DistributionPackageHeaderXml() - Root.appendChild(Tmp.ToXml(Dp.Header, 'DistributionHeader')) - - # Parse each PackageSurfaceArea - for Package in Dp.PackageSurfaceArea.values(): - Psa = PackageSurfaceAreaXml() - DomPackage = Psa.ToXml(Package) - Root.appendChild(DomPackage) - - # Parse each ModuleSurfaceArea - for Module in Dp.ModuleSurfaceArea.values(): - Msa = ModuleSurfaceAreaXml() - DomModule = Msa.ToXml(Module) - Root.appendChild(DomModule) - - # Parse Tools - Tmp = MiscellaneousFileXml() - #Tools = Tmp.FromXml2(XmlNode(self.Pkg, '/DistributionPackage/Tools'), 'Tools') - Root.appendChild(Tmp.ToXml2(Dp.Tools, 'Tools')) - - # Parse MiscFiles - Tmp = MiscellaneousFileXml() - #Tools = Tmp.FromXml2(XmlNode(self.Pkg, '/DistributionPackage/MiscellaneousFiles'), 'MiscellaneousFiles') - Root.appendChild(Tmp.ToXml2(Dp.MiscellaneousFiles, 'MiscellaneousFiles')) - - return Root.toprettyxml(indent = ' ') - - return '' - -if __name__ == '__main__': - M = DistributionPackageXml() - M.FromXml('C:\Test.xml') - print M.ToXml(M.Dp) - \ No newline at end of file diff --git a/BaseTools/Source/Python/Common/XmlRoutines.py b/BaseTools/Source/Python/Common/XmlRoutines.py deleted file mode 100644 index 5823067056..0000000000 --- a/BaseTools/Source/Python/Common/XmlRoutines.py +++ /dev/null @@ -1,228 +0,0 @@ -## @file -# This is an XML API that uses a syntax similar to XPath, but it is written in -# standard python so that no extra python packages are required to use it. -# -# Copyright (c) 2007, 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 -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# - -## -# Import Modules -# -import xml.dom.minidom - -## Create a element of XML -# -# @param Name -# @param String -# @param NodeList -# @param AttributeList -# -# @revel Element -# -def CreateXmlElement(Name, String, NodeList, AttributeList): - Doc = xml.dom.minidom.Document() - Element = Doc.createElement(Name) - if String != '' and String != None: - Element.appendChild(Doc.createTextNode(String)) - - for Item in NodeList: - if type(Item) == type([]): - Key = Item[0] - Value = Item[1] - if Key != '' and Key != None and Value != '' and Value != None: - Node = Doc.createElement(Key) - Node.appendChild(Doc.createTextNode(Value)) - Element.appendChild(Node) - else: - Element.appendChild(Item) - for Item in AttributeList: - Key = Item[0] - Value = Item[1] - if Key != '' and Key != None and Value != '' and Value != None: - Element.setAttribute(Key, Value) - - return Element - -## Get a list of XML nodes using XPath style syntax. -# -# Return a list of XML DOM nodes from the root Dom specified by XPath String. -# If the input Dom or String is not valid, then an empty list is returned. -# -# @param Dom The root XML DOM node. -# @param String A XPath style path. -# -# @revel Nodes A list of XML nodes matching XPath style Sting. -# -def XmlList(Dom, String): - if String == None or String == "" or Dom == None or Dom == "": - return [] - if Dom.nodeType == Dom.DOCUMENT_NODE: - Dom = Dom.documentElement - if String[0] == "/": - String = String[1:] - TagList = String.split('/') - Nodes = [Dom] - Index = 0 - End = len(TagList) - 1 - while Index <= End: - ChildNodes = [] - for Node in Nodes: - if Node.nodeType == Node.ELEMENT_NODE and Node.tagName == TagList[Index]: - if Index < End: - ChildNodes.extend(Node.childNodes) - else: - ChildNodes.append(Node) - Nodes = ChildNodes - ChildNodes = [] - Index += 1 - - return Nodes - - -## Get a single XML node using XPath style syntax. -# -# Return a single XML DOM node from the root Dom specified by XPath String. -# If the input Dom or String is not valid, then an empty string is returned. -# -# @param Dom The root XML DOM node. -# @param String A XPath style path. -# -# @revel Node A single XML node matching XPath style Sting. -# -def XmlNode(Dom, String): - if String == None or String == "" or Dom == None or Dom == "": - return "" - if Dom.nodeType == Dom.DOCUMENT_NODE: - Dom = Dom.documentElement - if String[0] == "/": - String = String[1:] - TagList = String.split('/') - Index = 0 - End = len(TagList) - 1 - ChildNodes = [Dom] - while Index <= End: - for Node in ChildNodes: - if Node.nodeType == Node.ELEMENT_NODE and Node.tagName == TagList[Index]: - if Index < End: - ChildNodes = Node.childNodes - else: - return Node - break - Index += 1 - return "" - - -## Get a single XML element using XPath style syntax. -# -# Return a single XML element from the root Dom specified by XPath String. -# If the input Dom or String is not valid, then an empty string is returned. -# -# @param Dom The root XML DOM object. -# @param Strin A XPath style path. -# -# @revel Element An XML element matching XPath style Sting. -# -def XmlElement(Dom, String): - try: - return XmlNode(Dom, String).firstChild.data.strip() - except: - return "" - - -## Get a single XML element of the current node. -# -# Return a single XML element specified by the current root Dom. -# If the input Dom is not valid, then an empty string is returned. -# -# @param Dom The root XML DOM object. -# -# @revel Element An XML element in current root Dom. -# -def XmlElementData(Dom): - try: - return Dom.firstChild.data.strip() - except: - return "" - - -## Get a list of XML elements using XPath style syntax. -# -# Return a list of XML elements from the root Dom specified by XPath String. -# If the input Dom or String is not valid, then an empty list is returned. -# -# @param Dom The root XML DOM object. -# @param String A XPath style path. -# -# @revel Elements A list of XML elements matching XPath style Sting. -# -def XmlElementList(Dom, String): - return map(XmlElementData, XmlList(Dom, String)) - - -## Get the XML attribute of the current node. -# -# Return a single XML attribute named Attribute from the current root Dom. -# If the input Dom or Attribute is not valid, then an empty string is returned. -# -# @param Dom The root XML DOM object. -# @param Attribute The name of Attribute. -# -# @revel Element A single XML element matching XPath style Sting. -# -def XmlAttribute(Dom, Attribute): - try: - return Dom.getAttribute(Attribute).strip() - except: - return '' - - -## Get the XML node name of the current node. -# -# Return a single XML node name from the current root Dom. -# If the input Dom is not valid, then an empty string is returned. -# -# @param Dom The root XML DOM object. -# -# @revel Element A single XML element matching XPath style Sting. -# -def XmlNodeName(Dom): - try: - return Dom.nodeName.strip() - except: - return '' - -## Parse an XML file. -# -# Parse the input XML file named FileName and return a XML DOM it stands for. -# If the input File is not a valid XML file, then an empty string is returned. -# -# @param FileName The XML file name. -# -# @revel Dom The Dom object achieved from the XML file. -# -def XmlParseFile(FileName): - try: - XmlFile = open(FileName) - Dom = xml.dom.minidom.parse(XmlFile) - XmlFile.close() - return Dom - except Exception, X: - print X - return "" - -# This acts like the main() function for the script, unless it is 'import'ed -# into another script. -if __name__ == '__main__': - # Nothing to do here. Could do some unit tests. - A = CreateXmlElement('AAA', 'CCC', [['AAA', '111'], ['BBB', '222']], [['A', '1'], ['B', '2']]) - B = CreateXmlElement('ZZZ', 'CCC', [['XXX', '111'], ['YYY', '222']], [['A', '1'], ['B', '2']]) - C = CreateXmlList('DDD', 'EEE', [A, B], ['FFF', 'GGG']) - print C.toprettyxml(indent = " ") - pass diff --git a/BaseTools/Source/Python/CommonDataClass/DistributionPackageClass.py b/BaseTools/Source/Python/CommonDataClass/DistributionPackageClass.py deleted file mode 100644 index 8f12026887..0000000000 --- a/BaseTools/Source/Python/CommonDataClass/DistributionPackageClass.py +++ /dev/null @@ -1,158 +0,0 @@ -## @file -# This file is used to define a class object to describe a distribution package -# -# Copyright (c) 2008, 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 -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -## -# Import Modules -# -import os.path -from CommonClass import * -from Common.Misc import sdict -from Common.Misc import GetFiles -from Common.DecClassObjectLight import Dec -from Common.InfClassObjectLight import Inf -from Common.XmlParser import * - -## DistributionPackageHeaderClass -# -class DistributionPackageHeaderClass(IdentificationClass, CommonHeaderClass): - def __init__(self): - IdentificationClass.__init__(self) - CommonHeaderClass.__init__(self) - self.ReadOnly = 'False' - self.RePackage = 'True' - self.Vendor = '' - self.Date = '' - self.Signature = 'Md5Sum' - self.XmlSpecification = '' - -## DistributionPackageClass -# -# -class DistributionPackageClass(object): - def __init__(self): - self.Header = DistributionPackageHeaderClass() - self.PackageSurfaceArea = sdict() # {(Guid, Version, Path) : PackageObj} - self.ModuleSurfaceArea = sdict() # {(Guid, Version, Path) : ModuleObj} - self.Tools = MiscFileClass() - self.MiscellaneousFiles = MiscFileClass() - self.UserExtensions = [] - - ## Get all included packages and modules for a distribution package - # - # @param WorkspaceDir: WorkspaceDir - # @param PackageList: A list of all packages - # @param ModuleList: A list of all modules - # - def GetDistributionPackage(self, WorkspaceDir, PackageList, ModuleList): - AllGuidVersionDict = {} - # Get Packages - if PackageList: - for PackageFile in PackageList: - PackageFileFullPath = os.path.normpath(os.path.join(WorkspaceDir, PackageFile)) - DecObj = Dec(PackageFileFullPath, True, WorkspaceDir) - PackageObj = DecObj.Package - AllGuidVersionDict[PackageFileFullPath] = [PackageObj.PackageHeader.Guid, PackageObj.PackageHeader.Version] - - # Parser inf file one bye one - for File in PackageObj.MiscFiles.Files: - Filename = os.path.normpath(os.path.join(PackageObj.PackageHeader.RelaPath, File.Filename)) - (Name, ExtName) = os.path.splitext(Filename) - if ExtName.upper() == '.INF': - InfObj = Inf(Filename, True, WorkspaceDir, DecObj.Identification.PackagePath) - ModuleObj = InfObj.Module - AllGuidVersionDict[File] = [ModuleObj.ModuleHeader.Guid, ModuleObj.ModuleHeader.Version] - # Find and update Guid/Version of LibraryClass - for Item in ModuleObj.LibraryClasses: - if Item.RecommendedInstance: - LibClassIns = os.path.normpath(os.path.join(WorkspaceDir, Item.RecommendedInstance)) - Guid, Version = '', '' - if LibClassIns in AllGuidVersionDict: - Guid = AllGuidVersionDict[LibClassIns][0] - Version = AllGuidVersionDict[LibClassIns][1] - else: - Lib = Inf(LibClassIns, True, WorkspaceDir) - Guid = Lib.Module.ModuleHeader.Guid - Version = Lib.Module.ModuleHeader.Version - AllGuidVersionDict[LibClassIns] = [Guid, Version] - Item.RecommendedInstanceGuid = Guid - Item.RecommendedInstanceVersion = Version - # Find and update Guid/Version of - for Item in ModuleObj.PackageDependencies: - if Item.FilePath: - PackageFilePath = os.path.normpath(os.path.join(WorkspaceDir, Item.FilePath)) - Guid, Version = '', '' - if PackageFilePath in AllGuidVersionDict: - Guid = AllGuidVersionDict[PackageFilePath][0] - Version = AllGuidVersionDict[PackageFilePath][1] - else: - PackageDependencies = Dec(PackageFilePath, True, WorkspaceDir) - Guid = PackageDependencies.Package.PackageHeader.Guid - Version = PackageDependencies.Package.PackageHeader.Version - AllGuidVersionDict[PackageFilePath] = [Guid, Version] - Item.PackageGuid = Guid - Item.PackageVersion = Version - - # Add module to package - PackageObj.Modules[(ModuleObj.ModuleHeader.Guid, ModuleObj.ModuleHeader.Version, ModuleObj.ModuleHeader.CombinePath)] = ModuleObj - self.PackageSurfaceArea[(PackageObj.PackageHeader.Guid, PackageObj.PackageHeader.Version, PackageObj.PackageHeader.CombinePath)] = PackageObj - - # Get Modules - if ModuleList: - for ModuleFile in ModuleList: - ModuleFileFullPath = os.path.normpath(os.path.join(WorkspaceDir, ModuleFile)) - InfObj = Inf(ModuleFileFullPath, True, WorkspaceDir) - ModuleObj = InfObj.Module - AllGuidVersionDict[ModuleFileFullPath] = [ModuleObj.ModuleHeader.Guid, ModuleObj.ModuleHeader.Version] - # Find and update Guid/Version of LibraryClass - for Item in ModuleObj.LibraryClasses: - if Item.RecommendedInstance: - LibClassIns = os.path.normpath(os.path.join(WorkspaceDir, Item.RecommendedInstance)) - Guid, Version = '', '' - if LibClassIns in AllGuidVersionDict: - Guid = AllGuidVersionDict[LibClassIns][0] - Version = AllGuidVersionDict[LibClassIns][1] - else: - Lib = Inf(LibClassIns, True, WorkspaceDir) - Guid = Lib.Module.ModuleHeader.Guid - Version = Lib.Module.ModuleHeader.Version - AllGuidVersionDict[LibClassIns] = [Guid, Version] - Item.RecommendedInstanceGuid = Guid - Item.RecommendedInstanceVersion = Version - # Find and update Guid/Version of - for Item in ModuleObj.PackageDependencies: - if Item.FilePath: - PackageFilePath = os.path.normpath(os.path.join(WorkspaceDir, Item.FilePath)) - Guid, Version = '', '' - if PackageFilePath in AllGuidVersionDict: - Guid = AllGuidVersionDict[PackageFilePath][0] - Version = AllGuidVersionDict[PackageFilePath][1] - else: - PackageDependencies = Dec(PackageFilePath, True, WorkspaceDir) - Guid = PackageDependencies.Package.PackageHeader.Guid - Version = PackageDependencies.Package.PackageHeader.Version - AllGuidVersionDict[PackageFilePath] = [Guid, Version] - Item.PackageGuid = Guid - Item.PackageVersion = Version - self.ModuleSurfaceArea[(ModuleObj.ModuleHeader.Guid, ModuleObj.ModuleHeader.Version, ModuleObj.ModuleHeader.CombinePath)] = ModuleObj - -## -# -# This acts like the main() function for the script, unless it is 'import'ed into another -# script. -# -if __name__ == '__main__': - D = DistributionPackageClass() - D.GetDistributionPackage(os.getenv('WORKSPACE'), ['MdePkg/MdePkg.dec', 'TianoModulePkg/TianoModulePkg.dec'], ['MdeModulePkg/Application/HelloWorld/HelloWorld.inf']) - Xml = DistributionPackageXml() - print Xml.ToXml(D) - E = Xml.FromXml('C:\\2.xml') - #print Xml.ToXml(E) diff --git a/BaseTools/Source/Python/Ecc/Check.py b/BaseTools/Source/Python/Ecc/Check.py index cd47b805e5..6f5f9fd0b5 100644 --- a/BaseTools/Source/Python/Ecc/Check.py +++ b/BaseTools/Source/Python/Ecc/Check.py @@ -580,6 +580,7 @@ class Check(object): pass # Check whether the unnecessary inclusion of library classes in the Inf file + # Check whether the unnecessary duplication of library classe names in the DSC file def MetaDataFileCheckLibraryNoUse(self): if EccGlobalData.gConfig.MetaDataFileCheckLibraryNoUse == '1' or EccGlobalData.gConfig.MetaDataFileCheckAll == '1' or EccGlobalData.gConfig.CheckAll == '1': EdkLogger.quiet("Checking for library instance not used ...") @@ -588,7 +589,20 @@ class Check(object): for Record in RecordSet: if not EccGlobalData.gException.IsException(ERROR_META_DATA_FILE_CHECK_LIBRARY_NO_USE, Record[1]): EccGlobalData.gDb.TblReport.Insert(ERROR_META_DATA_FILE_CHECK_LIBRARY_NO_USE, OtherMsg="The Library Class [%s] is not used in any platform" % (Record[1]), BelongsToTable='Inf', BelongsToItem=Record[0]) - + SqlCommand = """ + select A.ID, A.Value1, A.BelongsToFile, A.StartLine, B.StartLine from Dsc as A left join Dsc as B + where A.Model = %s and B.Model = %s and A.Value3 = B.Value3 and A.Arch = B.Arch and A.ID <> B.ID + and A.Value1 = B.Value1 and A.StartLine <> B.StartLine and B.BelongsToFile = A.BelongsToFile""" \ + % (MODEL_EFI_LIBRARY_CLASS, MODEL_EFI_LIBRARY_CLASS) + RecordSet = EccGlobalData.gDb.TblDsc.Exec(SqlCommand) + for Record in RecordSet: + if Record[3] and Record[4] and Record[3] != Record[4]: + SqlCommand = """select FullPath from File where ID = %s""" % (Record[2]) + FilePathList = EccGlobalData.gDb.TblFile.Exec(SqlCommand) + for FilePath in FilePathList: + if not EccGlobalData.gException.IsException(ERROR_META_DATA_FILE_CHECK_LIBRARY_NAME_DUPLICATE, Record[1]): + EccGlobalData.gDb.TblReport.Insert(ERROR_META_DATA_FILE_CHECK_LIBRARY_NAME_DUPLICATE, OtherMsg="The Library Class [%s] is duplicated in '%s' line %s and line %s." % (Record[1], FilePath, Record[3], Record[4]), BelongsToTable='Dsc', BelongsToItem=Record[0]) + # Check whether an Inf file is specified in the FDF file, but not in the Dsc file, then the Inf file must be for a Binary module only def MetaDataFileCheckBinaryInfInFdf(self): if EccGlobalData.gConfig.MetaDataFileCheckBinaryInfInFdf == '1' or EccGlobalData.gConfig.MetaDataFileCheckAll == '1' or EccGlobalData.gConfig.CheckAll == '1': diff --git a/BaseTools/Source/Python/Ecc/EccToolError.py b/BaseTools/Source/Python/Ecc/EccToolError.py index 48810e466c..4039f57bc6 100644 --- a/BaseTools/Source/Python/Ecc/EccToolError.py +++ b/BaseTools/Source/Python/Ecc/EccToolError.py @@ -94,6 +94,7 @@ ERROR_META_DATA_FILE_CHECK_DUPLICATE_PPI = 10013 ERROR_META_DATA_FILE_CHECK_MODULE_FILE_NO_USE = 10014 ERROR_META_DATA_FILE_CHECK_PCD_TYPE = 10015 ERROR_META_DATA_FILE_CHECK_MODULE_FILE_GUID_DUPLICATION = 10016 +ERROR_META_DATA_FILE_CHECK_LIBRARY_NAME_DUPLICATE = 10017 ERROR_SPELLING_CHECK_ALL = 11000 @@ -171,6 +172,7 @@ gEccErrorMessage = { ERROR_META_DATA_FILE_CHECK_LIBRARY_INSTANCE_DEPENDENT : "A library instance must be defined for all dependent library classes", ERROR_META_DATA_FILE_CHECK_LIBRARY_INSTANCE_ORDER : "The library Instances specified by the LibraryClasses sections should be listed in order of dependencies", ERROR_META_DATA_FILE_CHECK_LIBRARY_NO_USE : "There should be no unnecessary inclusion of library classes in the INF file", + ERROR_META_DATA_FILE_CHECK_LIBRARY_NAME_DUPLICATE : "Duplicate Library Class Name found", ERROR_META_DATA_FILE_CHECK_BINARY_INF_IN_FDF : "An INF file is specified in the FDF file, but not in the DSC file, therefore the INF file must be for a Binary module only", ERROR_META_DATA_FILE_CHECK_PCD_DUPLICATE : "Duplicate PCDs found", ERROR_META_DATA_FILE_CHECK_PCD_FLASH : "PCD settings in the FDF file should only be related to flash", diff --git a/BaseTools/Source/Python/Ecc/Exception.py b/BaseTools/Source/Python/Ecc/Exception.py index ff8736059f..ffbb62b3b0 100644 --- a/BaseTools/Source/Python/Ecc/Exception.py +++ b/BaseTools/Source/Python/Ecc/Exception.py @@ -14,7 +14,7 @@ ## # Import Modules # -from Common.XmlRoutines import * +from Xml.XmlRoutines import * import os.path # ExceptionXml to parse Exception Node of XML file diff --git a/BaseTools/Source/Python/Ecc/Xml/XmlRoutines.py b/BaseTools/Source/Python/Ecc/Xml/XmlRoutines.py new file mode 100644 index 0000000000..5823067056 --- /dev/null +++ b/BaseTools/Source/Python/Ecc/Xml/XmlRoutines.py @@ -0,0 +1,228 @@ +## @file +# This is an XML API that uses a syntax similar to XPath, but it is written in +# standard python so that no extra python packages are required to use it. +# +# Copyright (c) 2007, 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 +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# + +## +# Import Modules +# +import xml.dom.minidom + +## Create a element of XML +# +# @param Name +# @param String +# @param NodeList +# @param AttributeList +# +# @revel Element +# +def CreateXmlElement(Name, String, NodeList, AttributeList): + Doc = xml.dom.minidom.Document() + Element = Doc.createElement(Name) + if String != '' and String != None: + Element.appendChild(Doc.createTextNode(String)) + + for Item in NodeList: + if type(Item) == type([]): + Key = Item[0] + Value = Item[1] + if Key != '' and Key != None and Value != '' and Value != None: + Node = Doc.createElement(Key) + Node.appendChild(Doc.createTextNode(Value)) + Element.appendChild(Node) + else: + Element.appendChild(Item) + for Item in AttributeList: + Key = Item[0] + Value = Item[1] + if Key != '' and Key != None and Value != '' and Value != None: + Element.setAttribute(Key, Value) + + return Element + +## Get a list of XML nodes using XPath style syntax. +# +# Return a list of XML DOM nodes from the root Dom specified by XPath String. +# If the input Dom or String is not valid, then an empty list is returned. +# +# @param Dom The root XML DOM node. +# @param String A XPath style path. +# +# @revel Nodes A list of XML nodes matching XPath style Sting. +# +def XmlList(Dom, String): + if String == None or String == "" or Dom == None or Dom == "": + return [] + if Dom.nodeType == Dom.DOCUMENT_NODE: + Dom = Dom.documentElement + if String[0] == "/": + String = String[1:] + TagList = String.split('/') + Nodes = [Dom] + Index = 0 + End = len(TagList) - 1 + while Index <= End: + ChildNodes = [] + for Node in Nodes: + if Node.nodeType == Node.ELEMENT_NODE and Node.tagName == TagList[Index]: + if Index < End: + ChildNodes.extend(Node.childNodes) + else: + ChildNodes.append(Node) + Nodes = ChildNodes + ChildNodes = [] + Index += 1 + + return Nodes + + +## Get a single XML node using XPath style syntax. +# +# Return a single XML DOM node from the root Dom specified by XPath String. +# If the input Dom or String is not valid, then an empty string is returned. +# +# @param Dom The root XML DOM node. +# @param String A XPath style path. +# +# @revel Node A single XML node matching XPath style Sting. +# +def XmlNode(Dom, String): + if String == None or String == "" or Dom == None or Dom == "": + return "" + if Dom.nodeType == Dom.DOCUMENT_NODE: + Dom = Dom.documentElement + if String[0] == "/": + String = String[1:] + TagList = String.split('/') + Index = 0 + End = len(TagList) - 1 + ChildNodes = [Dom] + while Index <= End: + for Node in ChildNodes: + if Node.nodeType == Node.ELEMENT_NODE and Node.tagName == TagList[Index]: + if Index < End: + ChildNodes = Node.childNodes + else: + return Node + break + Index += 1 + return "" + + +## Get a single XML element using XPath style syntax. +# +# Return a single XML element from the root Dom specified by XPath String. +# If the input Dom or String is not valid, then an empty string is returned. +# +# @param Dom The root XML DOM object. +# @param Strin A XPath style path. +# +# @revel Element An XML element matching XPath style Sting. +# +def XmlElement(Dom, String): + try: + return XmlNode(Dom, String).firstChild.data.strip() + except: + return "" + + +## Get a single XML element of the current node. +# +# Return a single XML element specified by the current root Dom. +# If the input Dom is not valid, then an empty string is returned. +# +# @param Dom The root XML DOM object. +# +# @revel Element An XML element in current root Dom. +# +def XmlElementData(Dom): + try: + return Dom.firstChild.data.strip() + except: + return "" + + +## Get a list of XML elements using XPath style syntax. +# +# Return a list of XML elements from the root Dom specified by XPath String. +# If the input Dom or String is not valid, then an empty list is returned. +# +# @param Dom The root XML DOM object. +# @param String A XPath style path. +# +# @revel Elements A list of XML elements matching XPath style Sting. +# +def XmlElementList(Dom, String): + return map(XmlElementData, XmlList(Dom, String)) + + +## Get the XML attribute of the current node. +# +# Return a single XML attribute named Attribute from the current root Dom. +# If the input Dom or Attribute is not valid, then an empty string is returned. +# +# @param Dom The root XML DOM object. +# @param Attribute The name of Attribute. +# +# @revel Element A single XML element matching XPath style Sting. +# +def XmlAttribute(Dom, Attribute): + try: + return Dom.getAttribute(Attribute).strip() + except: + return '' + + +## Get the XML node name of the current node. +# +# Return a single XML node name from the current root Dom. +# If the input Dom is not valid, then an empty string is returned. +# +# @param Dom The root XML DOM object. +# +# @revel Element A single XML element matching XPath style Sting. +# +def XmlNodeName(Dom): + try: + return Dom.nodeName.strip() + except: + return '' + +## Parse an XML file. +# +# Parse the input XML file named FileName and return a XML DOM it stands for. +# If the input File is not a valid XML file, then an empty string is returned. +# +# @param FileName The XML file name. +# +# @revel Dom The Dom object achieved from the XML file. +# +def XmlParseFile(FileName): + try: + XmlFile = open(FileName) + Dom = xml.dom.minidom.parse(XmlFile) + XmlFile.close() + return Dom + except Exception, X: + print X + return "" + +# This acts like the main() function for the script, unless it is 'import'ed +# into another script. +if __name__ == '__main__': + # Nothing to do here. Could do some unit tests. + A = CreateXmlElement('AAA', 'CCC', [['AAA', '111'], ['BBB', '222']], [['A', '1'], ['B', '2']]) + B = CreateXmlElement('ZZZ', 'CCC', [['XXX', '111'], ['YYY', '222']], [['A', '1'], ['B', '2']]) + C = CreateXmlList('DDD', 'EEE', [A, B], ['FFF', 'GGG']) + print C.toprettyxml(indent = " ") + pass diff --git a/BaseTools/Source/Python/Ecc/Xml/__init__.py b/BaseTools/Source/Python/Ecc/Xml/__init__.py new file mode 100644 index 0000000000..5d268d990b --- /dev/null +++ b/BaseTools/Source/Python/Ecc/Xml/__init__.py @@ -0,0 +1,20 @@ +## @file +# Python 'Library' package initialization file. +# +# This file is required to make Python interpreter treat the directory +# as containing package. +# +# Copyright (c) 2011, 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 +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# + +''' +Xml +''' \ No newline at end of file diff --git a/BaseTools/Source/Python/GenFds/FdfParser.py b/BaseTools/Source/Python/GenFds/FdfParser.py index 358215d662..d3d50b638e 100644 --- a/BaseTools/Source/Python/GenFds/FdfParser.py +++ b/BaseTools/Source/Python/GenFds/FdfParser.py @@ -50,6 +50,7 @@ from Common.String import NormPath import Common.GlobalData as GlobalData from Common.Expression import * from Common import GlobalData +from Common.String import ReplaceMacro import re import os @@ -528,25 +529,35 @@ class FdfParser: if not self.__GetNextToken(): raise Warning("expected include file name", self.FileName, self.CurrentLineNumber) IncFileName = self.__Token - if not os.path.isabs(IncFileName): - if IncFileName.startswith('$(WORKSPACE)'): - Str = IncFileName.replace('$(WORKSPACE)', os.environ.get('WORKSPACE')) - if os.path.exists(Str): - if not os.path.isabs(Str): - Str = os.path.abspath(Str) - IncFileName = Str - else: - # file is in the same dir with FDF file - FullFdf = self.FileName - if not os.path.isabs(self.FileName): - FullFdf = os.path.join(os.environ.get('WORKSPACE'), self.FileName) - - IncFileName = os.path.join(os.path.dirname(FullFdf), IncFileName) - - if not os.path.exists(os.path.normpath(IncFileName)): - raise Warning("Include file not exists", self.FileName, self.CurrentLineNumber) + __IncludeMacros = {} + __IncludeMacros['WORKSPACE'] = InputMacroDict['WORKSPACE'] + __IncludeMacros['ECP_SOURCE'] = InputMacroDict['ECP_SOURCE'] + __IncludeMacros['EFI_SOURCE'] = InputMacroDict['EFI_SOURCE'] + __IncludeMacros['EDK_SOURCE'] = InputMacroDict['EDK_SOURCE'] + + IncludedFile = NormPath(ReplaceMacro(IncFileName, __IncludeMacros, RaiseError=True)) + # + # First search the include file under the same directory as FDF file + # + IncludedFile1 = PathClass(IncludedFile, os.path.dirname(self.FileName)) + ErrorCode = IncludedFile1.Validate()[0] + if ErrorCode != 0: + # + # Then search the include file under the same directory as DSC file + # + IncludedFile1 = PathClass(IncludedFile, GenFdsGlobalVariable.ActivePlatform.Dir) + ErrorCode = IncludedFile1.Validate()[0] + if ErrorCode != 0: + # + # Also search file under the WORKSPACE directory + # + IncludedFile1 = PathClass(IncludedFile, GlobalData.gWorkspace) + ErrorCode = IncludedFile1.Validate()[0] + if ErrorCode != 0: + raise Warning("The include file does not exist under below directories: \n%s\n%s\n%s\n"%(os.path.dirname(self.FileName), GenFdsGlobalVariable.ActivePlatform.Dir, GlobalData.gWorkspace), + self.FileName, self.CurrentLineNumber) - IncFileProfile = IncludeFileProfile(os.path.normpath(IncFileName)) + IncFileProfile = IncludeFileProfile(IncludedFile1.Path) CurrentLine = self.CurrentLineNumber CurrentOffset = self.CurrentOffsetWithinLine @@ -2942,6 +2953,9 @@ class FdfParser: if not self.__GetNextToken(): raise Warning("expected FV name", self.FileName, self.CurrentLineNumber) + if self.__Token.upper() not in self.Profile.FvDict.keys(): + raise Warning("FV name does not exist", self.FileName, self.CurrentLineNumber) + CapsuleFv = CapsuleData.CapsuleFv() CapsuleFv.FvName = self.__Token CapsuleObj.CapsuleDataList.append(CapsuleFv) @@ -2967,6 +2981,9 @@ class FdfParser: if not self.__GetNextToken(): raise Warning("expected FD name", self.FileName, self.CurrentLineNumber) + if self.__Token.upper() not in self.Profile.FdDict.keys(): + raise Warning("FD name does not exist", self.FileName, self.CurrentLineNumber) + CapsuleFd = CapsuleData.CapsuleFd() CapsuleFd.FdName = self.__Token CapsuleObj.CapsuleDataList.append(CapsuleFd) diff --git a/BaseTools/Source/Python/Makefile b/BaseTools/Source/Python/Makefile index f6890787ee..a1a0a5e639 100644 --- a/BaseTools/Source/Python/Makefile +++ b/BaseTools/Source/Python/Makefile @@ -27,7 +27,6 @@ COMMON_PYTHON=$(BASE_TOOLS_PATH)\Source\Python\Common\BuildToolError.py \ $(BASE_TOOLS_PATH)\Source\Python\Common\Database.py \ $(BASE_TOOLS_PATH)\Source\Python\Common\DataType.py \ $(BASE_TOOLS_PATH)\Source\Python\Common\DecClassObject.py \ - $(BASE_TOOLS_PATH)\Source\Python\Common\DecClassObjectLight.py \ $(BASE_TOOLS_PATH)\Source\Python\Common\Dictionary.py \ $(BASE_TOOLS_PATH)\Source\Python\Common\DscClassObject.py \ $(BASE_TOOLS_PATH)\Source\Python\Common\EdkIIWorkspace.py \ @@ -38,7 +37,6 @@ COMMON_PYTHON=$(BASE_TOOLS_PATH)\Source\Python\Common\BuildToolError.py \ $(BASE_TOOLS_PATH)\Source\Python\Common\GlobalData.py \ $(BASE_TOOLS_PATH)\Source\Python\Common\Identification.py \ $(BASE_TOOLS_PATH)\Source\Python\Common\InfClassObject.py \ - $(BASE_TOOLS_PATH)\Source\Python\Common\InfClassObjectLight.py \ $(BASE_TOOLS_PATH)\Source\Python\Common\MigrationUtilities.py \ $(BASE_TOOLS_PATH)\Source\Python\Common\Misc.py \ $(BASE_TOOLS_PATH)\Source\Python\Common\Parsing.py \ @@ -46,8 +44,6 @@ COMMON_PYTHON=$(BASE_TOOLS_PATH)\Source\Python\Common\BuildToolError.py \ $(BASE_TOOLS_PATH)\Source\Python\Common\TargetTxtClassObject.py \ $(BASE_TOOLS_PATH)\Source\Python\Common\ToolDefClassObject.py \ $(BASE_TOOLS_PATH)\Source\Python\Common\VpdInfoFile.py \ - $(BASE_TOOLS_PATH)\Source\Python\Common\XmlParser.py \ - $(BASE_TOOLS_PATH)\Source\Python\Common\XmlRoutines.py \ $(BASE_TOOLS_PATH)\Source\Python\Common\__init__.py \ $(BASE_TOOLS_PATH)\Source\Python\Common\BuildVersion.py \ $(BASE_TOOLS_PATH)\Source\Python\Workspace\BuildClassObject.py \ @@ -65,6 +61,7 @@ COMMON_PYTHON=$(BASE_TOOLS_PATH)\Source\Python\Common\BuildToolError.py \ $(BASE_TOOLS_PATH)\Source\Python\Autogen\UniClassObject.py \ $(BASE_TOOLS_PATH)\Source\Python\Autogen\__init__.py +UPT_BUILDVERSION_PYTHON=$(BASE_TOOLS_PATH)\Source\Python\UPT\BuildVersion.py all: SetPythonPath $(APPLICATIONS) @@ -104,7 +101,7 @@ $(BIN_DIR)\PatchPcdValue.exe: $(BASE_TOOLS_PATH)\Source\Python\PatchPcdValue\Pat $(BIN_DIR)\BPDG.exe: $(BASE_TOOLS_PATH)\Source\Python\BPDG\BPDG.py $(COMMON_PYTHON) @pushd . & @cd BPDG & @$(FREEZE) --include-modules=$(MODULES) --install-dir=$(BIN_DIR) BPDG.py & @popd -$(BIN_DIR)\UPT.exe: $(BASE_TOOLS_PATH)\Source\Python\UPT\UPT.py $(BASE_TOOLS_PATH)\Source\Python\UPT\UPT.py $(COMMON_PYTHON) +$(BIN_DIR)\UPT.exe: $(BASE_TOOLS_PATH)\Source\Python\UPT\UPT.py $(UPT_BUILDVERSION_PYTHON) @pushd . & @cd UPT & @$(FREEZE) --include-modules=$(MODULES) --install-dir=$(BIN_DIR) UPT.py & @popd clean: diff --git a/BaseTools/Source/Python/Trim/Trim.py b/BaseTools/Source/Python/Trim/Trim.py index c5e9ee2f0d..34f6284a87 100644 --- a/BaseTools/Source/Python/Trim/Trim.py +++ b/BaseTools/Source/Python/Trim/Trim.py @@ -37,7 +37,9 @@ gTypedefPattern = re.compile("^\s*typedef\s+struct(\s+\w+)?\s*[{]*$", re.MULTILI ## Regular expression for matching "#pragma pack" gPragmaPattern = re.compile("^\s*#pragma\s+pack", re.MULTILINE) ## Regular expression for matching HEX number -gHexNumberPattern = re.compile("0[xX]([0-9a-fA-F]+)") +gHexNumberPattern = re.compile("(0[xX])([0-9a-fA-F]+)U?") +## Regular expression for matching decimal number with 'U' postfix +gDecNumberPattern = re.compile("([0-9]+)U") ## Regular expression for matching "Include ()" in asl file gAslIncludePattern = re.compile("^(\s*)[iI]nclude\s*\(\"?([^\"\(\)]+)\"\)", re.MULTILINE) ## Regular expression for matching C style #include "XXX.asl" in asl file @@ -169,10 +171,15 @@ def TrimPreprocessedFile(Source, Target, ConvertHex, TrimLong): # convert HEX number format if indicated if ConvertHex: - Line = gHexNumberPattern.sub(r"0\1h", Line) + Line = gHexNumberPattern.sub(r"0\2h", Line) + else: + Line = gHexNumberPattern.sub(r"\1\2", Line) if TrimLong: Line = gLongNumberPattern.sub(r"\1", Line) + # convert Decimal number format + Line = gDecNumberPattern.sub(r"\1", Line) + if LineNumber != None: EdkLogger.verbose("Got line directive: line=%d" % LineNumber) # in case preprocessor removed some lines, like blank or comment lines diff --git a/BaseTools/Source/Python/UPT/BuildVersion.py b/BaseTools/Source/Python/UPT/BuildVersion.py new file mode 100644 index 0000000000..4bb9a8b521 --- /dev/null +++ b/BaseTools/Source/Python/UPT/BuildVersion.py @@ -0,0 +1,3 @@ +#This file is for build version number auto generation +# +gBUILD_VERSION = "Build 2423" diff --git a/BaseTools/Source/Python/UPT/Library/Misc.py b/BaseTools/Source/Python/UPT/Library/Misc.py index 658c4e0cfb..b67cd102d1 100644 --- a/BaseTools/Source/Python/UPT/Library/Misc.py +++ b/BaseTools/Source/Python/UPT/Library/Misc.py @@ -834,6 +834,59 @@ def ProcessLineExtender(LineList): return NewList +## ProcessEdkComment +# +# Process EDK style comment in LineList: c style /* */ comment or cpp style // comment +# +# +# @param LineList The LineList need to be processed. +# +# @return LineList The LineList been processed. +# @return FirstPos Where Edk comment is first found, -1 if not found +# +def ProcessEdkComment(LineList): + FindEdkBlockComment = False + Count = 0 + StartPos = -1 + EndPos = -1 + FirstPos = -1 + + while(Count < len(LineList)): + Line = LineList[Count].strip() + if Line.startswith("/*"): + # + # handling c style comment + # + StartPos = Count + while Count < len(LineList): + Line = LineList[Count].strip() + if Line.endswith("*/"): + if (Count == StartPos) and Line.strip() == '/*/': + Count = Count + 1 + continue + EndPos = Count + FindEdkBlockComment = True + break + Count = Count + 1 + + if FindEdkBlockComment: + if FirstPos == -1: + FirstPos = StartPos + for Index in xrange(StartPos, EndPos+1): + LineList[Index] = '' + FindEdkBlockComment = False + elif Line.find("//") != -1: + # + # handling cpp style comment + # + LineList[Count] = Line.replace("//", '#') + if FirstPos == -1: + FirstPos = Count + + Count = Count + 1 + + return LineList, FirstPos + ## GetLibInstanceInfo # # Get the information from Library Instance INF file. diff --git a/BaseTools/Source/Python/UPT/Logger/StringTable.py b/BaseTools/Source/Python/UPT/Logger/StringTable.py index 230c659189..063ca52d2b 100644 --- a/BaseTools/Source/Python/UPT/Logger/StringTable.py +++ b/BaseTools/Source/Python/UPT/Logger/StringTable.py @@ -196,6 +196,7 @@ ERR_INF_PARSER_VER_EXIST_BOTH_NUM_STR = \ _("The INF file %s defines both VERSION_NUMBER and VERSION_STRING, " "using VERSION_STRING") ERR_INF_PARSER_NOT_SUPPORT_EDKI_INF = _("EDKI INF is not supported") +ERR_INF_PARSER_EDKI_COMMENT_IN_EDKII = _("The EDKI style comment is not supported in EDKII modules") ERR_INF_PARSER_FEATUREPCD_USAGE_INVALID = _("The usage for FeaturePcd can only" " be type of \"CONSUMES\".") diff --git a/BaseTools/Source/Python/UPT/Makefile b/BaseTools/Source/Python/UPT/Makefile index a6e3a6dd41..d4eef45196 100644 --- a/BaseTools/Source/Python/UPT/Makefile +++ b/BaseTools/Source/Python/UPT/Makefile @@ -24,14 +24,14 @@ SOURCES_PATH = . APPLICATIONS=$(BIN_DIR)\UPT.exe -COMMON_PYTHON=$(SOURCES_PATH)\UPT.py +UPT_BUILDVERSION_PYTHON=$(SOURCES_PATH)\BuildVersion.py all: SetPythonPath $(APPLICATIONS) SetPythonPath: set PYTHONPATH= $(SOURCES_PATH) -$(BIN_DIR)\UPT.exe: $(SOURCES_PATH)\UPT.py $(COMMON_PYTHON) +$(BIN_DIR)\UPT.exe: $(SOURCES_PATH)\UPT.py $(UPT_BUILDVERSION_PYTHON) @pushd . & @cd build & @$(FREEZE) --include-modules=$(MODULES) --install-dir=$(BIN_DIR) UPT.py & @popd @pushd . & @copy .\Dll\sqlite3.dll .\Bin\Sqlite3.dll & @popd clean: diff --git a/BaseTools/Source/Python/UPT/Parser/InfParser.py b/BaseTools/Source/Python/UPT/Parser/InfParser.py index aa44e8038d..79f71448ee 100644 --- a/BaseTools/Source/Python/UPT/Parser/InfParser.py +++ b/BaseTools/Source/Python/UPT/Parser/InfParser.py @@ -26,6 +26,7 @@ from copy import deepcopy from Library.String import GetSplitValueList from Library.String import ConvertSpecialChar from Library.Misc import ProcessLineExtender +from Library.Misc import ProcessEdkComment from Library.Parsing import NormPath from Library.ParserValidate import IsValidInfMoudleTypeList from Library.ParserValidate import IsValidArch @@ -164,6 +165,12 @@ class InfParser(InfSectionParser): # FileLinesList = ProcessLineExtender(FileLinesList) + # + # Process EdkI INF style comment if found + # + OrigLines = [Line for Line in FileLinesList] + FileLinesList, EdkCommentStartPos = ProcessEdkComment(FileLinesList) + # # Judge whether the INF file is Binary INF or not # @@ -338,6 +345,17 @@ class InfParser(InfSectionParser): ST.ERR_INF_PARSER_HEADER_MISSGING, File=self.FullPath) + # + # EDKII INF should not have EDKI style comment + # + if EdkCommentStartPos != -1: + Logger.Error("InfParser", + FORMAT_INVALID, + ST.ERR_INF_PARSER_EDKI_COMMENT_IN_EDKII, + File=self.FullPath, + Line=EdkCommentStartPos + 1, + ExtraData=OrigLines[EdkCommentStartPos]) + # # extract [Event] [Hob] [BootMode] sections # diff --git a/BaseTools/Source/Python/UPT/UPT.py b/BaseTools/Source/Python/UPT/UPT.py index a9066a259a..b168a51daa 100644 --- a/BaseTools/Source/Python/UPT/UPT.py +++ b/BaseTools/Source/Python/UPT/UPT.py @@ -43,7 +43,7 @@ import RmPkg from Library.Misc import CheckEnvVariable from Library import GlobalData from Core.IpiDb import IpiDatabase -from Common.BuildVersion import gBUILD_VERSION +from BuildVersion import gBUILD_VERSION ## # Version and Copyright diff --git a/BaseTools/Source/Python/Workspace/MetaFileParser.py b/BaseTools/Source/Python/Workspace/MetaFileParser.py index bfa7054396..d907b11ba1 100644 --- a/BaseTools/Source/Python/Workspace/MetaFileParser.py +++ b/BaseTools/Source/Python/Workspace/MetaFileParser.py @@ -769,7 +769,7 @@ class DscParser(MetaFileParser): self._InSubsection = False self._SubsectionType = MODEL_UNKNOWN self._SubsectionName = '' - self._Owner.pop() + self._Owner[-1] = -1 continue # subsection header elif Line[0] == TAB_OPTION_START and Line[-1] == TAB_OPTION_END: @@ -1247,19 +1247,48 @@ class DscParser(MetaFileParser): MODEL_META_DATA_CONDITIONAL_STATEMENT_IFNDEF]: break elif self._ItemType == MODEL_META_DATA_INCLUDE: - # The included file must be relative to workspace - IncludedFile = NormPath(ReplaceMacro(self._ValueList[1], self._Macros, RaiseError=True)) - IncludedFile = PathClass(IncludedFile, GlobalData.gWorkspace) - ErrorCode, ErrorInfo = IncludedFile.Validate() + # The included file must be relative to workspace or same directory as DSC file + __IncludeMacros = {} + # + # Allow using system environment variables in path after !include + # + __IncludeMacros['WORKSPACE'] = GlobalData.gGlobalDefines['WORKSPACE'] + if "ECP_SOURCE" in GlobalData.gGlobalDefines.keys(): + __IncludeMacros['ECP_SOURCE'] = GlobalData.gGlobalDefines['ECP_SOURCE'] + # + # During GenFds phase call DSC parser, will go into this branch. + # + elif "ECP_SOURCE" in GlobalData.gCommandLineDefines.keys(): + __IncludeMacros['ECP_SOURCE'] = GlobalData.gCommandLineDefines['ECP_SOURCE'] + + __IncludeMacros['EFI_SOURCE'] = GlobalData.gGlobalDefines['EFI_SOURCE'] + __IncludeMacros['EDK_SOURCE'] = GlobalData.gGlobalDefines['EDK_SOURCE'] + # + # Allow using MACROs comes from [Defines] section to keep compatible. + # + __IncludeMacros.update(self._Macros) + + IncludedFile = NormPath(ReplaceMacro(self._ValueList[1], __IncludeMacros, RaiseError=True)) + # + # First search the include file under the same directory as DSC file + # + IncludedFile1 = PathClass(IncludedFile, self.MetaFile.Dir) + ErrorCode, ErrorInfo1 = IncludedFile1.Validate() if ErrorCode != 0: - EdkLogger.error('parser', ErrorCode, File=self._FileWithError, - Line=self._LineIndex+1, ExtraData=ErrorInfo) + # + # Also search file under the WORKSPACE directory + # + IncludedFile1 = PathClass(IncludedFile, GlobalData.gWorkspace) + ErrorCode, ErrorInfo2 = IncludedFile1.Validate() + if ErrorCode != 0: + EdkLogger.error('parser', ErrorCode, File=self._FileWithError, + Line=self._LineIndex+1, ExtraData=ErrorInfo1 + "\n"+ ErrorInfo2) - self._FileWithError = IncludedFile + self._FileWithError = IncludedFile1 - IncludedFileTable = MetaFileStorage(self._Table.Cur, IncludedFile, MODEL_FILE_DSC, False) + IncludedFileTable = MetaFileStorage(self._Table.Cur, IncludedFile1, MODEL_FILE_DSC, False) Owner = self._Content[self._ContentIndex-1][0] - Parser = DscParser(IncludedFile, self._FileType, IncludedFileTable, + Parser = DscParser(IncludedFile1, self._FileType, IncludedFileTable, Owner=Owner, From=Owner) # set the parser status with current status @@ -1280,7 +1309,10 @@ class DscParser(MetaFileParser): Records = IncludedFileTable.GetAll() if Records: self._Content[self._ContentIndex:self._ContentIndex] = Records - + self._Content.pop(self._ContentIndex-1) + self._ValueList = None + self._ContentIndex -= 1 + def __ProcessSkuId(self): self._ValueList = [ReplaceMacro(Value, self._Macros, RaiseError=True) for Value in self._ValueList] -- cgit v1.2.3