GenFds GenSection will search the output file based on the file extension. If the output file has no extension, it should be skip. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Liming Gao <liming.gao@intel.com> Reviewed-by: Andrew Fish <afish@apple.com>
		
			
				
	
	
		
			172 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			172 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| ## @file
 | |
| # section base class
 | |
| #
 | |
| #  Copyright (c) 2007-2015, 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.
 | |
| #
 | |
| 
 | |
| ##
 | |
| # Import Modules
 | |
| #
 | |
| from CommonDataClass.FdfClass import SectionClassObject
 | |
| from GenFdsGlobalVariable import GenFdsGlobalVariable
 | |
| import Common.LongFilePathOs as os, glob
 | |
| 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:
 | |
|                     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'):
 | |
|                         if '*' in FfsInf.TargetOverrideList or File.Target == '*' or File.Target in FfsInf.TargetOverrideList or FfsInf.TargetOverrideList == []:
 | |
|                             FileList.append(FfsInf.PatchEfiFile(File.Path, File.Type))
 | |
|                         else:
 | |
|                             GenFdsGlobalVariable.InfLogger ("\nBuild 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 ("\nFile 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 ("\nCurrent 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))
 | |
| 
 | |
|         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')
 | |
|             if os.path.exists(Makefile):
 | |
|                 # 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] == Suffix:
 | |
|                             FullName = os.path.join(Dirpath, F)
 | |
|                             if os.path.getmtime(FullName) > os.path.getmtime(Makefile):
 | |
|                                 FileList.append(FullName)
 | |
|             if not FileList:
 | |
|                 SuffixMap = FfsInf.GetFinalTargetSuffixMap()
 | |
|                 if Suffix in SuffixMap:
 | |
|                     FileList.extend(SuffixMap[Suffix])
 | |
|                 
 | |
|         #Process the file lists is alphabetical for a same section type
 | |
|         if len (FileList) > 1:
 | |
|             FileList.sort()
 | |
| 
 | |
|         return FileList, IsSect
 | |
|     GetFileList = staticmethod(GetFileList)
 |