]>
git.proxmox.com Git - mirror_edk2.git/blob - BaseTools/Source/Python/GenFds/EfiSection.py
2 # process rule section generation
4 # Copyright (c) 2007 - 2017, Intel Corporation. All rights reserved.<BR>
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
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.
20 from GenFdsGlobalVariable
import GenFdsGlobalVariable
23 import Common
.LongFilePathOs
as os
24 from CommonDataClass
.FdfClass
import EfiSectionClassObject
25 from Common
import EdkLogger
26 from Common
.BuildToolError
import *
27 from Common
.Misc
import PeImageClass
28 from Common
.LongFilePathSupport
import OpenLongFilePath
as open
29 from Common
.LongFilePathSupport
import CopyLongFilePath
31 ## generate rule section
34 class EfiSection (EfiSectionClassObject
):
38 # @param self The object pointer
41 EfiSectionClassObject
.__init
__(self
)
43 ## GenSection() method
45 # Generate rule section
47 # @param self The object pointer
48 # @param OutputPath Where to place output file
49 # @param ModuleName Which module this section belongs to
50 # @param SecNum Index of section
51 # @param KeyStringList Filter for inputs of section generation
52 # @param FfsInf FfsInfStatement object that contains this section data
53 # @param Dict dictionary contains macro and its value
54 # @retval tuple (Generated file name list, section alignment)
56 def GenSection(self
, OutputPath
, ModuleName
, SecNum
, KeyStringList
, FfsInf
= None, Dict
= {}, IsMakefile
= False) :
58 if self
.FileName
!= None and self
.FileName
.startswith('PCD('):
59 self
.FileName
= GenFdsGlobalVariable
.GetPcdValue(self
.FileName
)
60 """Prepare the parameter of GenSection"""
62 InfFileName
= FfsInf
.InfFileName
63 SectionType
= FfsInf
.__ExtendMacro
__(self
.SectionType
)
64 Filename
= FfsInf
.__ExtendMacro
__(self
.FileName
)
65 BuildNum
= FfsInf
.__ExtendMacro
__(self
.BuildNum
)
66 StringData
= FfsInf
.__ExtendMacro
__(self
.StringData
)
68 if FfsInf
.ModuleType
in ('SEC', 'PEI_CORE', 'PEIM') and SectionType
in ('TE', 'PE32'):
69 if FfsInf
.KeepReloc
!= None:
70 NoStrip
= FfsInf
.KeepReloc
71 elif FfsInf
.KeepRelocFromRule
!= None:
72 NoStrip
= FfsInf
.KeepRelocFromRule
73 elif self
.KeepReloc
!= None:
74 NoStrip
= self
.KeepReloc
75 elif FfsInf
.ShadowFromInfFile
!= None:
76 NoStrip
= FfsInf
.ShadowFromInfFile
78 EdkLogger
.error("GenFds", GENFDS_ERROR
, "Module %s apply rule for None!" %ModuleName
)
80 """If the file name was pointed out, add it in FileList"""
83 Filename
= GenFdsGlobalVariable
.MacroExtend(Filename
, Dict
)
84 # check if the path is absolute or relative
85 if os
.path
.isabs(Filename
):
86 Filename
= os
.path
.normpath(Filename
)
88 Filename
= os
.path
.normpath(os
.path
.join(FfsInf
.EfiOutputPath
, Filename
))
91 FileList
.append(Filename
)
92 elif os
.path
.exists(Filename
):
93 FileList
.append(Filename
)
94 elif '.depex' in FfsInf
.FinalTargetSuffixMap
or FfsInf
.Depex
:
95 FileList
.append(Filename
)
97 FileList
, IsSect
= Section
.Section
.GetFileList(FfsInf
, self
.FileType
, self
.FileExtension
, Dict
)
99 return FileList
, self
.Alignment
102 Align
= self
.Alignment
104 """ If Section type is 'VERSION'"""
106 if SectionType
== 'VERSION':
108 InfOverrideVerString
= False
109 if FfsInf
.Version
!= None:
110 #StringData = FfsInf.Version
111 BuildNum
= FfsInf
.Version
112 InfOverrideVerString
= True
114 if InfOverrideVerString
:
115 #VerTuple = ('-n', '"' + StringData + '"')
116 if BuildNum
!= None and BuildNum
!= '':
117 BuildNumTuple
= ('-j', BuildNum
)
119 BuildNumTuple
= tuple()
122 OutputFile
= os
.path
.join( OutputPath
, ModuleName
+ 'SEC' + str(Num
) + Ffs
.SectionSuffix
.get(SectionType
))
123 GenFdsGlobalVariable
.GenerateSection(OutputFile
, [], 'EFI_SECTION_VERSION',
126 IsMakefile
=IsMakefile
)
127 OutputFileList
.append(OutputFile
)
130 for File
in FileList
:
132 Num
= '%s.%d' %(SecNum
, Index
)
133 OutputFile
= os
.path
.join(OutputPath
, ModuleName
+ 'SEC' + Num
+ Ffs
.SectionSuffix
.get(SectionType
))
138 if BuildNum
!= None and BuildNum
!= '':
139 BuildNumTuple
= ('-j', BuildNum
)
140 GenFdsGlobalVariable
.GenerateSection(OutputFile
, [], 'EFI_SECTION_VERSION',
143 IsMakefile
=IsMakefile
)
144 OutputFileList
.append(OutputFile
)
147 BuildNum
= StringData
148 if BuildNum
!= None and BuildNum
!= '':
149 BuildNumTuple
= ('-j', BuildNum
)
151 BuildNumTuple
= tuple()
152 BuildNumString
= ' ' + ' '.join(BuildNumTuple
)
154 #if VerString == '' and
155 if BuildNumString
== '':
156 if self
.Optional
== True :
157 GenFdsGlobalVariable
.VerboseLogger( "Optional Section don't exist!")
160 EdkLogger
.error("GenFds", GENFDS_ERROR
, "File: %s miss Version Section value" %InfFileName
)
162 OutputFile
= os
.path
.join( OutputPath
, ModuleName
+ 'SEC' + str(Num
) + Ffs
.SectionSuffix
.get(SectionType
))
163 GenFdsGlobalVariable
.GenerateSection(OutputFile
, [], 'EFI_SECTION_VERSION',
166 IsMakefile
=IsMakefile
)
167 OutputFileList
.append(OutputFile
)
170 # If Section Type is 'UI'
172 elif SectionType
== 'UI':
174 InfOverrideUiString
= False
175 if FfsInf
.Ui
!= None:
176 StringData
= FfsInf
.Ui
177 InfOverrideUiString
= True
179 if InfOverrideUiString
:
181 OutputFile
= os
.path
.join( OutputPath
, ModuleName
+ 'SEC' + str(Num
) + Ffs
.SectionSuffix
.get(SectionType
))
182 GenFdsGlobalVariable
.GenerateSection(OutputFile
, [], 'EFI_SECTION_USER_INTERFACE',
183 Ui
=StringData
, IsMakefile
=IsMakefile
)
184 OutputFileList
.append(OutputFile
)
187 for File
in FileList
:
189 Num
= '%s.%d' %(SecNum
, Index
)
190 OutputFile
= os
.path
.join(OutputPath
, ModuleName
+ 'SEC' + Num
+ Ffs
.SectionSuffix
.get(SectionType
))
194 GenFdsGlobalVariable
.GenerateSection(OutputFile
, [], 'EFI_SECTION_USER_INTERFACE',
195 Ui
=UiString
, IsMakefile
=IsMakefile
)
196 OutputFileList
.append(OutputFile
)
198 if StringData
!= None and len(StringData
) > 0:
199 UiTuple
= ('-n', '"' + StringData
+ '"')
203 if self
.Optional
== True :
204 GenFdsGlobalVariable
.VerboseLogger( "Optional Section don't exist!")
207 EdkLogger
.error("GenFds", GENFDS_ERROR
, "File: %s miss UI Section value" %InfFileName
)
210 OutputFile
= os
.path
.join( OutputPath
, ModuleName
+ 'SEC' + str(Num
) + Ffs
.SectionSuffix
.get(SectionType
))
211 GenFdsGlobalVariable
.GenerateSection(OutputFile
, [], 'EFI_SECTION_USER_INTERFACE',
212 Ui
=StringData
, IsMakefile
=IsMakefile
)
213 OutputFileList
.append(OutputFile
)
217 """If File List is empty"""
219 if self
.Optional
== True:
220 GenFdsGlobalVariable
.VerboseLogger("Optional Section don't exist!")
223 EdkLogger
.error("GenFds", GENFDS_ERROR
, "Output file for %s section could not be found for %s" % (SectionType
, InfFileName
))
226 """Convert the File to Section file one by one """
227 for File
in FileList
:
228 """ Copy Map file to FFS output path """
230 Num
= '%s.%d' %(SecNum
, Index
)
231 OutputFile
= os
.path
.join( OutputPath
, ModuleName
+ 'SEC' + Num
+ Ffs
.SectionSuffix
.get(SectionType
))
232 File
= GenFdsGlobalVariable
.MacroExtend(File
, Dict
)
234 #Get PE Section alignment when align is set to AUTO
235 if self
.Alignment
== 'Auto' and (SectionType
== 'PE32' or SectionType
== 'TE'):
236 ImageObj
= PeImageClass (File
)
237 if ImageObj
.SectionAlignment
< 0x400:
238 Align
= str (ImageObj
.SectionAlignment
)
239 elif ImageObj
.SectionAlignment
< 0x100000:
240 Align
= str (ImageObj
.SectionAlignment
/ 0x400) + 'K'
242 Align
= str (ImageObj
.SectionAlignment
/ 0x100000) + 'M'
244 if File
[(len(File
)-4):] == '.efi':
245 MapFile
= File
.replace('.efi', '.map')
246 CopyMapFile
= os
.path
.join(OutputPath
, ModuleName
+ '.map')
248 if GenFdsGlobalVariable
.CopyList
== []:
249 GenFdsGlobalVariable
.CopyList
= [(MapFile
, CopyMapFile
)]
251 GenFdsGlobalVariable
.CopyList
.append((MapFile
, CopyMapFile
))
253 if os
.path
.exists(MapFile
):
254 if not os
.path
.exists(CopyMapFile
) or \
255 (os
.path
.getmtime(MapFile
) > os
.path
.getmtime(CopyMapFile
)):
256 CopyLongFilePath(MapFile
, CopyMapFile
)
259 FileBeforeStrip
= os
.path
.join(OutputPath
, ModuleName
+ '.efi')
261 if GenFdsGlobalVariable
.CopyList
== []:
262 GenFdsGlobalVariable
.CopyList
= [(File
, FileBeforeStrip
)]
264 GenFdsGlobalVariable
.CopyList
.append((File
, FileBeforeStrip
))
266 if not os
.path
.exists(FileBeforeStrip
) or \
267 (os
.path
.getmtime(File
) > os
.path
.getmtime(FileBeforeStrip
)):
268 CopyLongFilePath(File
, FileBeforeStrip
)
269 StrippedFile
= os
.path
.join(OutputPath
, ModuleName
+ '.stripped')
270 GenFdsGlobalVariable
.GenerateFirmwareImage(
274 IsMakefile
= IsMakefile
278 """For TE Section call GenFw to generate TE image"""
280 if SectionType
== 'TE':
281 TeFile
= os
.path
.join( OutputPath
, ModuleName
+ 'Te.raw')
282 GenFdsGlobalVariable
.GenerateFirmwareImage(
286 IsMakefile
= IsMakefile
290 """Call GenSection"""
291 GenFdsGlobalVariable
.GenerateSection(OutputFile
,
293 Section
.Section
.SectionType
.get (SectionType
),
294 IsMakefile
=IsMakefile
296 OutputFileList
.append(OutputFile
)
298 return OutputFileList
, Align