2009-07-17 11:10:31 +02:00
#!/usr/bin/env python
#
#
2010-03-01 00:39:39 +01:00
# Copyright (c) 2007 - 2010, Intel Corporation
2009-07-17 11:10:31 +02:00
# All rights reserved. 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.
""" This program converts EDK II MSA files into EDK II Extended INF format files """
import os , re , sys , fnmatch , xml . dom . minidom
from optparse import OptionParser
from AutoGenExterns import *
from Common . XmlRoutines import * # XmlParseFile, XmlElement, XmlAttribute, XmlList, XmlElementData, XmlNode
from Common . EdkIIWorkspace import *
versionNumber = " 0.9 "
__version__ = " % prog Version " + versionNumber
2010-03-01 00:39:39 +01:00
__copyright__ = " Copyright (c) 2007 - 2010, Intel Corporation All rights reserved. "
2009-07-17 11:10:31 +02:00
commonHeaderFilename = " CommonHeader.h "
entryPointFilename = " EntryPoint.c "
AutoGenLibraryMapping = {
" HiiLib " : " HiiLibFramework " ,
" EdkIfrSupportLib " : " IfrSupportLibFramework " ,
" EdkScsiLib " : " ScsiLib " ,
" EdkUsbLib " : " UsbLib " ,
" EdkFvbServiceLib " : " FvbServiceLib " ,
" EdkGraphicsLib " : " GraphicsLib "
}
def myOptionParser ( ) :
""" Argument Parser """
usage = " % prog [options] -f input_filename "
parser = OptionParser ( usage = usage , description = __copyright__ , version = " % prog " + str ( versionNumber ) )
parser . add_option ( " -f " , " --file " , dest = " filename " , help = " Name of MSA file to convert " )
parser . add_option ( " -o " , " --output " , dest = " outfile " , help = " Specific Name of the INF file to create, otherwise it is the MSA filename with the extension repalced. " )
parser . add_option ( " -a " , " --auto " , action = " store_true " , dest = " autowrite " , default = False , help = " Automatically create output files and write the INF file " )
parser . add_option ( " -i " , " --interactive " , action = " store_true " , dest = " interactive " , default = False , help = " Set Interactive mode, user must approve each change. " )
parser . add_option ( " -q " , " --quiet " , action = " store_const " , const = 0 , dest = " verbose " , help = " Do not print any messages, just return either 0 for succes or 1 for failure " )
parser . add_option ( " -v " , " --verbose " , action = " count " , dest = " verbose " , help = " Do not print any messages, just return either 0 for succes or 1 for failure " )
parser . add_option ( " -d " , " --debug " , action = " store_true " , dest = " debug " , default = False , help = " Enable printing of debug messages. " )
parser . add_option ( " -c " , " --convert " , action = " store_true " , dest = " convert " , default = False , help = " Convert package: OldMdePkg->MdePkg EdkModulePkg->MdeModulePkg. " )
parser . add_option ( " -e " , " --event " , action = " store_true " , dest = " event " , default = False , help = " Enable handling of Exit Boot Services & Virtual Address Changed Event " )
parser . add_option ( " -m " , " --manual " , action = " store_true " , dest = " manual " , default = False , help = " Generate CommonHeader.txt, user picks up & copy it to a module common header " )
parser . add_option ( " -w " , " --workspace " , dest = " workspace " , default = str ( os . environ . get ( ' WORKSPACE ' ) ) , help = " Specify workspace directory. " )
( options , args ) = parser . parse_args ( sys . argv [ 1 : ] )
return options , args
def openDatabase ( f ) :
""" Parse XML in the FrameworkDatabase.db file pointed to by f """
if ( options . debug and options . verbose > 1 ) :
print " Opening the database file: " , f
if os . path . exists ( f ) :
fdb = XmlParseFile ( f )
else :
return " None "
return fdb
def openSpd ( s ) :
""" Parse XML in the SPD file pointed to by s """
if ( options . debug and options . verbose > 1 ) :
print " Opening the SPD file: " , s
if os . path . exists ( s ) :
spd = XmlParseFile ( s )
else :
return " None "
return spd
def openMsa ( m ) :
""" Parse XML in the MSA file pointed to by m """
if ( options . debug and options . verbose > 1 ) :
print " Opening the MSA file: " , m
if os . path . exists ( m ) :
msa = XmlParseFile ( m )
else :
return " None "
return msa
def AddGuid ( ArchList , CName , Usage ) :
""" Add a GUID to the Architecture array that the GUID is valid for. """
if " IA32 " in ArchList :
GuidCNameIa32 . insert ( 0 , str ( " %-45s # %s " % ( CName , Usage ) ) )
if " X64 " in ArchList :
GuidCNameX64 . insert ( 0 , str ( " %-45s # %s " % ( CName , Usage ) ) )
if " IPF " in ArchList :
GuidCNameIPF . insert ( 0 , str ( " %-45s # %s " % ( CName , Usage ) ) )
if " EBC " in ArchList :
GuidCNameEBC . insert ( 0 , str ( " %-45s # %s " % ( CName , Usage ) ) )
if " ALL " in ArchList :
GuidCName . insert ( 0 , str ( " %-45s # %s " % ( CName , Usage ) ) )
def removeDups ( CN , ListName ) :
""" Remove Duplicate Entries from the Guid List passed in """
for Entry in ListName [ : ] :
if " " + CN + " " in Entry :
if ( options . verbose > 1 ) :
print " Removing C Name %s Entry from Guids List. " % ( CN )
ListName . remove ( Entry )
def chkArch ( Archs ) :
""" Process the supported architectures passed in to combine if possible """
Archs = Archs . upper ( )
if ( ( " IA32 " in Archs ) & ( " X64 " in Archs ) & ( " IPF " in Archs ) & ( " EBC " in Archs ) ) :
Archs = " ALL "
if ( len ( Archs ) == 0 ) :
Archs = " ALL "
return Archs
def saveSourceFile ( moduleDir , sourceFilename , sourceFileContents ) :
newFilename = os . path . join ( moduleDir , sourceFilename )
try :
f = open ( newFilename , " w+ " )
f . write ( sourceFileContents )
f . close ( )
except :
print " IO error in saving %s " % sourceFilename
return sourceFilename
def openSourceFile ( moduleDir , sourceFilename ) :
newFilename = os . path . join ( moduleDir , sourceFilename )
sourceFileContents = " "
try :
f = open ( newFilename , " r " )
sourceFileContents = f . read ( )
f . close ( )
except :
print " IO error in opening %s " % sourceFilename
return sourceFileContents
def MatchOption ( eline , ToolChainFamily , Targets , Archs , ToolCode , Value ) :
IDs = eline . split ( " _ " )
if len ( IDs ) < 5 :
return [ ]
MatchedTargets = [ ]
if ( Targets [ 0 ] == " * " ) or IDs [ 0 ] in Targets :
MatchedTargets . append ( IDs [ 0 ] )
elif IDs [ 0 ] == " * " :
MatchedTargets = Targets
MatchedArchs = [ ]
if Archs [ 0 ] == " * " or IDs [ 2 ] in Archs :
MatchedArchs . append ( IDs [ 2 ] )
elif IDs [ 2 ] == " * " :
MatchedArchs = Archs
if IDs [ 3 ] != ToolCode and IDs [ 3 ] != " * " :
return [ ]
result = [ ]
for arch in MatchedArchs :
for target in MatchedTargets :
line = " %s : %s _ %s _ %s _ %s _FLAGS = %s " % ( ToolChainFamily , target , IDs [ 1 ] , arch , ToolCode , Value )
result . append ( line )
return result
def main ( ) :
AutoGenSource = " "
AutoGenHeader = " "
AutoGenDeclaration = " "
AutoGenModuleFolder = None
workspace = " "
if ( options . workspace == None ) :
print " ERROR: E0000: WORKSPACE not defined. \n Please set the WORKSPACE environment variable to the location of the EDK II install directory. "
sys . exit ( 1 )
else :
workspace = options . workspace
if ( options . debug ) :
print " Using Workspace: " , workspace
try :
options . verbose + = 1
except :
options . verbose = 1
pass
FdbPath = os . path . join ( workspace , " Conf " )
FdbPath = os . path . join ( FdbPath , " FrameworkDatabase.db " )
if os . path . exists ( FdbPath ) :
FdbFile = FdbPath
else :
print " ERROR: E0001: WORKSPACE does not contain the FrameworkDatabase File. \n Please run EdkSetup from the EDK II install directory. \n "
sys . exit ( 1 )
Fdb = openDatabase ( FdbFile )
if ( Fdb == ' None ' ) :
print " ERROR: E0002 Could not open the Framework Database file: " , FdbFile
sys . exit ( 1 )
if ( options . debug ) :
print " FrameworkDataBase.db file: " , FdbFile
#
InitializeAutoGen ( workspace , Fdb )
if ( options . filename ) :
filename = options . filename
if ( ( options . verbose > 1 ) | ( options . autowrite ) ) :
print " Filename: " , filename
else :
print " ERROR: E0001 - You must specify an input filename "
sys . exit ( 1 )
if ( options . outfile ) :
outputFile = options . outfile
else :
outputFile = filename . replace ( ' .msa ' , ' .inf ' )
if ( ( options . verbose > 2 ) or ( options . debug ) ) :
print " Output Filename: " , outputFile
Msa = openMsa ( filename )
if ( Msa == ' None ' ) :
## Maybe developer think WORKSPACE macro is the root directory of file name
## So we will try to add WORKSPACE path into filename
MsaFileName = " "
MsaFileName = os . path . join ( workspace , filename )
Msa = openMsa ( MsaFileName )
if ( Msa == ' None ' ) :
print " ERROR: E0002: Could not open the file: " , filename
sys . exit ( 1 )
AutoGenModuleFolder = os . path . dirname ( filename )
MsaHeader = " /ModuleSurfaceArea/MsaHeader/ "
MsaDefs = " /ModuleSurfaceArea/ModuleDefinitions/ "
BaseName = str ( XmlElement ( Msa , MsaDefs + " OutputFileBasename " ) ) . strip ( )
if ( len ( BaseName ) < 1 ) :
BaseName = str ( XmlElement ( Msa , MsaHeader + " BaseName " ) ) . strip ( )
BaseName = re . sub ( ' ' , ' _ ' , BaseName )
GuidValue = str ( XmlElement ( Msa , MsaHeader + " GuidValue " ) ) . strip ( )
VerString = str ( XmlElement ( Msa , MsaHeader + " Version " ) ) . strip ( )
ModType = str ( XmlElement ( Msa , MsaHeader + " ModuleType " ) ) . strip ( )
CopyRight = str ( XmlElement ( Msa , MsaHeader + " Copyright " ) ) . strip ( )
Abstract = str ( XmlElement ( Msa , MsaHeader + " Abstract " ) ) . strip ( )
Description = str ( XmlElement ( Msa , MsaHeader + " Description " ) ) . strip ( ) . replace ( " " , " " ) . replace ( " " , " " ) . replace ( " " , " " )
if not CopyRight . find ( " 2007 " ) :
CopyRight = CopyRight . replace ( " 2006 " , " 2007 " )
License = str ( XmlElement ( Msa , MsaHeader + " License " ) ) . strip ( ) . replace ( " " , " " )
MsaDefs = " /ModuleSurfaceArea/ModuleDefinitions/ "
BinModule = " "
try :
BinModule = str ( XmlElement ( Msa , MsaDefs + " BinaryModule " ) ) . strip ( )
except :
pass
SupportedArchitectures = " "
try :
SupportedArchitectures = str ( XmlElement ( Msa , MsaDefs + " SupportedArchitectures " ) ) . strip ( )
except :
pass
DefinesComments = [ ]
if ( len ( SupportedArchitectures ) > 0 ) :
DefinesComments . insert ( 0 , " \n # \n # The following information is for reference only and not required by the build tools. \n # \n " )
DefinesComments . append ( " # VALID_ARCHITECTURES = " + SupportedArchitectures + " \n " )
DefinesComments . append ( " # \n " )
MsaExtern = " /ModuleSurfaceArea/Externs/ "
PcdIsDriver = " "
try :
PcdIsDriver = str ( XmlElement ( Msa , MsaExtern + " PcdIsDriver " ) ) . strip ( )
except :
pass
SpecList = [ ]
List = [ ]
try :
List = XmlList ( Msa , MsaExtern + " Specification " )
except :
pass
if ( len ( List ) > 0 ) :
for spec in List [ : ] :
SpecList . insert ( 0 , str ( XmlElementData ( spec ) ) . strip ( ) )
DriverModules = [ ]
LibraryModules = [ ]
Externlist = [ ]
Flag = ( DefinesComments == [ ] )
# Data structure to insert autogen code
AutoGenDriverModel = [ ]
AutoGenExitBootServices = [ ]
AutoGenVirtualAddressChanged = [ ]
AutoGenEntryPoint = " "
AutoGenUnload = " "
AutoGenGuid = [ ]
AutoGenLibClass = [ ]
AutoGenPackage = [ ]
AutoGenSourceFiles = [ ]
OldEntryPoint = " "
OldUnload = " "
try :
Externlist = XmlList ( Msa , MsaExtern + " Extern " )
except :
pass
if ( len ( Externlist ) > 0 ) :
if ( options . debug and options . verbose > 2 ) :
print " In Extern Parsing Routine "
for extern in Externlist :
EntryPoint = " "
Unload = " "
DBinding = " "
CompName = " "
Diag = " "
Config = " "
Constr = " "
Destr = " "
CallBack = " "
lFlag = False
AutoGenDriverModelItem = [ ]
try :
EntryPoint = str ( XmlElementData ( extern . getElementsByTagName ( " ModuleEntryPoint " ) [ 0 ] ) ) . strip ( )
AutoGenEntryPoint = EntryPoint
#DriverModules.append(" %-30s = %s\n" % ("ENTRY_POINT" , EntryPoint))
except :
pass
try :
Unload = str ( XmlElementData ( extern . getElementsByTagName ( " ModuleUnloadImage " ) [ 0 ] ) ) . strip ( )
AutoGenUnload = Unload
DriverModules . append ( " %-30s = %s \n " % ( " UNLOAD_IMAGE " , Unload ) )
except :
pass
try :
DBinding = str ( XmlElementData ( extern . getElementsByTagName ( " DriverBinding " ) [ 0 ] ) ) . strip ( )
AutoGenDriverModelItem . append ( " & " + DBinding )
DefinesComments . append ( " # %-29s = %-45s \n " % ( " DRIVER_BINDING " , DBinding ) )
lFlag = True
except :
pass
try :
CompName = str ( XmlElementData ( extern . getElementsByTagName ( " ComponentName " ) [ 0 ] ) ) . strip ( )
AutoGenDriverModelItem . append ( " & " + CompName )
DefinesComments . append ( " # %-29s = %-45s \n " % ( " COMPONENT_NAME " , CompName ) )
lFlag = True
except :
if lFlag :
AutoGenDriverModelItem . append ( " NULL " )
pass
try :
Config = str ( XmlElementData ( extern . getElementsByTagName ( " DriverConfig " ) [ 0 ] ) ) . strip ( )
AutoGenDriverModelItem . append ( " & " + Config )
DefinesComments . append ( " # %-29s = %-45s \n " % ( " DRIVER_CONFIG " , Config ) )
lFlag = True
except :
if lFlag :
AutoGenDriverModelItem . append ( " NULL " )
pass
try :
Diag = str ( XmlElementData ( extern . getElementsByTagName ( " DriverDiag " ) [ 0 ] ) ) . strip ( )
AutoGenDriverModelItem . append ( " & " + Diag )
DefinesComments . append ( " # %-29s = %-45s \n " % ( " DRIVER_DIAG " , Diag ) )
lFlag = True
except :
if lFlag :
AutoGenDriverModelItem . append ( " NULL " )
pass
if len ( AutoGenDriverModelItem ) > 0 :
AutoGenDriverModel . append ( AutoGenDriverModelItem )
try :
Constr = str ( XmlElementData ( extern . getElementsByTagName ( " Constructor " ) [ 0 ] ) ) . strip ( )
LibraryModules . append ( " %-30s = %s \n " % ( " CONSTRUCTOR " , Constr ) )
except :
pass
try :
Destr = str ( XmlElementData ( extern . getElementsByTagName ( " Destructor " ) [ 0 ] ) ) . strip ( )
LibraryModules . append ( " %-30s = %s \n " % ( " DESTRUCTOR " , Destr ) )
except :
pass
try :
CallBack = str ( XmlElement ( extern , " Extern/SetVirtualAddressMapCallBack " ) ) . strip ( )
if CallBack != " " :
AutoGenVirtualAddressChanged . append ( CallBack )
DefinesComments . append ( " # %-29s = %-45s \n " % ( " VIRTUAL_ADDRESS_MAP_CALLBACK " , CallBack ) )
lFlag = True
except :
pass
try :
CallBack = str ( XmlElement ( extern , " Extern/ExitBootServicesCallBack " ) ) . strip ( )
if CallBack != " " :
AutoGenExitBootServices . append ( CallBack )
DefinesComments . append ( " # %-29s = %-45s \n " % ( " EXIT_BOOT_SERVICES_CALLBACK " , CallBack ) )
lFlag = True
except :
pass
Flag = False
""" Get the Module ' s custom build options """
MBOlines = [ ]
MBO = " /ModuleSurfaceArea/ModuleBuildOptions/Options/Option "
mboList = [ ]
try :
mboList = XmlList ( Msa , MBO )
except :
pass
if ( len ( mboList ) > 0 ) :
for Option in mboList :
Targets = [ ]
Archs = [ ]
bt = " "
try :
bt = str ( Option . getAttribute ( " BuildTargets " ) )
except :
pass
if ( len ( bt ) > 0 ) :
if ( re . findall ( " " , bt ) > 0 ) :
Targets = bt . split ( )
else :
Targets . insert ( 0 , bt )
else :
Targets . insert ( 0 , " * " )
if ( options . debug and options . verbose > 2 ) :
print " Targets " , len ( Targets ) , Targets
pro = " "
try :
pro = Option . getAttribute ( " SupArchList " )
if ( re . findall ( " " , pro ) > 0 ) :
Archs = pro . split ( )
elif ( re . findall ( " , " , pro ) > 0 ) :
Archs = pro . split ( " , " )
except :
pass
if ( len ( pro ) == 0 ) :
Archs . insert ( 0 , " * " )
if ( options . debug and options . verbose > 2 ) :
print " Archs " , len ( Archs ) , Archs
ToolCode = " "
try :
ToolCode = str ( Option . getAttribute ( " ToolCode " ) )
except :
pass
if ( len ( ToolCode ) == 0 ) :
ToolCode = " * "
value = " "
try :
value = str ( XmlElementData ( Option ) )
except :
pass
Tags = [ ]
TagName = " "
try :
TagName = str ( Option . getAttribute ( " TagName " ) )
except :
pass
if ( len ( TagName ) > 0 ) :
if ( options . debug and options . verbose > 2 ) :
print " TagName was defined: " , TagName
Tags . insert ( 0 , TagName )
else :
if ( options . debug and options . verbose > 2 ) :
print " TagName was NOT defined! "
TagName = " * "
Tags . insert ( 0 , " * " )
Family = " "
try :
Family = str ( Option . getAttribute ( " ToolChainFamily " ) ) . strip ( )
except :
pass
if ( len ( Family ) > 0 ) :
if ( options . debug ) :
print " Searching tools_def.txt for Tool Tags that belong to: " , Family , " family "
TCF = [ ]
tdFile = " "
tdPath = os . path . join ( workspace , " Tools " )
tdPath = os . path . join ( tdPath , " Conf " )
tdPath = os . path . join ( tdPath , " tools_def.txt " )
tdPath = tdPath . replace ( " \\ " , " / " )
if os . path . exists ( tdPath ) :
tdFile = tdPath
else :
tdPath = os . path . join ( workspace , " Conf " )
tdPath = os . path . join ( tdPath , " tools_def.txt " )
if os . path . exists ( tdPath ) :
tdFile = tdPath
else :
print " ERROR: E0001: WORKSPACE does not contain the tools_def.txt File. \n Please run EdkSetup from the EDK II install directory. \n "
sys . exit ( 1 )
if ( options . debug and options . verbose > 2 ) :
print " Opening: " , tdFile
TagNameList = [ ]
tools_def = open ( tdFile , " r " )
for tdline in tools_def :
if " # " in tdline :
continue
if " FAMILY " in tdline :
if ( options . debug and options . verbose > 2 ) :
print " Testing for FAMILY: " , Family , " in the line: " , tdline . strip ( )
if Family in tdline :
enter = tdline . split ( " = " ) [ 0 ]
if ( options . debug and options . verbose > 2 ) :
print " Adding TNL: " , tdline
TagNameList . insert ( 0 , enter )
tools_def . close ( )
if ( options . debug and options . verbose > 2 ) :
print " TagNameList: " , TagNameList
olinesSet = { }
for eline in TagNameList :
if " # " in eline :
continue
if ( options . debug and options . verbose > 2 ) :
print " ToolsDef entry: " , eline
olines = MatchOption ( eline , Family , Targets , Archs , ToolCode , value )
for oline in olines :
olinesSet [ oline ] = 1
for oline in olinesSet :
if ( options . debug and options . verbose > 2 ) :
print " Adding: " , str ( oline )
MBOlines . insert ( 0 , oline )
else :
for targ in Targets :
for arch in Archs :
oline = " %s _ %s _ %s _ %s _FLAGS = %s " % ( targ , Tags [ 0 ] , arch , str ( ToolCode ) , str ( Value ) )
if ( options . debug and options . verbose > 2 ) :
print " Adding: " , str ( oline )
MBOlines . insert ( 0 , oline )
for tag in Tags :
for targ in Targets :
for arch in Archs :
oline = " " + str ( targ ) + " _ " + str ( tag ) + " _ " + str ( arch ) + " _ " + str ( ToolCode ) + " _FLAGS = " + str ( value )
if ( options . debug and options . verbose > 2 ) :
print " Adding: " , str ( oline )
#MBOlines.insert(0, oline)
""" Get the Library Class information """
MsaLcDefs = " /ModuleSurfaceArea/LibraryClassDefinitions/LibraryClass "
LcDefList = [ ]
try :
LcDefList = XmlList ( Msa , MsaLcDefs )
except :
pass
IamLibrary = [ ]
LibClassList = [ ]
LibClassListIa32 = [ ]
LibClassListX64 = [ ]
LibClassListIpf = [ ]
LibClassListEbc = [ ]
if ( len ( LcDefList ) > 0 ) :
for Lc in LcDefList :
lcKeyword = " "
try :
lcKeyword = str ( XmlElementData ( Lc . getElementsByTagName ( " Keyword " ) [ 0 ] ) )
except :
raise SyntaxError , " The MSA is not correctly formed, a Library Class Keyword Element is required "
lcUsage = " "
try :
lcUsage = str ( XmlAttribute ( Lc , " Usage " ) )
except :
raise SyntaxError , " The MSA is not correctly formed, a Usage Attribute is required for all Library Class Elements "
Archs = " "
try :
Archs = str ( XmlAttribute ( Lc , " SupArchList " ) )
except :
pass
Archs = chkArch ( Archs )
if ( options . debug and options . verbose > 2 ) :
print " Attr: " , lcUsage , lcKeyword , Archs
if ( options . convert ) :
lcKeyword = AutoGenLibraryMapping . get ( lcKeyword , lcKeyword )
if re . findall ( " PRODUCED " , lcUsage , re . IGNORECASE ) :
try :
lcSupModList = " "
try :
lcSupModList = str ( XmlAttribute ( Lc , " SupModuleList " ) )
except :
lcSupModList = " "
pass
lcLine = lcKeyword
AutoGenLibClass . append ( lcKeyword )
if len ( lcSupModList ) > 0 :
lcLine = lcLine + " | " + lcSupModList
IamLibrary . insert ( 0 , lcLine )
except :
pass
elif lcKeyword != " UefiDriverModelLib " :
AutoGenLibClass . append ( lcKeyword )
# This section handles the library classes that are CONSUMED
if " IA32 " in Archs :
LibClassListIa32 . insert ( 0 , lcKeyword )
if " X64 " in Archs :
LibClassListX64 . insert ( 0 , lcKeyword )
if " IPF " in Archs :
LibClassListIpf . insert ( 0 , lcKeyword )
if " EBC " in Archs :
LibClassListEbc . insert ( 0 , lcKeyword )
if " ALL " in Archs :
LibClassList . insert ( 0 , lcKeyword )
if len ( AutoGenDriverModel ) > 0 and " UefiLib " not in LibClassList :
AutoGenLibClass . append ( " UefiLib " )
LibClassList . insert ( 0 , " UefiLib " )
AutoGenDxsFiles = [ ]
""" Get the Source File list """
SrcFilenames = [ ]
SrcFilenamesIa32 = [ ]
SrcFilenamesX64 = [ ]
SrcFilenamesIpf = [ ]
SrcFilenamesEbc = [ ]
SrcFiles = " /ModuleSurfaceArea/SourceFiles/Filename "
SrcList = [ ]
try :
SrcList = XmlList ( Msa , SrcFiles )
except :
pass
if ( len ( SrcList ) > 0 ) :
for fn in SrcList :
file = " "
Archs = " "
try :
Archs = fn . getAttribute ( " SupArchList " )
except :
pass
Archs = chkArch ( Archs )
try :
file = str ( XmlElementData ( fn ) )
except :
pass
if file . endswith ( " .dxs " ) :
AutoGenDxsFiles . append ( ( file , Archs ) )
else :
AutoGenSourceFiles . append ( file )
if " IA32 " in Archs :
SrcFilenamesIa32 . insert ( 0 , file )
if " X64 " in Archs :
SrcFilenamesX64 . insert ( 0 , file )
if " IPF " in Archs :
SrcFilenamesIpf . insert ( 0 , file )
if " EBC " in Archs :
SrcFilenamesEbc . insert ( 0 , file )
if " ALL " in Archs :
SrcFilenames . insert ( 0 , file )
""" Package Dependency section """
DbPkgList = " /FrameworkDatabase/PackageList/Filename "
WorkspacePkgs = [ ]
try :
WorkspacePkgs = XmlList ( Fdb , DbPkgList )
except :
print " Could not tet the package data from the database "
sys . exit ( 1 )
PkgDb = [ ]
HeaderLocations = [ ]
if ( options . debug and options . verbose > 1 ) :
print " Found %s packages in the WORKSPACE " % ( len ( WorkspacePkgs ) )
Dirs = [ ]
GuidDecls = [ ]
if ( len ( WorkspacePkgs ) > 0 ) :
SpdHeader = " /PackageSurfaceArea/SpdHeader/ "
for Pkg in WorkspacePkgs [ : ] :
PackageGuid = " "
PackageVersion = " "
file = " "
try :
file = str ( XmlElementData ( Pkg ) )
except :
pass
if ( options . debug and options . verbose > 2 ) :
print " PKG: " , file
if fnmatch . fnmatch ( file , " *.dec " ) :
print " parsing " + os . path . join ( workspace , file )
PackageGuid = " "
PackageVersion = " "
try :
Lines = open ( os . path . join ( workspace , file ) ) . readlines ( )
except :
print " Could not parse the Package file: " , file
sys . exit ( 1 )
for Line in Lines :
Line = Line . split ( " # " ) [ 0 ]
Items = Line . split ( " = " )
if len ( Items ) != 2 :
continue
Key = Items [ 0 ] . strip ( ) . upper ( )
if Key == " PACKAGE_GUID " :
PackageGuid = Items [ 1 ] . strip ( )
if Key == " PACKAGE_VERSION " :
PackageVersion = Items [ 1 ] . strip ( )
else :
Spd = openSpd ( os . path . join ( workspace , file ) )
if ( Spd == ' None ' ) :
print " Could not parse the Package file: " , file
sys . exit ( 1 )
path = os . path . split ( file ) [ 0 ]
file = file . replace ( " .nspd " , " .dec " )
file = file . replace ( " .spd " , " .dec " )
try :
PackageGuid = str ( XmlElement ( Spd , SpdHeader + " GuidValue " ) )
except :
pass
try :
PackageVersion = str ( XmlElement ( Spd , SpdHeader + " Version " ) )
except :
pass
file = file + " | " + PackageGuid + " | " + PackageVersion
PkgDb . insert ( 0 , file )
GuidEntries = [ ]
try :
GuidEntries = XmlList ( Spd , " /PackageSurfaceArea/GuidDeclarations/Entry " )
except :
pass
if ( len ( GuidEntries ) > 0 ) :
for Entry in GuidEntries [ : ] :
try :
GuidDecls . append ( str ( XmlElementData ( Entry . getElementsByTagName ( " C_Name " ) [ 0 ] ) ) . strip ( ) )
except :
pass
pHdrs = [ ]
try :
pHdrs = XmlList ( Spd , " /PackageSurfaceArea/PackageHeaders/IncludePkgHeader " )
except :
pass
if ( len ( pHdrs ) > 0 ) :
for Hdr in pHdrs [ : ] :
try :
ModTypeList = str ( Hdr . getAttribute ( " ModuleType " ) )
if ( ModType in ModTypeList ) :
HeaderName = str ( XmlElementData ( Hdr ) ) [ 0 ]
Dirs . insert ( 0 , os . path . join ( packagepath , str ( os . path . split ( HeaderName ) ) ) )
except :
pass
# Get the Guid:Header from the Packages
SpdLcDec = " /PackageSurfaceArea/LibraryClassDeclarations/LibraryClass "
lcList = [ ]
try :
lcList = XmlList ( Spd , SpdLcDec )
except :
pass
if ( len ( lcList ) > 0 ) :
for Lc in lcList [ : ] :
Name = " "
try :
Name = Lc . getAttribute ( " Name " )
except :
pass
Header = " "
try :
Header = XmlElementData ( Lc . getElementsByTagName ( " IncludeHeader " ) [ 0 ] )
except :
pass
if ( ( len ( Name ) > 0 ) and ( len ( Header ) > 0 ) ) :
line = Name + " | " + os . path . join ( path , Header )
if ( options . debug and options . verbose > 2 ) :
print " Adding: " , line
HeaderLocations . insert ( 0 , line )
ishList = [ ]
try :
IndStdHeaders = " /PackageSurfaceArea/IndustryStdIncludes/IndustryStdHeader "
ishList = XmlList ( Spd , IndStdHeaders )
except :
pass
if ( len ( ishList ) > 0 ) :
for Lc in ishList [ : ] :
Name = " "
try :
Name = str ( Lc . getAttribute ( " Name " ) ) . strip ( )
except :
pass
Header = " "
try :
Header = str ( XmlElementData ( Lc . getElementsByTagName ( " IncludeHeader " ) [ 0 ] ) ) . strip ( )
except :
pass
if ( ( len ( Name ) > 0 ) and ( len ( Header ) > 0 ) ) :
line = Name + " | " + os . path . join ( path , Header )
HeaderLocations . insert ( 0 , str ( line ) )
PkgList = [ ]
PkgListIa32 = [ ]
PkgListX64 = [ ]
PkgListIpf = [ ]
PkgListEbc = [ ]
Pkgs = " /ModuleSurfaceArea/PackageDependencies/Package "
pkgL = [ ]
try :
pkgL = XmlList ( Msa , Pkgs )
except :
pass
gUnknownPkgGuid = { }
if ( len ( pkgL ) > 0 ) :
if ( options . debug and options . verbose > 1 ) :
print " Found %s packages in the module " % ( len ( pkgL ) )
for pkg in pkgL [ : ] :
Archs = " "
pkgGuid = " "
pkgVer = " "
FindPkgGuid = False
try :
Archs = pkg . getAttribute ( " SupArchList " )
except :
pass
Archs = chkArch ( Archs )
try :
pkgGuid = pkg . getAttribute ( " PackageGuid " )
except :
pass
if options . convert :
if pkgGuid . lower ( ) == " 5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec " :
pkgGuid = " 1E73767F-8F52-4603-AEB4-F29B510B6766 "
if pkgGuid . lower ( ) == " 68169ab0-d41b-4009-9060-292c253ac43d " :
pkgGuid = " BA0D78D6-2CAF-414b-BD4D-B6762A894288 "
AutoGenPackage . append ( pkgGuid )
try :
pkgVer = pkg . getAttribute ( " PackageVersion " )
except :
pass
for PkgEntry in PkgDb [ : ] :
if pkgGuid in PkgEntry :
if len ( pkgVer ) > 0 :
if pkgVer in PkgEntry :
FindPkgGuid = True
if " IA32 " in Archs :
PkgListIa32 . insert ( 0 , PkgEntry . split ( " | " ) [ 0 ] )
if " X64 " in Archs :
PkgListX64 . insert ( 0 , PkgEntry . split ( " | " ) [ 0 ] )
if " IPF " in Archs :
PkgListIpf . insert ( 0 , PkgEntry . split ( " | " ) [ 0 ] )
if " EBC " in Archs :
PkgListEbc . insert ( 0 , PkgEntry . split ( " | " ) [ 0 ] )
if " ALL " in Archs :
PkgList . insert ( 0 , PkgEntry . split ( " | " ) [ 0 ] )
else :
FindPkgGuid = True
if " IA32 " in Archs :
PkgListIa32 . insert ( 0 , PkgEntry . split ( " | " ) [ 0 ] )
if " X64 " in Archs :
PkgListX64 . insert ( 0 , PkgEntry . split ( " | " ) [ 0 ] )
if " IPF " in Archs :
PkgListIpf . insert ( 0 , PkgEntry . split ( " | " ) [ 0 ] )
if " EBC " in Archs :
PkgListEbc . insert ( 0 , PkgEntry . split ( " | " ) [ 0 ] )
if " ALL " in Archs :
PkgList . insert ( 0 , PkgEntry . split ( " | " ) [ 0 ] )
if not FindPkgGuid :
gUnknownPkgGuid [ str ( pkgGuid ) ] = 1
for UnknownPkgGuid in gUnknownPkgGuid :
print " Cannot resolve package dependency Guid: " , UnknownPkgGuid
PkgList . reverse ( )
PkgListIa32 . reverse ( )
PkgListX64 . reverse ( )
PkgListIpf . reverse ( )
PkgListEbc . reverse ( )
if ( options . debug ) :
print " Package List: " , PkgList
""" Setup the Global GuidCName arrays that will hold data from various MSA locations """
global GuidCName
global GuidCNameIa32
global GuidCNameX64
global GuidCNameIPF
global GuidCNameEBC
GuidCName = [ ]
GuidCNameIa32 = [ ]
GuidCNameX64 = [ ]
GuidCNameIPF = [ ]
GuidCNameEBC = [ ]
""" Check for the GUIDs Element """
Guids = " /ModuleSurfaceArea/Guids/GuidCNames "
GuidList = [ ]
try :
GuidList = XmlList ( Msa , Guids )
except :
pass
if ( len ( GuidList ) > 0 ) :
for Guid in GuidList :
Archs = " "
Usage = " "
CName = " "
try :
Archs = Guid . getAttribute ( " SupArchList " )
except :
pass
Archs = chkArch ( Archs )
try :
Usage = Guid . getAttribute ( " Usage " )
except :
pass
try :
CName = str ( XmlElementData ( Guid . getElementsByTagName ( " GuidCName " ) [ 0 ] ) )
if CName in GuidDecls :
if ( options . debug and options . verbose > 1 ) :
print " Guids Adding Guid CName: %-45s # %s Archs: %s " % ( CName , Usage , Archs )
AddGuid ( Archs , CName , Usage )
AutoGenGuid . append ( CName )
else :
raise AssertionError , " Guid %s defined in %s is not declared in any package (.dec) file! " % ( CName , filename )
except :
pass
if ( options . debug and options . verbose > 2 ) :
print " Guid C Name List: " , GuidCName
""" Check for Events """
Guids = " /ModuleSurfaceArea/Events/CreateEvents/EventTypes "
GuidList = [ ]
try :
GuidList = XmlList ( Msa , Guids )
except :
pass
if ( len ( GuidList ) > 0 ) :
for Guid in GuidList :
Archs = " "
Usage = " "
CName = " "
try :
Archs = Guid . getAttribute ( " SupArchList " )
except :
pass
Archs = chkArch ( Archs )
try :
Usage = Guid . getAttribute ( " Usage " )
Type = str ( XmlElementData ( Guid . getElementsByTagName ( " EventType " ) [ 0 ] ) )
Usage + = " Create Event: " + Type
except :
pass
try :
CName = str ( Guid . getAttribute ( " EventGuidCName " ) )
if CName in GuidDecls :
if ( options . debug and options . verbose > 1 ) :
print " CreateEvent Adding Guid CName: %-45s # %s Archs: %s " % ( CName , Usage , Archs )
AddGuid ( Archs , CName , Usage )
AutoGenGuid . append ( CName )
else :
if ( len ( DefinesComments ) == 0 ) :
DefinesComments . insert ( 0 , " \n # \n # The following information is for reference only and not required by the build tools. \n # \n " )
DefinesComments . append ( " # Create Event Guid C Name: " + CName + " Event Type: " + Type + " \n " )
Flag = True
except :
pass
if ( Flag ) :
DefinesComments . append ( " # \n " )
Flag = False
Guids = " /ModuleSurfaceArea/Events/SignalEvents/EventTypes "
GuidList = [ ]
try :
GuidList = XmlList ( Msa , Guids )
except :
pass
if ( len ( GuidList ) > 0 ) :
for Guid in GuidList :
Archs = " "
Usage = " "
CName = " "
try :
Archs = Guid . getAttribute ( " SupArchList " )
except :
pass
Archs = chkArch ( Archs )
try :
Usage = Guid . getAttribute ( " Usage " )
Type = str ( XmlElementData ( Guid . getElementsByTagName ( " EventType " ) [ 0 ] ) )
Usage + = " Signal Event: " + Type
except :
pass
try :
CName = str ( Guid . getAttribute ( " EventGuidCName " ) )
if CName in GuidDecls :
if ( options . debug and options . verbose > 1 ) :
print " SignalEvent Adding Guid CName: %-45s # %s Archs: %s " % ( CName , Usage , Archs )
AddGuid ( Archs , CName , Usage )
AutoGenGuid . append ( CName )
else :
if ( len ( DefinesComments ) == 0 ) :
DefinesComments . insert ( 0 , " \n # \n # The following information is for reference only and not required by the build tools. \n # \n " )
DefinesComments . append ( " # Signal Event Guid C Name: " + CName + " Event Type: " + Type + " \n " )
Flag = True
except :
pass
if ( Flag ) :
DefinesComments . append ( " # \n " )
Flag = False
""" Check the HOB guids """
Guids = " /ModuleSurfaceArea/Hobs/HobTypes "
GuidList = [ ]
try :
GuidList = XmlList ( Msa , Guids )
except :
pass
if ( len ( GuidList ) > 0 ) :
for Guid in GuidList :
Archs = " "
Usage = " "
CName = " "
try :
Archs = Guid . getAttribute ( " SupArchList " )
except :
pass
Archs = chkArch ( Archs )
try :
Usage = Guid . getAttribute ( " Usage " )
Type = str ( XmlElementData ( Guid . getElementsByTagName ( " HobType " ) [ 0 ] ) )
Usage + = " Hob: " + Type
except :
pass
try :
CName = str ( Guid . getAttribute ( " HobGuidCName " ) )
if CName in GuidDecls :
if ( options . debug and options . verbose > 1 ) :
print " Hob Adding Guid CName: %-45s # %s Archs: %s " % ( CName , Usage , Archs )
AddGuid ( Archs , CName , Usage )
AutoGenGuid . append ( CName )
else :
if ( len ( DefinesComments ) == 0 ) :
DefinesComments . insert ( 0 , " \n # \n # The following information is for reference only and not required by the build tools. \n # \n " )
DefinesComments . append ( " # HOB Guid C Name: " + CName + " Hob Type: " + Type + " \n " )
Flag = True
except :
if ( len ( DefinesComments ) == 0 ) :
DefinesComments . insert ( 0 , " \n # \n # The following information is for reference only and not required by the build tools. \n # \n " )
DefinesComments . append ( " # HOB: " + Type + " \n " )
Flag = True
pass
if ( Flag ) :
DefinesComments . append ( " # \n " )
Flag = False
""" Check for the SystemTables Element """
Guids = " /ModuleSurfaceArea/SystemTables/SystemTableCNames "
GuidList = [ ]
try :
GuidList = XmlList ( Msa , Guids )
except :
pass
if ( len ( GuidList ) > 0 ) :
for Guid in GuidList :
Archs = " "
Usage = " "
CName = " "
try :
Archs = Guid . getAttribute ( " SupArchList " )
except :
pass
Archs = chkArch ( Archs )
try :
Usage = Guid . getAttribute ( " Usage " )
Usage + = " System Table "
except :
pass
try :
CName = str ( XmlElementData ( Guid . getElementsByTagName ( " SystemTableCName " ) [ 0 ] ) )
if ( options . debug and options . verbose > 1 ) :
print " System Table Adding Guid CName: %-45s # %s Archs: %s " % ( CName , Usage , Archs )
AddGuid ( Archs , CName , Usage )
AutoGenGuid . append ( CName )
except :
pass
""" Check for the DataHubs Element """
Guids = " /ModuleSurfaceArea/DataHubs/DataHubRecord "
GuidList = [ ]
try :
GuidList = XmlList ( Msa , Guids )
except :
pass
if ( len ( GuidList ) > 0 ) :
for Guid in GuidList :
Archs = " "
Usage = " "
CName = " "
try :
Archs = Guid . getAttribute ( " SupArchList " )
except :
pass
Archs = chkArch ( Archs )
try :
Usage = Guid . getAttribute ( " Usage " )
Usage + = " Data Hub "
except :
pass
try :
CName = str ( XmlElementData ( Guid . getElementsByTagName ( " DataHubCName " ) [ 0 ] ) )
if ( options . debug and options . verbose > 1 ) :
print " Data Hub Adding Guid CName: %-45s # %s Archs: %s " % ( CName , Usage , Archs )
AddGuid ( Archs , CName , Usage )
AutoGenGuid . append ( CName )
except :
pass
""" Check for the HiiPackages Element """
Guids = " /ModuleSurfaceArea/HiiPackages/HiiPackage "
GuidList = [ ]
try :
GuidList = XmlList ( Msa , Guids )
except :
pass
if ( len ( GuidList ) > 0 ) :
for Guid in GuidList :
Archs = " "
Usage = " "
CName = " "
try :
Archs = Guid . getAttribute ( " SupArchList " )
except :
pass
Archs = chkArch ( Archs )
try :
Usage = Guid . getAttribute ( " Usage " )
Usage + = " HII Formset "
except :
pass
try :
CName = str ( XmlElementData ( Guid . getElementsByTagName ( " HiiCName " ) [ 0 ] ) )
if ( options . debug and options . verbose > 1 ) :
print " Hii Formset Adding Guid CName: %-45s # %s Archs: %s " % ( CName , Usage , Archs )
AddGuid ( Archs , CName , Usage )
AutoGenGuid . append ( CName )
except :
pass
""" Check for the Variables Element """
Guids = " /ModuleSurfaceArea/Variables/Variable "
GuidList = [ ]
try :
GuidList = XmlList ( Msa , Guids )
except :
pass
if ( len ( GuidList ) > 0 ) :
for Guid in GuidList :
Archs = " "
Usage = " "
CName = " "
VariableName = " "
try :
Archs = Guid . getAttribute ( " SupArchList " )
except :
pass
Archs = chkArch ( Archs )
try :
Usage = Guid . getAttribute ( " Usage " )
except :
pass
try :
VariableName = str ( XmlElementData ( Guid . getElementsByTagName ( " VariableName " ) [ 0 ] ) )
CName = str ( XmlElementData ( Guid . getElementsByTagName ( " GuidC_Name " ) [ 0 ] ) )
HexData = VariableName . strip ( ) . split ( )
UniString = " L \" "
for dig in HexData [ : ] :
UniString + = str ( unichr ( eval ( dig ) ) )
UniString + = " \" "
Usage + = UniString
if CName in set ( GuidDecls ) :
removeDups ( CName , GuidCName )
removeDups ( CName , GuidCNameIa32 )
removeDups ( CName , GuidCNameX64 )
removeDups ( CName , GuidCNameIPF )
removeDups ( CName , GuidCNameEBC )
if ( options . debug ) :
print " Variable Adding Guid CName: %-45s # %s Archs: %s " % ( CName , Usage , Archs )
AddGuid ( Archs , CName , Usage )
AutoGenGuid . append ( CName )
else :
if ( len ( DefinesComments ) == 0 ) :
DefinesComments . insert ( 0 , " \n # \n # The following information is for reference only and not required by the build tools. \n # \n " )
DefinesComments . append ( " # Variable Guid C Name: " + CName + " Variable Name: " + UniString + " \n " )
Flag = True
except :
pass
if ( Flag ) :
DefinesComments . append ( " # \n " )
Flag = False
""" Check for the Protocol Element """
Protocols = " /ModuleSurfaceArea/Protocols/Protocol "
ProtocolList = [ ]
ProtocolCName = [ ]
ProtocolCNameIa32 = [ ]
ProtocolCNameX64 = [ ]
ProtocolCNameIPF = [ ]
ProtocolCNameEBC = [ ]
try :
ProtocolList = XmlList ( Msa , Protocols )
except :
pass
if ( len ( ProtocolList ) > 0 ) :
for Protocol in ProtocolList :
Archs = " "
Usage = " "
CName = " "
try :
Archs = Protocol . getAttribute ( " SupArchList " )
except :
pass
Archs = chkArch ( Archs )
try :
Usage = Protocol . getAttribute ( " Usage " )
except :
pass
try :
CName = str ( XmlElementData ( Protocol . getElementsByTagName ( " ProtocolCName " ) [ 0 ] ) )
AutoGenGuid . append ( CName )
removeDups ( CName , GuidCName )
removeDups ( CName , GuidCNameIa32 )
removeDups ( CName , GuidCNameX64 )
removeDups ( CName , GuidCNameIPF )
removeDups ( CName , GuidCNameEBC )
if ( options . debug and options . verbose > 1 ) :
print " Found %s - %s - %s " % ( CName , Usage , str ( len ( Archs ) ) )
if " IA32 " in Archs :
ProtocolCNameIa32 . insert ( 0 , str ( " %-45s # PROTOCOL %s " % ( CName , Usage ) ) )
if " X64 " in Archs :
ProtocolCNameX64 . insert ( 0 , str ( " %-45s # PROTOCOL %s " % ( CName , Usage ) ) )
if " IPF " in Archs :
ProtocolCNameIPF . insert ( 0 , str ( " %-45s # PROTOCOL %s " % ( CName , Usage ) ) )
if " EBC " in Archs :
ProtocolCNameEBC . insert ( 0 , str ( " %-45s # PROTOCOL %s " % ( CName , Usage ) ) )
if " ALL " in Archs :
ProtocolCName . insert ( 0 , str ( " %-45s # PROTOCOL %s " % ( CName , Usage ) ) )
except :
pass
Protocols = " /ModuleSurfaceArea/Protocols/ProtocolNotify "
try :
ProtocolList = XmlList ( Msa , Protocols )
except :
pass
if ( len ( ProtocolList ) > 0 ) :
for Protocol in ProtocolList :
Archs = " "
Usage = " "
CName = " "
try :
Archs = Protocol . getAttribute ( " SupArchList " )
except :
pass
Archs = chkArch ( Archs )
try :
Usage = Protocol . getAttribute ( " Usage " )
except :
pass
try :
CName = str ( XmlElementData ( Protocol . getElementsByTagName ( " ProtocolNotifyCName " ) [ 0 ] ) )
AutoGenGuid . append ( CName )
removeDups ( CName , GuidCName )
removeDups ( CName , GuidCNameIa32 )
removeDups ( CName , GuidCNameX64 )
removeDups ( CName , GuidCNameIPF )
removeDups ( CName , GuidCNameEBC )
if " IA32 " in Archs :
ProtocolCNameIa32 . insert ( 0 , " %-45s # PROTOCOL_NOTIFY %s " % ( CName , Usage ) )
if " X64 " in Archs :
ProtocolCNameX64 . insert ( 0 , " %-45s # PROTOCOL_NOTIFY %s " % ( CName , Usage ) )
if " IPF " in Archs :
ProtocolCNameIPF . insert ( 0 , " %-45s # PROTOCOL_NOTIFY %s " % ( CName , Usage ) )
if " EBC " in Archs :
ProtocolCNameEBC . insert ( 0 , " %-45s # PROTOCOL_NOTIFY %s " % ( CName , Usage ) )
if " ALL " in Archs :
ProtocolCName . insert ( 0 , " %-45s # PROTOCOL_NOTIFY %s " % ( CName , Usage ) )
except :
pass
""" Check for the PPIs Element """
PPIs = " /ModuleSurfaceArea/PPIs/Ppi "
PPIsList = [ ]
PpiCName = [ ]
PpiCNameIa32 = [ ]
PpiCNameX64 = [ ]
PpiCNameIPF = [ ]
PpiCNameEBC = [ ]
try :
PPIsList = XmlList ( Msa , PPIs )
except :
pass
if ( len ( PPIsList ) > 0 ) :
for Ppi in PPIsList :
Archs = " "
Usage = " "
CName = " "
try :
Archs = str ( Ppi . getAttribute ( " SupArchList " ) )
except :
pass
Archs = chkArch ( Archs )
try :
Usage = str ( Ppi . getAttribute ( " Usage " ) )
except :
pass
try :
CName = str ( XmlElementData ( Ppi . getElementsByTagName ( " PpiCName " ) [ 0 ] ) ) . strip ( )
AutoGenGuid . append ( CName )
removeDups ( CName , GuidCName )
removeDups ( CName , GuidCNameIa32 )
removeDups ( CName , GuidCNameX64 )
removeDups ( CName , GuidCNameIPF )
removeDups ( CName , GuidCNameEBC )
if " IA32 " in Archs :
PpiCNameIa32 . insert ( 0 , " %-45s # PPI %s " % ( CName , Usage ) )
if " X64 " in Archs :
PpiCNameX64 . insert ( 0 , " %-45s # PPI %s " % ( CName , Usage ) )
if " IPF " in Archs :
PpiCNameIPF . insert ( 0 , " %-45s # PPI %s " % ( CName , Usage ) )
if " EBC " in Archs :
PpiCNameEBC . insert ( 0 , " %-45s # PPI %s " % ( CName , Usage ) )
if " ALL " in Archs :
PpiCName . insert ( 0 , " %-45s # PPI %s " % ( CName , Usage ) )
except :
pass
PPIs = " /ModuleSurfaceArea/PPIs/PpiNotify "
try :
PPIsList = XmlList ( Msa , PPIs )
except :
pass
if ( len ( PPIsList ) > 0 ) :
for Ppi in PPIsList :
Archs = " "
Usage = " "
CName = " "
try :
Archs = Ppi . getAttribute ( " SupArchList " )
except :
pass
Archs = chkArch ( Archs )
try :
Usage = Ppi . getAttribute ( " Usage " )
except :
pass
try :
CName = str ( XmlElementData ( Ppi . getElementsByTagName ( " PpiNotifyCName " ) [ 0 ] ) )
AutoGenGuid . append ( CName )
removeDups ( CName , GuidCName )
removeDups ( CName , GuidCNameIa32 )
removeDups ( CName , GuidCNameX64 )
removeDups ( CName , GuidCNameIPF )
removeDups ( CName , GuidCNameEBC )
if " IA32 " in Archs :
PpiCNameIa32 . insert ( 0 , " %-45s # PPI_NOTIFY %s " % ( CName , Usage ) )
if " X64 " in Archs :
PpiCNameX64 . insert ( 0 , " %-45s # PPI_NOTIFY %s " % ( CName , Usage ) )
if " IPF " in Archs :
PpiCNameIPF . insert ( 0 , " %-45s # PPI_NOTIFY %s " % ( CName , Usage ) )
if " EBC " in Archs :
PpiCNameEBC . insert ( 0 , " %-45s # PPI_NOTIFY %s " % ( CName , Usage ) )
if " ALL " in Archs :
PpiCName . insert ( 0 , " %-45s # PPI_NOTIFY %s " % ( CName , Usage ) )
except :
pass
""" Get the PCD entries now """
PcdCoded = " /ModuleSurfaceArea/PcdCoded/PcdEntry "
PcdList = [ ]
try :
PcdList = XmlList ( Msa , PcdCoded )
except :
pass
( PcdFF , PcdFFIa32 , PcdFFX64 , PcdFFIpf , PcdFFEbc ) = ( [ ] , [ ] , [ ] , [ ] , [ ] )
( PcdFAB , PcdFABIa32 , PcdFABX64 , PcdFABIpf , PcdFABEbc ) = ( [ ] , [ ] , [ ] , [ ] , [ ] )
( PcdPIM , PcdPIMIa32 , PcdPIMX64 , PcdPIMIpf , PcdPIMEbc ) = ( [ ] , [ ] , [ ] , [ ] , [ ] )
( PcdDY , PcdDYIa32 , PcdDYX64 , PcdDYIpf , PcdDYEbc ) = ( [ ] , [ ] , [ ] , [ ] , [ ] )
( PcdDYE , PcdDYEIa32 , PcdDYEX64 , PcdDYEIpf , PcdDYEEbc ) = ( [ ] , [ ] , [ ] , [ ] , [ ] )
if ( len ( PcdList ) > 0 ) :
for Pcd in PcdList :
Archs = " "
Usage = " "
CName = " "
DefVal = " "
try :
Archs = Pcd . getAttribute ( " SupArchList " )
except :
pass
Archs = chkArch ( Archs )
try :
ItemType = Pcd . getAttribute ( " PcdItemType " )
except :
pass
try :
CName = str ( XmlElementData ( Pcd . getElementsByTagName ( " C_Name " ) [ 0 ] ) )
except :
raise SyntaxError , " ERROR: MSA has a PCD with no Pcd C_Name defined "
try :
TSGC = str ( XmlElementData ( Pcd . getElementsByTagName ( " TokenSpaceGuidCName " ) [ 0 ] ) )
except :
pass
try :
DefVal = str ( XmlElementData ( Pcd . getElementsByTagName ( " DefaultValue " ) ) )
except :
pass
if ( len ( DefVal ) > 0 ) :
line = TSGC + " . " + CName + " | " + DefVal
else :
line = TSGC + " . " + CName
if ( ItemType == " FEATURE_FLAG " ) :
if ( " IA32 " in Archs ) :
PcdFFIa32 . insert ( 0 , line )
if ( " IPF " in Archs ) :
PcdFFIpf . insert ( 0 , line )
if ( " X64 " in Archs ) :
PcdFFX64 . insert ( 0 , line )
if ( " EBC " in Archs ) :
PcdFFEbc . insert ( 0 , line )
if ( " ALL " in Archs ) :
PcdFF . insert ( 0 , line )
elif ( ItemType == " FIXED_AT_BUILD " ) :
if ( " IA32 " in Archs ) :
PcdFABIa32 . insert ( 0 , line )
if ( " IPF " in Archs ) :
PcdFABIpf . insert ( 0 , line )
if ( " X64 " in Archs ) :
PcdFABX64 . insert ( 0 , line )
if ( " EBC " in Archs ) :
PcdFABEbc . insert ( 0 , line )
if ( " ALL " in Archs ) :
PcdFAB . insert ( 0 , line )
elif ( ItemType == " PATCHABLE_IN_MODULE " ) :
if ( " IA32 " in Archs ) :
PcdPIMIa32 . insert ( 0 , line )
if ( " IPF " in Archs ) :
PcdPIMIpf . insert ( 0 , line )
if ( " X64 " in Archs ) :
PcdPIMX64 . insert ( 0 , line )
if ( " EBC " in Archs ) :
PcdPIMEbc . insert ( 0 , line )
if ( " ALL " in Archs ) :
PcdFAB . insert ( 0 , line )
elif ( ItemType == " DYNAMIC_EX " ) :
if ( " IA32 " in Archs ) :
PcdDYEIa32 . insert ( 0 , line )
if ( " IPF " in Archs ) :
PcdDYEIpf . insert ( 0 , line )
if ( " X64 " in Archs ) :
PcdDYEX64 . insert ( 0 , line )
if ( " EBC " in Archs ) :
PcdDYEEbc . insert ( 0 , line )
if ( " ALL " in Archs ) :
PcdDYE . insert ( 0 , line )
else :
if ( " IA32 " in Archs ) :
PcdDYIa32 . insert ( 0 , line )
if ( " IPF " in Archs ) :
PcdDYIpf . insert ( 0 , line )
if ( " X64 " in Archs ) :
PcdDYX64 . insert ( 0 , line )
if ( " EBC " in Archs ) :
PcdDYEbc . insert ( 0 , line )
if ( " ALL " in Archs ) :
PcdDY . insert ( 0 , line )
""" User Extensions Section """
UEList = [ ]
UESectionList = [ ]
try :
UESectionList = XmlList ( Msa , " /ModuleSurfaceArea/UserExtensions " )
except :
pass
if ( len ( UESectionList ) > 0 ) :
for UE in UESectionList [ : ] :
UserId = " "
Identifier = " "
Value = " "
try :
UserId = str ( UE . getAttribute ( " UserID " ) )
except :
raise SyntaxError , " ERROR: Malformed MSA, No UserID Specified in UserExtensions element "
try :
Identifier = str ( UE . getAttribute ( " Identifier " ) )
except :
raise SyntaxError , " ERROR: Malformed MSA, No Identifier Specified in UserExtensions element "
if ( options . debug ) :
print " FOUND A UE Element " , UserId , Identifier
try :
Value = str ( XmlElementData ( UE ) )
except :
pass
Entry = [ UserId , Identifier , Value ]
UEList . insert ( 0 , Entry )
if ( len ( Externlist ) > 0 ) :
AutoGenSource = " "
AutoGenDefinitionSource = " "
AutoGenEntryPointSource = " "
AutoGenUnloadSource = " "
if ( len ( AutoGenDriverModel ) > 0 ) :
AutoGenCode = AddDriverBindingProtocolStatement ( AutoGenDriverModel )
AutoGenEntryPointSource + = AutoGenCode [ 0 ]
AutoGenUnloadSource + = AutoGenCode [ 1 ]
AutoGenDeclaration + = AutoGenCode [ 3 ]
if ( len ( AutoGenExitBootServices ) > 0 ) :
print " [Warning] Please manually add Create Event statement for Exit Boot Service Event! "
if options . event :
AutoGenCode = AddBootServiceEventStatement ( AutoGenExitBootServices )
AutoGenEntryPointSource + = AutoGenCode [ 0 ]
AutoGenUnloadSource + = AutoGenCode [ 1 ]
AutoGenDefinitionSource + = AutoGenCode [ 2 ]
AutoGenDeclaration + = AutoGenCode [ 3 ]
if ( len ( AutoGenVirtualAddressChanged ) > 0 ) :
print " [Warning] Please manually add Create Event statement for Virtual Address Change Event! "
if options . event :
AutoGenCode = AddVirtualAddressEventStatement ( AutoGenVirtualAddressChanged )
AutoGenEntryPointSource + = AutoGenCode [ 0 ]
AutoGenUnloadSource + = AutoGenCode [ 1 ]
AutoGenDefinitionSource + = AutoGenCode [ 2 ]
AutoGenDeclaration + = AutoGenCode [ 3 ]
if AutoGenEntryPointSource != " " :
OldEntryPoint = AutoGenEntryPoint
AutoGenCode = AddNewEntryPointContentsStatement ( BaseName , AutoGenEntryPoint , AutoGenEntryPointSource )
AutoGenEntryPoint = AutoGenCode [ 0 ]
AutoGenEntryPointSource = AutoGenCode [ 1 ]
AutoGenDeclaration + = AutoGenCode [ 2 ]
if AutoGenEntryPoint != " " :
DriverModules . insert ( 0 , " %-30s = %s \n " % ( " ENTRY_POINT " , AutoGenEntryPoint ) )
AutoGenSource = AutoGenDefinitionSource + AutoGenEntryPointSource + AutoGenUnloadSource
if ( lFlag ) :
DefinesComments . append ( " # \n " )
if ( Flag and len ( DefinesComments ) > 0 ) :
DefinesComments . insert ( 0 , " \n # \n # The following information is for reference only and not required by the build tools. \n # \n " )
if ( options . debug and options . verbose > 2 ) :
if ( len ( DriverModules ) > 0 ) :
print DriverModules
if ( len ( LibraryModules ) > 0 ) :
print LibraryModules
if ( len ( DefinesComments ) > 0 ) :
print DefinesComments
Depex = [ ]
DepexIa32 = [ ]
DepexX64 = [ ]
DepexIpf = [ ]
DepexEbc = [ ]
for DxsFile , Archs in AutoGenDxsFiles :
fileContents = openSourceFile ( AutoGenModuleFolder , DxsFile )
Contents , Unresolved = TranslateDpxSection ( fileContents )
if Contents == " " :
print " [warning] Cannot read dxs expression "
else :
if ( len ( Unresolved ) > 0 ) :
print " [warning] Guid Macro(s): %s cannot find corresponding cNames. Please resolve it in [depex] section in extened inf " % " , " . join ( Unresolved )
if ( " IA32 " in Archs ) :
DepexIa32 . insert ( 0 , Contents )
if ( " IPF " in Archs ) :
DepexIpf . insert ( 0 , Contents )
if ( " X64 " in Archs ) :
DepexX64 . insert ( 0 , Contents )
if ( " EBC " in Archs ) :
DepexEbc . insert ( 0 , Contents )
if ( " ALL " in Archs ) :
Depex . insert ( 0 , Contents )
AutoGenSourceHeaderFormat = " /**@file \n %s \n \n %s \n %s \n %s \n **/ \n \n %s "
includeCommonHeaderFileStatement = " #include \" %s \" " % commonHeaderFilename
AutoGenHeader + = AddSystemIncludeStatement ( ModType , AutoGenPackage )
AutoGenHeader + = AddGuidStatement ( AutoGenGuid )
AutoGenHeader + = AddLibraryClassStatement ( AutoGenLibClass )
if options . manual :
saveSourceFile ( AutoGenModuleFolder , " CommonHeader.txt " , AutoGenHeader )
else :
commonHeaderFilename2 = re . sub ( " (?=[^a-z]) " , " _ " , commonHeaderFilename )
commonHeaderFilename2 = " _ " + commonHeaderFilename2 . replace ( " . " , " " ) . upper ( ) + " _ "
briefDiscription = " Common header file shared by all source files. "
detailedDiscription = " This file includes package header files, library classes and protocol, PPI & GUID definitions. \n "
AutoGenHeader + = AutoGenDeclaration
AutoGenHeader = " #ifndef %s \n #define %s \n \n \n %s \n #endif \n " % ( commonHeaderFilename2 , commonHeaderFilename2 , AutoGenHeader )
AutoGenHeader = AutoGenSourceHeaderFormat % ( briefDiscription , detailedDiscription , CopyRight , License , AutoGenHeader )
saveSourceFile ( AutoGenModuleFolder , commonHeaderFilename , AutoGenHeader )
SrcFilenames . append ( commonHeaderFilename )
for source in AutoGenSourceFiles :
extension = os . path . splitext ( source ) [ 1 ]
if extension == " .c " :
sourceContents = openSourceFile ( AutoGenModuleFolder , source )
sourceContents = AddCommonInclusionStatement ( sourceContents , includeCommonHeaderFileStatement )
saveSourceFile ( AutoGenModuleFolder , source , sourceContents )
if AutoGenSource != " " :
briefDiscription = " Entry Point Source file. "
detailedDiscription = " This file contains the user entry point \n "
AutoGenSource = AutoGenSourceHeaderFormat % ( briefDiscription , detailedDiscription , CopyRight , License , AutoGenSource )
AutoGenSource = AddCommonInclusionStatement ( AutoGenSource , includeCommonHeaderFileStatement )
saveSourceFile ( AutoGenModuleFolder , entryPointFilename , AutoGenSource )
SrcFilenames . append ( entryPointFilename )
# DONE Getting data, now output it in INF format.
Msa . unlink ( )
Fdb . unlink ( )
Output = [ ]
""" Print the converted data format """
head = " #/** @file \n "
head + = " # " + str ( Abstract ) + " \n # \n "
head + = " # " + str ( Description ) . strip ( ) . replace ( " \n " , " \n # " ) + " \n "
head + = " # " + str ( CopyRight ) + " \n # \n "
head + = " # " + str ( License ) . replace ( " \n " , " \n # " ) . replace ( " " , " " ) . strip ( ) + " \n # \n "
head + = " # \n #**/ \n "
Output . append ( head )
if ( options . debug ) :
print head
## Defines = "\n" + "#"*80+ "\n#\n"
## if (BinModule != "false"):
## Defines += "# Defines Section - statements that will be processed to generate a binary image.\n"
## else:
## Defines += "# Defines Section - statements that will be processed to create a Makefile.\n"
## Defines += "#\n" + "#"*80 + "\n"
Defines = " \n "
Defines + = " [Defines] \n "
Defines + = " %-30s = %s \n " % ( " INF_VERSION " , " 0x00010005 " )
Defines + = " %-30s = %s \n " % ( " BASE_NAME " , BaseName )
Defines + = " %-30s = %s \n " % ( " FILE_GUID " , GuidValue )
Defines + = " %-30s = %s \n " % ( " MODULE_TYPE " , ModType )
Defines + = " %-30s = %s \n " % ( " VERSION_STRING " , VerString )
if ( len ( PcdIsDriver ) > 0 ) :
Defines + = " %-30s = %s \n " % ( " PCD_DRIVER " , PcdIsDriver )
if ( len ( IamLibrary ) > 0 ) :
lcstr = " "
for lc in IamLibrary [ : ] :
lcstr + = lc + " "
Defines + = " %-30s = %s " % ( " LIBRARY_CLASS " , lcstr )
Defines + = " \n "
if ( len ( SpecList ) > 0 ) :
for spec in SpecList [ : ] :
( specname , specval ) = spec . split ( )
Defines + = " %-30s = %s \n " % ( specname , specval )
Defines + = " \n "
if ( len ( DriverModules ) > 0 ) :
for line in DriverModules [ : ] :
Defines + = line
if ( len ( LibraryModules ) > 0 ) :
for line in LibraryModules [ : ] :
Defines + = line
if ( len ( DefinesComments ) > 0 ) :
for line in DefinesComments [ : ] :
Defines + = line
Output . append ( Defines )
if ( options . debug ) :
print Defines
if ( BinModule != " false " ) :
""" Binary Module, so sources are really binaries. """
## Sources = "\n" + "#"*80 + "\n#\n"
## Sources += "# Binaries Section - list of binary files that are required for the build\n# to succeed.\n"
## Sources += "#\n" + "#"*80 + "\n\n"
Sources = " \n "
if ModType == " UEFI_APPLICATION " :
FileType = " UEFI_APP "
if options . verbose > 0 :
print " WARNING: Binary Module: %s is assuming UEFI_APPLICATION file type. " % ( options . filename )
else :
FileType = " FV "
if options . verbose > 0 :
print " WARNING: Binary Module: %s is assuming FV file type. " % ( options . filename )
if ( len ( SrcFilenames ) > 0 ) :
Sources + = " [Binaries.common] \n "
for file in SrcFilenames [ : ] :
file = file . replace ( " \\ " , " / " )
Sources + = " " + FileType + " | " + file + " \n "
Sources + = " \n "
if ( len ( SrcFilenamesIa32 ) > 0 ) :
Sources + = " [Binaries.Ia32] \n "
for file in SrcFilenamesIa32 [ : ] :
file = file . replace ( " \\ " , " / " )
Sources + = " " + FileType + " | " + file + " \n "
Sources + = " \n "
if ( len ( SrcFilenamesX64 ) > 0 ) :
Sources + = " [Binaries.X64] \n "
for file in SrcFilenamesX64 [ : ] :
file = file . replace ( " \\ " , " / " )
Sources + = " " + FileType + " | " + file + " \n "
Sources + = " \n "
if ( len ( SrcFilenamesIpf ) > 0 ) :
Sources + = " [Binaries.IPF] \n "
for file in SrcFilenamesIpf [ : ] :
file = file . replace ( " \\ " , " / " )
Sources + = " " + FileType + " | " + file + " \n "
Sources + = " \n "
if ( len ( SrcFilenamesEbc ) > 0 ) :
Sources + = " [Binaries.EBC] \n "
for file in SrcFilenamesEbc [ : ] :
file = file . replace ( " \\ " , " / " )
Sources + = " " + FileType + " | " + file + " \n "
Sources + = " \n "
Output . append ( Sources )
if ( options . debug ) :
print Sources
else :
## Sources = "\n" + "#"*80 + "\n#\n"
## Sources += "# Sources Section - list of files that are required for the build to succeed.\n"
## Sources += "#\n" + "#"*80 + "\n\n"
Sources = " \n "
if ( len ( SrcFilenames ) > 0 ) :
Sources + = " [Sources.common] \n "
for file in SrcFilenames [ : ] :
Sources + = " " + file + " \n "
Sources + = " \n "
if ( len ( SrcFilenamesIa32 ) > 0 ) :
Sources + = " [Sources.Ia32] \n "
for file in SrcFilenamesIa32 [ : ] :
Sources + = " " + file + " \n "
Sources + = " \n "
if ( len ( SrcFilenamesX64 ) > 0 ) :
Sources + = " [Sources.X64] \n "
for file in SrcFilenamesX64 [ : ] :
Sources + = " " + file + " \n "
Sources + = " \n "
if ( len ( SrcFilenamesIpf ) > 0 ) :
Sources + = " [Sources.IPF] \n "
for file in SrcFilenamesIpf [ : ] :
Sources + = " " + file + " \n "
Sources + = " \n "
if ( len ( SrcFilenamesEbc ) > 0 ) :
Sources + = " [Sources.EBC] \n "
for file in SrcFilenamesEbc [ : ] :
Sources + = " " + file + " \n "
Sources + = " \n "
Output . append ( Sources )
if ( options . debug ) :
print Sources
includeLine = " "
if ( ( len ( HeaderLocations ) > 0 ) or ( len ( Dirs ) > 0 ) ) :
allLcs = set ( LibClassList + LibClassListIa32 + LibClassListX64 + LibClassListIpf + LibClassListEbc + Dirs )
Lines = [ ]
for line in HeaderLocations [ : ] :
for Lc in allLcs :
( keyword , header ) = line . split ( " | " )
if Lc in keyword :
if ( options . debug ) :
print " FOUND " , Lc , " in " , keyword , " header " , header
path = " $(WORKSPACE)/ " + os . path . split ( header ) [ 0 ]
Lines . insert ( 0 , path . strip ( ) )
Includes = " "
## Includes = "\n" + "#"*80 + "\n#\n"
## Includes += "# Includes Section - list of Include locations that are required for\n"
## Includes += "# this module.\n"
## Includes += "#\n" + "#"*80 + "\n\n"
## Includes += "[Includes]\n"
## includeLines = []
## includeLines = set(Lines)
## if (options.debug):
## print "There are", len(includeLines), "entries"
## for Line in includeLines:
## Includes += " " + str(Line).strip().replace("\\", "/") + "\n"
Output . append ( Includes )
if ( options . debug ) :
print Includes
if ( ( len ( PkgList ) + len ( PkgListIa32 ) + len ( PkgListX64 ) + len ( PkgListIpf ) + len ( PkgListEbc ) ) > 0 ) :
""" We do this if and only if we have Package Dependencies """
## PackageDepends = "\n" + "#"*80 + "\n#\n"
## PackageDepends += "# Package Dependency Section - list of Package files that are required for\n"
## PackageDepends += "# this module.\n"
## PackageDepends += "#\n" + "#"*80 + "\n\n"
PackageDepends = " \n "
if ( len ( PkgList ) > 0 ) :
PackageDepends + = " [Packages] \n "
for lc in PkgList [ : ] :
lc = lc . replace ( " \\ " , " / " )
PackageDepends + = " " + lc + " \n "
PackageDepends + = " \n "
if ( len ( PkgListIa32 ) > 0 ) :
PackageDepends + = " [Packages.IA32] \n "
for lc in PkgListIa32 [ : ] :
lc = lc . replace ( " \\ " , " / " )
PackageDepends + = " " + lc + " \n "
PackageDepends + = " \n "
if ( len ( PkgListX64 ) > 0 ) :
PackageDepends + = " [Packages.X64] \n "
for lc in PkgListX64 [ : ] :
lc = lc . replace ( " \\ " , " / " )
PackageDepends + = " " + lc + " \n "
PackageDepends + = " \n "
if ( len ( PkgListIpf ) > 0 ) :
PackageDepends + = " [Packages.IPF] \n "
for lc in PkgListIpf [ : ] :
lc = lc . replace ( " \\ " , " / " )
PackageDepends + = " " + lc + " \n "
PackageDepends + = " \n "
if ( len ( PkgListEbc ) > 0 ) :
PackageDepends + = " [Packages.EBC] \n "
for lc in PkgListEbc [ : ] :
lc = lc . replace ( " \\ " , " / " )
PackageDepends + = " " + lc + " \n "
PackageDepends + = " \n "
Output . append ( PackageDepends )
if ( options . debug ) :
print PackageDepends
if ( ( len ( LibClassList ) + len ( LibClassListIa32 ) + len ( LibClassListX64 ) + len ( LibClassListIpf ) + len ( LibClassListEbc ) ) > 0 ) :
## LibraryClasses = "\n" + "#"*80 + "\n#\n"
## LibraryClasses += "# Library Class Section - list of Library Classes that are required for\n"
## LibraryClasses += "# this module.\n"
## LibraryClasses += "#\n" + "#"*80 + "\n\n"
LibraryClasses = " \n "
if ( len ( LibClassList ) > 0 ) :
LibraryClasses + = " [LibraryClasses] \n "
for lc in LibClassList [ : ] :
LibraryClasses + = " " + lc + " \n "
LibraryClasses + = " \n "
if ( len ( LibClassListIa32 ) > 0 ) :
LibraryClasses + = " [LibraryClasses.IA32] \n "
for lc in LibClassListIa32 [ : ] :
LibraryClasses + = " " + lc + " \n "
LibraryClasses + = " \n "
if ( len ( LibClassListX64 ) > 0 ) :
LibraryClasses + = " [LibraryClasses.X64] \n "
for lc in LibClassListX64 [ : ] :
LibraryClasses + = " " + lc + " \n "
LibraryClasses + = " \n "
if ( len ( LibClassListIpf ) > 0 ) :
LibraryClasses + = " [LibraryClasses.IPF] \n "
for lc in LibClassListIpf [ : ] :
LibraryClasses + = " " + lc + " \n "
LibraryClasses + = " \n "
if ( len ( LibClassListEbc ) > 0 ) :
LibraryClasses + = " [LibraryClasses.EBC] \n "
for lc in LibClassListEbc [ : ] :
LibraryClasses + = " " + lc + " \n "
LibraryClasses + = " \n "
Output . append ( LibraryClasses )
if ( options . debug ) :
print LibraryClasses
# Print the Guids sections
if ( len ( GuidCName ) + len ( GuidCNameIa32 ) + len ( GuidCNameIPF ) + len ( GuidCNameX64 ) + len ( GuidCNameEBC ) ) > 0 :
## GuidSection = "\n" + "#"*80 + "\n#\n"
## GuidSection += "# Guid C Name Section - list of Guids that this module uses or produces.\n"
## GuidSection += "#\n" + "#"*80 + "\n\n"
GuidSection = " \n "
if ( len ( GuidCName ) > 0 ) :
GuidSection + = " [Guids] \n "
for Guid in GuidCName [ : ] :
GuidSection + = Guid + " \n "
GuidSection + = " \n "
if ( len ( GuidCNameIa32 ) > 0 ) :
GuidSection + = " [Guids.IA32] \n "
for Guid in GuidCNameIa32 [ : ] :
GuidSection + = Guid + " \n "
GuidSection + = " \n "
if ( len ( GuidCNameX64 ) > 0 ) :
GuidSection + = " [Guids.X64] \n "
for Guid in GuidCNameX64 [ : ] :
GuidSection + = Guid + " \n "
GuidSection + = " \n "
if ( len ( GuidCNameIPF ) > 0 ) :
GuidSection + = " [Guids.IPF] \n "
for Guid in GuidCNameIPF [ : ] :
GuidSection + = Guid + " \n "
GuidSection + = " \n "
if ( len ( GuidCNameEBC ) > 0 ) :
GuidSection + = " [Guids.EBC] \n "
for Guid in GuidCNameEBC [ : ] :
GuidSection + = Guid + " \n "
GuidSection + = " \n "
Output . append ( GuidSection )
if ( options . debug and options . verbose > 1 ) :
print GuidSection
# Print the Protocol sections
if ( len ( ProtocolCName ) + len ( ProtocolCNameIa32 ) + len ( ProtocolCNameIPF ) + len ( ProtocolCNameX64 ) + len ( ProtocolCNameEBC ) ) > 0 :
## ProtocolsSection = "\n" + "#"*80 + "\n#\n"
## ProtocolsSection += "# Protocol C Name Section - list of Protocol and Protocol Notify C Names\n"
## ProtocolsSection += "# that this module uses or produces.\n"
## ProtocolsSection += "#\n" + "#"*80 + "\n\n"
ProtocolsSection = " \n "
if ( len ( ProtocolCName ) > 0 ) :
ProtocolsSection + = " [Protocols] \n "
for Guid in ProtocolCName [ : ] :
ProtocolsSection + = Guid + " \n "
ProtocolsSection + = " \n "
if ( len ( ProtocolCNameIa32 ) > 0 ) :
ProtocolsSection + = " [Protocols.IA32] \n "
for Guid in ProtocolCNameIa32 [ : ] :
ProtocolsSection + = Guid + " \n "
ProtocolsSection + = " \n "
if ( len ( ProtocolCNameX64 ) > 0 ) :
ProtocolsSection + = " [Protocols.X64] \n "
for Guid in ProtocolCNameX64 [ : ] :
ProtocolsSection + = Guid + " \n "
ProtocolsSection + = " \n "
if ( len ( ProtocolCNameIPF ) > 0 ) :
ProtocolsSection + = " [Protocols.IPF] \n "
for Guid in ProtocolCNameIPF [ : ] :
ProtocolsSection + = Guid + " \n "
ProtocolsSection + = " \n "
if ( len ( ProtocolCNameEBC ) > 0 ) :
ProtocolsSection + = " [Protocols.EBC] \n "
for Guid in ProtocolCNameEBC [ : ] :
ProtocolsSection + = Guid + " \n "
ProtocolsSection + = " \n "
Output . append ( ProtocolsSection )
if ( options . debug ) :
print ProtocolsSection
# Print the PPI sections
if ( len ( PpiCName ) + len ( PpiCNameIa32 ) + len ( PpiCNameIPF ) + len ( PpiCNameX64 ) + len ( PpiCNameEBC ) ) > 0 :
## PpiSection = "\n" + "#"*80 + "\n#\n"
## PpiSection += "# PPI C Name Section - list of PPI and PPI Notify C Names that this module\n"
## PpiSection += "# uses or produces.\n"
## PpiSection += "#\n" + "#"*80 + "\n\n"
PpiSection = " \n "
if ( len ( PpiCName ) > 0 ) :
PpiSection + = " [Ppis] \n "
for Guid in PpiCName [ : ] :
PpiSection + = Guid + " \n "
PpiSection + = " \n "
if ( len ( PpiCNameIa32 ) > 0 ) :
PpiSection + = " [Ppis.IA32] \n "
for Guid in PpiCNameIa32 [ : ] :
PpiSection + = Guid + " \n "
PpiSection + = " \n "
if ( len ( PpiCNameX64 ) > 0 ) :
PpiSection + = " [Ppis.X64] \n "
for Guid in PpiCNameX64 [ : ] :
PpiSection + = Guid + " \n "
PpiSection + = " \n "
if ( len ( PpiCNameIPF ) > 0 ) :
PpiSection + = " [Ppis.IPF] \n "
for Guid in PpiCNameIPF [ : ] :
PpiSection + = Guid + " \n "
PpiSection + = " \n "
if ( len ( PpiCNameEBC ) > 0 ) :
PpiSection + = " [Ppis.EBC] \n "
for Guid in PpiCNameEBC [ : ] :
PpiSection + = Guid + " \n "
PpiSection + = " \n "
Output . append ( PpiSection )
if ( options . debug ) :
print PpiSection
# Print the PCD sections
if ( ( len ( PcdFF ) + len ( PcdFFIa32 ) + len ( PcdFFX64 ) + len ( PcdFFIpf ) + len ( PcdFFEbc ) ) > 0 ) :
## FeatureFlagSection = "\n" + "#"*80 + "\n#\n"
## FeatureFlagSection += "# Pcd FEATURE_FLAG - list of PCDs that this module is coded for.\n"
## FeatureFlagSection += "#\n" + "#"*80 + "\n\n"
FeatureFlagSection = " \n "
if ( len ( PcdFF ) > 0 ) :
FeatureFlagSection + = " [FeaturePcd.common] \n "
for Entry in PcdFF [ : ] :
FeatureFlagSection + = " " + Entry + " \n "
FeatureFlagSection + = " \n "
if ( len ( PcdFFIa32 ) > 0 ) :
FeatureFlagSection + = " [FeaturePcd.IA32] \n "
for Entry in PcdFFIa32 [ : ] :
FeatureFlagSection + = " " + Entry + " \n "
FeatureFlagSection + = " \n "
if ( len ( PcdFFX64 ) > 0 ) :
FeatureFlagSection + = " [FeaturePcd.X64] \n "
for Entry in PcdFFX64 [ : ] :
FeatureFlagSection + = " " + Entry + " \n "
FeatureFlagSection + = " \n "
if ( len ( PcdFFIpf ) > 0 ) :
FeatureFlagSection + = " [PcdsFeatureFlag.IPF] \n "
for Entry in PcdFFIpf [ : ] :
FeatureFlagSection + = " " + Entry + " \n "
FeatureFlagSection + = " \n "
if ( len ( PcdFFEbc ) > 0 ) :
FeatureFlagSection + = " [FeaturePcd.EBC] \n "
for Entry in PcdFFEbc [ : ] :
FeatureFlagSection + = " " + Entry + " \n "
FeatureFlagSection + = " \n "
Output . append ( FeatureFlagSection )
if ( options . debug ) :
print FeatureFlagSection
if ( ( len ( PcdFAB ) + len ( PcdFABIa32 ) + len ( PcdFABX64 ) + len ( PcdFABIpf ) + len ( PcdFABEbc ) ) > 0 ) :
## FixedAtBuildSection = "\n" + "#"*80 + "\n#\n"
## FixedAtBuildSection += "# Pcd FIXED_AT_BUILD - list of PCDs that this module is coded for.\n"
## FixedAtBuildSection += "#\n" + "#"*80 + "\n\n"
FixedAtBuildSection = " \n "
if ( len ( PcdFAB ) > 0 ) :
FixedAtBuildSection + = " [FixedPcd.common] \n "
for Entry in PcdFAB [ : ] :
FixedAtBuildSection + = " " + Entry + " \n "
FixedAtBuildSection + = " \n "
if ( len ( PcdFABIa32 ) > 0 ) :
FixedAtBuildSection + = " [FixedPcd.IA32] \n "
for Entry in PcdFABIa32 [ : ] :
FixedAtBuildSection + = " " + Entry + " \n "
FixedAtBuildSection + = " \n "
if ( len ( PcdFABX64 ) > 0 ) :
FixedAtBuildSection + = " [FixedPcd.X64] \n "
for Entry in PcdFABX64 [ : ] :
FixedAtBuildSection + = " " + Entry + " \n "
FixedAtBuildSection + = " \n "
if ( len ( PcdFABIpf ) > 0 ) :
FixedAtBuildSection + = " [FixedPcd.IPF] \n "
for Entry in PcdFABIpf [ : ] :
FixedAtBuildSection + = " " + Entry + " \n "
FixedAtBuildSection + = " \n "
if ( len ( PcdFABEbc ) > 0 ) :
FixedAtBuildSection + = " [FixedPcd.EBC] \n "
for Entry in PcdFABEbc [ : ] :
FixedAtBuildSection + = " " + Entry + " \n "
FixedAtBuildSection + = " \n "
Output . append ( FixedAtBuildSection )
if ( options . debug ) :
print FixedAtBuildSection
if ( ( len ( PcdPIM ) + len ( PcdPIMIa32 ) + len ( PcdPIMX64 ) + len ( PcdPIMIpf ) + len ( PcdPIMEbc ) ) > 0 ) :
## PatchableInModuleSection = "\n" + "#"*80 + "\n#\n"
## PatchableInModuleSection += "# Pcd PATCHABLE_IN_MODULE - list of PCDs that this module is coded for.\n"
## PatchableInModuleSection += "#\n" + "#"*80 + "\n\n"
PatchableInModuleSection = " \n "
if ( len ( PcdPIM ) > 0 ) :
PatchableInModuleSection + = " [PatchPcd.common] \n "
for Entry in PcdPIM [ : ] :
PatchableInModuleSection + = " " + Entry + " \n "
PatchableInModuleSection + = " \n "
if ( len ( PcdPIMIa32 ) > 0 ) :
PatchableInModuleSection + = " [PatchPcd.IA32] \n "
for Entry in PcdPIMIa32 [ : ] :
PatchableInModuleSection + = " " + Entry + " \n "
PatchableInModuleSection + = " \n "
if ( len ( PcdPIMX64 ) > 0 ) :
PatchableInModuleSection + = " [PatchPcd.X64] \n "
for Entry in PcdPIMX64 [ : ] :
PatchableInModuleSection + = " " + Entry + " \n "
PatchableInModuleSection + = " \n "
if ( len ( PcdPIMIpf ) > 0 ) :
PatchableInModuleSection + = " [PatchPcd.IPF] \n "
for Entry in PcdPIMIpf [ : ] :
PatchableInModuleSection + = " " + Entry + " \n "
PatchableInModuleSection + = " \n "
if ( len ( PcdPIMEbc ) > 0 ) :
PatchableInModuleSection + = " [PatchPcd.EBC] \n "
for Entry in PcdPIMEbc [ : ] :
PatchableInModuleSection + = " " + Entry + " \n "
PatchableInModuleSection + = " \n "
Output . append ( PatchableInModuleSection )
if ( options . debug ) :
print PatchableInModuleSection
if ( ( len ( PcdDYE ) + len ( PcdDYEIa32 ) + len ( PcdDYEX64 ) + len ( PcdDYEIpf ) + len ( PcdDYEEbc ) ) > 0 ) :
## DynamicExSection = "\n" + "#"*80 + "\n#\n"
## DynamicExSection += "# Pcd DYNAMIC_EX - list of PCDs that this module is coded for.\n"
## DynamicExSection += "#\n" + "#"*80 + "\n\n"
DynamicExSection = " \n "
if ( len ( PcdDYE ) > 0 ) :
DynamicExSection + = " [PcdEx.common] \n "
for Entry in PcdDYE [ : ] :
DynamicExSection + = " " + Entry + " \n "
DynamicExSection + = " \n "
if ( len ( PcdDYEIa32 ) > 0 ) :
DynamicExSection + = " [PcdEx.IA32] \n "
for Entry in PcdDYEIa32 [ : ] :
DynamicExSection + = " " + Entry + " \n "
DynamicExSection + = " \n "
if ( len ( PcdDYEX64 ) > 0 ) :
DynamicExSection + = " [PcdEx.X64] \n "
for Entry in PcdDYEX64 [ : ] :
DynamicExSection + = " " + Entry + " \n "
DynamicExSection + = " \n "
if ( len ( PcdDYEIpf ) > 0 ) :
DynamicExSection + = " [PcdEx.IPF] \n "
for Entry in PcdDYEIpf [ : ] :
DynamicExSection + = " " + Entry + " \n "
DynamicExSection + = " \n "
if ( len ( PcdDYEEbc ) > 0 ) :
DynamicExSection + = " [PcdEx.EBC] \n "
for Entry in PcdDYEEbc [ : ] :
DynamicExSection + = " " + Entry + " \n "
DynamicExSection + = " \n "
Output . append ( DynamicExSection )
if ( options . debug ) :
print DynamicExSection
if ( ( len ( PcdDY ) + len ( PcdDYIa32 ) + len ( PcdDYX64 ) + len ( PcdDYIpf ) + len ( PcdDYEbc ) ) > 0 ) :
## DynamicSection = "\n" + "#"*80 + "\n#\n"
## DynamicSection += "# Pcd DYNAMIC - list of PCDs that this module is coded for.\n"
## DynamicSection += "#\n" + "#"*80 + "\n\n"
DynamicSection = " \n "
if ( len ( PcdDY ) > 0 ) :
DynamicSection + = " [Pcd.common] \n "
for Entry in PcdDY [ : ] :
DynamicSection + = " " + Entry + " \n "
DynamicSection + = " \n "
if ( len ( PcdDYIa32 ) > 0 ) :
DynamicSection + = " [Pcd.IA32] \n "
for Entry in PcdDYIa32 [ : ] :
DynamicSection + = " " + Entry + " \n "
DynamicSection + = " \n "
if ( len ( PcdDYX64 ) > 0 ) :
DynamicSection + = " [Pcd.X64] \n "
for Entry in PcdDYX64 [ : ] :
DynamicSection + = " " + Entry + " \n "
DynamicSection + = " \n "
if ( len ( PcdDYIpf ) > 0 ) :
DynamicSection + = " [Pcd.IPF] \n "
for Entry in PcdDYIpf [ : ] :
DynamicSection + = " " + Entry + " \n "
DynamicSection + = " \n "
if ( len ( PcdDYEbc ) > 0 ) :
DynamicSection + = " [Pcd.EBC] \n "
for Entry in PcdDYEbc [ : ] :
DynamicSection + = " " + Entry + " \n "
DynamicSection + = " \n "
Output . append ( DynamicSection )
if ( options . debug ) :
print DynamicSection
if ( ( len ( Depex ) + len ( DepexIa32 ) + len ( DepexX64 ) + len ( DepexIpf ) + len ( DepexEbc ) ) > 0 ) :
""" We do this if and only if we have Package Dependencies """
## Dpx = "\n" + "#"*80 + "\n#\n"
## Dpx += "# Dependency Expression Section - list of Dependency expressions that are required for\n"
## Dpx += "# this module.\n"
## Dpx += "#\n" + "#"*80 + "\n\n"
Dpx = " \n "
if ( len ( Depex ) > 0 ) :
Dpx + = " [Depex] \n "
for lc in Depex [ : ] :
Dpx + = " " + lc + " \n "
Dpx + = " \n "
if ( len ( DepexIa32 ) > 0 ) :
Dpx + = " [Depex.IA32] \n "
for lc in DepexIa32 [ : ] :
Dpx + = " " + lc + " \n "
Dpx + = " \n "
if ( len ( DepexX64 ) > 0 ) :
Dpx + = " [Depex.X64] \n "
for lc in DepexX64 [ : ] :
Dpx + = " " + lc + " \n "
Dpx + = " \n "
if ( len ( DepexIpf ) > 0 ) :
Dpx + = " [Depex.IPF] \n "
for lc in DepexIpf [ : ] :
Dpx + = " " + lc + " \n "
Dpx + = " \n "
if ( len ( DepexEbc ) > 0 ) :
Dpx + = " [Depex.EBC] \n "
for lc in DepexEbc [ : ] :
Dpx + = " " + lc + " \n "
Dpx + = " \n "
Output . append ( Dpx )
if ( options . debug ) :
print Dpx
if ( len ( MBOlines ) > 0 ) :
BuildSection = " "
## BuildSection = "\n" + "#"*80 + "\n#\n"
## BuildSection += "# Build Options - list of custom build options for this module.\n"
## BuildSection += "#\n" + "#"*80 + "\n\n"
BuildSection + = " \n [BuildOptions] \n "
for mbo in MBOlines :
tool , targs = mbo . split ( " = " , 2 )
BuildSection + = " %-40s = %s \n " % ( tool . strip ( ) , targs . strip ( ) )
Output . append ( BuildSection )
if ( options . debug ) :
print BuildSection
if ( len ( UEList ) > 0 ) :
UserExtensionSection = " "
for UE in UEList [ : ] :
UserExtensionSection + = " [UserExtensions. " + UE [ 0 ] + ' . " ' + UE [ 1 ] + ' " ] \n '
if ( len ( UE [ 2 ] ) > 0 ) :
UserExtensionSection + = ' " ' + UE [ 2 ] + ' " \n '
else :
UserExtensionSection + = " \n "
Output . append ( UserExtensionSection )
if ( options . debug ) :
print UserExtensionSection
print " write file " , outputFile
if ( options . autowrite ) :
fo = open ( outputFile , " w " )
for Section in Output [ : ] :
fo . writelines ( Section )
if ( options . verbose > 1 ) :
print Section
fo . close ( )
elif ( options . outfile ) :
fo = open ( outputFile , " w " )
for Section in Output [ : ] :
fo . writelines ( Section )
fo . close ( )
else :
for Section in Output [ : ] :
print Section
if __name__ == ' __main__ ' :
global options
global args
options , args = myOptionParser ( )
main ( )
sys . exit ( 0 )