| ## @file GenMetaFileMisc.py | |
| # | |
| # This file contained the miscellaneous routines for GenMetaFile usage. | |
| # | |
| # 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. | |
| # | |
| ''' | |
| 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): | |
| for PackageDependency in Packages: | |
| # | |
| # Generate generic comment | |
| # | |
| Guid = PackageDependency.GetGuid() | |
| Version = PackageDependency.GetVersion() | |
| # | |
| # 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 | |
| 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 | |
| PcdCNameFound = False | |
| # | |
| # Get TokenSpaceGuidCName from Guids section | |
| # | |
| for GuidKey in DecGuidsDict: | |
| GuidList = DecGuidsDict[GuidKey] | |
| if TokenSpaceGuidNameFound: | |
| break | |
| for GuidItem in GuidList: | |
| if TokenSpaceGuidValue.upper() == GuidItem.GuidString.upper(): | |
| TokenSpaceGuidName = GuidItem.GuidCName | |
| TokenSpaceGuidNameFound = True | |
| break | |
| # | |
| # Retrieve PcdCName from Pcds Section | |
| # | |
| for PcdKey in DecPcdsDict: | |
| PcdList = DecPcdsDict[PcdKey] | |
| if PcdCNameFound: | |
| return TokenSpaceGuidName, PcdCName | |
| for PcdItem in PcdList: | |
| if TokenSpaceGuidName == PcdItem.TokenSpaceGuidCName and Token == PcdItem.TokenValue: | |
| PcdCName = PcdItem.TokenCName | |
| PcdCNameFound = True | |
| break | |
| 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 | |