2009-07-17 09:10:31 +00:00
## @file
# section base class
#
2015-08-26 06:33:31 +00:00
# Copyright (c) 2007-2015, Intel Corporation. All rights reserved.<BR>
2009-07-17 09:10:31 +00:00
#
2010-05-18 05:04:32 +00:00
# This program and the accompanying materials
2009-07-17 09:10:31 +00:00
# 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.
#
##
# Import Modules
#
from CommonDataClass.FdfClass import SectionClassObject
from GenFdsGlobalVariable import GenFdsGlobalVariable
2014-08-15 03:06:48 +00:00
import Common.LongFilePathOs as os , glob
2009-07-17 09:10:31 +00:00
from Common import EdkLogger
from Common.BuildToolError import *
## section base class
#
#
class Section ( SectionClassObject ):
SectionType = {
'RAW' : 'EFI_SECTION_RAW' ,
'FREEFORM' : 'EFI_SECTION_FREEFORM_SUBTYPE_GUID' ,
'PE32' : 'EFI_SECTION_PE32' ,
'PIC' : 'EFI_SECTION_PIC' ,
'TE' : 'EFI_SECTION_TE' ,
'FV_IMAGE' : 'EFI_SECTION_FIRMWARE_VOLUME_IMAGE' ,
'DXE_DEPEX' : 'EFI_SECTION_DXE_DEPEX' ,
'PEI_DEPEX' : 'EFI_SECTION_PEI_DEPEX' ,
'GUIDED' : 'EFI_SECTION_GUID_DEFINED' ,
'COMPRESS' : 'EFI_SECTION_COMPRESSION' ,
'UI' : 'EFI_SECTION_USER_INTERFACE' ,
'SMM_DEPEX' : 'EFI_SECTION_SMM_DEPEX'
}
BinFileType = {
'GUID' : '.guid' ,
'ACPI' : '.acpi' ,
'ASL' : '.asl' ,
'UEFI_APP' : '.app' ,
'LIB' : '.lib' ,
'PE32' : '.pe32' ,
'PIC' : '.pic' ,
'PEI_DEPEX' : '.depex' ,
'SEC_PEI_DEPEX' : '.depex' ,
'TE' : '.te' ,
'UNI_VER' : '.ver' ,
'VER' : '.ver' ,
'UNI_UI' : '.ui' ,
'UI' : '.ui' ,
'BIN' : '.bin' ,
'RAW' : '.raw' ,
'COMPAT16' : '.comp16' ,
'FV' : '.fv'
}
SectFileType = {
'SEC_GUID' : '.sec' ,
'SEC_PE32' : '.sec' ,
'SEC_PIC' : '.sec' ,
'SEC_TE' : '.sec' ,
'SEC_VER' : '.sec' ,
'SEC_UI' : '.sec' ,
'SEC_COMPAT16' : '.sec' ,
'SEC_BIN' : '.sec'
}
ToolGuid = {
'0xa31280ad-0x481e-0x41b6-0x95e8-0x127f-0x4c984779' : 'TianoCompress' ,
'0xee4e5898-0x3914-0x4259-0x9d6e-0xdc7b-0xd79403cf' : 'LzmaCompress'
}
## The constructor
#
# @param self The object pointer
#
def __init__ ( self ):
SectionClassObject . __init__ ( self )
## GenSection() method
#
# virtual function
#
# @param self The object pointer
# @param OutputPath Where to place output file
# @param ModuleName Which module this section belongs to
# @param SecNum Index of section
# @param KeyStringList Filter for inputs of section generation
# @param FfsInf FfsInfStatement object that contains this section data
# @param Dict dictionary contains macro and its value
#
def GenSection ( self , OutputPath , GuidName , SecNum , keyStringList , FfsInf = None , Dict = {}):
pass
## GetFileList() method
#
# Generate compressed section
#
# @param self The object pointer
# @param FfsInf FfsInfStatement object that contains file list
# @param FileType File type to get
# @param FileExtension File extension to get
# @param Dict dictionary contains macro and its value
# @retval tuple (File list, boolean)
#
def GetFileList ( FfsInf , FileType , FileExtension , Dict = {}):
if FileType in Section . SectFileType . keys () :
IsSect = True
else :
IsSect = False
if FileExtension != None :
Suffix = FileExtension
elif IsSect :
Suffix = Section . SectionType . get ( FileType )
else :
Suffix = Section . BinFileType . get ( FileType )
if FfsInf == None :
EdkLogger . error ( "GenFds" , GENFDS_ERROR , 'Inf File does not exist!' )
FileList = []
if FileType != None :
for File in FfsInf . BinFileList :
if File . Arch == "COMMON" or FfsInf . CurrentArch == File . Arch :
2014-08-28 13:53:34 +00:00
if File . Type == FileType or ( int ( FfsInf . PiSpecVersion , 16 ) >= 0x0001000A \
and FileType == 'DXE_DPEX' and File . Type == 'SMM_DEPEX' ) \
or ( FileType == 'TE' and File . Type == 'PE32' ):
2009-07-17 09:10:31 +00:00
if '*' in FfsInf . TargetOverrideList or File . Target == '*' or File . Target in FfsInf . TargetOverrideList or FfsInf . TargetOverrideList == []:
2014-08-28 13:53:34 +00:00
FileList . append ( FfsInf . PatchEfiFile ( File . Path , File . Type ))
2009-07-17 09:10:31 +00:00
else :
GenFdsGlobalVariable . InfLogger ( " \n Build Target \' %s \' of File %s is not in the Scope of %s specified by INF %s in FDF" % ( File . Target , File . File , FfsInf . TargetOverrideList , FfsInf . InfFileName ))
else :
GenFdsGlobalVariable . VerboseLogger ( " \n File Type \' %s \' of File %s in %s is not same with file type \' %s \' from Rule in FDF" % ( File . Type , File . File , FfsInf . InfFileName , FileType ))
else :
GenFdsGlobalVariable . InfLogger ( " \n Current ARCH \' %s \' of File %s is not in the Support Arch Scope of %s specified by INF %s in FDF" % ( FfsInf . CurrentArch , File . File , File . Arch , FfsInf . InfFileName ))
2015-06-08 09:44:01 +00:00
if Suffix != None and os . path . exists ( FfsInf . EfiOutputPath ):
#
# Get Makefile path and time stamp
#
MakefileDir = FfsInf . EfiOutputPath [: - len ( 'OUTPUT' )]
Makefile = os . path . join ( MakefileDir , 'Makefile' )
if not os . path . exists ( Makefile ):
Makefile = os . path . join ( MakefileDir , 'GNUmakefile' )
2015-08-26 06:33:31 +00:00
if os . path . exists ( Makefile ):
2015-06-08 09:44:01 +00:00
# Update to search files with suffix in all sub-dirs.
Tuple = os . walk ( FfsInf . EfiOutputPath )
for Dirpath , Dirnames , Filenames in Tuple :
for F in Filenames :
if os . path . splitext ( F )[ 1 ] in ( Suffix ):
FullName = os . path . join ( Dirpath , F )
if os . path . getmtime ( FullName ) > os . path . getmtime ( Makefile ):
FileList . append ( FullName )
2015-08-26 06:33:31 +00:00
if not FileList :
SuffixMap = FfsInf . GetFinalTargetSuffixMap ()
if Suffix in SuffixMap :
FileList . extend ( SuffixMap [ Suffix ])
2010-02-28 23:39:39 +00:00
#Process the file lists is alphabetical for a same section type
if len ( FileList ) > 1 :
FileList . sort ()
2009-07-17 09:10:31 +00:00
return FileList , IsSect
GetFileList = staticmethod ( GetFileList )