]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/GenFds/FfsFileStatement.py
BaseTools: the list and iterator translation
[mirror_edk2.git] / BaseTools / Source / Python / GenFds / FfsFileStatement.py
CommitLineData
30fdf114
LG
1## @file\r
2# process FFS generation from FILE statement\r
3#\r
9eb87141 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
86379ac4 19from io import BytesIO\r
9e47e6f9 20from struct import pack\r
30fdf114
LG
21from CommonDataClass.FdfClass import FileStatementClassObject\r
22from Common import EdkLogger\r
9e47e6f9
CJ
23from Common.BuildToolError import GENFDS_ERROR\r
24from Common.Misc import GuidStructureByteArrayToGuidString, SaveFileOnChange\r
25import Common.LongFilePathOs as os\r
bfa65b61
GL
26from .GuidSection import GuidSection\r
27from .FvImageSection import FvImageSection\r
9e47e6f9
CJ
28from .Ffs import FdfFvFileTypeToFileType\r
29from .GenFdsGlobalVariable import GenFdsGlobalVariable\r
30fdf114
LG
30\r
31## generate FFS from FILE\r
32#\r
33#\r
9e47e6f9 34class FileStatement (FileStatementClassObject):\r
30fdf114
LG
35 ## The constructor\r
36 #\r
37 # @param self The object pointer\r
38 #\r
39 def __init__(self):\r
40 FileStatementClassObject.__init__(self)\r
79b74a03
LG
41 self.CurrentLineNum = None\r
42 self.CurrentLineContent = None\r
43 self.FileName = None\r
44 self.InfFileName = None\r
cfaaf99b 45 self.SubAlignment = None\r
30fdf114
LG
46\r
47 ## GenFfs() method\r
48 #\r
49 # Generate FFS\r
50 #\r
52302d4d
LG
51 # @param self The object pointer\r
52 # @param Dict dictionary contains macro and value pair\r
53 # @param FvChildAddr Array of the inside FvImage base address\r
54 # @param FvParentAddr Parent Fv base address\r
55 # @retval string Generated FFS file name\r
30fdf114 56 #\r
a743986d 57 def GenFfs(self, Dict = {}, FvChildAddr=[], FvParentAddr=None, IsMakefile=False, FvName=None):\r
f7496d71 58\r
9e47e6f9 59 if self.NameGuid and self.NameGuid.startswith('PCD('):\r
30fdf114
LG
60 PcdValue = GenFdsGlobalVariable.GetPcdValue(self.NameGuid)\r
61 if len(PcdValue) == 0:\r
62 EdkLogger.error("GenFds", GENFDS_ERROR, '%s NOT defined.' \\r
63 % (self.NameGuid))\r
64 if PcdValue.startswith('{'):\r
65 PcdValue = GuidStructureByteArrayToGuidString(PcdValue)\r
66 RegistryGuidStr = PcdValue\r
67 if len(RegistryGuidStr) == 0:\r
68 EdkLogger.error("GenFds", GENFDS_ERROR, 'GUID value for %s in wrong format.' \\r
69 % (self.NameGuid))\r
70 self.NameGuid = RegistryGuidStr\r
f7496d71 71\r
a743986d
YZ
72 Str = self.NameGuid\r
73 if FvName:\r
74 Str += FvName\r
75 OutputDir = os.path.join(GenFdsGlobalVariable.FfsDir, Str)\r
30fdf114 76 if not os.path.exists(OutputDir):\r
0d2711a6 77 os.makedirs(OutputDir)\r
30fdf114
LG
78\r
79 Dict.update(self.DefineVarDict)\r
80 SectionAlignments = None\r
9e47e6f9 81 if self.FvName:\r
1ccc4d89 82 Buffer = BytesIO('')\r
9eb87141 83 if self.FvName.upper() not in GenFdsGlobalVariable.FdfParser.Profile.FvDict:\r
30fdf114
LG
84 EdkLogger.error("GenFds", GENFDS_ERROR, "FV (%s) is NOT described in FDF file!" % (self.FvName))\r
85 Fv = GenFdsGlobalVariable.FdfParser.Profile.FvDict.get(self.FvName.upper())\r
86 FileName = Fv.AddToBuffer(Buffer)\r
87 SectionFiles = [FileName]\r
88\r
9e47e6f9 89 elif self.FdName:\r
9eb87141 90 if self.FdName.upper() not in GenFdsGlobalVariable.FdfParser.Profile.FdDict:\r
30fdf114
LG
91 EdkLogger.error("GenFds", GENFDS_ERROR, "FD (%s) is NOT described in FDF file!" % (self.FdName))\r
92 Fd = GenFdsGlobalVariable.FdfParser.Profile.FdDict.get(self.FdName.upper())\r
fd171542 93 FileName = Fd.GenFd()\r
30fdf114
LG
94 SectionFiles = [FileName]\r
95\r
9e47e6f9 96 elif self.FileName:\r
860992ed 97 if hasattr(self, 'FvFileType') and self.FvFileType == 'RAW':\r
cfaaf99b 98 if isinstance(self.FileName, list) and isinstance(self.SubAlignment, list) and len(self.FileName) == len(self.SubAlignment):\r
1ccc4d89 99 FileContent = ''\r
cfaaf99b
YZ
100 MaxAlignIndex = 0\r
101 MaxAlignValue = 1\r
860992ed
YZ
102 for Index, File in enumerate(self.FileName):\r
103 try:\r
f8db6527 104 f = open(File, 'rb')\r
860992ed
YZ
105 except:\r
106 GenFdsGlobalVariable.ErrorLogger("Error opening RAW file %s." % (File))\r
107 Content = f.read()\r
108 f.close()\r
cfaaf99b 109 AlignValue = 1\r
9e47e6f9 110 if self.SubAlignment[Index]:\r
cfaaf99b
YZ
111 AlignValue = GenFdsGlobalVariable.GetAlignment(self.SubAlignment[Index])\r
112 if AlignValue > MaxAlignValue:\r
113 MaxAlignIndex = Index\r
114 MaxAlignValue = AlignValue\r
1ccc4d89
LG
115 FileContent += Content\r
116 if len(FileContent) % AlignValue != 0:\r
860992ed
YZ
117 Size = AlignValue - len(FileContent) % AlignValue\r
118 for i in range(0, Size):\r
1ccc4d89 119 FileContent += pack('B', 0xFF)\r
860992ed 120\r
1ccc4d89 121 if FileContent:\r
860992ed 122 OutputRAWFile = os.path.join(GenFdsGlobalVariable.FfsDir, self.NameGuid, self.NameGuid + '.raw')\r
1ccc4d89 123 SaveFileOnChange(OutputRAWFile, FileContent, True)\r
860992ed 124 self.FileName = OutputRAWFile\r
cfaaf99b
YZ
125 self.SubAlignment = self.SubAlignment[MaxAlignIndex]\r
126\r
127 if self.Alignment and self.SubAlignment:\r
128 if GenFdsGlobalVariable.GetAlignment (self.Alignment) < GenFdsGlobalVariable.GetAlignment (self.SubAlignment):\r
129 self.Alignment = self.SubAlignment\r
130 elif self.SubAlignment:\r
131 self.Alignment = self.SubAlignment\r
132\r
30fdf114 133 self.FileName = GenFdsGlobalVariable.ReplaceWorkspaceMacro(self.FileName)\r
97fa0ee9
YL
134 #Replace $(SAPCE) with real space\r
135 self.FileName = self.FileName.replace('$(SPACE)', ' ')\r
30fdf114
LG
136 SectionFiles = [GenFdsGlobalVariable.MacroExtend(self.FileName, Dict)]\r
137\r
138 else:\r
139 SectionFiles = []\r
140 Index = 0\r
141 SectionAlignments = []\r
9e47e6f9 142 for section in self.SectionList:\r
30fdf114
LG
143 Index = Index + 1\r
144 SecIndex = '%d' %Index\r
52302d4d
LG
145 # process the inside FvImage from FvSection or GuidSection\r
146 if FvChildAddr != []:\r
147 if isinstance(section, FvImageSection):\r
148 section.FvAddr = FvChildAddr.pop(0)\r
149 elif isinstance(section, GuidSection):\r
150 section.FvAddr = FvChildAddr\r
9e47e6f9 151 if FvParentAddr and isinstance(section, GuidSection):\r
52302d4d
LG
152 section.FvParentAddr = FvParentAddr\r
153\r
4afd3d04
LG
154 if self.KeepReloc == False:\r
155 section.KeepReloc = False\r
30fdf114
LG
156 sectList, align = section.GenSection(OutputDir, self.NameGuid, SecIndex, self.KeyStringList, None, Dict)\r
157 if sectList != []:\r
158 for sect in sectList:\r
159 SectionFiles.append(sect)\r
160 SectionAlignments.append(align)\r
161\r
162 #\r
163 # Prepare the parameter\r
164 #\r
165 FfsFileOutput = os.path.join(OutputDir, self.NameGuid + '.ffs')\r
166 GenFdsGlobalVariable.GenerateFfs(FfsFileOutput, SectionFiles,\r
9e47e6f9 167 FdfFvFileTypeToFileType.get(self.FvFileType),\r
30fdf114
LG
168 self.NameGuid,\r
169 Fixed=self.Fixed,\r
170 CheckSum=self.CheckSum,\r
171 Align=self.Alignment,\r
172 SectionAlign=SectionAlignments\r
173 )\r
174\r
175 return FfsFileOutput\r