| ## @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] in (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) |