]> git.proxmox.com Git - mirror_edk2.git/blob - BaseTools/Source/Python/GenFds/Section.py
d26f464ab97be7e4fecefb0e68bf8c25686fda63
[mirror_edk2.git] / BaseTools / Source / Python / GenFds / Section.py
1 ## @file
2 # section base class
3 #
4 # Copyright (c) 2007 - 2011, Intel Corporation. All rights reserved.<BR>
5 #
6 # This program and the accompanying materials
7 # are licensed and made available under the terms and conditions of the BSD License
8 # which accompanies this distribution. The full text of the license may be found at
9 # http://opensource.org/licenses/bsd-license.php
10 #
11 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13 #
14
15 ##
16 # Import Modules
17 #
18 from CommonDataClass.FdfClass import SectionClassObject
19 from GenFdsGlobalVariable import GenFdsGlobalVariable
20 import os, glob
21 from Common import EdkLogger
22 from Common.BuildToolError import *
23
24 ## section base class
25 #
26 #
27 class Section (SectionClassObject):
28 SectionType = {
29 'RAW' : 'EFI_SECTION_RAW',
30 'FREEFORM' : 'EFI_SECTION_FREEFORM_SUBTYPE_GUID',
31 'PE32' : 'EFI_SECTION_PE32',
32 'PIC' : 'EFI_SECTION_PIC',
33 'TE' : 'EFI_SECTION_TE',
34 'FV_IMAGE' : 'EFI_SECTION_FIRMWARE_VOLUME_IMAGE',
35 'DXE_DEPEX' : 'EFI_SECTION_DXE_DEPEX',
36 'PEI_DEPEX' : 'EFI_SECTION_PEI_DEPEX',
37 'GUIDED' : 'EFI_SECTION_GUID_DEFINED',
38 'COMPRESS' : 'EFI_SECTION_COMPRESSION',
39 'UI' : 'EFI_SECTION_USER_INTERFACE',
40 'SMM_DEPEX' : 'EFI_SECTION_SMM_DEPEX'
41 }
42
43 BinFileType = {
44 'GUID' : '.guid',
45 'ACPI' : '.acpi',
46 'ASL' : '.asl' ,
47 'UEFI_APP' : '.app',
48 'LIB' : '.lib',
49 'PE32' : '.pe32',
50 'PIC' : '.pic',
51 'PEI_DEPEX' : '.depex',
52 'SEC_PEI_DEPEX' : '.depex',
53 'TE' : '.te',
54 'UNI_VER' : '.ver',
55 'VER' : '.ver',
56 'UNI_UI' : '.ui',
57 'UI' : '.ui',
58 'BIN' : '.bin',
59 'RAW' : '.raw',
60 'COMPAT16' : '.comp16',
61 'FV' : '.fv'
62 }
63
64 SectFileType = {
65 'SEC_GUID' : '.sec' ,
66 'SEC_PE32' : '.sec' ,
67 'SEC_PIC' : '.sec',
68 'SEC_TE' : '.sec',
69 'SEC_VER' : '.sec',
70 'SEC_UI' : '.sec',
71 'SEC_COMPAT16' : '.sec',
72 'SEC_BIN' : '.sec'
73 }
74
75 ToolGuid = {
76 '0xa31280ad-0x481e-0x41b6-0x95e8-0x127f-0x4c984779' : 'TianoCompress',
77 '0xee4e5898-0x3914-0x4259-0x9d6e-0xdc7b-0xd79403cf' : 'LzmaCompress'
78 }
79
80 ## The constructor
81 #
82 # @param self The object pointer
83 #
84 def __init__(self):
85 SectionClassObject.__init__(self)
86
87 ## GenSection() method
88 #
89 # virtual function
90 #
91 # @param self The object pointer
92 # @param OutputPath Where to place output file
93 # @param ModuleName Which module this section belongs to
94 # @param SecNum Index of section
95 # @param KeyStringList Filter for inputs of section generation
96 # @param FfsInf FfsInfStatement object that contains this section data
97 # @param Dict dictionary contains macro and its value
98 #
99 def GenSection(self, OutputPath, GuidName, SecNum, keyStringList, FfsInf = None, Dict = {}):
100 pass
101
102 ## GetFileList() method
103 #
104 # Generate compressed section
105 #
106 # @param self The object pointer
107 # @param FfsInf FfsInfStatement object that contains file list
108 # @param FileType File type to get
109 # @param FileExtension File extension to get
110 # @param Dict dictionary contains macro and its value
111 # @retval tuple (File list, boolean)
112 #
113 def GetFileList(FfsInf, FileType, FileExtension, Dict = {}):
114 if FileType in Section.SectFileType.keys() :
115 IsSect = True
116 else :
117 IsSect = False
118
119 if FileExtension != None:
120 Suffix = FileExtension
121 elif IsSect :
122 Suffix = Section.SectionType.get(FileType)
123 else:
124 Suffix = Section.BinFileType.get(FileType)
125 if FfsInf == None:
126 EdkLogger.error("GenFds", GENFDS_ERROR, 'Inf File does not exist!')
127
128 FileList = []
129 if FileType != None:
130 for File in FfsInf.BinFileList:
131 if File.Arch == "COMMON" or FfsInf.CurrentArch == File.Arch:
132 if File.Type == FileType or (int(FfsInf.PiSpecVersion, 16) >= 0x0001000A and FileType == 'DXE_DPEX'and File.Type == 'SMM_DEPEX'):
133 if '*' in FfsInf.TargetOverrideList or File.Target == '*' or File.Target in FfsInf.TargetOverrideList or FfsInf.TargetOverrideList == []:
134 FileList.append(File.Path)
135 else:
136 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))
137 else:
138 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))
139 else:
140 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))
141
142 if Suffix != None:
143 for File in FfsInf.GetFinalBuildTargetList():
144 if os.path.splitext(File)[1] in (Suffix):
145 FileList.append(File)
146
147 #Process the file lists is alphabetical for a same section type
148 if len (FileList) > 1:
149 FileList.sort()
150
151 return FileList, IsSect
152 GetFileList = staticmethod(GetFileList)