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