]>
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
:
96 FileList
.append(Filename
)
98 FileList
, IsSect
= Section
.Section
.GetFileList(FfsInf
, self
.FileType
, self
.FileExtension
, Dict
, IsMakefile
=IsMakefile
)
100 return FileList
, self
.Alignment
103 Align
= self
.Alignment
105 """ If Section type is 'VERSION'"""
107 if SectionType
== 'VERSION':
109 InfOverrideVerString
= False
110 if FfsInf
.Version
!= None:
111 #StringData = FfsInf.Version
112 BuildNum
= FfsInf
.Version
113 InfOverrideVerString
= True
115 if InfOverrideVerString
:
116 #VerTuple = ('-n', '"' + StringData + '"')
117 if BuildNum
!= None and BuildNum
!= '':
118 BuildNumTuple
= ('-j', BuildNum
)
120 BuildNumTuple
= tuple()
123 OutputFile
= os
.path
.join( OutputPath
, ModuleName
+ 'SEC' + str(Num
) + Ffs
.SectionSuffix
.get(SectionType
))
124 GenFdsGlobalVariable
.GenerateSection(OutputFile
, [], 'EFI_SECTION_VERSION',
127 IsMakefile
=IsMakefile
)
128 OutputFileList
.append(OutputFile
)
131 for File
in FileList
:
133 Num
= '%s.%d' %(SecNum
, Index
)
134 OutputFile
= os
.path
.join(OutputPath
, ModuleName
+ 'SEC' + Num
+ Ffs
.SectionSuffix
.get(SectionType
))
139 if BuildNum
!= None and BuildNum
!= '':
140 BuildNumTuple
= ('-j', BuildNum
)
141 GenFdsGlobalVariable
.GenerateSection(OutputFile
, [], 'EFI_SECTION_VERSION',
144 IsMakefile
=IsMakefile
)
145 OutputFileList
.append(OutputFile
)
148 BuildNum
= StringData
149 if BuildNum
!= None and BuildNum
!= '':
150 BuildNumTuple
= ('-j', BuildNum
)
152 BuildNumTuple
= tuple()
153 BuildNumString
= ' ' + ' '.join(BuildNumTuple
)
155 #if VerString == '' and
156 if BuildNumString
== '':
157 if self
.Optional
== True :
158 GenFdsGlobalVariable
.VerboseLogger( "Optional Section don't exist!")
161 EdkLogger
.error("GenFds", GENFDS_ERROR
, "File: %s miss Version Section value" %InfFileName
)
163 OutputFile
= os
.path
.join( OutputPath
, ModuleName
+ 'SEC' + str(Num
) + Ffs
.SectionSuffix
.get(SectionType
))
164 GenFdsGlobalVariable
.GenerateSection(OutputFile
, [], 'EFI_SECTION_VERSION',
167 IsMakefile
=IsMakefile
)
168 OutputFileList
.append(OutputFile
)
171 # If Section Type is 'UI'
173 elif SectionType
== 'UI':
175 InfOverrideUiString
= False
176 if FfsInf
.Ui
!= None:
177 StringData
= FfsInf
.Ui
178 InfOverrideUiString
= True
180 if InfOverrideUiString
:
182 OutputFile
= os
.path
.join( OutputPath
, ModuleName
+ 'SEC' + str(Num
) + Ffs
.SectionSuffix
.get(SectionType
))
183 GenFdsGlobalVariable
.GenerateSection(OutputFile
, [], 'EFI_SECTION_USER_INTERFACE',
184 Ui
=StringData
, IsMakefile
=IsMakefile
)
185 OutputFileList
.append(OutputFile
)
188 for File
in FileList
:
190 Num
= '%s.%d' %(SecNum
, Index
)
191 OutputFile
= os
.path
.join(OutputPath
, ModuleName
+ 'SEC' + Num
+ Ffs
.SectionSuffix
.get(SectionType
))
195 GenFdsGlobalVariable
.GenerateSection(OutputFile
, [], 'EFI_SECTION_USER_INTERFACE',
196 Ui
=UiString
, IsMakefile
=IsMakefile
)
197 OutputFileList
.append(OutputFile
)
199 if StringData
!= None and len(StringData
) > 0:
200 UiTuple
= ('-n', '"' + StringData
+ '"')
204 if self
.Optional
== True :
205 GenFdsGlobalVariable
.VerboseLogger( "Optional Section don't exist!")
208 EdkLogger
.error("GenFds", GENFDS_ERROR
, "File: %s miss UI Section value" %InfFileName
)
211 OutputFile
= os
.path
.join( OutputPath
, ModuleName
+ 'SEC' + str(Num
) + Ffs
.SectionSuffix
.get(SectionType
))
212 GenFdsGlobalVariable
.GenerateSection(OutputFile
, [], 'EFI_SECTION_USER_INTERFACE',
213 Ui
=StringData
, IsMakefile
=IsMakefile
)
214 OutputFileList
.append(OutputFile
)
218 """If File List is empty"""
220 if self
.Optional
== True:
221 GenFdsGlobalVariable
.VerboseLogger("Optional Section don't exist!")
224 EdkLogger
.error("GenFds", GENFDS_ERROR
, "Output file for %s section could not be found for %s" % (SectionType
, InfFileName
))
227 """Convert the File to Section file one by one """
228 for File
in FileList
:
229 """ Copy Map file to FFS output path """
231 Num
= '%s.%d' %(SecNum
, Index
)
232 OutputFile
= os
.path
.join( OutputPath
, ModuleName
+ 'SEC' + Num
+ Ffs
.SectionSuffix
.get(SectionType
))
233 File
= GenFdsGlobalVariable
.MacroExtend(File
, Dict
)
235 #Get PE Section alignment when align is set to AUTO
236 if self
.Alignment
== 'Auto' and (SectionType
== 'PE32' or SectionType
== 'TE'):
237 ImageObj
= PeImageClass (File
)
238 if ImageObj
.SectionAlignment
< 0x400:
239 Align
= str (ImageObj
.SectionAlignment
)
240 elif ImageObj
.SectionAlignment
< 0x100000:
241 Align
= str (ImageObj
.SectionAlignment
/ 0x400) + 'K'
243 Align
= str (ImageObj
.SectionAlignment
/ 0x100000) + 'M'
245 if File
[(len(File
)-4):] == '.efi':
246 MapFile
= File
.replace('.efi', '.map')
247 CopyMapFile
= os
.path
.join(OutputPath
, ModuleName
+ '.map')
249 if GenFdsGlobalVariable
.CopyList
== []:
250 GenFdsGlobalVariable
.CopyList
= [(MapFile
, CopyMapFile
)]
252 GenFdsGlobalVariable
.CopyList
.append((MapFile
, CopyMapFile
))
254 if os
.path
.exists(MapFile
):
255 if not os
.path
.exists(CopyMapFile
) or \
256 (os
.path
.getmtime(MapFile
) > os
.path
.getmtime(CopyMapFile
)):
257 CopyLongFilePath(MapFile
, CopyMapFile
)
260 FileBeforeStrip
= os
.path
.join(OutputPath
, ModuleName
+ '.efi')
262 if GenFdsGlobalVariable
.CopyList
== []:
263 GenFdsGlobalVariable
.CopyList
= [(File
, FileBeforeStrip
)]
265 GenFdsGlobalVariable
.CopyList
.append((File
, FileBeforeStrip
))
267 if not os
.path
.exists(FileBeforeStrip
) or \
268 (os
.path
.getmtime(File
) > os
.path
.getmtime(FileBeforeStrip
)):
269 CopyLongFilePath(File
, FileBeforeStrip
)
270 StrippedFile
= os
.path
.join(OutputPath
, ModuleName
+ '.stripped')
271 GenFdsGlobalVariable
.GenerateFirmwareImage(
275 IsMakefile
= IsMakefile
279 """For TE Section call GenFw to generate TE image"""
281 if SectionType
== 'TE':
282 TeFile
= os
.path
.join( OutputPath
, ModuleName
+ 'Te.raw')
283 GenFdsGlobalVariable
.GenerateFirmwareImage(
287 IsMakefile
= IsMakefile
291 """Call GenSection"""
292 GenFdsGlobalVariable
.GenerateSection(OutputFile
,
294 Section
.Section
.SectionType
.get (SectionType
),
295 IsMakefile
=IsMakefile
297 OutputFileList
.append(OutputFile
)
299 return OutputFileList
, Align