Sync BaseTools Branch (version r2271) to EDKII main trunk.
BaseTool Branch: https://edk2-buildtools.svn.sourceforge.net/svnroot/edk2-buildtools/branches/Releases/BaseTools_r2100 Signed-off-by: lgao4 Reviewed-by: hchen30 git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12214 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
367
BaseTools/Source/Python/UPT/GenMetaFile/GenDecFile.py
Normal file
367
BaseTools/Source/Python/UPT/GenMetaFile/GenDecFile.py
Normal file
@@ -0,0 +1,367 @@
|
||||
## @file GenDecFile.py
|
||||
#
|
||||
# This file contained the logical of transfer package object to DEC files.
|
||||
#
|
||||
# Copyright (c) 2011, 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.
|
||||
#
|
||||
|
||||
'''
|
||||
GenDEC
|
||||
'''
|
||||
|
||||
from Library.Parsing import GenSection
|
||||
from Library.CommentGenerating import GenHeaderCommentSection
|
||||
from Library.CommentGenerating import GenGenericCommentF
|
||||
from Library.CommentGenerating import GenDecTailComment
|
||||
from Library.CommentGenerating import _GetHelpStr
|
||||
from Library.Misc import GuidStringToGuidStructureString
|
||||
from Library.Misc import SaveFileOnChange
|
||||
from Library.Misc import ConvertPath
|
||||
from Library.DataType import TAB_SPACE_SPLIT
|
||||
from Library.DataType import TAB_COMMA_SPLIT
|
||||
from Library.DataType import TAB_ARCH_COMMON
|
||||
from Library.DataType import TAB_DEC_DEFINES_DEC_SPECIFICATION
|
||||
from Library.DataType import TAB_DEC_DEFINES_PACKAGE_NAME
|
||||
from Library.DataType import TAB_DEC_DEFINES_PACKAGE_GUID
|
||||
from Library.DataType import TAB_DEC_DEFINES_PACKAGE_VERSION
|
||||
|
||||
|
||||
def GenPcd(Package, Content):
|
||||
#
|
||||
# generate [Pcd] section
|
||||
# <TokenSpcCName>.<TokenCName>|<Value>|<DatumType>|<Token>
|
||||
#
|
||||
ValidUsageDict = {}
|
||||
for Pcd in Package.GetPcdList():
|
||||
#
|
||||
# Generate generic comment
|
||||
#
|
||||
HelpTextList = Pcd.GetHelpTextList()
|
||||
HelpStr = _GetHelpStr(HelpTextList)
|
||||
CommentStr = GenGenericCommentF(HelpStr, 2)
|
||||
|
||||
PcdErrList = Pcd.GetPcdErrorsList()
|
||||
if PcdErrList:
|
||||
CommentStr += GenPcdErrComment(PcdErrList[0])
|
||||
Statement = CommentStr
|
||||
|
||||
CName = Pcd.GetCName()
|
||||
TokenSpaceGuidCName = Pcd.GetTokenSpaceGuidCName()
|
||||
DefaultValue = Pcd.GetDefaultValue()
|
||||
DatumType = Pcd.GetDatumType()
|
||||
Token = Pcd.GetToken()
|
||||
ValidUsage = Pcd.GetValidUsage()
|
||||
|
||||
if ValidUsage == 'FeaturePcd':
|
||||
ValidUsage = 'PcdsFeatureFlag'
|
||||
elif ValidUsage == 'PatchPcd':
|
||||
ValidUsage = 'PcdsPatchableInModule'
|
||||
elif ValidUsage == 'FixedPcd':
|
||||
ValidUsage = 'PcdsFixedAtBuild'
|
||||
elif ValidUsage == 'Pcd':
|
||||
ValidUsage = 'PcdsDynamic'
|
||||
elif ValidUsage == 'PcdEx':
|
||||
ValidUsage = 'PcdsDynamicEx'
|
||||
|
||||
if ValidUsage in ValidUsageDict:
|
||||
NewSectionDict = ValidUsageDict[ValidUsage]
|
||||
else:
|
||||
NewSectionDict = {}
|
||||
ValidUsageDict[ValidUsage] = NewSectionDict
|
||||
Statement += TokenSpaceGuidCName + '.' + CName
|
||||
Statement += '|' + DefaultValue
|
||||
Statement += '|' + DatumType
|
||||
Statement += '|' + Token
|
||||
#
|
||||
# generate tail comment
|
||||
#
|
||||
if Pcd.GetSupModuleList():
|
||||
Statement += GenDecTailComment(Pcd.GetSupModuleList())
|
||||
|
||||
ArchList = Pcd.GetSupArchList()
|
||||
ArchList.sort()
|
||||
SortedArch = ' '.join(ArchList)
|
||||
if SortedArch in NewSectionDict:
|
||||
NewSectionDict[SortedArch] = \
|
||||
NewSectionDict[SortedArch] + [Statement]
|
||||
else:
|
||||
NewSectionDict[SortedArch] = [Statement]
|
||||
|
||||
for ValidUsage in ValidUsageDict:
|
||||
Content += GenSection(ValidUsage, ValidUsageDict[ValidUsage])
|
||||
|
||||
return Content
|
||||
|
||||
def GenGuidProtocolPpi(Package, Content):
|
||||
#
|
||||
# generate [Guids] section
|
||||
#
|
||||
NewSectionDict = {}
|
||||
for Guid in Package.GetGuidList():
|
||||
#
|
||||
# Generate generic comment
|
||||
#
|
||||
HelpTextList = Guid.GetHelpTextList()
|
||||
HelpStr = _GetHelpStr(HelpTextList)
|
||||
CommentStr = GenGenericCommentF(HelpStr, 2)
|
||||
|
||||
Statement = CommentStr
|
||||
CName = Guid.GetCName()
|
||||
Value = GuidStringToGuidStructureString(Guid.GetGuid())
|
||||
Statement += CName + ' = ' + Value
|
||||
#
|
||||
# generate tail comment
|
||||
#
|
||||
if Guid.GetSupModuleList():
|
||||
Statement += GenDecTailComment(Guid.GetSupModuleList())
|
||||
ArchList = Guid.GetSupArchList()
|
||||
ArchList.sort()
|
||||
SortedArch = ' '.join(ArchList)
|
||||
if SortedArch in NewSectionDict:
|
||||
NewSectionDict[SortedArch] = \
|
||||
NewSectionDict[SortedArch] + [Statement]
|
||||
else:
|
||||
NewSectionDict[SortedArch] = [Statement]
|
||||
|
||||
Content += GenSection('Guids', NewSectionDict)
|
||||
|
||||
#
|
||||
# generate [Protocols] section
|
||||
#
|
||||
NewSectionDict = {}
|
||||
for Protocol in Package.GetProtocolList():
|
||||
#
|
||||
# Generate generic comment
|
||||
#
|
||||
HelpTextList = Protocol.GetHelpTextList()
|
||||
HelpStr = _GetHelpStr(HelpTextList)
|
||||
CommentStr = GenGenericCommentF(HelpStr, 2)
|
||||
|
||||
Statement = CommentStr
|
||||
CName = Protocol.GetCName()
|
||||
Value = GuidStringToGuidStructureString(Protocol.GetGuid())
|
||||
Statement += CName + ' = ' + Value
|
||||
|
||||
#
|
||||
# generate tail comment
|
||||
#
|
||||
if Protocol.GetSupModuleList():
|
||||
Statement += GenDecTailComment(Protocol.GetSupModuleList())
|
||||
ArchList = Protocol.GetSupArchList()
|
||||
ArchList.sort()
|
||||
SortedArch = ' '.join(ArchList)
|
||||
if SortedArch in NewSectionDict:
|
||||
NewSectionDict[SortedArch] = \
|
||||
NewSectionDict[SortedArch] + [Statement]
|
||||
else:
|
||||
NewSectionDict[SortedArch] = [Statement]
|
||||
|
||||
Content += GenSection('Protocols', NewSectionDict)
|
||||
|
||||
#
|
||||
# generate [Ppis] section
|
||||
#
|
||||
NewSectionDict = {}
|
||||
for Ppi in Package.GetPpiList():
|
||||
#
|
||||
# Generate generic comment
|
||||
#
|
||||
HelpTextList = Ppi.GetHelpTextList()
|
||||
HelpStr = _GetHelpStr(HelpTextList)
|
||||
CommentStr = GenGenericCommentF(HelpStr, 2)
|
||||
|
||||
Statement = CommentStr
|
||||
CName = Ppi.GetCName()
|
||||
Value = GuidStringToGuidStructureString(Ppi.GetGuid())
|
||||
Statement += CName + ' = ' + Value
|
||||
|
||||
#
|
||||
# generate tail comment
|
||||
#
|
||||
if Ppi.GetSupModuleList():
|
||||
Statement += GenDecTailComment(Ppi.GetSupModuleList())
|
||||
ArchList = Ppi.GetSupArchList()
|
||||
ArchList.sort()
|
||||
SortedArch = ' '.join(ArchList)
|
||||
if SortedArch in NewSectionDict:
|
||||
NewSectionDict[SortedArch] = \
|
||||
NewSectionDict[SortedArch] + [Statement]
|
||||
else:
|
||||
NewSectionDict[SortedArch] = [Statement]
|
||||
|
||||
Content += GenSection('Ppis', NewSectionDict)
|
||||
|
||||
return Content
|
||||
|
||||
## Transfer Package Object to Dec files
|
||||
#
|
||||
# Transfer all contents of a standard Package Object to a Dec file
|
||||
#
|
||||
# @param Package: A Package
|
||||
#
|
||||
def PackageToDec(Package):
|
||||
#
|
||||
# Init global information for the file
|
||||
#
|
||||
ContainerFile = Package.GetFullPath()
|
||||
|
||||
Content = ''
|
||||
#
|
||||
# generate header comment section
|
||||
#
|
||||
Content += GenHeaderCommentSection(Package.GetAbstract(), \
|
||||
Package.GetDescription(), \
|
||||
Package.GetCopyright(), \
|
||||
Package.GetLicense())
|
||||
|
||||
#
|
||||
# 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]
|
||||
# }
|
||||
#
|
||||
|
||||
#
|
||||
# generate [Defines] section
|
||||
#
|
||||
NewSectionDict = {TAB_ARCH_COMMON : []}
|
||||
SpecialItemList = []
|
||||
|
||||
Statement = '%s = %s' % (TAB_DEC_DEFINES_DEC_SPECIFICATION, '0x00010017')
|
||||
SpecialItemList.append(Statement)
|
||||
|
||||
BaseName = Package.GetBaseName()
|
||||
if BaseName.startswith('.') or BaseName.startswith('-'):
|
||||
BaseName = '_' + BaseName
|
||||
Statement = '%s = %s' % (TAB_DEC_DEFINES_PACKAGE_NAME, BaseName)
|
||||
SpecialItemList.append(Statement)
|
||||
Statement = '%s = %s' % (TAB_DEC_DEFINES_PACKAGE_VERSION, Package.GetVersion())
|
||||
SpecialItemList.append(Statement)
|
||||
Statement = '%s = %s' % (TAB_DEC_DEFINES_PACKAGE_GUID, Package.GetGuid())
|
||||
SpecialItemList.append(Statement)
|
||||
for SortedArch in NewSectionDict:
|
||||
NewSectionDict[SortedArch] = \
|
||||
NewSectionDict[SortedArch] + SpecialItemList
|
||||
Content += GenSection('Defines', NewSectionDict)
|
||||
|
||||
#
|
||||
# generate [Includes] section
|
||||
#
|
||||
NewSectionDict = {}
|
||||
IncludeArchList = Package.GetIncludeArchList()
|
||||
if IncludeArchList:
|
||||
for Path, ArchList in IncludeArchList:
|
||||
Statement = Path
|
||||
ArchList.sort()
|
||||
SortedArch = ' '.join(ArchList)
|
||||
if SortedArch in NewSectionDict:
|
||||
NewSectionDict[SortedArch] = \
|
||||
NewSectionDict[SortedArch] + [ConvertPath(Statement)]
|
||||
else:
|
||||
NewSectionDict[SortedArch] = [ConvertPath(Statement)]
|
||||
|
||||
Content += GenSection('Includes', NewSectionDict)
|
||||
|
||||
Content = GenGuidProtocolPpi(Package, Content)
|
||||
|
||||
#
|
||||
# generate [LibraryClasses] section
|
||||
#
|
||||
NewSectionDict = {}
|
||||
for LibraryClass in Package.GetLibraryClassList():
|
||||
#
|
||||
# Generate generic comment
|
||||
#
|
||||
HelpTextList = LibraryClass.GetHelpTextList()
|
||||
HelpStr = _GetHelpStr(HelpTextList)
|
||||
if HelpStr:
|
||||
HelpStr = '@libraryclass ' + HelpStr
|
||||
CommentStr = GenGenericCommentF(HelpStr, 2)
|
||||
|
||||
Statement = CommentStr
|
||||
Name = LibraryClass.GetLibraryClass()
|
||||
IncludeHeader = LibraryClass.GetIncludeHeader()
|
||||
Statement += Name + '|' + ConvertPath(IncludeHeader)
|
||||
#
|
||||
# generate tail comment
|
||||
#
|
||||
if LibraryClass.GetSupModuleList():
|
||||
Statement += \
|
||||
GenDecTailComment(LibraryClass.GetSupModuleList())
|
||||
ArchList = LibraryClass.GetSupArchList()
|
||||
ArchList.sort()
|
||||
SortedArch = ' '.join(ArchList)
|
||||
if SortedArch in NewSectionDict:
|
||||
NewSectionDict[SortedArch] = \
|
||||
NewSectionDict[SortedArch] + [Statement]
|
||||
else:
|
||||
NewSectionDict[SortedArch] = [Statement]
|
||||
|
||||
Content += GenSection('LibraryClasses', NewSectionDict)
|
||||
|
||||
Content = GenPcd(Package, Content)
|
||||
|
||||
#
|
||||
# generate [UserExtensions] section
|
||||
#
|
||||
NewSectionDict = {}
|
||||
for UserExtension in Package.GetUserExtensionList():
|
||||
Statement = UserExtension.GetStatement()
|
||||
if not Statement:
|
||||
continue
|
||||
|
||||
SectionList = []
|
||||
SectionName = 'UserExtensions'
|
||||
UserId = UserExtension.GetUserID()
|
||||
if UserId:
|
||||
if '.' in UserId:
|
||||
UserId = '"' + UserId + '"'
|
||||
SectionName += '.' + UserId
|
||||
if UserExtension.GetIdentifier():
|
||||
SectionName += '.' + '"' + UserExtension.GetIdentifier() + '"'
|
||||
if not UserExtension.GetSupArchList():
|
||||
SectionList.append(SectionName)
|
||||
else:
|
||||
for Arch in UserExtension.GetSupArchList():
|
||||
SectionList.append(SectionName + '.' + Arch)
|
||||
SectionName = ', '.join(SectionList)
|
||||
SectionName = ''.join(['[', SectionName, ']\n'])
|
||||
Content += '\n\n' + SectionName + Statement
|
||||
|
||||
SaveFileOnChange(ContainerFile, Content, False)
|
||||
return ContainerFile
|
||||
|
||||
## GenPcdErrComment
|
||||
#
|
||||
# @param PcdErrObject: PcdErrorObject
|
||||
#
|
||||
# @retval CommentStr: Generated comment lines, with prefix "#"
|
||||
#
|
||||
def GenPcdErrComment (PcdErrObject):
|
||||
EndOfLine = "\n"
|
||||
ValidValueRange = PcdErrObject.GetValidValueRange()
|
||||
if ValidValueRange:
|
||||
CommentStr = "# @ValidRange " + ValidValueRange + EndOfLine
|
||||
|
||||
ValidValue = PcdErrObject.GetValidValue()
|
||||
if ValidValue:
|
||||
ValidValueList = \
|
||||
[Value for Value in ValidValue.split(TAB_SPACE_SPLIT) if Value]
|
||||
CommentStr = \
|
||||
"# @ValidList " + TAB_COMMA_SPLIT.join(ValidValueList) + EndOfLine
|
||||
|
||||
Expression = PcdErrObject.GetExpression()
|
||||
if Expression:
|
||||
CommentStr = "# @Expression " + Expression + EndOfLine
|
||||
|
||||
return CommentStr
|
||||
|
988
BaseTools/Source/Python/UPT/GenMetaFile/GenInfFile.py
Normal file
988
BaseTools/Source/Python/UPT/GenMetaFile/GenInfFile.py
Normal file
@@ -0,0 +1,988 @@
|
||||
## @file GenInfFile.py
|
||||
#
|
||||
# This file contained the logical of transfer package object to INF files.
|
||||
#
|
||||
# Copyright (c) 2011, 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
|
||||
'''
|
||||
from os import getenv
|
||||
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.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
|
||||
|
||||
## 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):
|
||||
if not GlobalData.gWSPKG_LIST:
|
||||
GlobalData.gWSPKG_LIST = GetWorkspacePackage()
|
||||
|
||||
#
|
||||
# Init global information for the file
|
||||
#
|
||||
ContainerFile = ModuleObject.GetFullPath()
|
||||
Content = ''
|
||||
#
|
||||
# generate header comment section
|
||||
#
|
||||
Content += GenHeaderCommentSection(ModuleObject.GetAbstract(),
|
||||
ModuleObject.GetDescription(),
|
||||
ModuleObject.GetCopyright(),
|
||||
ModuleObject.GetLicense())
|
||||
|
||||
#
|
||||
# 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\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)
|
||||
return ContainerFile
|
||||
|
||||
def GenDefines(ModuleObject):
|
||||
#
|
||||
# generate [Defines] section
|
||||
#
|
||||
Content = ''
|
||||
NewSectionDict = {}
|
||||
for UserExtension in ModuleObject.GetUserExtensionList():
|
||||
DefinesDict = UserExtension.GetDefinesDict()
|
||||
if not DefinesDict:
|
||||
continue
|
||||
|
||||
for Statement in DefinesDict:
|
||||
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 = []
|
||||
|
||||
#
|
||||
# Add INF_VERSION statement firstly
|
||||
#
|
||||
Statement = 'INF_VERSION = 0x00010017'
|
||||
SpecialStatementList.append(Statement)
|
||||
|
||||
BaseName = ModuleObject.GetBaseName()
|
||||
if BaseName.startswith('.') or BaseName.startswith('-'):
|
||||
BaseName = '_' + BaseName
|
||||
Statement = '%s = %s' % (DT.TAB_INF_DEFINES_BASE_NAME, BaseName)
|
||||
SpecialStatementList.append(Statement)
|
||||
Statement = '%s = %s' % (DT.TAB_INF_DEFINES_FILE_GUID, ModuleObject.GetGuid())
|
||||
SpecialStatementList.append(Statement)
|
||||
Statement = '%s = %s' % (DT.TAB_INF_DEFINES_VERSION_STRING, ModuleObject.GetVersion())
|
||||
SpecialStatementList.append(Statement)
|
||||
|
||||
if ModuleObject.GetModuleType():
|
||||
Statement = '%s = %s' % (DT.TAB_INF_DEFINES_MODULE_TYPE, ModuleObject.GetModuleType())
|
||||
SpecialStatementList.append(Statement)
|
||||
if ModuleObject.GetPcdIsDriver():
|
||||
Statement = '%s = %s' % (DT.TAB_INF_DEFINES_PCD_IS_DRIVER, ModuleObject.GetPcdIsDriver())
|
||||
SpecialStatementList.append(Statement)
|
||||
if ModuleObject.GetUefiSpecificationVersion():
|
||||
Statement = '%s = %s' % (DT.TAB_INF_DEFINES_UEFI_SPECIFICATION_VERSION, \
|
||||
ModuleObject.GetUefiSpecificationVersion())
|
||||
SpecialStatementList.append(Statement)
|
||||
if ModuleObject.GetPiSpecificationVersion():
|
||||
Statement = '%s = %s' % (DT.TAB_INF_DEFINES_PI_SPECIFICATION_VERSION, ModuleObject.GetPiSpecificationVersion())
|
||||
SpecialStatementList.append(Statement)
|
||||
for LibraryClass in ModuleObject.GetLibraryClassList():
|
||||
if LibraryClass.GetUsage() == DT.USAGE_ITEM_PRODUCES or \
|
||||
LibraryClass.GetUsage() == DT.USAGE_ITEM_SOMETIMES_PRODUCES:
|
||||
Statement = '%s = %s' % (DT.TAB_INF_DEFINES_LIBRARY_CLASS, LibraryClass.GetLibraryClass())
|
||||
if LibraryClass.GetSupModuleList():
|
||||
Statement += '|' + DT.TAB_SPACE_SPLIT.join(l for l in LibraryClass.GetSupModuleList())
|
||||
SpecialStatementList.append(Statement)
|
||||
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)
|
||||
|
||||
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'
|
||||
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 += '# ' + '\n'
|
||||
|
||||
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'):
|
||||
LibraryClassDict['COMMON'].append(Statement)
|
||||
else:
|
||||
LibraryClassDict['COMMON'] = ['## @LIB_INSTANCES']
|
||||
LibraryClassDict['COMMON'].append(Statement)
|
||||
else:
|
||||
for Arch in BinaryFile.SupArchList:
|
||||
if LibraryClassDict.has_key(Arch):
|
||||
LibraryClassDict[Arch].append(Statement)
|
||||
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 = getenv('WORKSPACE')
|
||||
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()
|
||||
#
|
||||
# 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 = Path[Path.upper().find(WorkspaceDir.upper()) + len(WorkspaceDir) + 1:]
|
||||
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.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):
|
||||
(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 = ''
|
||||
|
||||
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()
|
||||
|
||||
#
|
||||
# we need to 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)
|
||||
|
||||
#
|
||||
# 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()
|
||||
|
||||
#
|
||||
# we need to 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)
|
||||
|
||||
#
|
||||
# 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 or (ItemType == DT.TAB_INF_FEATURE_PCD):
|
||||
# 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)
|
||||
|
||||
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[:-3] + TokenSpaceName + '.' + PcdCName + ' | ' + PcdValue + ' | ' + PcdOffset
|
||||
|
||||
if len(BinaryFile.SupArchList) == 0:
|
||||
if PatchPcdDict.has_key('COMMON'):
|
||||
PatchPcdDict['COMMON'].append(Statement)
|
||||
else:
|
||||
PatchPcdDict['COMMON'] = [Statement]
|
||||
else:
|
||||
for Arch in BinaryFile.SupArchList:
|
||||
if PatchPcdDict.has_key(Arch):
|
||||
PatchPcdDict[Arch].append(Statement)
|
||||
else:
|
||||
PatchPcdDict[Arch] = [Statement]
|
||||
return GenSection('PatchPcd', 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
|
||||
PcdValue = PcdExItem.DefaultValue
|
||||
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[:-3] + TokenSpaceName + '.' + PcdCName + ' | ' + PcdValue
|
||||
|
||||
if len(BinaryFile.SupArchList) == 0:
|
||||
if PcdExDict.has_key('COMMON'):
|
||||
PcdExDict['COMMON'].append(Statement)
|
||||
else:
|
||||
PcdExDict['COMMON'] = [Statement]
|
||||
else:
|
||||
for Arch in BinaryFile.SupArchList:
|
||||
if PcdExDict.has_key(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 two empty line after the generated section content to differentiate
|
||||
# it between other possible sections
|
||||
#
|
||||
if Content:
|
||||
Content += '\n#\n#\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:
|
||||
Statement = GenBinaryStatement(Key, None)
|
||||
if SortedArch in NewSectionDict:
|
||||
NewSectionDict[SortedArch] = NewSectionDict[SortedArch] + [Statement]
|
||||
else:
|
||||
NewSectionDict[SortedArch] = [Statement]
|
||||
|
||||
return GenSection('Binaries', NewSectionDict)
|
155
BaseTools/Source/Python/UPT/GenMetaFile/GenMetaFileMisc.py
Normal file
155
BaseTools/Source/Python/UPT/GenMetaFile/GenMetaFileMisc.py
Normal file
@@ -0,0 +1,155 @@
|
||||
## @file GenMetaFileMisc.py
|
||||
#
|
||||
# This file contained the miscellaneous routines for GenMetaFile usage.
|
||||
#
|
||||
# Copyright (c) 2011, 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):
|
||||
for ArchList, EntryPoint, UnloadImage, Constructor, Destructor, FFE, HelpStringList in ExternList:
|
||||
if Arch or ArchList:
|
||||
if EntryPoint:
|
||||
Statement = '%s = %s' % (DT.TAB_INF_DEFINES_ENTRY_POINT, 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 = '%s = %s' % (DT.TAB_INF_DEFINES_UNLOAD_IMAGE, 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 = '%s = %s' % (DT.TAB_INF_DEFINES_CONSTRUCTOR, 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 = '%s = %s' % (DT.TAB_INF_DEFINES_DESTRUCTOR, 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 = Dec(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 == GuidItem.GuidString:
|
||||
TokenSpaceGuidName = GuidItem.GuidCName
|
||||
TokenSpaceGuidNameFound = True
|
||||
break
|
||||
|
||||
#
|
||||
# Retrieve PcdCName from Pcds Section
|
||||
#
|
||||
for PcdKey in DecPcdsDict:
|
||||
PcdList = DecPcdsDict[PcdKey]
|
||||
if PcdCNameFound:
|
||||
break
|
||||
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):
|
||||
NewDict = {}
|
||||
|
||||
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:
|
||||
NewStateMent = Statement + ' ' + Comment.rstrip('\n')
|
||||
|
||||
if SortedArch in NewDict:
|
||||
NewDict[SortedArch] = NewDict[SortedArch] + [NewStateMent]
|
||||
else:
|
||||
NewDict[SortedArch] = [NewStateMent]
|
||||
|
||||
return NewDict
|
||||
|
18
BaseTools/Source/Python/UPT/GenMetaFile/GenXmlFile.py
Normal file
18
BaseTools/Source/Python/UPT/GenMetaFile/GenXmlFile.py
Normal file
@@ -0,0 +1,18 @@
|
||||
## @file GenXmlFile.py
|
||||
#
|
||||
# This file contained the logical of generate XML files.
|
||||
#
|
||||
# Copyright (c) 2011, 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.
|
||||
#
|
||||
|
||||
'''
|
||||
GenXmlFile
|
||||
'''
|
20
BaseTools/Source/Python/UPT/GenMetaFile/__init__.py
Normal file
20
BaseTools/Source/Python/UPT/GenMetaFile/__init__.py
Normal file
@@ -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.<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.
|
||||
#
|
||||
|
||||
'''
|
||||
GenMetaFile
|
||||
'''
|
Reference in New Issue
Block a user