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