]> git.proxmox.com Git - mirror_edk2.git/blob - BaseTools/Source/Python/GenFds/AprioriSection.py
BaseTools: Rename String to StringUtils.
[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 - 2018, 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.StringUtils 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
29
30 ## process APRIORI file data and generate PEI/DXE APRIORI file
31 #
32 #
33 class AprioriSection (AprioriSectionClassObject):
34 ## The constructor
35 #
36 # @param self The object pointer
37 #
38 def __init__(self):
39 AprioriSectionClassObject.__init__(self)
40 self.AprioriType = ""
41
42 ## GenFfs() method
43 #
44 # Generate FFS for APRIORI file
45 #
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
50 #
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)
63
64 OutputAprFileName = os.path.join( OutputAprFilePath, \
65 AprioriFileGuid + FvName + '.Apri' )
66 AprFfsFileName = os.path.join (OutputAprFilePath,\
67 AprioriFileGuid + FvName + '.Ffs')
68
69 Dict.update(self.DefineVarDict)
70 InfFileName = None
71 for FfsObj in self.FfsList :
72 Guid = ""
73 if isinstance(FfsObj, FfsFileStatement.FileStatement):
74 Guid = FfsObj.NameGuid
75 else:
76 InfFileName = NormPath(FfsObj.InfFileName)
77 Arch = FfsObj.GetCurrentArch()
78
79 if Arch is not None:
80 Dict['$(ARCH)'] = Arch
81 InfFileName = GenFdsGlobalVariable.MacroExtend(InfFileName, Dict, Arch)
82
83 if Arch is not None:
84 Inf = GenFdsGlobalVariable.WorkSpace.BuildObject[PathClass(InfFileName, GenFdsGlobalVariable.WorkSpaceDir), Arch, GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag]
85 Guid = Inf.Guid
86
87 else:
88 Inf = GenFdsGlobalVariable.WorkSpace.BuildObject[PathClass(InfFileName, GenFdsGlobalVariable.WorkSpaceDir), TAB_COMMON, GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag]
89 Guid = Inf.Guid
90
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))
96
97
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)))
102
103 for Num in range(2):
104 Char = GuidPart[3][Num*2:Num*2+2]
105 Buffer.write(pack('B', int(Char, 16)))
106
107 for Num in range(6):
108 Char = GuidPart[4][Num*2:Num*2+2]
109 Buffer.write(pack('B', int(Char, 16)))
110
111 SaveFileOnChange(OutputAprFileName, Buffer.getvalue())
112
113 RawSectionFileName = os.path.join( OutputAprFilePath, \
114 AprioriFileGuid + FvName + '.raw' )
115 MakefilePath = None
116 if IsMakefile:
117 if not InfFileName:
118 return None
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)
123
124 return AprFfsFileName
125