]>
git.proxmox.com Git - mirror_edk2.git/blob - BaseTools/Source/Python/GenFds/EfiSection.py
2 # process rule section generation
4 # Copyright (c) 2007 - 2014, 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
= {}) :
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
)
95 FileList
, IsSect
= Section
.Section
.GetFileList(FfsInf
, self
.FileType
, self
.FileExtension
, Dict
)
97 return FileList
, self
.Alignment
101 """ If Section type is 'VERSION'"""
103 if SectionType
== 'VERSION':
105 InfOverrideVerString
= False
106 if FfsInf
.Version
!= None:
107 #StringData = FfsInf.Version
108 BuildNum
= FfsInf
.Version
109 InfOverrideVerString
= True
111 if InfOverrideVerString
:
112 #VerTuple = ('-n', '"' + StringData + '"')
113 if BuildNum
!= None and BuildNum
!= '':
114 BuildNumTuple
= ('-j', BuildNum
)
116 BuildNumTuple
= tuple()
119 OutputFile
= os
.path
.join( OutputPath
, ModuleName
+ 'SEC' + str(Num
) + Ffs
.SectionSuffix
.get(SectionType
))
120 GenFdsGlobalVariable
.GenerateSection(OutputFile
, [], 'EFI_SECTION_VERSION',
123 OutputFileList
.append(OutputFile
)
126 for File
in FileList
:
128 Num
= '%s.%d' %(SecNum
, Index
)
129 OutputFile
= os
.path
.join(OutputPath
, ModuleName
+ 'SEC' + Num
+ Ffs
.SectionSuffix
.get(SectionType
))
134 if BuildNum
!= None and BuildNum
!= '':
135 BuildNumTuple
= ('-j', BuildNum
)
136 GenFdsGlobalVariable
.GenerateSection(OutputFile
, [], 'EFI_SECTION_VERSION',
139 OutputFileList
.append(OutputFile
)
142 BuildNum
= StringData
143 if BuildNum
!= None and BuildNum
!= '':
144 BuildNumTuple
= ('-j', BuildNum
)
146 BuildNumTuple
= tuple()
147 BuildNumString
= ' ' + ' '.join(BuildNumTuple
)
149 #if VerString == '' and
150 if BuildNumString
== '':
151 if self
.Optional
== True :
152 GenFdsGlobalVariable
.VerboseLogger( "Optional Section don't exist!")
155 EdkLogger
.error("GenFds", GENFDS_ERROR
, "File: %s miss Version Section value" %InfFileName
)
157 OutputFile
= os
.path
.join( OutputPath
, ModuleName
+ 'SEC' + str(Num
) + Ffs
.SectionSuffix
.get(SectionType
))
158 GenFdsGlobalVariable
.GenerateSection(OutputFile
, [], 'EFI_SECTION_VERSION',
161 OutputFileList
.append(OutputFile
)
164 # If Section Type is 'UI'
166 elif SectionType
== 'UI':
168 InfOverrideUiString
= False
169 if FfsInf
.Ui
!= None:
170 StringData
= FfsInf
.Ui
171 InfOverrideUiString
= True
173 if InfOverrideUiString
:
175 OutputFile
= os
.path
.join( OutputPath
, ModuleName
+ 'SEC' + str(Num
) + Ffs
.SectionSuffix
.get(SectionType
))
176 GenFdsGlobalVariable
.GenerateSection(OutputFile
, [], 'EFI_SECTION_USER_INTERFACE',
178 OutputFileList
.append(OutputFile
)
181 for File
in FileList
:
183 Num
= '%s.%d' %(SecNum
, Index
)
184 OutputFile
= os
.path
.join(OutputPath
, ModuleName
+ 'SEC' + Num
+ Ffs
.SectionSuffix
.get(SectionType
))
188 GenFdsGlobalVariable
.GenerateSection(OutputFile
, [], 'EFI_SECTION_USER_INTERFACE',
190 OutputFileList
.append(OutputFile
)
192 if StringData
!= None and len(StringData
) > 0:
193 UiTuple
= ('-n', '"' + StringData
+ '"')
197 if self
.Optional
== True :
198 GenFdsGlobalVariable
.VerboseLogger( "Optional Section don't exist!")
201 EdkLogger
.error("GenFds", GENFDS_ERROR
, "File: %s miss UI Section value" %InfFileName
)
204 OutputFile
= os
.path
.join( OutputPath
, ModuleName
+ 'SEC' + str(Num
) + Ffs
.SectionSuffix
.get(SectionType
))
205 GenFdsGlobalVariable
.GenerateSection(OutputFile
, [], 'EFI_SECTION_USER_INTERFACE',
207 OutputFileList
.append(OutputFile
)
211 """If File List is empty"""
213 if self
.Optional
== True:
214 GenFdsGlobalVariable
.VerboseLogger("Optional Section don't exist!")
217 EdkLogger
.error("GenFds", GENFDS_ERROR
, "Output file for %s section could not be found for %s" % (SectionType
, InfFileName
))
220 """Convert the File to Section file one by one """
221 for File
in FileList
:
222 """ Copy Map file to FFS output path """
224 Num
= '%s.%d' %(SecNum
, Index
)
225 OutputFile
= os
.path
.join( OutputPath
, ModuleName
+ 'SEC' + Num
+ Ffs
.SectionSuffix
.get(SectionType
))
226 File
= GenFdsGlobalVariable
.MacroExtend(File
, Dict
)
228 #Get PE Section alignment when align is set to AUTO
229 if self
.Alignment
== 'Auto' and (SectionType
== 'PE32' or SectionType
== 'TE'):
230 ImageObj
= PeImageClass (File
)
231 if ImageObj
.SectionAlignment
< 0x400:
232 self
.Alignment
= str (ImageObj
.SectionAlignment
)
234 self
.Alignment
= str (ImageObj
.SectionAlignment
/ 0x400) + 'K'
236 if File
[(len(File
)-4):] == '.efi':
237 MapFile
= File
.replace('.efi', '.map')
238 if os
.path
.exists(MapFile
):
239 CopyMapFile
= os
.path
.join(OutputPath
, ModuleName
+ '.map')
240 if not os
.path
.exists(CopyMapFile
) or \
241 (os
.path
.getmtime(MapFile
) > os
.path
.getmtime(CopyMapFile
)):
242 CopyLongFilePath(MapFile
, CopyMapFile
)
245 FileBeforeStrip
= os
.path
.join(OutputPath
, ModuleName
+ '.efi')
246 if not os
.path
.exists(FileBeforeStrip
) or \
247 (os
.path
.getmtime(File
) > os
.path
.getmtime(FileBeforeStrip
)):
248 CopyLongFilePath(File
, FileBeforeStrip
)
249 StrippedFile
= os
.path
.join(OutputPath
, ModuleName
+ '.stripped')
250 GenFdsGlobalVariable
.GenerateFirmwareImage(
257 """For TE Section call GenFw to generate TE image"""
259 if SectionType
== 'TE':
260 TeFile
= os
.path
.join( OutputPath
, ModuleName
+ 'Te.raw')
261 GenFdsGlobalVariable
.GenerateFirmwareImage(
268 """Call GenSection"""
269 GenFdsGlobalVariable
.GenerateSection(OutputFile
,
271 Section
.Section
.SectionType
.get (SectionType
)
273 OutputFileList
.append(OutputFile
)
275 return OutputFileList
, self
.Alignment