1. Fix a bug of generating additional EOL in file header. 2. Fix a bug of format error for Defines section. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Hess Chen <hesheng.chen@intel.com> Reviewed-by: Yingke Liu <yingke.d.liu@Intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16153 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			1126 lines
		
	
	
		
			45 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			1126 lines
		
	
	
		
			45 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| ## @file GenInfFile.py
 | |
| #
 | |
| # This file contained the logical of transfer package object to INF files.
 | |
| #
 | |
| # Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>
 | |
| #
 | |
| # 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.
 | |
| #
 | |
| '''
 | |
| GenInf
 | |
| '''
 | |
| import os
 | |
| import stat
 | |
| import codecs
 | |
| import md5
 | |
| from Core.FileHook import __FileHookOpen__
 | |
| from Library.String import GetSplitValueList
 | |
| from Library.Parsing import GenSection
 | |
| from Library.Parsing import GetWorkspacePackage
 | |
| from Library.Parsing import ConvertArchForInstall
 | |
| from Library.Misc import SaveFileOnChange
 | |
| from Library.Misc import IsAllModuleList
 | |
| from Library.Misc import Sdict
 | |
| from Library.Misc import ConvertPath
 | |
| from Library.Misc import ConvertSpec
 | |
| from Library.Misc import GetRelativePath
 | |
| from Library.Misc import GetLocalValue
 | |
| from Library.CommentGenerating import GenHeaderCommentSection
 | |
| from Library.CommentGenerating import GenGenericCommentF
 | |
| from Library.CommentGenerating import _GetHelpStr
 | |
| from Library import GlobalData
 | |
| from Logger import StringTable as ST
 | |
| from Logger import ToolError
 | |
| import Logger.Log as Logger
 | |
| from Library import DataType as DT
 | |
| from GenMetaFile import GenMetaFileMisc
 | |
| from Library.UniClassObject import FormatUniEntry
 | |
| 
 | |
| 
 | |
| ## Transfer Module Object to Inf files
 | |
| #
 | |
| # Transfer all contents of a standard Module Object to an Inf file 
 | |
| # @param ModuleObject: A Module Object  
 | |
| #
 | |
| def ModuleToInf(ModuleObject, PackageObject=None, DistHeader=None):
 | |
|     if not GlobalData.gWSPKG_LIST:
 | |
|         GlobalData.gWSPKG_LIST = GetWorkspacePackage()
 | |
|     #
 | |
|     # Init global information for the file
 | |
|     #
 | |
|     ContainerFile = ModuleObject.GetFullPath()
 | |
| 
 | |
|     Content = ''
 | |
|     #
 | |
|     # Generate file header, If any Abstract, Description, Copyright or License XML elements are missing, 
 | |
|     # should 1) use the Abstract, Description, Copyright or License from the PackageSurfaceArea.Header elements 
 | |
|     # that the module belongs to, or 2) if this is a stand-alone module that is not included in a PackageSurfaceArea, 
 | |
|     # use the abstract, description, copyright or license from the DistributionPackage.Header elements.
 | |
|     #
 | |
|     ModuleAbstract = GetLocalValue(ModuleObject.GetAbstract())
 | |
|     if not ModuleAbstract and PackageObject:
 | |
|         ModuleAbstract = GetLocalValue(PackageObject.GetAbstract())
 | |
|     if not ModuleAbstract and DistHeader:
 | |
|         ModuleAbstract = GetLocalValue(DistHeader.GetAbstract())
 | |
|     ModuleDescription = GetLocalValue(ModuleObject.GetDescription())
 | |
|     if not ModuleDescription and PackageObject:
 | |
|         ModuleDescription = GetLocalValue(PackageObject.GetDescription())
 | |
|     if not ModuleDescription and DistHeader:
 | |
|         ModuleDescription = GetLocalValue(DistHeader.GetDescription())
 | |
|     ModuleCopyright = ''
 | |
|     for (Lang, Copyright) in ModuleObject.GetCopyright():
 | |
|         if Lang:
 | |
|             pass
 | |
|         ModuleCopyright = Copyright
 | |
|     if not ModuleCopyright and PackageObject:
 | |
|         for (Lang, Copyright) in PackageObject.GetCopyright():
 | |
|             if Lang:
 | |
|                 pass
 | |
|             ModuleCopyright = Copyright
 | |
|     if not ModuleCopyright and DistHeader:
 | |
|         for (Lang, Copyright) in DistHeader.GetCopyright():
 | |
|             if Lang:
 | |
|                 pass
 | |
|             ModuleCopyright = Copyright
 | |
|     ModuleLicense = ''
 | |
|     for (Lang, License) in ModuleObject.GetLicense():
 | |
|         if Lang:
 | |
|             pass
 | |
|         ModuleLicense = License
 | |
|     if not ModuleLicense and PackageObject:
 | |
|         for (Lang, License) in PackageObject.GetLicense():
 | |
|             if Lang:
 | |
|                 pass
 | |
|             ModuleLicense = License
 | |
|     if not ModuleLicense and DistHeader:
 | |
|         for (Lang, License) in DistHeader.GetLicense():
 | |
|             if Lang:
 | |
|                 pass
 | |
|             ModuleLicense = License
 | |
| 
 | |
|     #
 | |
|     # Generate header comment section of INF file
 | |
|     #        
 | |
|     Content += GenHeaderCommentSection(ModuleAbstract,
 | |
|                                        ModuleDescription,
 | |
|                                        ModuleCopyright,
 | |
|                                        ModuleLicense).replace('\r\n', '\n')
 | |
| 
 | |
|     #
 | |
|     # Generate Binary Header 
 | |
|     # 
 | |
|     for UserExtension in ModuleObject.GetUserExtensionList():
 | |
|         if UserExtension.GetUserID() == DT.TAB_BINARY_HEADER_USERID \
 | |
|         and UserExtension.GetIdentifier() == DT.TAB_BINARY_HEADER_IDENTIFIER:
 | |
|             ModuleBinaryAbstract = GetLocalValue(UserExtension.GetBinaryAbstract())
 | |
|             ModuleBinaryDescription = GetLocalValue(UserExtension.GetBinaryDescription())
 | |
|             ModuleBinaryCopyright = ''
 | |
|             ModuleBinaryLicense = ''
 | |
|             for (Lang, Copyright) in UserExtension.GetBinaryCopyright():
 | |
|                 ModuleBinaryCopyright = Copyright
 | |
|             for (Lang, License) in UserExtension.GetBinaryLicense():
 | |
|                 ModuleBinaryLicense = License
 | |
|             if ModuleBinaryAbstract and ModuleBinaryDescription and \
 | |
|             ModuleBinaryCopyright and ModuleBinaryLicense:
 | |
|                 Content += GenHeaderCommentSection(ModuleBinaryAbstract,
 | |
|                                            ModuleBinaryDescription,
 | |
|                                            ModuleBinaryCopyright,
 | |
|                                            ModuleBinaryLicense,
 | |
|                                            True)
 | |
| 
 | |
|     #
 | |
|     # Generate MODULE_UNI_FILE for module
 | |
|     #
 | |
|     FileHeader = GenHeaderCommentSection(ModuleAbstract, ModuleDescription, ModuleCopyright, ModuleLicense, False, \
 | |
|                                          DT.TAB_COMMENT_EDK1_SPLIT)
 | |
|     GenModuleUNIEncodeFile(ModuleObject, FileHeader)
 | |
| 
 | |
|     #
 | |
|     # Judge whether the INF file is an AsBuild INF.
 | |
|     #
 | |
|     if ModuleObject.BinaryModule:
 | |
|         GlobalData.gIS_BINARY_INF = True
 | |
|     else:
 | |
|         GlobalData.gIS_BINARY_INF = False
 | |
|     #
 | |
|     # for each section, maintain a dict, sorted arch will be its key, 
 | |
|     # statement list will be its data
 | |
|     # { 'Arch1 Arch2 Arch3': [statement1, statement2],
 | |
|     #   'Arch1' : [statement1, statement3] 
 | |
|     #  }
 | |
|     #
 | |
|     # Gen section contents
 | |
|     #
 | |
|     Content += GenDefines(ModuleObject)
 | |
|     Content += GenBuildOptions(ModuleObject)
 | |
|     Content += GenLibraryClasses(ModuleObject)
 | |
|     Content += GenPackages(ModuleObject)
 | |
|     Content += GenPcdSections(ModuleObject)
 | |
|     Content += GenSources(ModuleObject)
 | |
|     Content += GenProtocolPPiSections(ModuleObject.GetProtocolList(), True)
 | |
|     Content += GenProtocolPPiSections(ModuleObject.GetPpiList(), False)
 | |
|     Content += GenGuidSections(ModuleObject.GetGuidList())
 | |
|     Content += GenBinaries(ModuleObject)
 | |
|     Content += GenDepex(ModuleObject)
 | |
|     Content += GenUserExtensions(ModuleObject)
 | |
|     if ModuleObject.GetEventList() or ModuleObject.GetBootModeList() or ModuleObject.GetHobList():
 | |
|         Content += '\n'
 | |
|     #
 | |
|     # generate [Event], [BootMode], [Hob] section
 | |
|     #
 | |
|     Content += GenSpecialSections(ModuleObject.GetEventList(), 'Event')
 | |
|     Content += GenSpecialSections(ModuleObject.GetBootModeList(), 'BootMode')
 | |
|     Content += GenSpecialSections(ModuleObject.GetHobList(), 'Hob')
 | |
|     SaveFileOnChange(ContainerFile, Content, False)
 | |
|     if DistHeader.ReadOnly:
 | |
|         os.chmod(ContainerFile, stat.S_IRUSR|stat.S_IRGRP|stat.S_IROTH)
 | |
|     else:
 | |
|         os.chmod(ContainerFile, stat.S_IRUSR|stat.S_IRGRP|stat.S_IROTH|stat.S_IWUSR|stat.S_IWGRP|stat.S_IWOTH)
 | |
|     return ContainerFile
 | |
| 
 | |
| ## GenModuleUNIEncodeFile
 | |
| # GenModuleUNIEncodeFile, default is a UCS-2LE encode file
 | |
| #
 | |
| def GenModuleUNIEncodeFile(ModuleObject, UniFileHeader='', Encoding=DT.TAB_ENCODING_UTF16LE):
 | |
|     GenUNIFlag = False
 | |
|     OnlyLANGUAGE_EN_X = True
 | |
|     BinaryAbstract = []
 | |
|     BinaryDescription = []
 | |
|     #
 | |
|     # If more than one language code is used for any element that would be present in the MODULE_UNI_FILE, 
 | |
|     # then the MODULE_UNI_FILE must be created.
 | |
|     #
 | |
|     for (Key, Value) in ModuleObject.GetAbstract() + ModuleObject.GetDescription():
 | |
|         if Key == DT.TAB_LANGUAGE_EN_X:
 | |
|             GenUNIFlag = True
 | |
|         else:
 | |
|             OnlyLANGUAGE_EN_X = False
 | |
| 
 | |
|     for UserExtension in ModuleObject.GetUserExtensionList():
 | |
|         if UserExtension.GetUserID() == DT.TAB_BINARY_HEADER_USERID \
 | |
|         and UserExtension.GetIdentifier() == DT.TAB_BINARY_HEADER_IDENTIFIER:
 | |
|             for (Key, Value) in UserExtension.GetBinaryAbstract():
 | |
|                 if Key == DT.TAB_LANGUAGE_EN_X:
 | |
|                     GenUNIFlag = True
 | |
|                 else:
 | |
|                     OnlyLANGUAGE_EN_X = False
 | |
|                 BinaryAbstract.append((Key, Value))
 | |
|             for (Key, Value) in UserExtension.GetBinaryDescription():
 | |
|                 if Key == DT.TAB_LANGUAGE_EN_X:
 | |
|                     GenUNIFlag = True
 | |
|                 else:
 | |
|                     OnlyLANGUAGE_EN_X = False
 | |
|                 BinaryDescription.append((Key, Value))
 | |
| 
 | |
| 
 | |
|     if not GenUNIFlag:
 | |
|         return
 | |
|     elif OnlyLANGUAGE_EN_X:
 | |
|         return
 | |
|     else:
 | |
|         ModuleObject.UNIFlag = True
 | |
|     ContainerFile = os.path.normpath(os.path.join(os.path.dirname(ModuleObject.GetFullPath()),
 | |
|                                                   (ModuleObject.GetBaseName() + '.uni')))
 | |
|     if not os.path.exists(os.path.dirname(ModuleObject.GetFullPath())):
 | |
|         os.makedirs(os.path.dirname(ModuleObject.GetFullPath()))
 | |
| 
 | |
|     Content = UniFileHeader + '\r\n'
 | |
|     Content += '\r\n'
 | |
| 
 | |
|     Content += FormatUniEntry('#string ' + DT.TAB_INF_ABSTRACT, ModuleObject.GetAbstract(), ContainerFile) + '\r\n'
 | |
| 
 | |
|     Content += FormatUniEntry('#string ' + DT.TAB_INF_DESCRIPTION, ModuleObject.GetDescription(), ContainerFile) \
 | |
|             + '\r\n'
 | |
| 
 | |
|     BinaryAbstractString = FormatUniEntry('#string ' + DT.TAB_INF_BINARY_ABSTRACT, BinaryAbstract, ContainerFile)
 | |
|     if BinaryAbstractString:
 | |
|         Content += BinaryAbstractString + '\r\n'
 | |
| 
 | |
|     BinaryDescriptionString = FormatUniEntry('#string ' + DT.TAB_INF_BINARY_DESCRIPTION, BinaryDescription, \
 | |
|                                              ContainerFile)
 | |
|     if BinaryDescriptionString:
 | |
|         Content += BinaryDescriptionString + '\r\n'
 | |
| 
 | |
|     if not os.path.exists(ContainerFile):
 | |
|         File = codecs.open(ContainerFile, 'wb', Encoding)
 | |
|         File.write(u'\uFEFF' + Content)
 | |
|         File.stream.close()
 | |
|     Md5Sigature = md5.new(__FileHookOpen__(str(ContainerFile), 'rb').read())
 | |
|     Md5Sum = Md5Sigature.hexdigest()
 | |
|     if (ContainerFile, Md5Sum) not in ModuleObject.FileList:
 | |
|         ModuleObject.FileList.append((ContainerFile, Md5Sum))
 | |
| 
 | |
|     return ContainerFile
 | |
| def GenDefines(ModuleObject):
 | |
|     #
 | |
|     # generate [Defines] section
 | |
|     #
 | |
|     LeftOffset = 31
 | |
|     Content = ''
 | |
|     NewSectionDict = {}
 | |
| 
 | |
|     for UserExtension in ModuleObject.GetUserExtensionList():
 | |
|         DefinesDict = UserExtension.GetDefinesDict()
 | |
|         if not DefinesDict:
 | |
|             continue
 | |
|         for Statement in DefinesDict:
 | |
|             if Statement.split(DT.TAB_EQUAL_SPLIT) > 1:
 | |
|                 Statement = (u'%s ' % Statement.split(DT.TAB_EQUAL_SPLIT, 1)[0]).ljust(LeftOffset) \
 | |
|                              + u'= %s' % Statement.split(DT.TAB_EQUAL_SPLIT, 1)[1].lstrip()
 | |
|             SortedArch = DT.TAB_ARCH_COMMON
 | |
|             if Statement.strip().startswith(DT.TAB_INF_DEFINES_CUSTOM_MAKEFILE):
 | |
|                 pos = Statement.find(DT.TAB_VALUE_SPLIT)
 | |
|                 if pos == -1:
 | |
|                     pos = Statement.find(DT.TAB_EQUAL_SPLIT)
 | |
|                 Makefile = ConvertPath(Statement[pos + 1:].strip())
 | |
|                 Statement = Statement[:pos + 1] + ' ' + Makefile
 | |
|             if SortedArch in NewSectionDict:
 | |
|                 NewSectionDict[SortedArch] = NewSectionDict[SortedArch] + [Statement]
 | |
|             else:
 | |
|                 NewSectionDict[SortedArch] = [Statement]
 | |
|     SpecialStatementList = []
 | |
| 
 | |
|     # TAB_INF_DEFINES_INF_VERSION
 | |
|     Statement = (u'%s ' % DT.TAB_INF_DEFINES_INF_VERSION).ljust(LeftOffset) + u'= %s' % '0x00010017'
 | |
|     SpecialStatementList.append(Statement)
 | |
| 
 | |
|     # BaseName
 | |
|     BaseName = ModuleObject.GetBaseName()
 | |
|     if BaseName.startswith('.') or BaseName.startswith('-'):
 | |
|         BaseName = '_' + BaseName
 | |
|     Statement = (u'%s ' % DT.TAB_INF_DEFINES_BASE_NAME).ljust(LeftOffset) + u'= %s' % BaseName
 | |
|     SpecialStatementList.append(Statement)
 | |
|     
 | |
|     # TAB_INF_DEFINES_FILE_GUID
 | |
|     Statement = (u'%s ' % DT.TAB_INF_DEFINES_FILE_GUID).ljust(LeftOffset) + u'= %s' % ModuleObject.GetGuid()
 | |
|     SpecialStatementList.append(Statement)
 | |
|     
 | |
|     # TAB_INF_DEFINES_VERSION_STRING
 | |
|     Statement = (u'%s ' % DT.TAB_INF_DEFINES_VERSION_STRING).ljust(LeftOffset) + u'= %s' % ModuleObject.GetVersion()
 | |
|     SpecialStatementList.append(Statement)
 | |
| 
 | |
|     # TAB_INF_DEFINES_VERSION_STRING
 | |
|     if ModuleObject.UNIFlag:
 | |
|         Statement = (u'%s ' % DT.TAB_INF_DEFINES_MODULE_UNI_FILE).ljust(LeftOffset) + \
 | |
|                     u'= %s' % ModuleObject.GetBaseName() + '.uni'
 | |
|         SpecialStatementList.append(Statement)
 | |
| 
 | |
|     # TAB_INF_DEFINES_MODULE_TYPE
 | |
|     if ModuleObject.GetModuleType():
 | |
|         Statement = (u'%s ' % DT.TAB_INF_DEFINES_MODULE_TYPE).ljust(LeftOffset) + u'= %s' % ModuleObject.GetModuleType()
 | |
|         SpecialStatementList.append(Statement)
 | |
| 
 | |
|     # TAB_INF_DEFINES_PCD_IS_DRIVER
 | |
|     if ModuleObject.GetPcdIsDriver():
 | |
|         Statement = (u'%s ' % DT.TAB_INF_DEFINES_PCD_IS_DRIVER).ljust(LeftOffset) + \
 | |
|                     u'= %s' % ModuleObject.GetPcdIsDriver()
 | |
|         SpecialStatementList.append(Statement)
 | |
| 
 | |
|     # TAB_INF_DEFINES_UEFI_SPECIFICATION_VERSION
 | |
|     if ModuleObject.GetUefiSpecificationVersion():
 | |
|         Statement = (u'%s ' % DT.TAB_INF_DEFINES_UEFI_SPECIFICATION_VERSION).ljust(LeftOffset) + \
 | |
|                     u'= %s' % ModuleObject.GetUefiSpecificationVersion()
 | |
|         SpecialStatementList.append(Statement)
 | |
| 
 | |
|     # TAB_INF_DEFINES_PI_SPECIFICATION_VERSION
 | |
|     if ModuleObject.GetPiSpecificationVersion():
 | |
|         Statement = (u'%s ' % DT.TAB_INF_DEFINES_PI_SPECIFICATION_VERSION).ljust(LeftOffset) + \
 | |
|                     u'= %s' % ModuleObject.GetPiSpecificationVersion()
 | |
|         SpecialStatementList.append(Statement)
 | |
| 
 | |
|     # LibraryClass
 | |
|     for LibraryClass in ModuleObject.GetLibraryClassList():
 | |
|         if LibraryClass.GetUsage() == DT.USAGE_ITEM_PRODUCES or \
 | |
|            LibraryClass.GetUsage() == DT.USAGE_ITEM_SOMETIMES_PRODUCES:
 | |
|             Statement = (u'%s ' % DT.TAB_INF_DEFINES_LIBRARY_CLASS).ljust(LeftOffset) + \
 | |
|                         u'= %s' % LibraryClass.GetLibraryClass()
 | |
|             if LibraryClass.GetSupModuleList():
 | |
|                 Statement += '|' + DT.TAB_SPACE_SPLIT.join(l for l in LibraryClass.GetSupModuleList())
 | |
|             SpecialStatementList.append(Statement)
 | |
| 
 | |
|     # Spec Item
 | |
|     for SpecItem in ModuleObject.GetSpecList():
 | |
|         Spec, Version = SpecItem
 | |
|         Spec = ConvertSpec(Spec)
 | |
|         Statement = '%s %s = %s' % (DT.TAB_INF_DEFINES_SPEC, Spec, Version)
 | |
|         SpecialStatementList.append(Statement)
 | |
| 
 | |
|     # Extern
 | |
|     ExternList = []
 | |
|     for Extern in ModuleObject.GetExternList():
 | |
|         ArchList = Extern.GetSupArchList()
 | |
|         EntryPoint = Extern.GetEntryPoint()
 | |
|         UnloadImage = Extern.GetUnloadImage()
 | |
|         Constructor = Extern.GetConstructor()
 | |
|         Destructor = Extern.GetDestructor()
 | |
|         HelpStringList = Extern.GetHelpTextList()
 | |
|         FFE = Extern.GetFeatureFlag()
 | |
|         ExternList.append([ArchList, EntryPoint, UnloadImage, Constructor, Destructor, FFE, HelpStringList])
 | |
|     #
 | |
|     # Add VALID_ARCHITECTURES information
 | |
|     #
 | |
|     ValidArchStatement = None
 | |
|     if ModuleObject.SupArchList:
 | |
|         ValidArchStatement = '\n' + '# ' + '\n'
 | |
|         ValidArchStatement += '# The following information is for reference only and not required by the build tools.\n'
 | |
|         ValidArchStatement += '# ' + '\n'
 | |
|         ValidArchStatement += '# VALID_ARCHITECTURES = %s' % (' '.join(ModuleObject.SupArchList)) + '\n'
 | |
|         ValidArchStatement += '# '
 | |
|     if DT.TAB_ARCH_COMMON not in NewSectionDict:
 | |
|         NewSectionDict[DT.TAB_ARCH_COMMON] = []
 | |
|     NewSectionDict[DT.TAB_ARCH_COMMON] = NewSectionDict[DT.TAB_ARCH_COMMON] + SpecialStatementList
 | |
|     GenMetaFileMisc.AddExternToDefineSec(NewSectionDict, DT.TAB_ARCH_COMMON, ExternList)
 | |
|     if ValidArchStatement is not None:
 | |
|         NewSectionDict[DT.TAB_ARCH_COMMON] = NewSectionDict[DT.TAB_ARCH_COMMON] + [ValidArchStatement]
 | |
|     Content += GenSection('Defines', NewSectionDict)
 | |
|     return Content
 | |
| 
 | |
| def GenLibraryClasses(ModuleObject):
 | |
|     #
 | |
|     # generate [LibraryClasses] section
 | |
|     #
 | |
|     Content = ''
 | |
|     NewSectionDict = {}
 | |
|     if not GlobalData.gIS_BINARY_INF:
 | |
|         for LibraryClass in ModuleObject.GetLibraryClassList():
 | |
|             if LibraryClass.GetUsage() == DT.USAGE_ITEM_PRODUCES:
 | |
|                 continue
 | |
|             #
 | |
|             # Generate generic comment
 | |
|             #
 | |
|             HelpTextList = LibraryClass.GetHelpTextList()
 | |
|             HelpStr = _GetHelpStr(HelpTextList)
 | |
|             CommentStr = GenGenericCommentF(HelpStr)
 | |
|             Statement = CommentStr
 | |
|             Name = LibraryClass.GetLibraryClass()
 | |
|             FFE = LibraryClass.GetFeatureFlag()
 | |
|             Statement += Name
 | |
|             if FFE:
 | |
|                 Statement += '|' + FFE
 | |
|             ModuleList = LibraryClass.GetSupModuleList()
 | |
|             ArchList = LibraryClass.GetSupArchList()
 | |
|             for Index in xrange(0, len(ArchList)):
 | |
|                 ArchList[Index] = ConvertArchForInstall(ArchList[Index])
 | |
|             ArchList.sort()
 | |
|             SortedArch = ' '.join(ArchList)
 | |
|             KeyList = []
 | |
|             if not ModuleList or IsAllModuleList(ModuleList):
 | |
|                 KeyList = [SortedArch]
 | |
|             else:
 | |
|                 ModuleString = DT.TAB_VALUE_SPLIT.join(l for l in ModuleList)
 | |
|                 if not ArchList:
 | |
|                     SortedArch = DT.TAB_ARCH_COMMON
 | |
|                     KeyList = [SortedArch + '.' + ModuleString]
 | |
|                 else:
 | |
|                     KeyList = [Arch + '.' + ModuleString for Arch in ArchList]
 | |
|             for Key in KeyList:
 | |
|                 if Key in NewSectionDict:
 | |
|                     NewSectionDict[Key] = NewSectionDict[Key] + [Statement]
 | |
|                 else:
 | |
|                     NewSectionDict[Key] = [Statement]
 | |
|         Content += GenSection('LibraryClasses', NewSectionDict)
 | |
|     else:
 | |
|         LibraryClassDict = {}
 | |
|         for BinaryFile in ModuleObject.GetBinaryFileList():
 | |
|             if not BinaryFile.AsBuiltList:
 | |
|                 continue
 | |
|             for LibraryItem in BinaryFile.AsBuiltList[0].LibraryInstancesList:
 | |
|                 Statement = '# Guid: ' + LibraryItem.Guid + ' Version: ' + LibraryItem.Version
 | |
| 
 | |
|                 if len(BinaryFile.SupArchList) == 0:
 | |
|                     if LibraryClassDict.has_key('COMMON') and Statement not in LibraryClassDict['COMMON']:
 | |
|                         LibraryClassDict['COMMON'].append(Statement)
 | |
|                     else:
 | |
|                         LibraryClassDict['COMMON'] = ['## @LIB_INSTANCES']
 | |
|                         LibraryClassDict['COMMON'].append(Statement)
 | |
|                 else:
 | |
|                     for Arch in BinaryFile.SupArchList:
 | |
|                         if LibraryClassDict.has_key(Arch):
 | |
|                             if Statement not in LibraryClassDict[Arch]:
 | |
|                                 LibraryClassDict[Arch].append(Statement)
 | |
|                             else:
 | |
|                                 continue
 | |
|                         else:
 | |
|                             LibraryClassDict[Arch] = ['## @LIB_INSTANCES']
 | |
|                             LibraryClassDict[Arch].append(Statement)
 | |
|         Content += GenSection('LibraryClasses', LibraryClassDict)
 | |
| 
 | |
|     return Content
 | |
| 
 | |
| def GenPackages(ModuleObject):
 | |
|     Content = ''
 | |
|     #
 | |
|     # generate [Packages] section
 | |
|     #
 | |
|     NewSectionDict = Sdict()
 | |
|     WorkspaceDir = GlobalData.gWORKSPACE
 | |
|     for PackageDependency in ModuleObject.GetPackageDependencyList():
 | |
|         #
 | |
|         # Generate generic comment
 | |
|         #
 | |
|         CommentStr = ''
 | |
|         HelpText = PackageDependency.GetHelpText()
 | |
|         if HelpText:
 | |
|             HelpStr = HelpText.GetString()
 | |
|             CommentStr = GenGenericCommentF(HelpStr)
 | |
|         Statement = CommentStr
 | |
|         Guid = PackageDependency.GetGuid()
 | |
|         Version = PackageDependency.GetVersion()
 | |
|         FFE = PackageDependency.GetFeatureFlag()
 | |
|         Path = ''
 | |
|         #
 | |
|         # find package path/name
 | |
|         # 
 | |
|         for PkgInfo in GlobalData.gWSPKG_LIST:
 | |
|             if Guid == PkgInfo[1]:
 | |
|                 if (not Version) or (Version == PkgInfo[2]):
 | |
|                     Path = PkgInfo[3]
 | |
|                     break
 | |
|         #
 | |
|         # get relative path
 | |
|         #
 | |
|         RelaPath = GetRelativePath(Path, WorkspaceDir)
 | |
|         Statement += RelaPath.replace('\\', '/')
 | |
|         if FFE:
 | |
|             Statement += '|' + FFE
 | |
|         ArchList = PackageDependency.GetSupArchList()
 | |
|         ArchList.sort()
 | |
|         SortedArch = ' '.join(ArchList)
 | |
|         if SortedArch in NewSectionDict:
 | |
|             NewSectionDict[SortedArch] = NewSectionDict[SortedArch] + [Statement]
 | |
|         else:
 | |
|             NewSectionDict[SortedArch] = [Statement]
 | |
|     Content += GenSection('Packages', NewSectionDict)
 | |
|     return Content
 | |
| 
 | |
| def GenSources(ModuleObject):
 | |
|     #
 | |
|     # generate [Sources] section
 | |
|     #
 | |
|     Content = ''
 | |
|     NewSectionDict = {}
 | |
|     for Source in ModuleObject.GetSourceFileList():
 | |
|         SourceFile = Source.GetSourceFile()
 | |
|         Family = Source.GetFamily()
 | |
|         FeatureFlag = Source.GetFeatureFlag()
 | |
|         SupArchList = Source.GetSupArchList()
 | |
|         SupArchList.sort()
 | |
|         SortedArch = ' '.join(SupArchList)
 | |
|         Statement = GenSourceStatement(ConvertPath(SourceFile), Family, FeatureFlag)
 | |
|         if SortedArch in NewSectionDict:
 | |
|             NewSectionDict[SortedArch] = NewSectionDict[SortedArch] + [Statement]
 | |
|         else:
 | |
|             NewSectionDict[SortedArch] = [Statement]
 | |
|     Content += GenSection('Sources', NewSectionDict)
 | |
| 
 | |
|     return Content
 | |
| 
 | |
| def GenDepex(ModuleObject):
 | |
|     #
 | |
|     # generate [Depex] section
 | |
|     #
 | |
|     NewSectionDict = Sdict()
 | |
|     Content = ''
 | |
|     for Depex in ModuleObject.GetPeiDepex() + ModuleObject.GetDxeDepex() + ModuleObject.GetSmmDepex():
 | |
|         HelpTextList = Depex.GetHelpTextList()
 | |
|         HelpStr = _GetHelpStr(HelpTextList)
 | |
|         CommentStr = GenGenericCommentF(HelpStr)
 | |
|         SupArchList = Depex.GetSupArchList()
 | |
|         SupModList = Depex.GetModuleType()
 | |
|         Expression = Depex.GetDepex()
 | |
|         Statement = CommentStr + Expression
 | |
|         SupArchList.sort()
 | |
|         KeyList = []
 | |
|         if not SupArchList:
 | |
|             SupArchList.append(DT.TAB_ARCH_COMMON.lower())
 | |
|         if not SupModList:
 | |
|             KeyList = SupArchList
 | |
|         else:
 | |
|             for ModuleType in SupModList:
 | |
|                 for Arch in SupArchList:
 | |
|                     KeyList.append(ConvertArchForInstall(Arch) + '.' + ModuleType)
 | |
|         for Key in KeyList:
 | |
|             if Key in NewSectionDict:
 | |
|                 NewSectionDict[Key] = NewSectionDict[Key] + [Statement]
 | |
|             else:
 | |
|                 NewSectionDict[Key] = [Statement]
 | |
|     Content += GenSection('Depex', NewSectionDict, False)
 | |
|     
 | |
|     return Content
 | |
| ## GenUserExtensions
 | |
| #
 | |
| # GenUserExtensions
 | |
| #
 | |
| def GenUserExtensions(ModuleObject):
 | |
|     NewSectionDict = {}
 | |
|     for UserExtension in ModuleObject.GetUserExtensionList():
 | |
|         if UserExtension.GetUserID() == DT.TAB_BINARY_HEADER_USERID and \
 | |
|             UserExtension.GetIdentifier() == DT.TAB_BINARY_HEADER_IDENTIFIER:
 | |
|             continue
 | |
|         if UserExtension.GetIdentifier() == 'Depex':
 | |
|             continue
 | |
|         Statement = UserExtension.GetStatement()
 | |
|         if not Statement:
 | |
|             continue
 | |
|         ArchList = UserExtension.GetSupArchList()
 | |
|         for Index in xrange(0, len(ArchList)):
 | |
|             ArchList[Index] = ConvertArchForInstall(ArchList[Index])
 | |
|         ArchList.sort()
 | |
|         KeyList = []
 | |
|         CommonPreFix = ''
 | |
|         if UserExtension.GetUserID():
 | |
|             CommonPreFix = UserExtension.GetUserID()
 | |
|             if CommonPreFix.find('.') > -1:
 | |
|                 CommonPreFix = '"' + CommonPreFix + '"'
 | |
|             if UserExtension.GetIdentifier():
 | |
|                 CommonPreFix += '.' + '"' + UserExtension.GetIdentifier() + '"'
 | |
|             if ArchList:
 | |
|                 KeyList = [CommonPreFix + '.' + Arch for Arch in ArchList]
 | |
|             else:
 | |
|                 KeyList = [CommonPreFix]
 | |
|         for Key in KeyList:
 | |
|             if Key in NewSectionDict:
 | |
|                 NewSectionDict[Key] = NewSectionDict[Key] + [Statement]
 | |
|             else:
 | |
|                 NewSectionDict[Key] = [Statement]
 | |
|     Content = GenSection('UserExtensions', NewSectionDict, False)
 | |
| 
 | |
|     return Content
 | |
| 
 | |
| # GenSourceStatement
 | |
| #
 | |
| #  @param SourceFile: string of source file path/name
 | |
| #  @param Family:     string of source file family field
 | |
| #  @param FeatureFlag:  string of source file FeatureFlag field
 | |
| #  @param TagName:  string of source file TagName field
 | |
| #  @param ToolCode:  string of source file ToolCode field
 | |
| #  @param HelpStr:  string of source file HelpStr field
 | |
| #
 | |
| #  @retval Statement: The generated statement for source
 | |
| #
 | |
| def GenSourceStatement(SourceFile, Family, FeatureFlag, TagName=None,
 | |
|                        ToolCode=None, HelpStr=None):
 | |
|     Statement = ''
 | |
|     if HelpStr:
 | |
|         Statement += GenGenericCommentF(HelpStr)
 | |
|     #
 | |
|     # format of SourceFile|Family|TagName|ToolCode|FeatureFlag
 | |
|     #
 | |
|     Statement += SourceFile
 | |
|     if TagName == None:
 | |
|         TagName = ''
 | |
|     if ToolCode == None:
 | |
|         ToolCode = ''
 | |
|     if HelpStr == None:
 | |
|         HelpStr = ''
 | |
|     if FeatureFlag:
 | |
|         Statement += '|' + Family + '|' + TagName + '|' + ToolCode + '|' + FeatureFlag
 | |
|     elif ToolCode:
 | |
|         Statement += '|' + Family + '|' + TagName + '|' + ToolCode
 | |
|     elif TagName:
 | |
|         Statement += '|' + Family + '|' + TagName
 | |
|     elif Family:
 | |
|         Statement += '|' + Family
 | |
|     return Statement
 | |
| 
 | |
| # GenBinaryStatement
 | |
| #
 | |
| #  @param Key:       (FileName, FileType, FFE, SortedArch)
 | |
| #  @param Value:     (Target, Family, TagName, Comment)
 | |
| #
 | |
| #
 | |
| def GenBinaryStatement(Key, Value, SubTypeGuidValue=None):
 | |
|     (FileName, FileType, FFE, SortedArch) = Key
 | |
|     if SortedArch:
 | |
|         pass
 | |
|     if Value:
 | |
|         (Target, Family, TagName, Comment) = Value
 | |
|     else:
 | |
|         Target = ''
 | |
|         Family = ''
 | |
|         TagName = ''
 | |
|         Comment = ''
 | |
|     if Comment:
 | |
|         Statement = GenGenericCommentF(Comment)
 | |
|     else:
 | |
|         Statement = ''
 | |
|     if FileType == 'SUBTYPE_GUID' and SubTypeGuidValue:
 | |
|         Statement += FileType + '|' + SubTypeGuidValue + '|' + FileName
 | |
|     else:
 | |
|         Statement += FileType + '|' + FileName
 | |
|     if FileType in DT.BINARY_FILE_TYPE_UI_LIST + DT.BINARY_FILE_TYPE_VER_LIST:
 | |
|         if FFE:
 | |
|             Statement += '|' + Target + '|' + FFE
 | |
|         elif Target:
 | |
|             Statement += '|' + Target
 | |
|     else:
 | |
|         if FFE:
 | |
|             Statement += '|' + Target + '|' + Family + '|' + TagName + '|' + FFE
 | |
|         elif TagName:
 | |
|             Statement += '|' + Target + '|' + Family + '|' + TagName
 | |
|         elif Family:
 | |
|             Statement += '|' + Target + '|' + Family
 | |
|         elif Target:
 | |
|             Statement += '|' + Target
 | |
|     return Statement
 | |
| ## GenGuidSections
 | |
| # 
 | |
| #  @param GuidObjList: List of GuidObject
 | |
| #  @retVal Content: The generated section contents
 | |
| #
 | |
| def GenGuidSections(GuidObjList):
 | |
|     #
 | |
|     # generate [Guids] section
 | |
|     #
 | |
|     Content = ''
 | |
|     GuidDict = Sdict()
 | |
|     for Guid in GuidObjList:
 | |
|         HelpTextList = Guid.GetHelpTextList()
 | |
|         HelpStr = _GetHelpStr(HelpTextList)
 | |
|         CName = Guid.GetCName()
 | |
|         FFE = Guid.GetFeatureFlag()
 | |
|         Statement = CName
 | |
|         if FFE:
 | |
|             Statement += '|' + FFE
 | |
|         Usage = Guid.GetUsage()
 | |
|         GuidType = Guid.GetGuidTypeList()[0]
 | |
|         VariableName = Guid.GetVariableName()
 | |
|         #
 | |
|         # Differentiate the generic comment and usage comment as multiple generic comment need to be put at first
 | |
|         #
 | |
|         if Usage == DT.ITEM_UNDEFINED and GuidType == DT.ITEM_UNDEFINED:
 | |
|             # generate list of generic comment
 | |
|             Comment = GenGenericCommentF(HelpStr)
 | |
|         else:
 | |
|             # generate list of other comment
 | |
|             Comment = HelpStr.replace('\n', ' ')
 | |
|             Comment = Comment.strip()
 | |
|             if Comment:
 | |
|                 Comment = ' # ' + Comment
 | |
|             else:
 | |
|                 Comment = ''
 | |
|             if Usage != DT.ITEM_UNDEFINED and GuidType == DT.ITEM_UNDEFINED:
 | |
|                 Comment = '## ' + Usage + Comment
 | |
|             elif GuidType == 'Variable':
 | |
|                 Comment = '## ' + Usage + ' ## ' + GuidType + ':' + VariableName + Comment
 | |
|             else:
 | |
|                 Comment = '## ' + Usage + ' ## ' + GuidType + Comment
 | |
| 
 | |
|             if Comment:
 | |
|                 Comment += '\n'
 | |
|         #
 | |
|         # merge duplicate items
 | |
|         #
 | |
|         ArchList = Guid.GetSupArchList()
 | |
|         ArchList.sort()
 | |
|         SortedArch = ' '.join(ArchList)
 | |
|         if (Statement, SortedArch) in GuidDict:
 | |
|             PreviousComment = GuidDict[Statement, SortedArch]
 | |
|             Comment = PreviousComment + Comment
 | |
|         GuidDict[Statement, SortedArch] = Comment
 | |
|     NewSectionDict = GenMetaFileMisc.TransferDict(GuidDict, 'INF_GUID')
 | |
|     #
 | |
|     # generate the section contents
 | |
|     #
 | |
|     if NewSectionDict:
 | |
|         Content = GenSection('Guids', NewSectionDict)
 | |
| 
 | |
|     return Content
 | |
| 
 | |
| ## GenProtocolPPiSections
 | |
| # 
 | |
| #  @param ObjList: List of ProtocolObject or Ppi Object
 | |
| #  @retVal Content: The generated section contents
 | |
| #
 | |
| def GenProtocolPPiSections(ObjList, IsProtocol):
 | |
|     Content = ''
 | |
|     Dict = Sdict()
 | |
|     for Object in ObjList:
 | |
|         HelpTextList = Object.GetHelpTextList()
 | |
|         HelpStr = _GetHelpStr(HelpTextList)
 | |
|         CName = Object.GetCName()
 | |
|         FFE = Object.GetFeatureFlag()
 | |
|         Statement = CName
 | |
|         if FFE:
 | |
|             Statement += '|' + FFE
 | |
|         Usage = Object.GetUsage()
 | |
|         Notify = Object.GetNotify()
 | |
|         #
 | |
|         # Differentiate the generic comment and usage comment as consecutive generic comment need to be put together
 | |
|         #
 | |
|         if Usage == DT.ITEM_UNDEFINED and Notify == '':
 | |
|             # generate list of generic comment
 | |
|             Comment = GenGenericCommentF(HelpStr)
 | |
|         else:
 | |
|             # generate list of other comment
 | |
|             Comment = HelpStr.replace('\n', ' ')
 | |
|             Comment = Comment.strip()
 | |
|             if Comment:
 | |
|                 Comment = ' # ' + Comment
 | |
|             else:
 | |
|                 Comment = ''
 | |
|             if Usage == DT.ITEM_UNDEFINED and not Comment and Notify == '':
 | |
|                 Comment = ''
 | |
|             else:
 | |
|                 if Notify:
 | |
|                     Comment = '## ' + Usage + ' ## ' + 'NOTIFY' + Comment
 | |
|                 else:
 | |
|                     Comment = '## ' + Usage + Comment
 | |
|             if Comment:
 | |
|                 Comment += '\n'
 | |
|         #
 | |
|         # merge duplicate items
 | |
|         #
 | |
|         ArchList = Object.GetSupArchList()
 | |
|         ArchList.sort()
 | |
|         SortedArch = ' '.join(ArchList)
 | |
|         if (Statement, SortedArch) in Dict:
 | |
|             PreviousComment = Dict[Statement, SortedArch]
 | |
|             Comment = PreviousComment + Comment
 | |
|         Dict[Statement, SortedArch] = Comment
 | |
|     NewSectionDict = GenMetaFileMisc.TransferDict(Dict, 'INF_PPI_PROTOCOL')
 | |
|     #
 | |
|     # generate the section contents
 | |
|     #
 | |
|     if NewSectionDict:
 | |
|         if IsProtocol:
 | |
|             Content = GenSection('Protocols', NewSectionDict)
 | |
|         else:
 | |
|             Content = GenSection('Ppis', NewSectionDict)
 | |
| 
 | |
|     return Content
 | |
| 
 | |
| ## GenPcdSections
 | |
| #
 | |
| #
 | |
| def GenPcdSections(ModuleObject):
 | |
|     Content = ''
 | |
|     if not GlobalData.gIS_BINARY_INF:
 | |
|         #
 | |
|         # for each Pcd Itemtype, maintain a dict so the same type will be grouped 
 | |
|         # together
 | |
|         #
 | |
|         ItemTypeDict = {}
 | |
|         for Pcd in ModuleObject.GetPcdList():
 | |
|             HelpTextList = Pcd.GetHelpTextList()
 | |
|             HelpStr = _GetHelpStr(HelpTextList)
 | |
|             Statement = ''
 | |
|             CName = Pcd.GetCName()
 | |
|             TokenSpaceGuidCName = Pcd.GetTokenSpaceGuidCName()
 | |
|             DefaultValue = Pcd.GetDefaultValue()
 | |
|             ItemType = Pcd.GetItemType()
 | |
|             if ItemType in ItemTypeDict:
 | |
|                 Dict = ItemTypeDict[ItemType]
 | |
|             else:
 | |
|                 Dict = Sdict()
 | |
|                 ItemTypeDict[ItemType] = Dict
 | |
|             FFE = Pcd.GetFeatureFlag()
 | |
|             Statement += TokenSpaceGuidCName + '.' + CName
 | |
|             if DefaultValue:
 | |
|                 Statement += '|' + DefaultValue
 | |
|                 if FFE:
 | |
|                     Statement += '|' + FFE
 | |
|             elif FFE:
 | |
|                 Statement += '||' + FFE
 | |
|             #
 | |
|             # Generate comment
 | |
|             #
 | |
|             Usage = Pcd.GetValidUsage()
 | |
|             # if FeatureFlag Pcd, then assume all Usage is CONSUMES
 | |
|             if ItemType == DT.TAB_INF_FEATURE_PCD:
 | |
|                 Usage = DT.USAGE_ITEM_CONSUMES
 | |
|             if Usage == DT.ITEM_UNDEFINED:
 | |
|                 # generate list of generic comment
 | |
|                 Comment = GenGenericCommentF(HelpStr)
 | |
|             else:
 | |
|                 # generate list of other comment
 | |
|                 Comment = HelpStr.replace('\n', ' ')
 | |
|                 Comment = Comment.strip()
 | |
|                 if Comment:
 | |
|                     Comment = ' # ' + Comment
 | |
|                 else:
 | |
|                     Comment = ''
 | |
|                 Comment = '## ' + Usage + Comment
 | |
|                 if Comment:
 | |
|                     Comment += '\n'
 | |
|             #
 | |
|             # Merge duplicate entries
 | |
|             #
 | |
|             ArchList = Pcd.GetSupArchList()
 | |
|             ArchList.sort()
 | |
|             SortedArch = ' '.join(ArchList)
 | |
|             if (Statement, SortedArch) in Dict:
 | |
|                 PreviousComment = Dict[Statement, SortedArch]
 | |
|                 Comment = PreviousComment + Comment
 | |
|             Dict[Statement, SortedArch] = Comment
 | |
|         for ItemType in ItemTypeDict:
 | |
|             # First we need to transfer the Dict to use SortedArch as key
 | |
|             Dict = ItemTypeDict[ItemType]
 | |
|             NewSectionDict = GenMetaFileMisc.TransferDict(Dict, 'INF_PCD')
 | |
|             if NewSectionDict:
 | |
|                 Content += GenSection(ItemType, NewSectionDict)
 | |
|     #
 | |
|     # For AsBuild INF files   
 | |
|     #
 | |
|     else:
 | |
|         Content += GenAsBuiltPacthPcdSections(ModuleObject)
 | |
|         Content += GenAsBuiltPcdExSections(ModuleObject)
 | |
| 
 | |
|     return Content
 | |
| 
 | |
| ## GenPcdSections
 | |
| #
 | |
| #
 | |
| def GenAsBuiltPacthPcdSections(ModuleObject):
 | |
|     PatchPcdDict = {}
 | |
|     for BinaryFile in ModuleObject.GetBinaryFileList():
 | |
|         if not BinaryFile.AsBuiltList:
 | |
|             continue
 | |
|         for PatchPcd in BinaryFile.AsBuiltList[0].PatchPcdList:
 | |
|             TokenSpaceName = ''
 | |
|             PcdCName = PatchPcd.CName
 | |
|             PcdValue = PatchPcd.DefaultValue
 | |
|             PcdOffset = PatchPcd.Offset
 | |
|             TokenSpaceGuidValue = PatchPcd.TokenSpaceGuidValue
 | |
|             Token = PatchPcd.Token
 | |
|             HelpTextList = PatchPcd.HelpTextList
 | |
|             HelpString = ''
 | |
|             for HelpStringItem in HelpTextList:
 | |
|                 for HelpLine in GetSplitValueList(HelpStringItem.String, '\n'):
 | |
|                     HelpString += '## ' + HelpLine + '\n'
 | |
|             TokenSpaceName, PcdCName = GenMetaFileMisc.ObtainPcdName(ModuleObject.PackageDependencyList,
 | |
|                                                                      TokenSpaceGuidValue,
 | |
|                                                                      Token)
 | |
|             if TokenSpaceName == '' or PcdCName == '':
 | |
|                 Logger.Error("Upt",
 | |
|                              ToolError.RESOURCE_NOT_AVAILABLE,
 | |
|                              ST.ERR_INSTALL_FILE_DEC_FILE_ERROR % (TokenSpaceGuidValue, Token),
 | |
|                              File=ModuleObject.GetFullPath())
 | |
|             Statement = HelpString + TokenSpaceName + '.' + PcdCName + ' | ' + PcdValue + ' | ' + \
 | |
|                          PcdOffset + DT.TAB_SPACE_SPLIT
 | |
|             #
 | |
|             # Use binary file's Arch to be Pcd's Arch 
 | |
|             #
 | |
|             ArchList = []
 | |
|             FileNameObjList = BinaryFile.GetFileNameList()
 | |
|             if FileNameObjList:
 | |
|                 ArchList = FileNameObjList[0].GetSupArchList()
 | |
|             if len(ArchList) == 0:
 | |
|                 if PatchPcdDict.has_key(DT.TAB_ARCH_COMMON):
 | |
|                     if Statement not in PatchPcdDict[DT.TAB_ARCH_COMMON]:
 | |
|                         PatchPcdDict[DT.TAB_ARCH_COMMON].append(Statement)
 | |
|                 else:
 | |
|                     PatchPcdDict[DT.TAB_ARCH_COMMON] = [Statement]
 | |
|             else:
 | |
|                 for Arch in ArchList:
 | |
|                     if PatchPcdDict.has_key(Arch):
 | |
|                         if Statement not in PatchPcdDict[Arch]:
 | |
|                             PatchPcdDict[Arch].append(Statement)
 | |
|                     else:
 | |
|                         PatchPcdDict[Arch] = [Statement]
 | |
|     return GenSection(DT.TAB_INF_PATCH_PCD, PatchPcdDict)
 | |
| ## GenPcdSections
 | |
| #
 | |
| #
 | |
| def GenAsBuiltPcdExSections(ModuleObject):
 | |
|     PcdExDict = {}
 | |
|     for BinaryFile in ModuleObject.GetBinaryFileList():
 | |
|         if not BinaryFile.AsBuiltList:
 | |
|             continue
 | |
|         for PcdExItem in BinaryFile.AsBuiltList[0].PcdExValueList:
 | |
|             TokenSpaceName = ''
 | |
|             PcdCName = PcdExItem.CName
 | |
|             TokenSpaceGuidValue = PcdExItem.TokenSpaceGuidValue
 | |
|             Token = PcdExItem.Token
 | |
|             HelpTextList = PcdExItem.HelpTextList
 | |
|             HelpString = ''
 | |
|             for HelpStringItem in HelpTextList:
 | |
|                 for HelpLine in GetSplitValueList(HelpStringItem.String, '\n'):
 | |
|                     HelpString += '## ' + HelpLine + '\n'
 | |
|             TokenSpaceName, PcdCName = GenMetaFileMisc.ObtainPcdName(ModuleObject.PackageDependencyList,
 | |
|                                                                      TokenSpaceGuidValue, Token)
 | |
|             if TokenSpaceName == '' or PcdCName == '':
 | |
|                 Logger.Error("Upt",
 | |
|                              ToolError.RESOURCE_NOT_AVAILABLE,
 | |
|                              ST.ERR_INSTALL_FILE_DEC_FILE_ERROR % (TokenSpaceGuidValue, Token),
 | |
|                              File=ModuleObject.GetFullPath())
 | |
| 
 | |
|             Statement = HelpString + TokenSpaceName + DT.TAB_SPLIT + PcdCName + DT.TAB_SPACE_SPLIT
 | |
| 
 | |
|             #
 | |
|             # Use binary file's Arch to be Pcd's Arch 
 | |
|             #
 | |
|             ArchList = []
 | |
|             FileNameObjList = BinaryFile.GetFileNameList()
 | |
|             if FileNameObjList:
 | |
|                 ArchList = FileNameObjList[0].GetSupArchList()
 | |
| 
 | |
|             if len(ArchList) == 0:
 | |
|                 if PcdExDict.has_key('COMMON'):
 | |
|                     PcdExDict['COMMON'].append(Statement)
 | |
|                 else:
 | |
|                     PcdExDict['COMMON'] = [Statement]
 | |
|             else:
 | |
|                 for Arch in ArchList:
 | |
|                     if PcdExDict.has_key(Arch):
 | |
|                         if Statement not in PcdExDict[Arch]:
 | |
|                             PcdExDict[Arch].append(Statement)
 | |
|                     else:
 | |
|                         PcdExDict[Arch] = [Statement]
 | |
|     return GenSection('PcdEx', PcdExDict)
 | |
| 
 | |
| ## GenSpecialSections
 | |
| #  generate special sections for Event/BootMode/Hob
 | |
| #
 | |
| def GenSpecialSections(ObjectList, SectionName):
 | |
|     #
 | |
|     # generate section
 | |
|     #
 | |
|     Content = ''
 | |
|     NewSectionDict = {}
 | |
|     for Obj in ObjectList:
 | |
|         #
 | |
|         # Generate comment
 | |
|         #
 | |
|         CommentStr = ''
 | |
|         HelpTextList = Obj.GetHelpTextList()
 | |
|         HelpStr = _GetHelpStr(HelpTextList)
 | |
|         CommentStr = GenGenericCommentF(HelpStr)
 | |
|         if SectionName == 'Hob':
 | |
|             Type = Obj.GetHobType()
 | |
|         elif SectionName == 'Event':
 | |
|             Type = Obj.GetEventType()
 | |
|         elif SectionName == 'BootMode':
 | |
|             Type = Obj.GetSupportedBootModes()
 | |
|         else:
 | |
|             assert(SectionName)
 | |
|         Usage = Obj.GetUsage()
 | |
|         Statement = ' ' + Type + ' ## ' + Usage
 | |
|         if CommentStr in ['#\n', '#\n#\n']:
 | |
|             CommentStr = '#\n#\n#\n'
 | |
|         #
 | |
|         # the first head comment line should start with '##\n', if it starts with '#\n', then add one '#'
 | |
|         # else add '##\n' to meet the format defined in INF spec
 | |
|         #
 | |
|         if CommentStr.startswith('#\n'):
 | |
|             CommentStr = '#' + CommentStr
 | |
|         elif CommentStr:
 | |
|             CommentStr = '##\n' + CommentStr
 | |
|         if CommentStr and not CommentStr.endswith('\n#\n'):
 | |
|             CommentStr = CommentStr + '#\n'
 | |
|         NewStateMent = CommentStr + Statement
 | |
|         SupArch = Obj.GetSupArchList()
 | |
|         SupArch.sort()
 | |
|         SortedArch = ' '.join(SupArch)
 | |
|         if SortedArch in NewSectionDict:
 | |
|             NewSectionDict[SortedArch] = NewSectionDict[SortedArch] + [NewStateMent]
 | |
|         else:
 | |
|             NewSectionDict[SortedArch] = [NewStateMent]
 | |
|     SectionContent = GenSection(SectionName, NewSectionDict)
 | |
|     SectionContent = SectionContent.strip()
 | |
|     if SectionContent:
 | |
|         Content = '# ' + ('\n' + '# ').join(GetSplitValueList(SectionContent, '\n'))
 | |
|         Content = Content.lstrip()
 | |
|     #
 | |
|     # add a return to differentiate it between other possible sections
 | |
|     # 
 | |
|     if Content:
 | |
|         Content += '\n'
 | |
|     return Content
 | |
| ## GenBuildOptions
 | |
| #
 | |
| #
 | |
| def GenBuildOptions(ModuleObject):
 | |
|     Content = ''
 | |
|     if not ModuleObject.BinaryModule:
 | |
|         #
 | |
|         # generate [BuildOptions] section
 | |
|         #
 | |
|         NewSectionDict = {}
 | |
|         for UserExtension in ModuleObject.GetUserExtensionList():
 | |
|             BuildOptionDict = UserExtension.GetBuildOptionDict()
 | |
|             if not BuildOptionDict:
 | |
|                 continue
 | |
|             for Arch in BuildOptionDict:
 | |
|                 if Arch in NewSectionDict:
 | |
|                     NewSectionDict[Arch] = NewSectionDict[Arch] + [BuildOptionDict[Arch]]
 | |
|                 else:
 | |
|                     NewSectionDict[Arch] = [BuildOptionDict[Arch]]
 | |
|         Content = GenSection('BuildOptions', NewSectionDict)
 | |
|     else:
 | |
|         BuildOptionDict = {}
 | |
|         for BinaryFile in ModuleObject.GetBinaryFileList():
 | |
|             if not BinaryFile.AsBuiltList:
 | |
|                 continue
 | |
|             for BuilOptionItem in BinaryFile.AsBuiltList[0].BinaryBuildFlagList:
 | |
|                 Statement = '#' + BuilOptionItem.AsBuiltOptionFlags
 | |
|                 if len(BinaryFile.SupArchList) == 0:
 | |
|                     if BuildOptionDict.has_key('COMMON'):
 | |
|                         if Statement not in BuildOptionDict['COMMON']:
 | |
|                             BuildOptionDict['COMMON'].append(Statement)
 | |
|                     else:
 | |
|                         BuildOptionDict['COMMON'] = ['## @AsBuilt']
 | |
|                         BuildOptionDict['COMMON'].append(Statement)
 | |
|                 else:
 | |
|                     for Arch in BinaryFile.SupArchList:
 | |
|                         if BuildOptionDict.has_key(Arch):
 | |
|                             if Statement not in BuildOptionDict[Arch]:
 | |
|                                 BuildOptionDict[Arch].append(Statement)
 | |
|                         else:
 | |
|                             BuildOptionDict[Arch] = ['## @AsBuilt']
 | |
|                             BuildOptionDict[Arch].append(Statement)
 | |
|         Content = GenSection('BuildOptions', BuildOptionDict)
 | |
| 
 | |
|     return Content
 | |
| ## GenBinaries
 | |
| #
 | |
| #
 | |
| def GenBinaries(ModuleObject):
 | |
|     NewSectionDict = {}
 | |
|     BinariesDict = []
 | |
|     for UserExtension in ModuleObject.GetUserExtensionList():
 | |
|         BinariesDict = UserExtension.GetBinariesDict()
 | |
|         if BinariesDict:
 | |
|             break
 | |
|     for BinaryFile in ModuleObject.GetBinaryFileList():
 | |
|         FileNameObjList = BinaryFile.GetFileNameList()
 | |
|         for FileNameObj in FileNameObjList:
 | |
|             FileName = ConvertPath(FileNameObj.GetFilename())
 | |
|             FileType = FileNameObj.GetFileType()
 | |
|             FFE = FileNameObj.GetFeatureFlag()
 | |
|             ArchList = FileNameObj.GetSupArchList()
 | |
|             ArchList.sort()
 | |
|             SortedArch = ' '.join(ArchList)
 | |
|             Key = (FileName, FileType, FFE, SortedArch)
 | |
|             if Key in BinariesDict:
 | |
|                 ValueList = BinariesDict[Key]
 | |
|                 for ValueItem in ValueList:
 | |
|                     Statement = GenBinaryStatement(Key, ValueItem)
 | |
|                     if SortedArch in NewSectionDict:
 | |
|                         NewSectionDict[SortedArch] = NewSectionDict[SortedArch] + [Statement]
 | |
|                     else:
 | |
|                         NewSectionDict[SortedArch] = [Statement]
 | |
|                 #
 | |
|                 # as we already generated statement for this DictKey here set the Valuelist to be empty 
 | |
|                 # to avoid generate duplicate entries as the DictKey may have multiple entries
 | |
|                 #
 | |
|                 BinariesDict[Key] = []
 | |
|             else:
 | |
|                 if FileType == 'SUBTYPE_GUID' and FileNameObj.GetGuidValue():
 | |
|                     Statement = GenBinaryStatement(Key, None, FileNameObj.GetGuidValue())
 | |
|                 else:
 | |
|                     Statement = GenBinaryStatement(Key, None)
 | |
|                 if SortedArch in NewSectionDict:
 | |
|                     NewSectionDict[SortedArch] = NewSectionDict[SortedArch] + [Statement]
 | |
|                 else:
 | |
|                     NewSectionDict[SortedArch] = [Statement]
 | |
|     Content = GenSection('Binaries', NewSectionDict)
 | |
| 
 | |
|     return Content
 |