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