## @file | |
# section base class | |
# | |
# Copyright (c) 2007-2018, Intel Corporation. All rights reserved.<BR> | |
# | |
# SPDX-License-Identifier: BSD-2-Clause-Patent | |
# | |
## | |
# Import Modules | |
# | |
from __future__ import absolute_import | |
from CommonDataClass.FdfClass import SectionClassObject | |
from .GenFdsGlobalVariable import GenFdsGlobalVariable | |
import Common.LongFilePathOs as os, glob | |
from Common import EdkLogger | |
from Common.BuildToolError import * | |
from Common.DataType import * | |
## section base class | |
# | |
# | |
class Section (SectionClassObject): | |
SectionType = { | |
'RAW' : 'EFI_SECTION_RAW', | |
'FREEFORM' : 'EFI_SECTION_FREEFORM_SUBTYPE_GUID', | |
BINARY_FILE_TYPE_PE32 : 'EFI_SECTION_PE32', | |
BINARY_FILE_TYPE_PIC : 'EFI_SECTION_PIC', | |
BINARY_FILE_TYPE_TE : 'EFI_SECTION_TE', | |
'FV_IMAGE' : 'EFI_SECTION_FIRMWARE_VOLUME_IMAGE', | |
'COMPAT16' : 'EFI_SECTION_COMPATIBILITY16', | |
BINARY_FILE_TYPE_DXE_DEPEX : 'EFI_SECTION_DXE_DEPEX', | |
BINARY_FILE_TYPE_PEI_DEPEX : 'EFI_SECTION_PEI_DEPEX', | |
'GUIDED' : 'EFI_SECTION_GUID_DEFINED', | |
'COMPRESS' : 'EFI_SECTION_COMPRESSION', | |
BINARY_FILE_TYPE_UI : 'EFI_SECTION_USER_INTERFACE', | |
BINARY_FILE_TYPE_SMM_DEPEX : 'EFI_SECTION_SMM_DEPEX' | |
} | |
BinFileType = { | |
BINARY_FILE_TYPE_GUID : '.guid', | |
'ACPI' : '.acpi', | |
'ASL' : '.asl' , | |
BINARY_FILE_TYPE_UEFI_APP : '.app', | |
BINARY_FILE_TYPE_LIB : '.lib', | |
BINARY_FILE_TYPE_PE32 : '.pe32', | |
BINARY_FILE_TYPE_PIC : '.pic', | |
BINARY_FILE_TYPE_PEI_DEPEX : '.depex', | |
'SEC_PEI_DEPEX' : '.depex', | |
BINARY_FILE_TYPE_TE : '.te', | |
BINARY_FILE_TYPE_UNI_VER : '.ver', | |
BINARY_FILE_TYPE_VER : '.ver', | |
BINARY_FILE_TYPE_UNI_UI : '.ui', | |
BINARY_FILE_TYPE_UI : '.ui', | |
BINARY_FILE_TYPE_BIN : '.bin', | |
'RAW' : '.raw', | |
'COMPAT16' : '.comp16', | |
BINARY_FILE_TYPE_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 = None): | |
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 = None, IsMakefile=False, SectionType=None): | |
IsSect = FileType in Section.SectFileType | |
if FileExtension is not None: | |
Suffix = FileExtension | |
elif IsSect : | |
Suffix = Section.SectionType.get(FileType) | |
else: | |
Suffix = Section.BinFileType.get(FileType) | |
if FfsInf is None: | |
EdkLogger.error("GenFds", GENFDS_ERROR, 'Inf File does not exist!') | |
FileList = [] | |
if FileType is not None: | |
for File in FfsInf.BinFileList: | |
if File.Arch == TAB_ARCH_COMMON or FfsInf.CurrentArch == File.Arch: | |
if File.Type == FileType or (int(FfsInf.PiSpecVersion, 16) >= 0x0001000A \ | |
and FileType == 'DXE_DPEX' and File.Type == BINARY_FILE_TYPE_SMM_DEPEX) \ | |
or (FileType == BINARY_FILE_TYPE_TE and File.Type == BINARY_FILE_TYPE_PE32): | |
if TAB_STAR in FfsInf.TargetOverrideList or File.Target == TAB_STAR 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)) | |
elif FileType is None and SectionType == BINARY_FILE_TYPE_RAW: | |
for File in FfsInf.BinFileList: | |
if File.Ext == Suffix: | |
FileList.append(File.Path) | |
if (not IsMakefile and Suffix is not None and os.path.exists(FfsInf.EfiOutputPath)) or (IsMakefile and Suffix is not None): | |
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) |