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:
lgao4
2011-08-26 07:46:26 +00:00
parent ba944801a9
commit 4234283c3a
186 changed files with 37663 additions and 3133 deletions

View File

@@ -0,0 +1,607 @@
## @file DecPomAlignment.py
# This file contained the adapter for convert INF parser object to POM Object
#
# 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.
#
'''
DecPomAlignment
'''
##
# Import Modules
#
import os.path
from os import sep
import platform
import Logger.Log as Logger
from Logger import StringTable as ST
from Logger.ToolError import UPT_MUL_DEC_ERROR
from Library.Parsing import NormPath
from Library.DataType import ARCH_LIST
from Library.DataType import TAB_GUIDS
from Library.DataType import TAB_PROTOCOLS
from Library.DataType import TAB_PPIS
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
from Library.DataType import TAB_DEC_DEFINES_DEC_SPECIFICATION
from Library.DataType import TAB_ARCH_COMMON
from Library.CommentParsing import ParseHeaderCommentSection
from Library.DataType import TAB_INCLUDES
from Library.CommentParsing import ParseGenericComment
from Library.DataType import TAB_LIBRARY_CLASSES
from Library.DataType import TAB_PCDS
from Library.DataType import TAB_PCDS_FIXED_AT_BUILD_NULL
from Library.DataType import TAB_PCDS_PATCHABLE_IN_MODULE_NULL
from Library.DataType import TAB_PCDS_FEATURE_FLAG_NULL
from Library.DataType import TAB_PCDS_DYNAMIC_EX_NULL
from Library.DataType import TAB_PCDS_DYNAMIC_NULL
from Library.DataType import TAB_PTR_TYPE_PCD
from Library.DataType import ITEM_UNDEFINED
from Library.CommentParsing import ParseDecPcdGenericComment
from Library.CommentParsing import ParseDecPcdTailComment
from Library.Misc import GetFiles
from Library.Misc import Sdict
from Parser.DecParser import Dec
from Object.POM.PackageObject import PackageObject
from Object.POM.CommonObject import UserExtensionObject
from Object.POM.CommonObject import IncludeObject
from Object.POM.CommonObject import GuidObject
from Object.POM.CommonObject import ProtocolObject
from Object.POM.CommonObject import PpiObject
from Object.POM.CommonObject import LibraryClassObject
from Object.POM.CommonObject import PcdObject
from Object.POM.CommonObject import TextObject
## DecPomAlignment
#
# Inherited from PackageObject
#
class DecPomAlignment(PackageObject):
def __init__(self, Filename, WorkspaceDir = None, CheckMulDec = False):
PackageObject.__init__(self)
self.UserExtensions = ''
self.WorkspaceDir = WorkspaceDir
self.SupArchList = ARCH_LIST
self.CheckMulDec = CheckMulDec
self.DecParser = None
#
# Load Dec file
#
self.LoadDecFile(Filename)
#
# Transfer to Package Object if IsToPackage is True
#
self.DecToPackage()
## Load Dec file
#
# Load the file if it exists
#
# @param Filename: Input value for filename of Dec file
#
def LoadDecFile(self, Filename):
#
# Insert a record for file
#
Filename = NormPath(Filename)
(Path, Name) = os.path.split(Filename)
self.SetFullPath(Filename)
self.SetRelaPath(Path)
self.SetFileName(Name)
self.SetPackagePath(Path[Path.upper().find(self.WorkspaceDir.upper()) + len(self.WorkspaceDir) + 1:])
self.SetCombinePath(Filename[Filename.upper().find(self.WorkspaceDir.upper()) + len(self.WorkspaceDir) + 1:])
self.DecParser = Dec(Filename)
## Transfer to Package Object
#
# Transfer all contents of a Dec file to a standard Package Object
#
def DecToPackage(self):
#
# Init global information for the file
#
ContainerFile = self.GetFullPath()
#
# Generate Package Header
#
self.GenPackageHeader(ContainerFile)
#
# Generate Includes
#
self.GenIncludes(ContainerFile)
#
# Generate Guids
#
self.GenGuidProtocolPpis(TAB_GUIDS, ContainerFile)
#
# Generate Protocols
#
self.GenGuidProtocolPpis(TAB_PROTOCOLS, ContainerFile)
#
# Generate Ppis
#
self.GenGuidProtocolPpis(TAB_PPIS, ContainerFile)
#
# Generate LibraryClasses
#
self.GenLibraryClasses(ContainerFile)
#
# Generate Pcds
#
self.GenPcds(ContainerFile)
#
# Generate Module File list, will be used later on to generate
# distribution
#
self.GenModuleFileList(ContainerFile)
#
# Generate user extensions
#
self.GenUserExtensions()
## Generate user extention
#
#
def GenUserExtensions(self):
UEObj = self.DecParser.GetUserExtensionSectionObject()
UEList = UEObj.GetAllUserExtensions()
for Item in UEList:
if not Item.UserString:
continue
UserExtension = UserExtensionObject()
UserId = Item.UserId
if UserId.startswith('"') and UserId.endswith('"'):
UserId = UserId[1:-1]
UserExtension.SetUserID(UserId)
Identifier = Item.IdString
if Identifier.startswith('"') and Identifier.endswith('"'):
Identifier = Identifier[1:-1]
UserExtension.SetIdentifier(Identifier)
UserExtension.SetStatement(Item.UserString)
UserExtension.SetSupArchList(
Item.ArchAndModuleType
)
self.SetUserExtensionList(
self.GetUserExtensionList() + [UserExtension]
)
## Generate Package Header
#
# Gen Package Header of Dec as <Key> = <Value>
#
# @param ContainerFile: The Dec file full path
#
def GenPackageHeader(self, ContainerFile):
Logger.Debug(2, "Generate PackageHeader ...")
DefinesDict = {}
#
# Update all defines item in database
#
DefObj = self.DecParser.GetDefineSectionObject()
for Item in DefObj.GetDefines():
#
# put items into Dict except for PackageName, Guid, Version, DEC_SPECIFICATION
#
SkipItemList = [TAB_DEC_DEFINES_PACKAGE_NAME, \
TAB_DEC_DEFINES_PACKAGE_GUID, TAB_DEC_DEFINES_PACKAGE_VERSION, TAB_DEC_DEFINES_DEC_SPECIFICATION]
if Item.Key in SkipItemList:
continue
DefinesDict['%s = %s' % (Item.Key, Item.Value)] = TAB_ARCH_COMMON
self.SetBaseName(DefObj.GetPackageName())
self.SetVersion(DefObj.GetPackageVersion())
# self.SetName(DefObj.GetPackageName() + ' Version ' + \
# DefObj.GetPackageVersion())
self.SetName(os.path.splitext(self.GetFileName())[0])
self.SetGuid(DefObj.GetPackageGuid())
if DefinesDict:
UserExtension = UserExtensionObject()
UserExtension.SetDefinesDict(DefinesDict)
UserExtension.SetIdentifier('DefineModifiers')
UserExtension.SetUserID('EDK2')
self.SetUserExtensionList(
self.GetUserExtensionList() + [UserExtension]
)
#
# Get All header comment section information
#
Abstract, Description, Copyright, License = \
ParseHeaderCommentSection(self.DecParser.GetHeadComment(),
ContainerFile)
self.SetAbstract(Abstract)
self.SetDescription(Description)
self.SetCopyright(Copyright)
self.SetLicense(License)
## GenIncludes
#
# Gen Includes of Dec
#
# @param ContainerFile: The Dec file full path
#
def GenIncludes(self, ContainerFile):
if ContainerFile:
pass
Logger.Debug(2, "Generate %s ..." % TAB_INCLUDES)
IncludesDict = Sdict()
IncObj = self.DecParser.GetIncludeSectionObject()
for Item in IncObj.GetAllIncludes():
IncludePath = os.path.normpath(Item.File)
if platform.system() != 'Windows':
IncludePath = IncludePath.replace('\\', '/')
if IncludePath in IncludesDict:
if Item.GetArchList() == [TAB_ARCH_COMMON] or IncludesDict[IncludePath] == [TAB_ARCH_COMMON]:
IncludesDict[IncludePath] = [TAB_ARCH_COMMON]
else:
IncludesDict[IncludePath] = IncludesDict[IncludePath] + Item.GetArchList()
else:
IncludesDict[IncludePath] = Item.GetArchList()
#
# get the standardIncludeFileList(industry), packageIncludeFileList
# (others) for PackageObject
#
PackagePath = os.path.split(self.GetFullPath())[0]
IncludePathList = \
[os.path.normpath(Path) + sep for Path in IncludesDict.keys()]
IncludePathList.sort()
#
# get a non-overlap set of include path, IncludePathList should be
# sorted, and path should be end with path seperator '\'
#
NonOverLapList = []
for Path1 in IncludePathList:
for Path2 in NonOverLapList:
if Path1.startswith(Path2):
break
else:
NonOverLapList.append(Path1)
#
# revert the list so the longest path shown first in list, also need
# to remove the extra path seperator '\'
# as this list is used to search the supported Arch info
#
for IndexN in range (0, len(IncludePathList)):
IncludePathList[IndexN] = os.path.normpath(IncludePathList[IndexN])
IncludePathList.sort()
IncludePathList.reverse()
#
# save the include path list for later usage
#
self.SetIncludePathList(IncludePathList)
StandardIncludeFileList = []
PackageIncludeFileList = []
IncludeFileList = []
for Path in NonOverLapList:
FileList = GetFiles(os.path.join(PackagePath, Path), ['CVS', '.svn'], False)
IncludeFileList += [os.path.normpath(os.path.join(Path, File)) for File in FileList]
for Includefile in IncludeFileList:
ExtName = os.path.splitext(Includefile)[1]
if ExtName.upper() == '.DEC' and self.CheckMulDec:
Logger.Error('MkPkg',
UPT_MUL_DEC_ERROR,
ST.ERR_MUL_DEC_ERROR%(os.path.dirname(ContainerFile),
os.path.basename(ContainerFile),
Includefile))
FileCombinePath = os.path.dirname(Includefile)
Include = IncludeObject()
for Path in IncludePathList:
if FileCombinePath.startswith(Path):
SupArchList = IncludesDict[Path]
break
Include.SetFilePath(Includefile)
Include.SetSupArchList(SupArchList)
if Includefile.find('IndustryStandard') != -1:
StandardIncludeFileList.append(Include)
else:
PackageIncludeFileList.append(Include)
self.SetStandardIncludeFileList(StandardIncludeFileList)
#
# put include path into the PackageIncludeFileList
#
PackagePathList = []
IncObj = self.DecParser.GetIncludeSectionObject()
for Item in IncObj.GetAllIncludes():
IncludePath = Item.File
Include = IncludeObject()
Include.SetFilePath(IncludePath)
Include.SetSupArchList(Item.GetArchList())
PackagePathList.append(Include)
self.SetPackageIncludeFileList(PackagePathList + PackageIncludeFileList)
## GenPpis
#
# Gen Ppis of Dec
# <CName>=<GuidValue>
#
# @param ContainerFile: The Dec file full path
#
def GenGuidProtocolPpis(self, Type, ContainerFile):
if ContainerFile:
pass
Logger.Debug(2, "Generate %s ..." % Type)
Obj = None
Factory = None
if Type == TAB_GUIDS:
Obj = self.DecParser.GetGuidSectionObject()
def CreateGuidObject():
Object = GuidObject()
Object.SetGuidTypeList([])
Object.SetUsage(None)
Object.SetName(None)
return Object
Factory = CreateGuidObject
elif Type == TAB_PROTOCOLS:
Obj = self.DecParser.GetProtocolSectionObject()
def CreateProtocolObject():
return ProtocolObject()
Factory = CreateProtocolObject
elif Type == TAB_PPIS:
Obj = self.DecParser.GetPpiSectionObject()
def CreatePpiObject():
return PpiObject()
Factory = CreatePpiObject
else:
#
# Should not be here
#
return
DeclarationsList = []
#
# Go through each arch
#
for Item in Obj.GetGuidStyleAllItems():
Name = Item.GuidCName
Value = Item.GuidString
HelpTxt = ParseGenericComment(Item.GetHeadComment() + \
Item.GetTailComment())
ListObject = Factory()
ListObject.SetCName(Name)
ListObject.SetGuid(Value)
ListObject.SetSupArchList(Item.GetArchList())
if HelpTxt:
ListObject.SetHelpTextList([HelpTxt])
DeclarationsList.append(ListObject)
#
#GuidTypeList is abstracted from help
#
if Type == TAB_GUIDS:
self.SetGuidList(self.GetGuidList() + DeclarationsList)
elif Type == TAB_PROTOCOLS:
self.SetProtocolList(self.GetProtocolList() + DeclarationsList)
elif Type == TAB_PPIS:
self.SetPpiList(self.GetPpiList() + DeclarationsList)
## GenLibraryClasses
#
# Gen LibraryClasses of Dec
# <CName>=<GuidValue>
#
# @param ContainerFile: The Dec file full path
#
def GenLibraryClasses(self, ContainerFile):
if ContainerFile:
pass
Logger.Debug(2, "Generate %s ..." % TAB_LIBRARY_CLASSES)
LibraryClassDeclarations = []
LibObj = self.DecParser.GetLibraryClassSectionObject()
for Item in LibObj.GetAllLibraryclasses():
LibraryClass = LibraryClassObject()
LibraryClass.SetLibraryClass(Item.Libraryclass)
LibraryClass.SetSupArchList(Item.GetArchList())
LibraryClass.SetIncludeHeader(Item.File)
HelpTxt = ParseGenericComment(Item.GetHeadComment() + \
Item.GetTailComment(), None, '@libraryclass')
if HelpTxt:
LibraryClass.SetHelpTextList([HelpTxt])
LibraryClassDeclarations.append(LibraryClass)
self.SetLibraryClassList(self.GetLibraryClassList() + \
LibraryClassDeclarations)
## GenPcds
#
# Gen Pcds of Dec
# <TokenSpcCName>.<TokenCName>|<Value>|<DatumType>|<Token>
#
# @param ContainerFile: The Dec file full path
#
def GenPcds(self, ContainerFile):
Logger.Debug(2, "Generate %s ..." % TAB_PCDS)
PcdObj = self.DecParser.GetPcdSectionObject()
#
# Get all Pcds
#
PcdDeclarations = []
IterList = [
(TAB_PCDS_FIXED_AT_BUILD_NULL, 'FixedPcd'),
(TAB_PCDS_PATCHABLE_IN_MODULE_NULL, 'PatchPcd'),
(TAB_PCDS_FEATURE_FLAG_NULL, 'FeaturePcd'),
(TAB_PCDS_DYNAMIC_EX_NULL, 'PcdEx'),
(TAB_PCDS_DYNAMIC_NULL, 'Pcd')]
#
# For each PCD type
#
for PcdType, Type in IterList:
#
# Go through all archs
#
# for Arch in self.SupArchList + [TAB_ARCH_COMMON]:
#
for Item in PcdObj.GetPcdsByType(PcdType.upper()):
PcdDeclaration = GenPcdDeclaration(
ContainerFile,
(Item.TokenSpaceGuidCName, Item.TokenCName,
Item.DefaultValue, Item.DatumType, Item.TokenValue,
Type, Item.GetHeadComment(), Item.GetTailComment(),
'')
)
PcdDeclaration.SetSupArchList(Item.GetArchListOfType(PcdType))
PcdDeclarations.append(PcdDeclaration)
self.SetPcdList(self.GetPcdList() + PcdDeclarations)
## GenModuleFileList
#
def GenModuleFileList(self, ContainerFile):
ModuleFileList = []
ContainerFileName = os.path.basename(ContainerFile)
ContainerFilePath = os.path.dirname(ContainerFile)
for Item in GetFiles(ContainerFilePath,
['CVS', '.svn'] + self.GetIncludePathList(), False):
ExtName = os.path.splitext(Item)[1]
if ExtName.lower() == '.inf':
ModuleFileList.append(Item)
elif ExtName.upper() == '.DEC' and self.CheckMulDec:
if Item == ContainerFileName:
continue
Logger.Error('MkPkg',
UPT_MUL_DEC_ERROR,
ST.ERR_MUL_DEC_ERROR%(ContainerFilePath,
ContainerFileName,
Item))
self.SetModuleFileList(ModuleFileList)
## Show detailed information of Package
#
# Print all members and their values of Package class
#
def ShowPackage(self):
print '\nName =', self.GetName()
print '\nBaseName =', self.GetBaseName()
print '\nVersion =', self.GetVersion()
print '\nGuid =', self.GetGuid()
print '\nStandardIncludes = %d ' \
% len(self.GetStandardIncludeFileList()),
for Item in self.GetStandardIncludeFileList():
print Item.GetFilePath(), ' ', Item.GetSupArchList()
print '\nPackageIncludes = %d \n' \
% len(self.GetPackageIncludeFileList()),
for Item in self.GetPackageIncludeFileList():
print Item.GetFilePath(), ' ', Item.GetSupArchList()
print '\nGuids =', self.GetGuidList()
for Item in self.GetGuidList():
print Item.GetCName(), Item.GetGuid(), Item.GetSupArchList()
print '\nProtocols =', self.GetProtocolList()
for Item in self.GetProtocolList():
print Item.GetCName(), Item.GetGuid(), Item.GetSupArchList()
print '\nPpis =', self.GetPpiList()
for Item in self.GetPpiList():
print Item.GetCName(), Item.GetGuid(), Item.GetSupArchList()
print '\nLibraryClasses =', self.GetLibraryClassList()
for Item in self.GetLibraryClassList():
print Item.GetLibraryClass(), Item.GetRecommendedInstance(), \
Item.GetSupArchList()
print '\nPcds =', self.GetPcdList()
for Item in self.GetPcdList():
print 'CName=', Item.GetCName(), 'TokenSpaceGuidCName=', \
Item.GetTokenSpaceGuidCName(), \
'DefaultValue=', Item.GetDefaultValue(), \
'ValidUsage=', Item.GetValidUsage(), \
'SupArchList', Item.GetSupArchList(), \
'Token=', Item.GetToken(), 'DatumType=', Item.GetDatumType()
for Item in self.GetMiscFileList():
print Item.GetName()
for FileObjectItem in Item.GetFileList():
print FileObjectItem.GetURI()
print '****************\n'
## GenPcdDeclaration
#
# @param ContainerFile: File name of the DEC file
# @param PcdInfo: Pcd information, of format (TokenGuidCName,
# TokenName, Value, DatumType, Token, Type,
# GenericComment, TailComment, Arch)
#
def GenPcdDeclaration(ContainerFile, PcdInfo):
HelpStr = ''
TailHelpStr = ''
TokenGuidCName, TokenName, Value, DatumType, Token, Type, \
GenericComment, TailComment, Arch = PcdInfo
Pcd = PcdObject()
Pcd.SetCName(TokenName)
Pcd.SetToken(Token)
Pcd.SetTokenSpaceGuidCName(TokenGuidCName)
Pcd.SetDatumType(DatumType)
Pcd.SetDefaultValue(Value)
Pcd.SetValidUsage(Type)
#
# MaxDatumSize is required field for 'VOID*' PCD
#
if DatumType == TAB_PTR_TYPE_PCD:
Pcd.SetMaxDatumSize(ITEM_UNDEFINED)
SupArchList = [Arch]
Pcd.SetSupArchList(SupArchList)
if GenericComment:
HelpStr, PcdErr = ParseDecPcdGenericComment(GenericComment,
ContainerFile)
if PcdErr:
Pcd.SetPcdErrorsList([PcdErr])
if TailComment:
SupModuleList, TailHelpStr = ParseDecPcdTailComment(TailComment,
ContainerFile)
if SupModuleList:
Pcd.SetSupModuleList(SupModuleList)
if HelpStr and (not HelpStr.endswith('\n')) and TailHelpStr:
HelpStr += '\n'
HelpStr += TailHelpStr
if HelpStr:
HelpTxtObj = TextObject()
HelpTxtObj.SetString(HelpStr)
Pcd.SetHelpTextList([HelpTxtObj])
return Pcd

View File

@@ -0,0 +1,972 @@
## @file InfPomAlignment.py
# This file contained the adapter for convert INF parser object to POM Object
#
# 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.
#
'''
InfPomAlignment
'''
##
# Import modules
#
import os.path
from Logger import StringTable as ST
import Logger.Log as Logger
from Library.String import FORMAT_INVALID
from Library.String import PARSER_ERROR
from Library.String import NormPath
from Library.String import GetSplitValueList
from Library.Misc import ConvertVersionToDecimal
from Library.Misc import GetHelpStringByRemoveHashKey
from Library.Misc import ConvertArchList
from Library.Parsing import GetPkgInfoFromDec
from Library import DataType as DT
from Library import GlobalData
from Object.POM import CommonObject
from Object.POM.ModuleObject import ModuleObject
from Object.POM.ModuleObject import ExternObject
from Object.POM.ModuleObject import HobObject
from Object.POM.ModuleObject import EventObject
from Object.POM.ModuleObject import BootModeObject
from Object.POM.ModuleObject import PackageDependencyObject
from Object.POM.ModuleObject import SourceFileObject
from Object.POM.ModuleObject import DepexObject
from Object.POM.ModuleObject import AsBuildLibraryClassObject
from Object.POM.ModuleObject import AsBuiltObject
from PomAdapter.InfPomAlignmentMisc import GenModuleHeaderUserExt
from PomAdapter.InfPomAlignmentMisc import GenBinaryData
from Parser import InfParser
## InfPomAlignment
#
# Inherit from ModuleObject
#
class InfPomAlignment(ModuleObject):
## Construct of InfPomAlignment
# Skip means that UPT don't care the syntax of INF, this may be the not
# distributed INF files during creation or the INF files checked for
# dependency rule during remove.
#
def __init__(self, FileName, WorkSpace=None, PackagePath='', Skip=False):
ModuleObject.__init__(self)
self.Parser = None
self.FileName = FileName
self.WorkSpace = WorkSpace
self.CombinePath = ''
self.LibModuleTypeList = []
self.FullPath = ''
self.ModulePath = ''
self.WorkspaceDir = " "
self.CustomMakefile = []
self.SetPackagePath(PackagePath)
#
# Call GenInfPomObjects function to fill POM object.
#
if Skip:
OrigConfig = Logger.SUPRESS_ERROR
Logger.SUPRESS_ERROR = True
self._GenInfPomObjects(Skip)
Logger.SUPRESS_ERROR = OrigConfig
else:
self._GenInfPomObjects(Skip)
##
# Generate all POM objects, the original input comes
# from INF parser's output
#
def _GenInfPomObjects(self, Skip):
#
# Call INF Parser to get information from INF file
#
self.Parser = InfParser.InfParser(self.FileName, self.WorkSpace)
self.FullPath = self.Parser.FullPath
self.GetFullPath()
self._GenModuleHeader()
#
# Call GenBinaries after Module Header for Binary INF consideration.
#
self._GenBinaries()
self._GenBuildOptions()
self._GenLibraryClasses()
self._GenPackages(Skip)
self._GenPcds()
self._GenSources()
self._GenUserExtensions()
self._GenGuidProtocolPpis(DT.TAB_GUIDS)
self._GenGuidProtocolPpis(DT.TAB_PROTOCOLS)
self._GenGuidProtocolPpis(DT.TAB_PPIS)
self._GenDepexes()
self._GenMiscFiles(self.FullPath, Skip)
## Convert [Defines] section content to InfDefObject
#
# Convert [Defines] section content to InfDefObject
#
# @param Defines The content under [Defines] section
# @param ModuleHeader An object of ModuleHeaderClass
# @param Arch The supported ARCH
#
def _GenModuleHeader(self):
Logger.Debug(2, "Generate ModuleHeader ...")
#
# Get all defines information form InfParser Object
#
RecordSet = self.Parser.InfDefSection.Defines
#
# Should only have one ArchString Item.
#
ArchString = RecordSet.keys()[0]
ArchList = GetSplitValueList(ArchString, ' ')
ArchList = ConvertArchList(ArchList)
HasCalledFlag = False
#
# Get data from Sdict()
#
ValueList = RecordSet[ArchString]
self.SetFileName(self.FileName)
self.SetFullPath(self.FullPath)
#
# The INF's filename (without the directory path or the extension)
# must be used for the value of the
# ModuleSurfaceArea.Header.Name element
#
self.SetName(os.path.splitext(os.path.basename(self.FileName))[0])
self.WorkspaceDir = " "
#
# CombinePath and ModulePath
#
PathCount = self.FullPath.upper().find(self.WorkSpace.upper()) + len(self.WorkSpace) + 1
CombinePath = self.FullPath[PathCount:]
self.SetCombinePath(CombinePath)
ModulePath = os.path.split(CombinePath)[0]
ModuleRelativePath = ModulePath
if self.GetPackagePath() != '':
ModuleRelativePath = ModulePath[ModulePath.find(self.GetPackagePath()) + len(self.GetPackagePath()) + 1:]
self.SetModulePath(ModuleRelativePath)
#
# For Define Seciton Items.
#
DefineObj = ValueList
#
# Convert UEFI/PI version to decimal number
#
if DefineObj.GetUefiSpecificationVersion() != None:
__UefiVersion = DefineObj.GetUefiSpecificationVersion().GetValue()
__UefiVersion = ConvertVersionToDecimal(__UefiVersion)
self.SetUefiSpecificationVersion(str(__UefiVersion))
if DefineObj.GetPiSpecificationVersion() != None:
__PiVersion = DefineObj.GetPiSpecificationVersion().GetValue()
__PiVersion = ConvertVersionToDecimal(__PiVersion)
self.SetPiSpecificationVersion(str(__PiVersion))
SpecList = DefineObj.GetSpecification()
NewSpecList = []
for SpecItem in SpecList:
NewSpecList.append((SpecItem[0], ConvertVersionToDecimal(SpecItem[1])))
self.SetSpecList(NewSpecList)
#
# must exist items in INF define section
# MODULE_TYPE/BASE_NAME/INF_VERSION/FILE_GUID/VERSION_STRING
#
if DefineObj.GetModuleType() == None:
Logger.Error("InfParser", FORMAT_INVALID,
ST.ERR_INF_PARSER_DEFINE_SECTION_MUST_ITEM_NOT_EXIST % ("MODULE_TYPE"), File=self.FullPath)
else:
self.SetModuleType(DefineObj.GetModuleType().GetValue())
ModuleType = DefineObj.GetModuleType().GetValue()
if ModuleType:
#
# Drivers and applications are not allowed to have a MODULE_TYPE of "BASE". Only
# libraries are permitted to a have a MODULE_TYPE of "BASE".
#
if len(DefineObj.LibraryClass) == 0 and ModuleType == 'BASE':
Logger.Error("InfParser",
FORMAT_INVALID,
ST.ERR_INF_PARSER_MODULETYPE_INVALID,
File=self.FullPath,
Line=DefineObj.ModuleType.CurrentLine.LineNo,
ExtraData=DefineObj.ModuleType.CurrentLine.LineString)
self.LibModuleTypeList.append(ModuleType)
if DefineObj.GetBaseName() == None:
Logger.Error("InfParser", FORMAT_INVALID,
ST.ERR_INF_PARSER_DEFINE_SECTION_MUST_ITEM_NOT_EXIST % ("BASE_NAME"), File=self.FullPath)
else:
self.SetBaseName(DefineObj.GetBaseName().GetValue())
if DefineObj.GetInfVersion() == None:
Logger.Error("InfParser", FORMAT_INVALID,
ST.ERR_INF_PARSER_DEFINE_SECTION_MUST_ITEM_NOT_EXIST % ("INF_VERSION"), File=self.FullPath)
else:
self.SetVersion(DefineObj.GetInfVersion().GetValue())
if DefineObj.GetFileGuid() == None:
Logger.Error("InfParser", FORMAT_INVALID,
ST.ERR_INF_PARSER_DEFINE_SECTION_MUST_ITEM_NOT_EXIST % ("FILE_GUID"), File=self.FullPath)
else:
self.SetGuid(DefineObj.GetFileGuid().GetValue())
if DefineObj.GetVersionString() == None:
#
# VERSION_STRING is missing from the [Defines] section, tools must assume that the module's version is 0.
#
self.SetVersion('0')
else:
#
# Get version of INF
#
if DefineObj.GetVersionString().GetValue() != "":
#
# EDK2 inf
#
VersionString = DefineObj.GetVersionString().GetValue()
if len(VersionString) > 0:
VersionString = ConvertVersionToDecimal(VersionString)
self.SetVersion(VersionString)
else:
#
# EDK1 inf
#
Logger.Error("Parser", PARSER_ERROR, ST.ERR_INF_PARSER_NOT_SUPPORT_EDKI_INF, ExtraData=self.FullPath,
RaiseError=Logger.IS_RAISE_ERROR)
#
# if there is Shadow, Should judge the MODULE_TYPE in
# SEC, PEI_CORE and PEIM
#
if DefineObj.GetShadow():
ModuleTypeValue = DefineObj.GetModuleType().GetValue()
if not (ModuleTypeValue == 'SEC' or ModuleTypeValue == 'PEI_CORE' or ModuleTypeValue == 'PEIM'):
Logger.Error("InfParser", FORMAT_INVALID, ST.ERR_INF_PARSER_DEFINE_SHADOW_INVALID, File=self.FullPath)
if DefineObj.GetPcdIsDriver() != None:
self.SetPcdIsDriver(DefineObj.GetPcdIsDriver().GetValue())
#
# LIBRARY_CLASS
#
self._GenModuleHeaderLibClass(DefineObj, ArchList)
#
# CUSTOM_MAKEFILE
#
self.CustomMakefile = DefineObj.GetCustomMakefile()
#
# Externs in Defines section
# Only one define section, so just call once.
#
if not HasCalledFlag:
self._GenModuleHeaderExterns(DefineObj)
HasCalledFlag = True
#
# each module has only one module header
#
self.SetSupArchList(ArchList)
#
# Get Hob/BootMode/EventList information
#
self._GenSpecialComments()
#
# put all define statement into user-extension sections
#
DefinesDictNew = GenModuleHeaderUserExt(DefineObj, ArchString)
if DefinesDictNew:
UserExtension = CommonObject.UserExtensionObject()
UserExtension.SetDefinesDict(DefinesDictNew)
UserExtension.SetIdentifier('DefineModifiers')
UserExtension.SetUserID('EDK2')
self.SetUserExtensionList(self.GetUserExtensionList() + [UserExtension])
#
# Get all meta-file header information
# the record is list of items formated:
# [LineValue, Arch, StartLine, ID, Third]
#
InfHeaderObj = self.Parser.InfHeader
#
# Put header information into POM object
#
self.SetAbstract(InfHeaderObj.GetAbstract())
self.SetDescription(InfHeaderObj.GetDescription())
self.SetCopyright(InfHeaderObj.GetCopyright())
self.SetLicense(InfHeaderObj.GetLicense())
## GenModuleHeaderLibClass
#
#
def _GenModuleHeaderLibClass(self, DefineObj, ArchList):
LibraryList = DefineObj.GetLibraryClass()
for LibraryItem in LibraryList:
Lib = CommonObject.LibraryClassObject()
Lib.SetLibraryClass(LibraryItem.GetLibraryName())
Lib.SetUsage(DT.USAGE_ITEM_PRODUCES)
SupModuleList = LibraryItem.GetTypes()
self.LibModuleTypeList += SupModuleList
Lib.SetSupModuleList(SupModuleList)
Lib.SetSupArchList(ArchList)
self.SetLibraryClassList(self.GetLibraryClassList() + [Lib])
self.SetIsLibrary(True)
self.SetIsLibraryModList(self.GetIsLibraryModList() + SupModuleList)
## GenModuleHeaderExterns
#
#
def _GenModuleHeaderExterns(self, DefineObj):
EntryPointList = DefineObj.GetEntryPoint()
for EntryPoint in EntryPointList:
Image = ExternObject()
Image.SetEntryPoint(EntryPoint.GetCName())
#
# Future enhancement
#
self.SetExternList(self.GetExternList() + [Image])
#
# UNLOAD_IMAGE
#
UnloadImageList = DefineObj.GetUnloadImages()
for UnloadImage in UnloadImageList:
Image = ExternObject()
#
# Future enhancement
#
Image.SetUnloadImage(UnloadImage.GetCName())
self.SetExternList(self.GetExternList() + [Image])
#
# CONSTRUCTOR
#
ConstructorList = DefineObj.GetConstructor()
for ConstructorItem in ConstructorList:
Image = ExternObject()
#
# Future enhancement
#
Image.SetConstructor(ConstructorItem.GetCName())
self.SetExternList(self.GetExternList() + [Image])
#
# DESTRUCTOR
#
DestructorList = DefineObj.GetDestructor()
for DestructorItem in DestructorList:
Image = ExternObject()
#
# Future enhancement
#
Image.SetDestructor(DestructorItem.GetCName())
self.SetExternList(self.GetExternList() + [Image])
## GenModuleHeaderExterns
# BootMode/HOB/Event
#
def _GenSpecialComments(self):
SpecialCommentsList = self.Parser.InfSpecialCommentSection.GetSpecialComments()
for Key in SpecialCommentsList:
if Key == DT.TYPE_HOB_SECTION:
HobList = []
for Item in SpecialCommentsList[Key]:
Hob = HobObject()
Hob.SetHobType(Item.GetHobType())
Hob.SetUsage(Item.GetUsage())
Hob.SetSupArchList(Item.GetSupArchList())
if Item.GetHelpString():
HelpTextObj = CommonObject.TextObject()
HelpTextObj.SetString(Item.GetHelpString())
Hob.SetHelpTextList([HelpTextObj])
HobList.append(Hob)
self.SetHobList(HobList)
elif Key == DT.TYPE_EVENT_SECTION:
EventList = []
for Item in SpecialCommentsList[Key]:
Event = EventObject()
Event.SetEventType(Item.GetEventType())
Event.SetUsage(Item.GetUsage())
if Item.GetHelpString():
HelpTextObj = CommonObject.TextObject()
HelpTextObj.SetString(Item.GetHelpString())
Event.SetHelpTextList([HelpTextObj])
EventList.append(Event)
self.SetEventList(EventList)
elif Key == DT.TYPE_BOOTMODE_SECTION:
BootModeList = []
for Item in SpecialCommentsList[Key]:
BootMode = BootModeObject()
BootMode.SetSupportedBootModes(Item.GetSupportedBootModes())
BootMode.SetUsage(Item.GetUsage())
if Item.GetHelpString():
HelpTextObj = CommonObject.TextObject()
HelpTextObj.SetString(Item.GetHelpString())
BootMode.SetHelpTextList([HelpTextObj])
BootModeList.append(BootMode)
self.SetBootModeList(BootModeList)
## GenBuildOptions
#
# Gen BuildOptions of Inf
# [<Family>:]<ToolFlag>=Flag
#
#
def _GenBuildOptions(self):
Logger.Debug(2, "Generate %s ..." % DT.TAB_BUILD_OPTIONS)
#
# Get all BuildOptions
#
BuildOptionsList = self.Parser.InfBuildOptionSection.GetBuildOptions()
if not GlobalData.gIS_BINARY_INF:
BuildOptionDict = {}
for BuildOptionObj in BuildOptionsList:
ArchList = BuildOptionObj.GetSupArchList()
ArchList = ConvertArchList(ArchList)
BuildOptionsContent = BuildOptionObj.GetContent()
ArchString = ' '.join(ArchList)
if not BuildOptionsContent:
continue
BuildOptionDict[ArchString] = BuildOptionsContent
if not BuildOptionDict:
return
UserExtension = CommonObject.UserExtensionObject()
UserExtension.SetBuildOptionDict(BuildOptionDict)
UserExtension.SetIdentifier('BuildOptionModifiers')
UserExtension.SetUserID('EDK2')
self.SetUserExtensionList(self.GetUserExtensionList() + [UserExtension])
else:
#
# Not process this information, will be processed in GenBinaries()
#
pass
## GenLibraryClasses
#
# Get LibraryClass of Inf
# <LibraryClassKeyWord>|<LibraryInstance>
#
# @param ContainerFile: The Inf file full path
#
def _GenLibraryClasses(self):
Logger.Debug(2, "Generate %s ..." % DT.TAB_LIBRARY_CLASSES)
if not GlobalData.gIS_BINARY_INF:
#
# Get all LibraryClasses
#
LibClassObj = self.Parser.InfLibraryClassSection.LibraryClasses
Keys = LibClassObj.keys()
for Key in Keys:
LibraryClassData = LibClassObj[Key]
for Item in LibraryClassData:
LibraryClass = CommonObject.LibraryClassObject()
LibraryClass.SetUsage(DT.USAGE_ITEM_CONSUMES)
LibraryClass.SetLibraryClass(Item.GetLibName())
LibraryClass.SetRecommendedInstance(None)
LibraryClass.SetFeatureFlag(Item.GetFeatureFlagExp())
LibraryClass.SetSupArchList(ConvertArchList(Item.GetSupArchList()))
LibraryClass.SetSupModuleList(Item.GetSupModuleList())
HelpStringObj = Item.GetHelpString()
if HelpStringObj != None:
CommentString = GetHelpStringByRemoveHashKey(HelpStringObj.HeaderComments +
HelpStringObj.TailComments)
HelpTextHeaderObj = CommonObject.TextObject()
HelpTextHeaderObj.SetString(CommentString)
LibraryClass.SetHelpTextList([HelpTextHeaderObj])
self.SetLibraryClassList(self.GetLibraryClassList() + [LibraryClass])
## GenPackages
#
# Gen Packages of Inf
#
#
# @param ContainerFile: The Inf file full path
#
def _GenPackages(self, Skip):
Logger.Debug(2, "Generate %s ..." % DT.TAB_PACKAGES)
#
# Get all Packages
#
PackageObj = self.Parser.InfPackageSection.Packages
#
# Go through each arch
#
for PackageItemObj in PackageObj:
#
# Need package information for dependency check usage
#
PackageDependency = PackageDependencyObject()
PackageDependency.SetPackageFilePath(NormPath(PackageItemObj.GetPackageName()))
PackageDependency.SetSupArchList(ConvertArchList(PackageItemObj.GetSupArchList()))
PackageDependency.SetFeatureFlag(PackageItemObj.GetFeatureFlagExp())
PkgInfo = GetPkgInfoFromDec(os.path.normpath(os.path.join(self.WorkSpace,
NormPath(PackageItemObj.GetPackageName()))))
if PkgInfo[1] and PkgInfo[2]:
PackageDependency.SetGuid(PkgInfo[1])
PackageDependency.SetVersion(PkgInfo[2])
elif Skip:
continue
else:
Logger.Error("\nUPT", PARSER_ERROR,
ST.ERR_INF_GET_PKG_DEPENDENCY_FAIL % PackageItemObj.GetPackageName(), File=self.FullPath)
PackageDependencyList = self.GetPackageDependencyList()
PackageDependencyList.append(PackageDependency)
self.SetPackageDependencyList(PackageDependencyList)
## GenPcds
#
# Gen Pcds of Inf
# <TokenSpaceGuidCName>.<PcdCName>[|<Value> [|<FFE>]]
#
# @param ContainerFile: The Inf file full path
#
def _GenPcds(self):
if not GlobalData.gIS_BINARY_INF:
Logger.Debug(2, "Generate %s ..." % DT.TAB_PCDS)
#
# Get all Pcds
#
PcdObj = self.Parser.InfPcdSection.Pcds
KeysList = PcdObj.keys()
#
# Go through each arch
#
for (PcdType, PcdKey) in KeysList:
PcdData = PcdObj[PcdType, PcdKey]
for PcdItemObj in PcdData:
CommentList = PcdItemObj.GetHelpStringList()
if CommentList:
for CommentItem in CommentList:
Pcd = CommonObject.PcdObject()
Pcd.SetCName(PcdItemObj.GetCName())
Pcd.SetTokenSpaceGuidCName(PcdItemObj.GetTokenSpaceGuidCName())
Pcd.SetDefaultValue(PcdItemObj.GetDefaultValue())
Pcd.SetItemType(PcdType)
Pcd.SetValidUsage(CommentItem.GetUsageItem())
Pcd.SetFeatureFlag(PcdItemObj.GetFeatureFlagExp())
Pcd.SetSupArchList(ConvertArchList(PcdItemObj.GetSupportArchList()))
HelpTextObj = CommonObject.TextObject()
HelpTextObj.SetString(CommentItem.GetHelpStringItem())
Pcd.SetHelpTextList([HelpTextObj])
PcdList = self.GetPcdList()
PcdList.append(Pcd)
self.SetPcdList(PcdList)
## GenSources
#
# Gen Sources of Inf
# <Filename>[|<Family>[|<TagName>[|<ToolCode>[|<PcdFeatureFlag>]]]]
#
# @param ContainerFile: The Inf file full path
#
def _GenSources(self):
Logger.Debug(2, "Generate %s ..." % DT.TAB_SOURCES)
#
# Get all SourceFiles
#
SourceObj = self.Parser.InfSourcesSection.Sources
DataList = SourceObj.keys()
#
# Go through each arch
#
SourceList = []
for Key in DataList:
SourceData = SourceObj[Key]
for Item in SourceData:
SourceFile = Item.GetSourceFileName()
Family = Item.GetFamily()
FeatureFlag = Item.GetFeatureFlagExp()
SupArchList = ConvertArchList(Item.GetSupArchList())
SupArchList.sort()
Source = SourceFileObject()
Source.SetSourceFile(SourceFile)
Source.SetFamily(Family)
Source.SetFeatureFlag(FeatureFlag)
Source.SetSupArchList(SupArchList)
SourceList.append(Source)
self.SetSourceFileList(self.GetSourceFileList() + SourceList)
## GenUserExtensions
#
# Gen UserExtensions of Inf
#
def _GenUserExtensions(self):
#
# UserExtensions
#
UserExtensionObj = self.Parser.InfUserExtensionSection.UserExtension
Keys = UserExtensionObj.keys()
for Key in Keys:
UserExtensionData = UserExtensionObj[Key]
for UserExtensionDataObj in UserExtensionData:
UserExtension = CommonObject.UserExtensionObject()
UserId = UserExtensionDataObj.GetUserId()
if UserId.startswith('"') and UserId.endswith('"'):
UserId = UserId[1:-1]
UserExtension.SetUserID(UserId)
Identifier = UserExtensionDataObj.GetIdString()
if Identifier.startswith('"') and Identifier.endswith('"'):
Identifier = Identifier[1:-1]
UserExtension.SetIdentifier(Identifier)
UserExtension.SetStatement(UserExtensionDataObj.GetContent())
UserExtension.SetSupArchList(ConvertArchList(UserExtensionDataObj.GetSupArchList()))
self.SetUserExtensionList(self.GetUserExtensionList() + [UserExtension])
def _GenDepexesList(self, SmmDepexList, DxeDepexList, PeiDepexList):
if SmmDepexList:
self.SetSmmDepex(SmmDepexList)
if DxeDepexList:
self.SetDxeDepex(DxeDepexList)
if PeiDepexList:
self.SetPeiDepex(PeiDepexList)
## GenDepexes
#
# Gen Depex of Inf
#
# @param ContainerFile: The Inf file full path
#
def _GenDepexes(self):
Logger.Debug(2, "Generate %s ..." % DT.TAB_DEPEX)
PEI_LIST = [DT.SUP_MODULE_PEIM]
SMM_LIST = [DT.SUP_MODULE_DXE_SMM_DRIVER]
DXE_LIST = [DT.SUP_MODULE_DXE_DRIVER, DT.SUP_MODULE_DXE_SAL_DRIVER,
DT.SUP_MODULE_DXE_RUNTIME_DRIVER]
IsLibraryClass = self.GetIsLibrary()
#
# Get all Depexes
#
DepexData = self.Parser.InfDepexSection.GetDepex()
SmmDepexList = []
DxeDepexList = []
PeiDepexList = []
for Depex in DepexData:
ModuleType = Depex.GetModuleType()
ModuleTypeList = []
if IsLibraryClass:
if not self.GetIsLibraryModList():
Logger.Error("\nMkPkg", PARSER_ERROR, ST.ERR_INF_PARSER_DEPEX_SECTION_INVALID_FOR_LIBRARY_CLASS,
self.GetFullPath(), RaiseError=True)
if ModuleType and ModuleType not in self.GetIsLibraryModList():
Logger.Error("\nMkPkg", PARSER_ERROR, ST.ERR_INF_PARSER_DEPEX_SECTION_NOT_DETERMINED,
self.GetFullPath(), RaiseError=True)
if ModuleType:
ModuleTypeList = [ModuleType]
else:
for ModuleTypeInList in self.GetIsLibraryModList():
if ModuleTypeInList in DT.VALID_DEPEX_MODULE_TYPE_LIST:
ModuleTypeList.append(ModuleTypeInList)
if not ModuleTypeList:
Logger.Error("\nMkPkg", PARSER_ERROR, ST.ERR_INF_PARSER_DEPEX_SECTION_NOT_DETERMINED,
self.GetFullPath(), RaiseError=True)
else:
if not ModuleType:
ModuleType = self.ModuleType
if ModuleType not in DT.VALID_DEPEX_MODULE_TYPE_LIST:
Logger.Error("\nMkPkg", PARSER_ERROR,
ST.ERR_INF_PARSER_DEPEX_SECTION_MODULE_TYPE_ERROR % (ModuleType),
self.GetFullPath(), RaiseError=True)
if ModuleType != self.ModuleType:
Logger.Error("\nMkPkg", PARSER_ERROR, ST.ERR_INF_PARSER_DEPEX_SECTION_NOT_DETERMINED,
self.GetFullPath(), RaiseError=True)
ModuleTypeList = [ModuleType]
for ModuleType in ModuleTypeList:
DepexIns = DepexObject()
DepexIns.SetDepex(Depex.GetDepexContent())
if IsLibraryClass:
DepexIns.SetModuleType(ModuleType)
else:
if Depex.GetModuleType():
DepexIns.SetModuleType(Depex.GetModuleType())
DepexIns.SetSupArchList(ConvertArchList([Depex.GetSupArch()]))
DepexIns.SetFeatureFlag(Depex.GetFeatureFlagExp())
if Depex.HelpString:
HelpIns = CommonObject.TextObject()
HelpIns.SetString(GetHelpStringByRemoveHashKey(Depex.HelpString))
DepexIns.SetHelpText(HelpIns)
if ModuleType in SMM_LIST:
SmmDepexList.append(DepexIns)
if ModuleType in DXE_LIST:
DxeDepexList.append(DepexIns)
if ModuleType in PEI_LIST:
PeiDepexList.append(DepexIns)
if ModuleType == DT.SUP_MODULE_UEFI_DRIVER:
if IsLibraryClass:
DxeDepexList.append(DepexIns)
else:
Logger.Error("\nMkPkg", PARSER_ERROR, ST.ERR_INF_PARSER_DEPEX_SECTION_INVALID_FOR_DRIVER,
self.GetFullPath(), RaiseError=True)
#End of for ModuleType in ModuleTypeList
self._GenDepexesList(SmmDepexList, DxeDepexList, PeiDepexList)
#End of for Depex in DepexData
## GenBinaries
#
# Gen Binary of Inf, must be called after Pcd/Library is generated
# <FileType>|<Filename>|<Target>[|<TokenSpaceGuidCName>.<PcdCName>]
#
# @param ContainerFile: The Inf file full path
#
def _GenBinaries(self):
Logger.Debug(2, "Generate %s ..." % DT.TAB_BINARIES)
BinariesDict = {}
#
# Get all Binary data
#
BinaryObj = self.Parser.InfBinariesSection.GetBinary()
BinaryData = BinaryObj.keys()
BinaryData.sort()
#
# If the INF file does not contain a [Sources] section, and the INF file does contain a [Binaries] section,
# then the ModuleSurfaceArea.BinaryModule attribute must be set to true. Otherwise, do not use the attribute
#
if BinaryObj and not self.Parser.InfSourcesSection.GetSources():
self.BinaryModule = True
else:
self.BinaryModule = False
BinaryFileObjectList = []
AsBuildLibraryClassList = []
AsBuildBuildOptionList = []
AsBuildIns = AsBuiltObject()
#
# Library AsBuild Info
#
for LibItem in self.Parser.InfLibraryClassSection.GetLibraryClasses():
AsBuildLibIns = AsBuildLibraryClassObject()
AsBuildLibIns.SetLibGuid(LibItem.GetFileGuid())
AsBuildLibIns.SetLibVersion(LibItem.GetVersion())
AsBuildLibraryClassList.append(AsBuildLibIns)
AsBuildIns.SetLibraryInstancesList(AsBuildLibraryClassList)
#
# BuildOption AsBuild Info
#
for BuildOptionItem in self.Parser.InfBuildOptionSection.GetBuildOptions():
AsBuildBuildOptionList += BuildOptionItem.GetAsBuildList()
AsBuildIns.SetBuildFlagsList(AsBuildBuildOptionList)
#
# PatchPcd and PcdEx
#
AsBuildIns = self._GenAsBuiltPcds(self.Parser.InfPcdSection.GetPcds(), AsBuildIns)
BinariesDict, AsBuildIns, BinaryFileObjectList = GenBinaryData(BinaryData, BinaryObj,
BinariesDict,
AsBuildIns,
BinaryFileObjectList,
self.GetSupArchList(),
self.BinaryModule)
BinariesDict2 = {}
for Key in BinariesDict:
ValueList = BinariesDict[Key]
if len(ValueList) > 1:
BinariesDict2[Key] = ValueList
else:
#
# if there is no TagName, ToolCode, HelpStr,
# then do not need to put them into userextension
#
(Target, Family, TagName, HelpStr) = ValueList[0]
if not (Target or Family or TagName or HelpStr):
continue
else:
BinariesDict2[Key] = ValueList
self.SetBinaryFileList(self.GetBinaryFileList() + BinaryFileObjectList)
if BinariesDict2:
UserExtension = CommonObject.UserExtensionObject()
UserExtension.SetBinariesDict(BinariesDict2)
UserExtension.SetIdentifier('BinaryFileModifiers')
UserExtension.SetUserID('EDK2')
self.SetUserExtensionList(self.GetUserExtensionList() + [UserExtension])
## GenAsBuiltPcds
#
#
def _GenAsBuiltPcds(self, PcdList, AsBuildIns):
AsBuildPatchPcdList = []
AsBuildPcdExList = []
#
# Pcd AsBuild Info
#
for PcdItem in PcdList:
if PcdItem[0].upper() == DT.TAB_INF_PATCH_PCD.upper():
PcdItemObj = PcdItem[1]
Pcd = CommonObject.PcdObject()
Pcd.SetCName(PcdItemObj.GetCName())
Pcd.SetTokenSpaceGuidCName(PcdItemObj.GetTokenSpaceGuidCName())
if PcdItemObj.GetTokenSpaceGuidValue() == '' and self.BinaryModule:
Logger.Error("\nMkPkg",
PARSER_ERROR,
ST.ERR_ASBUILD_PCD_TOKENSPACE_GUID_VALUE_MISS % \
(PcdItemObj.GetTokenSpaceGuidCName()),
self.GetFullPath(), RaiseError=True)
else:
Pcd.SetTokenSpaceGuidValue(PcdItemObj.GetTokenSpaceGuidValue())
if (PcdItemObj.GetToken() == '' or PcdItemObj.GetDatumType() == '') and self.BinaryModule:
Logger.Error("\nMkPkg",
PARSER_ERROR,
ST.ERR_ASBUILD_PCD_DECLARITION_MISS % \
(PcdItemObj.GetTokenSpaceGuidCName() + '.' + PcdItemObj.GetCName()),
self.GetFullPath(), RaiseError=True)
Pcd.SetToken(PcdItemObj.GetToken())
Pcd.SetDatumType(PcdItemObj.GetDatumType())
Pcd.SetMaxDatumSize(PcdItemObj.GetMaxDatumSize())
Pcd.SetDefaultValue(PcdItemObj.GetDefaultValue())
Pcd.SetOffset(PcdItemObj.GetOffset())
Pcd.SetItemType(PcdItem[0])
Pcd.SetFeatureFlag(PcdItemObj.GetFeatureFlagExp())
Pcd.SetSupArchList(ConvertArchList(PcdItemObj.GetSupportArchList()))
HelpTextObj = CommonObject.TextObject()
HelpTextObj.SetString(PcdItemObj.GetHelpStringList())
Pcd.SetHelpTextList([HelpTextObj])
AsBuildPatchPcdList.append(Pcd)
else:
PcdItemObj = PcdItem[1]
Pcd = CommonObject.PcdObject()
Pcd.SetTokenSpaceGuidValue(PcdItemObj.GetTokenSpaceGuidValue())
Pcd.SetToken(PcdItemObj.GetToken())
Pcd.SetDatumType(PcdItemObj.GetDatumType())
Pcd.SetMaxDatumSize(PcdItemObj.GetMaxDatumSize())
Pcd.SetDefaultValue(PcdItemObj.GetDefaultValue())
Pcd.SetItemType(PcdItem[0])
Pcd.SetFeatureFlag(PcdItemObj.GetFeatureFlagExp())
Pcd.SetSupArchList(ConvertArchList(PcdItemObj.GetSupportArchList()))
HelpTextObj = CommonObject.TextObject()
HelpTextObj.SetString(PcdItemObj.GetHelpStringList())
Pcd.SetHelpTextList([HelpTextObj])
AsBuildPcdExList.append(Pcd)
AsBuildIns.SetPatchPcdList(AsBuildPatchPcdList)
AsBuildIns.SetPcdExList(AsBuildPcdExList)
return AsBuildIns
## GenGuidProtocolPpis
#
# Gen Guids/Protocol/Ppis of INF
# <CName>=<GuidValue>
#
def _GenGuidProtocolPpis(self, Type):
Logger.Debug(2, "Generate %s ..." % Type)
#
# Get all Guid/Protocol/Ppis data
#
GuidObj = self.Parser.InfGuidSection.GetGuid()
ProtocolObj = self.Parser.InfProtocolSection.GetProtocol()
PpisObj = self.Parser.InfPpiSection.GetPpi()
GuidProtocolPpiList = []
if Type == DT.TAB_GUIDS:
GuidData = GuidObj.keys()
for Item in GuidData:
CommentList = Item.GetCommentList()
#
# Depend on CommentList content
# generate muti-guid-obj
#
if CommentList:
for GuidComentItem in CommentList:
ListObject = CommonObject.GuidObject()
ListObject.SetGuidTypeList([GuidComentItem.GetGuidTypeItem()])
ListObject.SetVariableName(GuidComentItem.GetVariableNameItem())
ListObject.SetUsage(GuidComentItem.GetUsageItem())
ListObject.SetName(Item.GetName())
ListObject.SetCName(Item.GetName())
ListObject.SetSupArchList(ConvertArchList(Item.GetSupArchList()))
ListObject.SetFeatureFlag(Item.GetFeatureFlagExp())
HelpString = GuidComentItem.GetHelpStringItem()
HelpTxtTailObj = CommonObject.TextObject()
HelpTxtTailObj.SetString(HelpString)
ListObject.SetHelpTextList([HelpTxtTailObj])
GuidProtocolPpiList.append(ListObject)
elif Type == DT.TAB_PROTOCOLS:
ProtocolData = ProtocolObj.keys()
for Item in ProtocolData:
CommentList = Item.GetCommentList()
for CommentItem in CommentList:
ListObject = CommonObject.ProtocolObject()
ListObject.SetCName(Item.GetName())
ListObject.SetSupArchList(ConvertArchList(Item.GetSupArchList()))
ListObject.SetFeatureFlag(Item.GetFeatureFlagExp())
ListObject.SetNotify(CommentItem.GetNotify())
ListObject.SetUsage(CommentItem.GetUsageItem())
HelpTxtObj = CommonObject.TextObject()
HelpString = CommentItem.GetHelpStringItem()
HelpTxtObj.SetString(HelpString)
ListObject.SetHelpTextList([HelpTxtObj])
GuidProtocolPpiList.append(ListObject)
elif Type == DT.TAB_PPIS:
PpiData = PpisObj.keys()
for Item in PpiData:
CommentList = Item.GetCommentList()
for CommentItem in CommentList:
ListObject = CommonObject.PpiObject()
ListObject.SetCName(Item.GetName())
ListObject.SetSupArchList(ConvertArchList(Item.GetSupArchList()))
ListObject.SetFeatureFlag(Item.GetFeatureFlagExp())
ListObject.SetNotify(CommentItem.GetNotify())
ListObject.SetUsage(CommentItem.GetUsage())
HelpTextObj = CommonObject.TextObject()
HelpString = CommentItem.GetHelpStringItem()
HelpTextObj.SetString(HelpString)
ListObject.SetHelpTextList([HelpTextObj])
GuidProtocolPpiList.append(ListObject)
if Type == DT.TAB_GUIDS:
self.SetGuidList(self.GetGuidList() + GuidProtocolPpiList)
elif Type == DT.TAB_PROTOCOLS:
self.SetProtocolList(self.GetProtocolList() + GuidProtocolPpiList)
elif Type == DT.TAB_PPIS:
self.SetPpiList(self.GetPpiList() + GuidProtocolPpiList)
## GenMiscFiles
#
# Gen MiscellaneousFiles of Inf
#
# @param ContainerFile: The Inf file full path
#
def _GenMiscFiles(self, ContainerFile, Skip):
pass

View File

@@ -0,0 +1,221 @@
## @file InfPomAlignmentMisc.py
# This file contained the routines for InfPomAlignment
#
# 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.
#
'''
InfPomAlignmentMisc
'''
##
# Import modules
#
import Logger.Log as Logger
from Library import DataType as DT
from Library.Misc import ConvertArchList
from Object.POM.ModuleObject import BinaryFileObject
from Object.POM import CommonObject
## GenModuleHeaderUserExt
#
#
def GenModuleHeaderUserExt(DefineObj, ArchString):
DefinesDictNew = {}
EdkReleaseVersion = DefineObj.GetEdkReleaseVersion()
Shadow = DefineObj.GetShadow()
DpxSource = DefineObj.GetDpxSource()
PciVendorId = DefineObj.GetPciVendorId()
PciDeviceId = DefineObj.GetPciDeviceId()
PciClassCode = DefineObj.GetPciClassCode()
PciRevision = DefineObj.GetPciRevision()
PciCompress = DefineObj.GetPciCompress()
CustomMakefile = DefineObj.GetCustomMakefile()
UefiHiiResourceSection = DefineObj.GetUefiHiiResourceSection()
if EdkReleaseVersion != None:
Name = DT.TAB_INF_DEFINES_EDK_RELEASE_VERSION
Value = EdkReleaseVersion.GetValue()
Statement = _GenInfDefineStateMent(EdkReleaseVersion.Comments.GetHeaderComments(),
Name,
Value,
EdkReleaseVersion.Comments.GetTailComments())
DefinesDictNew[Statement] = ArchString
if Shadow != None:
Name = DT.TAB_INF_DEFINES_SHADOW
Value = Shadow.GetValue()
Statement = _GenInfDefineStateMent(Shadow.Comments.GetHeaderComments(),
Name,
Value,
Shadow.Comments.GetTailComments())
DefinesDictNew[Statement] = ArchString
if DpxSource != None:
Name = DT.TAB_INF_DEFINES_DPX_SOURCE
for DpxSourceItem in DpxSource:
Value = DpxSourceItem[0]
Statement = _GenInfDefineStateMent(DpxSourceItem[1].GetHeaderComments(),
Name,
Value,
DpxSourceItem[1].GetTailComments())
DefinesDictNew[Statement] = ArchString
if PciVendorId != None:
Name = DT.TAB_INF_DEFINES_PCI_VENDOR_ID
Value = PciVendorId.GetValue()
Statement = _GenInfDefineStateMent(PciVendorId.Comments.GetHeaderComments(),
Name,
Value,
PciVendorId.Comments.GetTailComments())
DefinesDictNew[Statement] = ArchString
if PciDeviceId != None:
Name = DT.TAB_INF_DEFINES_PCI_DEVICE_ID
Value = PciDeviceId.GetValue()
Statement = _GenInfDefineStateMent(PciDeviceId.Comments.GetHeaderComments(),
Name,
Value,
PciDeviceId.Comments.GetTailComments())
DefinesDictNew[Statement] = ArchString
if PciClassCode != None:
Name = DT.TAB_INF_DEFINES_PCI_CLASS_CODE
Value = PciClassCode.GetValue()
Statement = _GenInfDefineStateMent(PciClassCode.Comments.GetHeaderComments(),
Name,
Value,
PciClassCode.Comments.GetTailComments())
DefinesDictNew[Statement] = ArchString
if PciRevision != None:
Name = DT.TAB_INF_DEFINES_PCI_REVISION
Value = PciRevision.GetValue()
Statement = _GenInfDefineStateMent(PciRevision.Comments.GetHeaderComments(),
Name,
Value,
PciRevision.Comments.GetTailComments())
DefinesDictNew[Statement] = ArchString
if PciCompress != None:
Name = DT.TAB_INF_DEFINES_PCI_COMPRESS
Value = PciCompress.GetValue()
Statement = _GenInfDefineStateMent(PciCompress.Comments.GetHeaderComments(),
Name,
Value,
PciCompress.Comments.GetTailComments())
DefinesDictNew[Statement] = ArchString
if len(CustomMakefile) >= 1:
for CustomMakefileItem in CustomMakefile:
Name = DT.TAB_INF_DEFINES_CUSTOM_MAKEFILE
#
# Not with Feature Flag Expression
#
if len(CustomMakefileItem) == 3:
if CustomMakefileItem[0] != '':
Value = CustomMakefileItem[0] + ' | ' + CustomMakefileItem[1]
else:
Value = CustomMakefileItem[1]
Comments = CustomMakefileItem[2]
Statement = _GenInfDefineStateMent(Comments.GetHeaderComments(),
Name,
Value,
Comments.GetTailComments())
DefinesDictNew[Statement] = ArchString
if UefiHiiResourceSection != None:
Name = DT.TAB_INF_DEFINES_UEFI_HII_RESOURCE_SECTION
Value = UefiHiiResourceSection.GetValue()
HeaderComment = UefiHiiResourceSection.Comments.GetHeaderComments()
TailComment = UefiHiiResourceSection.Comments.GetTailComments()
Statement = _GenInfDefineStateMent(HeaderComment,
Name,
Value,
TailComment)
DefinesDictNew[Statement] = ""
return DefinesDictNew
## Generate the define statement that will be put into userextension
# Not support comments.
#
# @param HeaderComment: the original header comment (# not remvoed)
# @param Name: the definition keyword, should not be empty or none
# @param Value: the definition keyword value
# @param TailComment: the original Tail comment (# not remvoed)
#
# @return: the regenerated define statement
#
def _GenInfDefineStateMent(HeaderComment, Name, Value, TailComment):
Logger.Debug(5, HeaderComment + TailComment)
Statement = '%s = %s' % (Name, Value)
return Statement
## GenBinaryData
#
#
def GenBinaryData(BinaryData, BinaryObj, BinariesDict, AsBuildIns, BinaryFileObjectList, SupArchList, BinaryModule):
if BinaryModule:
pass
OriSupArchList = SupArchList
for Item in BinaryData:
ItemObj = BinaryObj[Item][0][0]
if ItemObj.GetType() not in DT.BINARY_FILE_TYPE_UI_LIST + DT.BINARY_FILE_TYPE_VER_LIST:
TagName = ItemObj.GetTagName()
Family = ItemObj.GetFamily()
else:
TagName = ''
Family = ''
FFE = ItemObj.GetFeatureFlagExp()
#
# If have architecturie specified, then use the specified architecturie;
# If the section tag does not have an architecture modifier or the modifier is "common" (case in-sensitive),
# and the VALID_ARCHITECTURES comment exists, the list from the VALID_ARCHITECTURES comment
# can be used for the attribute.
# If both not have VALID_ARCHITECTURE comment and no architecturie specified, then keep it empty.
#
SupArchList = ConvertArchList(ItemObj.GetSupArchList())
SupArchList.sort()
if len(SupArchList) == 1 and SupArchList[0] == 'COMMON':
if not (len(OriSupArchList) == 1 or OriSupArchList[0] == 'COMMON'):
SupArchList = OriSupArchList
else:
SupArchList = ['COMMON']
FileNameObj = CommonObject.FileNameObject()
FileNameObj.SetFileType(ItemObj.GetType())
FileNameObj.SetFilename(ItemObj.GetFileName())
FileNameObj.SetFeatureFlag(FFE)
FileNameObj.SetSupArchList(SupArchList)
FileNameList = [FileNameObj]
BinaryFile = BinaryFileObject()
BinaryFile.SetFileNameList(FileNameList)
BinaryFile.SetAsBuiltList(AsBuildIns)
BinaryFileObjectList.append(BinaryFile)
SupArchStr = ' '.join(SupArchList)
Key = (ItemObj.GetFileName(), ItemObj.GetType(), FFE, SupArchStr)
ValueItem = (ItemObj.GetTarget(), Family, TagName, '')
if Key in BinariesDict:
ValueList = BinariesDict[Key]
ValueList.append(ValueItem)
BinariesDict[Key] = ValueList
else:
BinariesDict[Key] = [ValueItem]
return BinariesDict, AsBuildIns, BinaryFileObjectList

View File

@@ -0,0 +1,20 @@
## @file
# Python 'Parser' 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.
#
'''
PomAdapter
'''