]> git.proxmox.com Git - mirror_edk2.git/blob - BaseTools/Source/Python/GenFds/AprioriSection.py
BaseTools: skip updating temporary variable.
[mirror_edk2.git] / BaseTools / Source / Python / GenFds / AprioriSection.py
1 ## @file
2 # process APRIORI file data and generate PEI/DXE APRIORI file
3 #
4 # Copyright (c) 2007 - 2017, 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 struct import *
19 import Common.LongFilePathOs as os
20 import StringIO
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
29 ## process APRIORI file data and generate PEI/DXE APRIORI file
30 #
31 #
32 class AprioriSection (AprioriSectionClassObject):
33 ## The constructor
34 #
35 # @param self The object pointer
36 #
37 def __init__(self):
38 AprioriSectionClassObject.__init__(self)
39 self.AprioriType = ""
40
41 ## GenFfs() method
42 #
43 # Generate FFS for APRIORI file
44 #
45 # @param self The object pointer
46 # @param FvName for whom apriori file generated
47 # @param Dict dictionary contains macro and its value
48 # @retval string Generated file name
49 #
50 def GenFfs (self, FvName, Dict = {}, IsMakefile = False):
51 DXE_GUID = "FC510EE7-FFDC-11D4-BD41-0080C73C8881"
52 PEI_GUID = "1B45CC0A-156A-428A-AF62-49864DA0E6E6"
53 Buffer = StringIO.StringIO('')
54 AprioriFileGuid = DXE_GUID
55 if self.AprioriType == "PEI":
56 AprioriFileGuid = PEI_GUID
57 OutputAprFilePath = os.path.join (GenFdsGlobalVariable.WorkSpaceDir, \
58 GenFdsGlobalVariable.FfsDir,\
59 AprioriFileGuid + FvName)
60 if not os.path.exists(OutputAprFilePath) :
61 os.makedirs(OutputAprFilePath)
62
63 OutputAprFileName = os.path.join( OutputAprFilePath, \
64 AprioriFileGuid + FvName + '.Apri' )
65 AprFfsFileName = os.path.join (OutputAprFilePath,\
66 AprioriFileGuid + FvName + '.Ffs')
67
68 Dict.update(self.DefineVarDict)
69 InfFileName = None
70 for FfsObj in self.FfsList :
71 Guid = ""
72 if isinstance(FfsObj, FfsFileStatement.FileStatement):
73 Guid = FfsObj.NameGuid
74 else:
75 InfFileName = NormPath(FfsObj.InfFileName)
76 Arch = FfsObj.GetCurrentArch()
77
78 if Arch is not None:
79 Dict['$(ARCH)'] = Arch
80 InfFileName = GenFdsGlobalVariable.MacroExtend(InfFileName, Dict, Arch)
81
82 if Arch is not None:
83 Inf = GenFdsGlobalVariable.WorkSpace.BuildObject[PathClass(InfFileName, GenFdsGlobalVariable.WorkSpaceDir), Arch, GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag]
84 Guid = Inf.Guid
85
86 else:
87 Inf = GenFdsGlobalVariable.WorkSpace.BuildObject[PathClass(InfFileName, GenFdsGlobalVariable.WorkSpaceDir), 'COMMON', GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag]
88 Guid = Inf.Guid
89
90 self.BinFileList = Inf.Module.Binaries
91 if self.BinFileList == []:
92 EdkLogger.error("GenFds", RESOURCE_NOT_AVAILABLE,
93 "INF %s not found in build ARCH %s!" \
94 % (InfFileName, GenFdsGlobalVariable.ArchList))
95
96
97 GuidPart = Guid.split('-')
98 Buffer.write(pack('I', long(GuidPart[0], 16)))
99 Buffer.write(pack('H', int(GuidPart[1], 16)))
100 Buffer.write(pack('H', int(GuidPart[2], 16)))
101
102 for Num in range(2):
103 Char = GuidPart[3][Num*2:Num*2+2]
104 Buffer.write(pack('B', int(Char, 16)))
105
106 for Num in range(6):
107 Char = GuidPart[4][Num*2:Num*2+2]
108 Buffer.write(pack('B', int(Char, 16)))
109
110 SaveFileOnChange(OutputAprFileName, Buffer.getvalue())
111
112 RawSectionFileName = os.path.join( OutputAprFilePath, \
113 AprioriFileGuid + FvName + '.raw' )
114 MakefilePath = None
115 if IsMakefile:
116 if not InfFileName:
117 return None
118 MakefilePath = InfFileName, Arch
119 GenFdsGlobalVariable.GenerateSection(RawSectionFileName, [OutputAprFileName], 'EFI_SECTION_RAW', IsMakefile=IsMakefile)
120 GenFdsGlobalVariable.GenerateFfs(AprFfsFileName, [RawSectionFileName],
121 'EFI_FV_FILETYPE_FREEFORM', AprioriFileGuid, MakefilePath=MakefilePath)
122
123 return AprFfsFileName
124