2 # process APRIORI file data and generate PEI/DXE APRIORI file
4 # Copyright (c) 2007 - 2018, 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.
19 import Common
.LongFilePathOs
as os
21 import FfsFileStatement
22 from GenFdsGlobalVariable
import GenFdsGlobalVariable
23 from CommonDataClass
.FdfClass
import AprioriSectionClassObject
24 from Common
.String
import *
25 from Common
.Misc
import SaveFileOnChange
,PathClass
26 from Common
import EdkLogger
27 from Common
.BuildToolError
import *
28 from Common
.DataType
import TAB_COMMON
30 ## process APRIORI file data and generate PEI/DXE APRIORI file
33 class AprioriSection (AprioriSectionClassObject
):
36 # @param self The object pointer
39 AprioriSectionClassObject
.__init
__(self
)
44 # Generate FFS for APRIORI file
46 # @param self The object pointer
47 # @param FvName for whom apriori file generated
48 # @param Dict dictionary contains macro and its value
49 # @retval string Generated file name
51 def GenFfs (self
, FvName
, Dict
= {}, IsMakefile
= False):
52 DXE_GUID
= "FC510EE7-FFDC-11D4-BD41-0080C73C8881"
53 PEI_GUID
= "1B45CC0A-156A-428A-AF62-49864DA0E6E6"
54 Buffer
= StringIO
.StringIO('')
55 AprioriFileGuid
= DXE_GUID
56 if self
.AprioriType
== "PEI":
57 AprioriFileGuid
= PEI_GUID
58 OutputAprFilePath
= os
.path
.join (GenFdsGlobalVariable
.WorkSpaceDir
, \
59 GenFdsGlobalVariable
.FfsDir
,\
60 AprioriFileGuid
+ FvName
)
61 if not os
.path
.exists(OutputAprFilePath
) :
62 os
.makedirs(OutputAprFilePath
)
64 OutputAprFileName
= os
.path
.join( OutputAprFilePath
, \
65 AprioriFileGuid
+ FvName
+ '.Apri' )
66 AprFfsFileName
= os
.path
.join (OutputAprFilePath
,\
67 AprioriFileGuid
+ FvName
+ '.Ffs')
69 Dict
.update(self
.DefineVarDict
)
71 for FfsObj
in self
.FfsList
:
73 if isinstance(FfsObj
, FfsFileStatement
.FileStatement
):
74 Guid
= FfsObj
.NameGuid
76 InfFileName
= NormPath(FfsObj
.InfFileName
)
77 Arch
= FfsObj
.GetCurrentArch()
80 Dict
['$(ARCH)'] = Arch
81 InfFileName
= GenFdsGlobalVariable
.MacroExtend(InfFileName
, Dict
, Arch
)
84 Inf
= GenFdsGlobalVariable
.WorkSpace
.BuildObject
[PathClass(InfFileName
, GenFdsGlobalVariable
.WorkSpaceDir
), Arch
, GenFdsGlobalVariable
.TargetName
, GenFdsGlobalVariable
.ToolChainTag
]
88 Inf
= GenFdsGlobalVariable
.WorkSpace
.BuildObject
[PathClass(InfFileName
, GenFdsGlobalVariable
.WorkSpaceDir
), TAB_COMMON
, GenFdsGlobalVariable
.TargetName
, GenFdsGlobalVariable
.ToolChainTag
]
91 self
.BinFileList
= Inf
.Module
.Binaries
92 if self
.BinFileList
== []:
93 EdkLogger
.error("GenFds", RESOURCE_NOT_AVAILABLE
,
94 "INF %s not found in build ARCH %s!" \
95 % (InfFileName
, GenFdsGlobalVariable
.ArchList
))
98 GuidPart
= Guid
.split('-')
99 Buffer
.write(pack('I', long(GuidPart
[0], 16)))
100 Buffer
.write(pack('H', int(GuidPart
[1], 16)))
101 Buffer
.write(pack('H', int(GuidPart
[2], 16)))
104 Char
= GuidPart
[3][Num
*2:Num
*2+2]
105 Buffer
.write(pack('B', int(Char
, 16)))
108 Char
= GuidPart
[4][Num
*2:Num
*2+2]
109 Buffer
.write(pack('B', int(Char
, 16)))
111 SaveFileOnChange(OutputAprFileName
, Buffer
.getvalue())
113 RawSectionFileName
= os
.path
.join( OutputAprFilePath
, \
114 AprioriFileGuid
+ FvName
+ '.raw' )
119 MakefilePath
= InfFileName
, Arch
120 GenFdsGlobalVariable
.GenerateSection(RawSectionFileName
, [OutputAprFileName
], 'EFI_SECTION_RAW', IsMakefile
=IsMakefile
)
121 GenFdsGlobalVariable
.GenerateFfs(AprFfsFileName
, [RawSectionFileName
],
122 'EFI_FV_FILETYPE_FREEFORM', AprioriFileGuid
, MakefilePath
=MakefilePath
)
124 return AprFfsFileName