]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/GenFds/AprioriSection.py
BaseTools: Handle the bytes and str difference
[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
40d841f6 6# This program and the accompanying materials\r
30fdf114
LG
7# are licensed and made available under the terms and conditions of the BSD License\r
8# which accompanies this distribution. The full text of the license may be found at\r
9# http://opensource.org/licenses/bsd-license.php\r
10#\r
11# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13#\r
14\r
15##\r
16# Import Modules\r
17#\r
1ccc4d89 18from __future__ import absolute_import\r
9e47e6f9 19from struct import pack\r
1be2ed90 20import Common.LongFilePathOs as os\r
86379ac4 21from io import BytesIO\r
9e47e6f9 22from .FfsFileStatement import FileStatement\r
bfa65b61 23from .GenFdsGlobalVariable import GenFdsGlobalVariable\r
9e47e6f9 24from Common.StringUtils import NormPath\r
ccaa7754 25from Common.Misc import SaveFileOnChange, PathClass\r
9e47e6f9
CJ
26from Common.EdkLogger import error as EdkLoggerError\r
27from Common.BuildToolError import RESOURCE_NOT_AVAILABLE\r
55c84777 28from Common.DataType import TAB_COMMON\r
30fdf114 29\r
9e47e6f9
CJ
30DXE_APRIORI_GUID = "FC510EE7-FFDC-11D4-BD41-0080C73C8881"\r
31PEI_APRIORI_GUID = "1B45CC0A-156A-428A-AF62-49864DA0E6E6"\r
32\r
30fdf114
LG
33## process APRIORI file data and generate PEI/DXE APRIORI file\r
34#\r
35#\r
9e47e6f9 36class AprioriSection (object):\r
30fdf114
LG
37 ## The constructor\r
38 #\r
39 # @param self The object pointer\r
40 #\r
41 def __init__(self):\r
9e47e6f9
CJ
42 self.DefineVarDict = {}\r
43 self.FfsList = []\r
30fdf114
LG
44 self.AprioriType = ""\r
45\r
46 ## GenFfs() method\r
47 #\r
48 # Generate FFS for APRIORI file\r
49 #\r
50 # @param self The object pointer\r
51 # @param FvName for whom apriori file generated\r
52 # @param Dict dictionary contains macro and its value\r
53 # @retval string Generated file name\r
54 #\r
37de70b7 55 def GenFfs (self, FvName, Dict = {}, IsMakefile = False):\r
d943b0c3 56 Buffer = BytesIO()\r
30fdf114 57 if self.AprioriType == "PEI":\r
9e47e6f9
CJ
58 AprioriFileGuid = PEI_APRIORI_GUID\r
59 else:\r
60 AprioriFileGuid = DXE_APRIORI_GUID\r
61\r
30fdf114
LG
62 OutputAprFilePath = os.path.join (GenFdsGlobalVariable.WorkSpaceDir, \\r
63 GenFdsGlobalVariable.FfsDir,\\r
64 AprioriFileGuid + FvName)\r
9e47e6f9 65 if not os.path.exists(OutputAprFilePath):\r
30fdf114
LG
66 os.makedirs(OutputAprFilePath)\r
67\r
68 OutputAprFileName = os.path.join( OutputAprFilePath, \\r
69 AprioriFileGuid + FvName + '.Apri' )\r
70 AprFfsFileName = os.path.join (OutputAprFilePath,\\r
71 AprioriFileGuid + FvName + '.Ffs')\r
72\r
73 Dict.update(self.DefineVarDict)\r
37de70b7 74 InfFileName = None\r
9e47e6f9 75 for FfsObj in self.FfsList:\r
30fdf114 76 Guid = ""\r
9e47e6f9 77 if isinstance(FfsObj, FileStatement):\r
30fdf114
LG
78 Guid = FfsObj.NameGuid\r
79 else:\r
80 InfFileName = NormPath(FfsObj.InfFileName)\r
81 Arch = FfsObj.GetCurrentArch()\r
82\r
9e47e6f9 83 if Arch:\r
30fdf114
LG
84 Dict['$(ARCH)'] = Arch\r
85 InfFileName = GenFdsGlobalVariable.MacroExtend(InfFileName, Dict, Arch)\r
86\r
9e47e6f9 87 if Arch:\r
0d2711a6 88 Inf = GenFdsGlobalVariable.WorkSpace.BuildObject[PathClass(InfFileName, GenFdsGlobalVariable.WorkSpaceDir), Arch, GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag]\r
30fdf114 89 Guid = Inf.Guid\r
30fdf114 90 else:\r
55c84777 91 Inf = GenFdsGlobalVariable.WorkSpace.BuildObject[PathClass(InfFileName, GenFdsGlobalVariable.WorkSpaceDir), TAB_COMMON, GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag]\r
30fdf114
LG
92 Guid = Inf.Guid\r
93\r
9e47e6f9
CJ
94 if not Inf.Module.Binaries:\r
95 EdkLoggerError("GenFds", RESOURCE_NOT_AVAILABLE,\r
30fdf114
LG
96 "INF %s not found in build ARCH %s!" \\r
97 % (InfFileName, GenFdsGlobalVariable.ArchList))\r
98\r
30fdf114 99 GuidPart = Guid.split('-')\r
af881abc 100 Buffer.write(pack('I', int(GuidPart[0], 16)))\r
30fdf114
LG
101 Buffer.write(pack('H', int(GuidPart[1], 16)))\r
102 Buffer.write(pack('H', int(GuidPart[2], 16)))\r
103\r
104 for Num in range(2):\r
105 Char = GuidPart[3][Num*2:Num*2+2]\r
106 Buffer.write(pack('B', int(Char, 16)))\r
107\r
108 for Num in range(6):\r
109 Char = GuidPart[4][Num*2:Num*2+2]\r
110 Buffer.write(pack('B', int(Char, 16)))\r
111\r
112 SaveFileOnChange(OutputAprFileName, Buffer.getvalue())\r
113\r
114 RawSectionFileName = os.path.join( OutputAprFilePath, \\r
115 AprioriFileGuid + FvName + '.raw' )\r
37de70b7
YZ
116 MakefilePath = None\r
117 if IsMakefile:\r
118 if not InfFileName:\r
119 return None\r
120 MakefilePath = InfFileName, Arch\r
121 GenFdsGlobalVariable.GenerateSection(RawSectionFileName, [OutputAprFileName], 'EFI_SECTION_RAW', IsMakefile=IsMakefile)\r
30fdf114 122 GenFdsGlobalVariable.GenerateFfs(AprFfsFileName, [RawSectionFileName],\r
37de70b7 123 'EFI_FV_FILETYPE_FREEFORM', AprioriFileGuid, MakefilePath=MakefilePath)\r
30fdf114
LG
124\r
125 return AprFfsFileName\r