Add a new feature to UPT to support installing multiple DIST packages in one time. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Hess Chen <hesheng.chen@intel.com> Reviewed-by: Yonghong Zhu <yonghong.zhu@intel.com>
		
			
				
	
	
		
			195 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			195 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| ## @file GenMetaFileMisc.py
 | |
| #
 | |
| # This file contained the miscellaneous routines for GenMetaFile usage.
 | |
| #
 | |
| # Copyright (c) 2011 - 2017, 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.
 | |
| #
 | |
| 
 | |
| '''
 | |
| GenMetaFileMisc
 | |
| '''
 | |
| 
 | |
| from Library import DataType as DT
 | |
| from Library import GlobalData
 | |
| from Parser.DecParser import Dec
 | |
| 
 | |
| # AddExternToDefineSec
 | |
| #
 | |
| #  @param SectionDict: string of source file path/name
 | |
| #  @param Arch:     string of source file family field
 | |
| #  @param ExternList:  string of source file FeatureFlag field
 | |
| #   
 | |
| def AddExternToDefineSec(SectionDict, Arch, ExternList):
 | |
|     LeftOffset = 31
 | |
|     for ArchList, EntryPoint, UnloadImage, Constructor, Destructor, FFE, HelpStringList in ExternList:
 | |
|         if Arch or ArchList:
 | |
|             if EntryPoint:
 | |
|                 Statement = (u'%s ' % DT.TAB_INF_DEFINES_ENTRY_POINT).ljust(LeftOffset) + u'= %s' % EntryPoint
 | |
|                 if FFE:
 | |
|                     Statement += ' | %s' % FFE
 | |
|                 if len(HelpStringList) > 0:
 | |
|                     Statement = HelpStringList[0].GetString() + '\n' + Statement
 | |
|                 if len(HelpStringList) > 1:
 | |
|                     Statement = Statement + HelpStringList[1].GetString()
 | |
|                 SectionDict[Arch] = SectionDict[Arch] + [Statement]
 | |
| 
 | |
|             if UnloadImage:
 | |
|                 Statement = (u'%s ' % DT.TAB_INF_DEFINES_UNLOAD_IMAGE).ljust(LeftOffset) + u'= %s' % UnloadImage
 | |
|                 if FFE:
 | |
|                     Statement += ' | %s' % FFE
 | |
| 
 | |
|                 if len(HelpStringList) > 0:
 | |
|                     Statement = HelpStringList[0].GetString() + '\n' + Statement
 | |
|                 if len(HelpStringList) > 1:
 | |
|                     Statement = Statement + HelpStringList[1].GetString()
 | |
|                 SectionDict[Arch] = SectionDict[Arch] + [Statement]
 | |
| 
 | |
|             if Constructor:
 | |
|                 Statement = (u'%s ' % DT.TAB_INF_DEFINES_CONSTRUCTOR).ljust(LeftOffset) + u'= %s' % Constructor
 | |
|                 if FFE:
 | |
|                     Statement += ' | %s' % FFE
 | |
| 
 | |
|                 if len(HelpStringList) > 0:
 | |
|                     Statement = HelpStringList[0].GetString() + '\n' + Statement
 | |
|                 if len(HelpStringList) > 1:
 | |
|                     Statement = Statement + HelpStringList[1].GetString()
 | |
|                 SectionDict[Arch] = SectionDict[Arch] + [Statement]
 | |
| 
 | |
|             if Destructor:
 | |
|                 Statement = (u'%s ' % DT.TAB_INF_DEFINES_DESTRUCTOR).ljust(LeftOffset) + u'= %s' % Destructor
 | |
|                 if FFE:
 | |
|                     Statement += ' | %s' % FFE
 | |
| 
 | |
|                 if len(HelpStringList) > 0:
 | |
|                     Statement = HelpStringList[0].GetString() + '\n' + Statement
 | |
|                 if len(HelpStringList) > 1:
 | |
|                     Statement = Statement + HelpStringList[1].GetString()
 | |
|                 SectionDict[Arch] = SectionDict[Arch] + [Statement]
 | |
| 
 | |
| ## ObtainPcdName
 | |
| #
 | |
| # Using TokenSpaceGuidValue and Token to obtain PcdName from DEC file
 | |
| #
 | |
| def ObtainPcdName(Packages, TokenSpaceGuidValue, Token):
 | |
|     TokenSpaceGuidName = ''
 | |
|     PcdCName = ''
 | |
|     TokenSpaceGuidNameFound = False
 | |
| 
 | |
|     for PackageDependency in Packages:
 | |
|         #
 | |
|         # Generate generic comment
 | |
|         #
 | |
|         Guid = PackageDependency.GetGuid()
 | |
|         Version = PackageDependency.GetVersion()
 | |
| 
 | |
|         Path = None
 | |
|         #
 | |
|         # 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
 | |
| 
 | |
|         # The dependency package in workspace
 | |
|         if Path:
 | |
|             DecFile = None
 | |
|             if Path not in GlobalData.gPackageDict:
 | |
|                 DecFile = Dec(Path)
 | |
|                 GlobalData.gPackageDict[Path] = DecFile
 | |
|             else:
 | |
|                 DecFile = GlobalData.gPackageDict[Path]
 | |
| 
 | |
|             DecGuidsDict = DecFile.GetGuidSectionObject().ValueDict
 | |
|             DecPcdsDict = DecFile.GetPcdSectionObject().ValueDict
 | |
| 
 | |
|             TokenSpaceGuidName = ''
 | |
|             PcdCName = ''
 | |
|             TokenSpaceGuidNameFound = False
 | |
| 
 | |
|             #
 | |
|             # Get TokenSpaceGuidCName from Guids section
 | |
|             #
 | |
|             for GuidKey in DecGuidsDict:
 | |
|                 GuidList = DecGuidsDict[GuidKey]
 | |
|                 for GuidItem in GuidList:
 | |
|                     if TokenSpaceGuidValue.upper() == GuidItem.GuidString.upper():
 | |
|                         TokenSpaceGuidName = GuidItem.GuidCName
 | |
|                         TokenSpaceGuidNameFound = True
 | |
|                         break
 | |
|                 if TokenSpaceGuidNameFound:
 | |
|                     break
 | |
|             #
 | |
|             # Retrieve PcdCName from Pcds Section
 | |
|             #
 | |
|             for PcdKey in DecPcdsDict:
 | |
|                 PcdList = DecPcdsDict[PcdKey]
 | |
|                 for PcdItem in PcdList:
 | |
|                     if TokenSpaceGuidName == PcdItem.TokenSpaceGuidCName and Token == PcdItem.TokenValue:
 | |
|                         PcdCName = PcdItem.TokenCName
 | |
|                         return TokenSpaceGuidName, PcdCName
 | |
| 
 | |
|         # The dependency package in ToBeInstalledDist
 | |
|         else:
 | |
|             for Dist in GlobalData.gTO_BE_INSTALLED_DIST_LIST:
 | |
|                 for Package in Dist.PackageSurfaceArea.values():
 | |
|                     if Guid == Package.Guid:
 | |
|                         for GuidItem in Package.GuidList:
 | |
|                             if TokenSpaceGuidValue.upper() == GuidItem.Guid.upper():
 | |
|                                 TokenSpaceGuidName = GuidItem.CName
 | |
|                                 TokenSpaceGuidNameFound = True
 | |
|                                 break
 | |
|                         for PcdItem in Package.PcdList:
 | |
|                             if TokenSpaceGuidName == PcdItem.TokenSpaceGuidCName and Token == PcdItem.Token:
 | |
|                                 PcdCName = PcdItem.CName
 | |
|                                 return TokenSpaceGuidName, PcdCName
 | |
| 
 | |
|     return TokenSpaceGuidName, PcdCName
 | |
| 
 | |
| ## _TransferDict
 | |
| #  transfer dict that using (Statement, SortedArch) as key, 
 | |
| #  (GenericComment, UsageComment) as value into a dict that using SortedArch as
 | |
| #  key and NewStatement as value 
 | |
| #
 | |
| def TransferDict(OrigDict, Type=None):
 | |
|     NewDict = {}
 | |
|     LeftOffset = 0
 | |
|     if Type in ['INF_GUID', 'INF_PPI_PROTOCOL']:
 | |
|         LeftOffset = 45
 | |
|     if Type in ['INF_PCD']:
 | |
|         LeftOffset = 75
 | |
|     if LeftOffset > 0:
 | |
|         for Statement, SortedArch in OrigDict:
 | |
|             if len(Statement) > LeftOffset:
 | |
|                 LeftOffset = len(Statement)
 | |
|         
 | |
|     for Statement, SortedArch in OrigDict:
 | |
|         Comment = OrigDict[Statement, SortedArch]
 | |
|         #
 | |
|         # apply the NComment/1Comment rule
 | |
|         #
 | |
|         if Comment.find('\n') != len(Comment) - 1:
 | |
|             NewStateMent = Comment + Statement
 | |
|         else:
 | |
|             if LeftOffset:
 | |
|                 NewStateMent = Statement.ljust(LeftOffset) + ' ' + Comment.rstrip('\n')
 | |
|             else:
 | |
|                 NewStateMent = Statement + ' ' + Comment.rstrip('\n')
 | |
| 
 | |
|         if SortedArch in NewDict:
 | |
|             NewDict[SortedArch] = NewDict[SortedArch] + [NewStateMent]
 | |
|         else:
 | |
|             NewDict[SortedArch] = [NewStateMent]
 | |
| 
 | |
|     return NewDict
 | |
| 
 |