]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/GenFds/AprioriSection.py
BaseTools:change some incorrect parameter defaults
[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
e32f7bc9
FZ
49 def GenFfs (self, FvName, Dict = None, IsMakefile = False):\r
50 if Dict is None:\r
51 Dict = {}\r
d943b0c3 52 Buffer = BytesIO()\r
30fdf114 53 if self.AprioriType == "PEI":\r
9e47e6f9
CJ
54 AprioriFileGuid = PEI_APRIORI_GUID\r
55 else:\r
56 AprioriFileGuid = DXE_APRIORI_GUID\r
57\r
30fdf114
LG
58 OutputAprFilePath = os.path.join (GenFdsGlobalVariable.WorkSpaceDir, \\r
59 GenFdsGlobalVariable.FfsDir,\\r
60 AprioriFileGuid + FvName)\r
9e47e6f9 61 if not os.path.exists(OutputAprFilePath):\r
30fdf114
LG
62 os.makedirs(OutputAprFilePath)\r
63\r
64 OutputAprFileName = os.path.join( OutputAprFilePath, \\r
65 AprioriFileGuid + FvName + '.Apri' )\r
66 AprFfsFileName = os.path.join (OutputAprFilePath,\\r
67 AprioriFileGuid + FvName + '.Ffs')\r
68\r
69 Dict.update(self.DefineVarDict)\r
37de70b7 70 InfFileName = None\r
9e47e6f9 71 for FfsObj in self.FfsList:\r
30fdf114 72 Guid = ""\r
9e47e6f9 73 if isinstance(FfsObj, FileStatement):\r
30fdf114
LG
74 Guid = FfsObj.NameGuid\r
75 else:\r
76 InfFileName = NormPath(FfsObj.InfFileName)\r
77 Arch = FfsObj.GetCurrentArch()\r
78\r
9e47e6f9 79 if Arch:\r
30fdf114
LG
80 Dict['$(ARCH)'] = Arch\r
81 InfFileName = GenFdsGlobalVariable.MacroExtend(InfFileName, Dict, Arch)\r
82\r
9e47e6f9 83 if Arch:\r
0d2711a6 84 Inf = GenFdsGlobalVariable.WorkSpace.BuildObject[PathClass(InfFileName, GenFdsGlobalVariable.WorkSpaceDir), Arch, GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag]\r
30fdf114 85 Guid = Inf.Guid\r
30fdf114 86 else:\r
55c84777 87 Inf = GenFdsGlobalVariable.WorkSpace.BuildObject[PathClass(InfFileName, GenFdsGlobalVariable.WorkSpaceDir), TAB_COMMON, GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag]\r
30fdf114
LG
88 Guid = Inf.Guid\r
89\r
9e47e6f9
CJ
90 if not Inf.Module.Binaries:\r
91 EdkLoggerError("GenFds", RESOURCE_NOT_AVAILABLE,\r
30fdf114
LG
92 "INF %s not found in build ARCH %s!" \\r
93 % (InfFileName, GenFdsGlobalVariable.ArchList))\r
94\r
30fdf114 95 GuidPart = Guid.split('-')\r
af881abc 96 Buffer.write(pack('I', int(GuidPart[0], 16)))\r
30fdf114
LG
97 Buffer.write(pack('H', int(GuidPart[1], 16)))\r
98 Buffer.write(pack('H', int(GuidPart[2], 16)))\r
99\r
100 for Num in range(2):\r
101 Char = GuidPart[3][Num*2:Num*2+2]\r
102 Buffer.write(pack('B', int(Char, 16)))\r
103\r
104 for Num in range(6):\r
105 Char = GuidPart[4][Num*2:Num*2+2]\r
106 Buffer.write(pack('B', int(Char, 16)))\r
107\r
108 SaveFileOnChange(OutputAprFileName, Buffer.getvalue())\r
109\r
110 RawSectionFileName = os.path.join( OutputAprFilePath, \\r
111 AprioriFileGuid + FvName + '.raw' )\r
37de70b7
YZ
112 MakefilePath = None\r
113 if IsMakefile:\r
114 if not InfFileName:\r
115 return None\r
116 MakefilePath = InfFileName, Arch\r
117 GenFdsGlobalVariable.GenerateSection(RawSectionFileName, [OutputAprFileName], 'EFI_SECTION_RAW', IsMakefile=IsMakefile)\r
30fdf114 118 GenFdsGlobalVariable.GenerateFfs(AprFfsFileName, [RawSectionFileName],\r
37de70b7 119 'EFI_FV_FILETYPE_FREEFORM', AprioriFileGuid, MakefilePath=MakefilePath)\r
30fdf114
LG
120\r
121 return AprFfsFileName\r