]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/Workspace/DscBuildData.py
BaseTools: Enable the flag to treat dynamic pcd as dynamicEx
[mirror_edk2.git] / BaseTools / Source / Python / Workspace / DscBuildData.py
CommitLineData
ae7b6df8
LG
1## @file\r
2# This file is used to create a database used by build tool\r
3#\r
b47fe265 4# Copyright (c) 2008 - 2020, Intel Corporation. All rights reserved.<BR>\r
ae7b6df8 5# (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>\r
2e351cbe 6# SPDX-License-Identifier: BSD-2-Clause-Patent\r
ae7b6df8
LG
7#\r
8\r
9## Platform build information from DSC file\r
10#\r
11# This class is used to retrieve information stored in database and convert them\r
12# into PlatformBuildClassObject form for easier use for AutoGen.\r
13#\r
1ccc4d89
LG
14from __future__ import print_function\r
15from __future__ import absolute_import\r
5a57246e 16from Common.StringUtils import *\r
ae7b6df8
LG
17from Common.DataType import *\r
18from Common.Misc import *\r
19from types import *\r
8565b582 20from Common.Expression import *\r
ae7b6df8 21from CommonDataClass.CommonClass import SkuInfoClass\r
4465cd12
FZ
22from Common.TargetTxtClassObject import TargetTxtDict\r
23from Common.ToolDefClassObject import ToolDefDict\r
1100bc5a
GL
24from .MetaDataTable import *\r
25from .MetaFileTable import *\r
26from .MetaFileParser import *\r
ae7b6df8 27\r
1100bc5a 28from .WorkspaceCommon import GetDeclaredPcd\r
ae7b6df8 29from Common.Misc import AnalyzeDscPcd\r
afe8c411 30from Common.Misc import ProcessDuplicatedInf,RemoveCComments,ArrayIndex\r
ae7b6df8
LG
31import re\r
32from Common.Parsing import IsValidWord\r
33from Common.VariableAttributes import VariableAttributes\r
34import Common.GlobalData as GlobalData\r
35import subprocess\r
1590d123 36from functools import reduce\r
0a57a978 37from Common.Misc import SaveFileOnChange\r
ae7b6df8 38from Workspace.BuildClassObject import PlatformBuildClassObject, StructurePcd, PcdClassObject, ModuleBuildClassObject\r
ccaa7754 39from collections import OrderedDict, defaultdict\r
ae7b6df8 40\r
2b95556c
CJ
41def _IsFieldValueAnArray (Value):\r
42 Value = Value.strip()\r
43 if Value.startswith(TAB_GUID) and Value.endswith(')'):\r
44 return True\r
45 if Value.startswith('L"') and Value.endswith('"') and len(list(Value[2:-1])) > 1:\r
46 return True\r
47 if Value[0] == '"' and Value[-1] == '"' and len(list(Value[1:-1])) > 1:\r
48 return True\r
49 if Value[0] == '{' and Value[-1] == '}':\r
50 return True\r
51 if Value.startswith("L'") and Value.endswith("'") and len(list(Value[2:-1])) > 1:\r
52 return True\r
53 if Value[0] == "'" and Value[-1] == "'" and len(list(Value[1:-1])) > 1:\r
54 return True\r
55 return False\r
56\r
ae7b6df8 57PcdValueInitName = 'PcdValueInit'\r
484b1534 58PcdValueCommonName = 'PcdValueCommon'\r
ae7b6df8
LG
59\r
60PcdMainCHeader = '''\r
61/**\r
62 DO NOT EDIT\r
63 FILE auto-generated\r
64**/\r
65\r
66#include <stdio.h>\r
67#include <stdlib.h>\r
68#include <string.h>\r
69#include <PcdValueCommon.h>\r
70'''\r
71\r
72PcdMainCEntry = '''\r
73int\r
74main (\r
75 int argc,\r
76 char *argv[]\r
77 )\r
78{\r
79 return PcdValueMain (argc, argv);\r
80}\r
81'''\r
82\r
83PcdMakefileHeader = '''\r
84#\r
85# DO NOT EDIT\r
86# This file is auto-generated by build utility\r
87#\r
88\r
89'''\r
90\r
68ba919f
YZ
91WindowsCFLAGS = 'CFLAGS = $(CFLAGS) /wd4200 /wd4034 /wd4101 '\r
92LinuxCFLAGS = 'BUILD_CFLAGS += -Wno-pointer-to-int-cast -Wno-unused-variable '\r
ae7b6df8
LG
93PcdMakefileEnd = '''\r
94!INCLUDE $(BASE_TOOLS_PATH)\Source\C\Makefiles\ms.common\r
ae7b6df8
LG
95!INCLUDE $(BASE_TOOLS_PATH)\Source\C\Makefiles\ms.app\r
96'''\r
97\r
c637c602
B
98AppTarget = '''\r
99all: $(APPFILE)\r
100$(APPFILE): $(OBJECTS)\r
101%s\r
102'''\r
103\r
ae7b6df8 104PcdGccMakefile = '''\r
ae7b6df8
LG
105MAKEROOT ?= $(EDK_TOOLS_PATH)/Source/C\r
106LIBS = -lCommon\r
107'''\r
108\r
3e4faa26 109variablePattern = re.compile(r'[\t\s]*0[xX][a-fA-F0-9]+$')\r
24bd035c 110SkuIdPattern = re.compile(r'^[a-zA-Z_][a-zA-Z0-9_]*$')\r
fe1abb4b
CJ
111## regular expressions for finding decimal and hex numbers\r
112Pattern = re.compile('^[1-9]\d*|0$')\r
113HexPattern = re.compile(r'0[xX][0-9a-fA-F]+$')\r
34d808ad
B
114## Regular expression for finding header file inclusions\r
115from AutoGen.GenMake import gIncludePattern\r
116\r
117## Find dependencies for one source file\r
118#\r
119# By searching recursively "#include" directive in file, find out all the\r
120# files needed by given source file. The dependecies will be only searched\r
121# in given search path list.\r
122#\r
123# @param SearchPathList The list of search path\r
124#\r
125# @retval list The list of files the given source file depends on\r
126#\r
ccaa7754 127def GetDependencyList(FileStack, SearchPathList):\r
34d808ad
B
128 DepDb = dict()\r
129 DependencySet = set(FileStack)\r
130 while len(FileStack) > 0:\r
131 F = FileStack.pop()\r
132 FullPathDependList = []\r
133 CurrentFileDependencyList = []\r
134 if F in DepDb:\r
135 CurrentFileDependencyList = DepDb[F]\r
136 else:\r
137 try:\r
138 Fd = open(F, 'r')\r
139 FileContent = Fd.read()\r
5b0671c1 140 except BaseException as X:\r
34d808ad
B
141 EdkLogger.error("build", FILE_OPEN_FAILURE, ExtraData=F + "\n\t" + str(X))\r
142 finally:\r
143 if "Fd" in dir(locals()):\r
144 Fd.close()\r
145\r
146 if len(FileContent) == 0:\r
147 continue\r
1ccc4d89 148\r
f747640b
FB
149 try:\r
150 if FileContent[0] == 0xff or FileContent[0] == 0xfe:\r
151 FileContent = FileContent.decode('utf-16')\r
152 else:\r
153 FileContent = FileContent.decode()\r
154 except:\r
155 # The file is not txt file. for example .mcb file\r
156 continue\r
34d808ad
B
157 IncludedFileList = gIncludePattern.findall(FileContent)\r
158\r
159 for Inc in IncludedFileList:\r
160 Inc = Inc.strip()\r
161 Inc = os.path.normpath(Inc)\r
162 CurrentFileDependencyList.append(Inc)\r
163 DepDb[F] = CurrentFileDependencyList\r
164\r
165 CurrentFilePath = os.path.dirname(F)\r
166 PathList = [CurrentFilePath] + SearchPathList\r
167 for Inc in CurrentFileDependencyList:\r
168 for SearchPath in PathList:\r
169 FilePath = os.path.join(SearchPath, Inc)\r
170 if not os.path.exists(FilePath):\r
171 continue\r
172 if FilePath not in DependencySet:\r
173 FileStack.append(FilePath)\r
174 FullPathDependList.append(FilePath)\r
175 break\r
176 DependencySet.update(FullPathDependList)\r
177 DependencyList = list(DependencySet) # remove duplicate ones\r
178\r
179 return DependencyList\r
180\r
ae7b6df8 181class DscBuildData(PlatformBuildClassObject):\r
ae7b6df8
LG
182\r
183 # dict used to convert part of [Defines] to members of DscBuildData directly\r
184 _PROPERTY_ = {\r
185 #\r
186 # Required Fields\r
187 #\r
188 TAB_DSC_DEFINES_PLATFORM_NAME : "_PlatformName",\r
189 TAB_DSC_DEFINES_PLATFORM_GUID : "_Guid",\r
190 TAB_DSC_DEFINES_PLATFORM_VERSION : "_Version",\r
191 TAB_DSC_DEFINES_DSC_SPECIFICATION : "_DscSpecification",\r
192 # TAB_DSC_DEFINES_OUTPUT_DIRECTORY : "_OutputDirectory",\r
193 # TAB_DSC_DEFINES_SUPPORTED_ARCHITECTURES : "_SupArchList",\r
194 # TAB_DSC_DEFINES_BUILD_TARGETS : "_BuildTargets",\r
195 TAB_DSC_DEFINES_SKUID_IDENTIFIER : "_SkuName",\r
196 # TAB_DSC_DEFINES_FLASH_DEFINITION : "_FlashDefinition",\r
197 TAB_DSC_DEFINES_BUILD_NUMBER : "_BuildNumber",\r
198 TAB_DSC_DEFINES_MAKEFILE_NAME : "_MakefileName",\r
199 TAB_DSC_DEFINES_BS_BASE_ADDRESS : "_BsBaseAddress",\r
200 TAB_DSC_DEFINES_RT_BASE_ADDRESS : "_RtBaseAddress",\r
201 # TAB_DSC_DEFINES_RFC_LANGUAGES : "_RFCLanguages",\r
202 # TAB_DSC_DEFINES_ISO_LANGUAGES : "_ISOLanguages",\r
203 }\r
204\r
205 # used to compose dummy library class name for those forced library instances\r
206 _NullLibraryNumber = 0\r
207\r
208 ## Constructor of DscBuildData\r
209 #\r
210 # Initialize object of DscBuildData\r
211 #\r
212 # @param FilePath The path of platform description file\r
213 # @param RawData The raw data of DSC file\r
214 # @param BuildDataBase Database used to retrieve module/package information\r
215 # @param Arch The target architecture\r
216 # @param Platform (not used for DscBuildData)\r
217 # @param Macros Macros used for replacement in DSC file\r
218 #\r
55c84777 219 def __init__(self, FilePath, RawData, BuildDataBase, Arch=TAB_ARCH_COMMON, Target=None, Toolchain=None):\r
ae7b6df8
LG
220 self.MetaFile = FilePath\r
221 self._RawData = RawData\r
222 self._Bdb = BuildDataBase\r
223 self._Arch = Arch\r
224 self._Target = Target\r
225 self._Toolchain = Toolchain\r
68ba919f 226 self._ToolChainFamily = None\r
ae7b6df8 227 self._Clear()\r
0a57a978 228 self.WorkspaceDir = os.getenv("WORKSPACE") if os.getenv("WORKSPACE") else ""\r
8518bf0b 229 self.DefaultStores = None\r
e651d06c 230 self.SkuIdMgr = SkuClass(self.SkuName, self.SkuIds)\r
40a90664 231 self.UpdatePcdTypeDict()\r
0a57a978
FB
232 @property\r
233 def OutputPath(self):\r
234 if os.getenv("WORKSPACE"):\r
ccaa7754 235 return os.path.join(os.getenv("WORKSPACE"), self.OutputDirectory, self._Target + "_" + self._Toolchain, PcdValueInitName)\r
0a57a978
FB
236 else:\r
237 return os.path.dirname(self.DscFile)\r
ae7b6df8
LG
238\r
239 ## XXX[key] = value\r
240 def __setitem__(self, key, value):\r
241 self.__dict__[self._PROPERTY_[key]] = value\r
242\r
243 ## value = XXX[key]\r
244 def __getitem__(self, key):\r
245 return self.__dict__[self._PROPERTY_[key]]\r
246\r
247 ## "in" test support\r
248 def __contains__(self, key):\r
249 return key in self._PROPERTY_\r
250\r
251 ## Set all internal used members of DscBuildData to None\r
252 def _Clear(self):\r
253 self._Header = None\r
254 self._PlatformName = None\r
255 self._Guid = None\r
256 self._Version = None\r
257 self._DscSpecification = None\r
258 self._OutputDirectory = None\r
259 self._SupArchList = None\r
260 self._BuildTargets = None\r
261 self._SkuName = None\r
ae7b6df8
LG
262 self._PcdInfoFlag = None\r
263 self._VarCheckFlag = None\r
264 self._FlashDefinition = None\r
265 self._Prebuild = None\r
266 self._Postbuild = None\r
267 self._BuildNumber = None\r
268 self._MakefileName = None\r
269 self._BsBaseAddress = None\r
270 self._RtBaseAddress = None\r
271 self._SkuIds = None\r
272 self._Modules = None\r
273 self._LibraryInstances = None\r
274 self._LibraryClasses = None\r
275 self._Pcds = None\r
276 self._DecPcds = None\r
277 self._BuildOptions = None\r
278 self._ModuleTypeOptions = None\r
279 self._LoadFixAddress = None\r
280 self._RFCLanguages = None\r
281 self._ISOLanguages = None\r
282 self._VpdToolGuid = None\r
71cac3f7 283 self._MacroDict = None\r
8518bf0b 284 self.DefaultStores = None\r
ae7b6df8 285\r
ae7b6df8 286 ## Get current effective macros\r
71cac3f7
CJ
287 @property\r
288 def _Macros(self):\r
289 if self._MacroDict is None:\r
290 self._MacroDict = {}\r
291 self._MacroDict.update(GlobalData.gPlatformDefines)\r
292 self._MacroDict.update(GlobalData.gGlobalDefines)\r
293 self._MacroDict.update(GlobalData.gCommandLineDefines)\r
294 return self._MacroDict\r
ae7b6df8
LG
295\r
296 ## Get architecture\r
71cac3f7
CJ
297 @property\r
298 def Arch(self):\r
ae7b6df8 299 return self._Arch\r
b1e27d17
FB
300 @property\r
301 def Dir(self):\r
302 return self.MetaFile.Dir\r
ae7b6df8 303\r
ae7b6df8
LG
304 ## Retrieve all information in [Defines] section\r
305 #\r
fb0b35e0 306 # (Retrieving all [Defines] information in one-shot is just to save time.)\r
ae7b6df8
LG
307 #\r
308 def _GetHeaderInfo(self):\r
309 RecordList = self._RawData[MODEL_META_DATA_HEADER, self._Arch]\r
310 for Record in RecordList:\r
311 Name = Record[1]\r
312 # items defined _PROPERTY_ don't need additional processing\r
313\r
314 # some special items in [Defines] section need special treatment\r
315 if Name == TAB_DSC_DEFINES_OUTPUT_DIRECTORY:\r
316 self._OutputDirectory = NormPath(Record[2], self._Macros)\r
317 if ' ' in self._OutputDirectory:\r
318 EdkLogger.error("build", FORMAT_NOT_SUPPORTED, "No space is allowed in OUTPUT_DIRECTORY",\r
319 File=self.MetaFile, Line=Record[-1],\r
320 ExtraData=self._OutputDirectory)\r
321 elif Name == TAB_DSC_DEFINES_FLASH_DEFINITION:\r
322 self._FlashDefinition = PathClass(NormPath(Record[2], self._Macros), GlobalData.gWorkspace)\r
323 ErrorCode, ErrorInfo = self._FlashDefinition.Validate('.fdf')\r
324 if ErrorCode != 0:\r
325 EdkLogger.error('build', ErrorCode, File=self.MetaFile, Line=Record[-1],\r
326 ExtraData=ErrorInfo)\r
327 elif Name == TAB_DSC_PREBUILD:\r
328 PrebuildValue = Record[2]\r
329 if Record[2][0] == '"':\r
330 if Record[2][-1] != '"':\r
331 EdkLogger.error('build', FORMAT_INVALID, 'Missing double quotes in the end of %s statement.' % TAB_DSC_PREBUILD,\r
332 File=self.MetaFile, Line=Record[-1])\r
333 PrebuildValue = Record[2][1:-1]\r
334 self._Prebuild = PrebuildValue\r
335 elif Name == TAB_DSC_POSTBUILD:\r
336 PostbuildValue = Record[2]\r
337 if Record[2][0] == '"':\r
338 if Record[2][-1] != '"':\r
339 EdkLogger.error('build', FORMAT_INVALID, 'Missing double quotes in the end of %s statement.' % TAB_DSC_POSTBUILD,\r
340 File=self.MetaFile, Line=Record[-1])\r
341 PostbuildValue = Record[2][1:-1]\r
342 self._Postbuild = PostbuildValue\r
343 elif Name == TAB_DSC_DEFINES_SUPPORTED_ARCHITECTURES:\r
344 self._SupArchList = GetSplitValueList(Record[2], TAB_VALUE_SPLIT)\r
345 elif Name == TAB_DSC_DEFINES_BUILD_TARGETS:\r
346 self._BuildTargets = GetSplitValueList(Record[2])\r
347 elif Name == TAB_DSC_DEFINES_SKUID_IDENTIFIER:\r
4231a819 348 if self._SkuName is None:\r
ae7b6df8 349 self._SkuName = Record[2]\r
e651d06c
LG
350 if GlobalData.gSKUID_CMD:\r
351 self._SkuName = GlobalData.gSKUID_CMD\r
ae7b6df8
LG
352 elif Name == TAB_DSC_DEFINES_PCD_INFO_GENERATION:\r
353 self._PcdInfoFlag = Record[2]\r
354 elif Name == TAB_DSC_DEFINES_PCD_VAR_CHECK_GENERATION:\r
355 self._VarCheckFlag = Record[2]\r
356 elif Name == TAB_FIX_LOAD_TOP_MEMORY_ADDRESS:\r
357 try:\r
358 self._LoadFixAddress = int (Record[2], 0)\r
359 except:\r
360 EdkLogger.error("build", PARAMETER_INVALID, "FIX_LOAD_TOP_MEMORY_ADDRESS %s is not valid dec or hex string" % (Record[2]))\r
361 elif Name == TAB_DSC_DEFINES_RFC_LANGUAGES:\r
362 if not Record[2] or Record[2][0] != '"' or Record[2][-1] != '"' or len(Record[2]) == 1:\r
363 EdkLogger.error('build', FORMAT_NOT_SUPPORTED, 'language code for RFC_LANGUAGES must have double quotes around it, for example: RFC_LANGUAGES = "en-us;zh-hans"',\r
364 File=self.MetaFile, Line=Record[-1])\r
365 LanguageCodes = Record[2][1:-1]\r
366 if not LanguageCodes:\r
367 EdkLogger.error('build', FORMAT_NOT_SUPPORTED, 'one or more RFC4646 format language code must be provided for RFC_LANGUAGES statement',\r
368 File=self.MetaFile, Line=Record[-1])\r
369 LanguageList = GetSplitValueList(LanguageCodes, TAB_SEMI_COLON_SPLIT)\r
370 # check whether there is empty entries in the list\r
371 if None in LanguageList:\r
372 EdkLogger.error('build', FORMAT_NOT_SUPPORTED, 'one or more empty language code is in RFC_LANGUAGES statement',\r
373 File=self.MetaFile, Line=Record[-1])\r
374 self._RFCLanguages = LanguageList\r
375 elif Name == TAB_DSC_DEFINES_ISO_LANGUAGES:\r
376 if not Record[2] or Record[2][0] != '"' or Record[2][-1] != '"' or len(Record[2]) == 1:\r
377 EdkLogger.error('build', FORMAT_NOT_SUPPORTED, 'language code for ISO_LANGUAGES must have double quotes around it, for example: ISO_LANGUAGES = "engchn"',\r
378 File=self.MetaFile, Line=Record[-1])\r
379 LanguageCodes = Record[2][1:-1]\r
380 if not LanguageCodes:\r
381 EdkLogger.error('build', FORMAT_NOT_SUPPORTED, 'one or more ISO639-2 format language code must be provided for ISO_LANGUAGES statement',\r
382 File=self.MetaFile, Line=Record[-1])\r
383 if len(LanguageCodes) % 3:\r
384 EdkLogger.error('build', FORMAT_NOT_SUPPORTED, 'bad ISO639-2 format for ISO_LANGUAGES',\r
385 File=self.MetaFile, Line=Record[-1])\r
386 LanguageList = []\r
387 for i in range(0, len(LanguageCodes), 3):\r
388 LanguageList.append(LanguageCodes[i:i + 3])\r
389 self._ISOLanguages = LanguageList\r
390 elif Name == TAB_DSC_DEFINES_VPD_TOOL_GUID:\r
391 #\r
392 # try to convert GUID to a real UUID value to see whether the GUID is format\r
393 # for VPD_TOOL_GUID is correct.\r
394 #\r
395 try:\r
396 uuid.UUID(Record[2])\r
397 except:\r
398 EdkLogger.error("build", FORMAT_INVALID, "Invalid GUID format for VPD_TOOL_GUID", File=self.MetaFile)\r
399 self._VpdToolGuid = Record[2]\r
40a90664
BF
400 elif Name == TAB_DSC_DEFINES_PCD_DYNAMIC_AS_DYNAMICEX:\r
401 if TAB_DSC_DEFINES_PCD_DYNAMIC_AS_DYNAMICEX not in gCommandLineDefines:\r
402 gCommandLineDefines[TAB_DSC_DEFINES_PCD_DYNAMIC_AS_DYNAMICEX] = Record[2].strip()\r
ae7b6df8
LG
403 elif Name in self:\r
404 self[Name] = Record[2]\r
405 # set _Header to non-None in order to avoid database re-querying\r
406 self._Header = 'DUMMY'\r
407\r
408 ## Retrieve platform name\r
71cac3f7
CJ
409 @property\r
410 def PlatformName(self):\r
4231a819
CJ
411 if self._PlatformName is None:\r
412 if self._Header is None:\r
ae7b6df8 413 self._GetHeaderInfo()\r
4231a819 414 if self._PlatformName is None:\r
ae7b6df8
LG
415 EdkLogger.error('build', ATTRIBUTE_NOT_AVAILABLE, "No PLATFORM_NAME", File=self.MetaFile)\r
416 return self._PlatformName\r
417\r
71cac3f7
CJ
418 @property\r
419 def Platform(self):\r
420 return self.PlatformName\r
421\r
ae7b6df8 422 ## Retrieve file guid\r
71cac3f7
CJ
423 @property\r
424 def Guid(self):\r
4231a819
CJ
425 if self._Guid is None:\r
426 if self._Header is None:\r
ae7b6df8 427 self._GetHeaderInfo()\r
4231a819 428 if self._Guid is None:\r
ae7b6df8
LG
429 EdkLogger.error('build', ATTRIBUTE_NOT_AVAILABLE, "No PLATFORM_GUID", File=self.MetaFile)\r
430 return self._Guid\r
431\r
432 ## Retrieve platform version\r
71cac3f7
CJ
433 @property\r
434 def Version(self):\r
4231a819
CJ
435 if self._Version is None:\r
436 if self._Header is None:\r
ae7b6df8 437 self._GetHeaderInfo()\r
4231a819 438 if self._Version is None:\r
ae7b6df8
LG
439 EdkLogger.error('build', ATTRIBUTE_NOT_AVAILABLE, "No PLATFORM_VERSION", File=self.MetaFile)\r
440 return self._Version\r
441\r
442 ## Retrieve platform description file version\r
71cac3f7
CJ
443 @property\r
444 def DscSpecification(self):\r
4231a819
CJ
445 if self._DscSpecification is None:\r
446 if self._Header is None:\r
ae7b6df8 447 self._GetHeaderInfo()\r
4231a819 448 if self._DscSpecification is None:\r
ae7b6df8
LG
449 EdkLogger.error('build', ATTRIBUTE_NOT_AVAILABLE, "No DSC_SPECIFICATION", File=self.MetaFile)\r
450 return self._DscSpecification\r
451\r
452 ## Retrieve OUTPUT_DIRECTORY\r
71cac3f7
CJ
453 @property\r
454 def OutputDirectory(self):\r
4231a819
CJ
455 if self._OutputDirectory is None:\r
456 if self._Header is None:\r
ae7b6df8 457 self._GetHeaderInfo()\r
4231a819 458 if self._OutputDirectory is None:\r
ae7b6df8
LG
459 self._OutputDirectory = os.path.join("Build", self._PlatformName)\r
460 return self._OutputDirectory\r
461\r
462 ## Retrieve SUPPORTED_ARCHITECTURES\r
71cac3f7
CJ
463 @property\r
464 def SupArchList(self):\r
4231a819
CJ
465 if self._SupArchList is None:\r
466 if self._Header is None:\r
ae7b6df8 467 self._GetHeaderInfo()\r
4231a819 468 if self._SupArchList is None:\r
ae7b6df8
LG
469 EdkLogger.error('build', ATTRIBUTE_NOT_AVAILABLE, "No SUPPORTED_ARCHITECTURES", File=self.MetaFile)\r
470 return self._SupArchList\r
471\r
472 ## Retrieve BUILD_TARGETS\r
71cac3f7
CJ
473 @property\r
474 def BuildTargets(self):\r
4231a819
CJ
475 if self._BuildTargets is None:\r
476 if self._Header is None:\r
ae7b6df8 477 self._GetHeaderInfo()\r
4231a819 478 if self._BuildTargets is None:\r
ae7b6df8
LG
479 EdkLogger.error('build', ATTRIBUTE_NOT_AVAILABLE, "No BUILD_TARGETS", File=self.MetaFile)\r
480 return self._BuildTargets\r
481\r
71cac3f7
CJ
482 @property\r
483 def PcdInfoFlag(self):\r
4231a819 484 if self._PcdInfoFlag is None or self._PcdInfoFlag.upper() == 'FALSE':\r
ae7b6df8
LG
485 return False\r
486 elif self._PcdInfoFlag.upper() == 'TRUE':\r
487 return True\r
488 else:\r
489 return False\r
71cac3f7
CJ
490\r
491 @property\r
492 def VarCheckFlag(self):\r
4231a819 493 if self._VarCheckFlag is None or self._VarCheckFlag.upper() == 'FALSE':\r
ae7b6df8
LG
494 return False\r
495 elif self._VarCheckFlag.upper() == 'TRUE':\r
496 return True\r
497 else:\r
498 return False\r
e651d06c
LG
499\r
500 # # Retrieve SKUID_IDENTIFIER\r
71cac3f7
CJ
501 @property\r
502 def SkuName(self):\r
4231a819
CJ
503 if self._SkuName is None:\r
504 if self._Header is None:\r
ae7b6df8 505 self._GetHeaderInfo()\r
4231a819 506 if self._SkuName is None:\r
55c84777 507 self._SkuName = TAB_DEFAULT\r
ae7b6df8
LG
508 return self._SkuName\r
509\r
510 ## Override SKUID_IDENTIFIER\r
71cac3f7
CJ
511 @SkuName.setter\r
512 def SkuName(self, Value):\r
ae7b6df8 513 self._SkuName = Value\r
ae7b6df8 514\r
71cac3f7
CJ
515 @property\r
516 def FlashDefinition(self):\r
4231a819
CJ
517 if self._FlashDefinition is None:\r
518 if self._Header is None:\r
ae7b6df8 519 self._GetHeaderInfo()\r
4231a819 520 if self._FlashDefinition is None:\r
ae7b6df8
LG
521 self._FlashDefinition = ''\r
522 return self._FlashDefinition\r
523\r
71cac3f7
CJ
524 @property\r
525 def Prebuild(self):\r
4231a819
CJ
526 if self._Prebuild is None:\r
527 if self._Header is None:\r
ae7b6df8 528 self._GetHeaderInfo()\r
4231a819 529 if self._Prebuild is None:\r
ae7b6df8
LG
530 self._Prebuild = ''\r
531 return self._Prebuild\r
532\r
71cac3f7
CJ
533 @property\r
534 def Postbuild(self):\r
4231a819
CJ
535 if self._Postbuild is None:\r
536 if self._Header is None:\r
ae7b6df8 537 self._GetHeaderInfo()\r
4231a819 538 if self._Postbuild is None:\r
ae7b6df8
LG
539 self._Postbuild = ''\r
540 return self._Postbuild\r
541\r
542 ## Retrieve FLASH_DEFINITION\r
71cac3f7
CJ
543 @property\r
544 def BuildNumber(self):\r
4231a819
CJ
545 if self._BuildNumber is None:\r
546 if self._Header is None:\r
ae7b6df8 547 self._GetHeaderInfo()\r
4231a819 548 if self._BuildNumber is None:\r
ae7b6df8
LG
549 self._BuildNumber = ''\r
550 return self._BuildNumber\r
551\r
552 ## Retrieve MAKEFILE_NAME\r
71cac3f7
CJ
553 @property\r
554 def MakefileName(self):\r
4231a819
CJ
555 if self._MakefileName is None:\r
556 if self._Header is None:\r
ae7b6df8 557 self._GetHeaderInfo()\r
4231a819 558 if self._MakefileName is None:\r
ae7b6df8
LG
559 self._MakefileName = ''\r
560 return self._MakefileName\r
561\r
562 ## Retrieve BsBaseAddress\r
71cac3f7
CJ
563 @property\r
564 def BsBaseAddress(self):\r
4231a819
CJ
565 if self._BsBaseAddress is None:\r
566 if self._Header is None:\r
ae7b6df8 567 self._GetHeaderInfo()\r
4231a819 568 if self._BsBaseAddress is None:\r
ae7b6df8
LG
569 self._BsBaseAddress = ''\r
570 return self._BsBaseAddress\r
571\r
572 ## Retrieve RtBaseAddress\r
71cac3f7
CJ
573 @property\r
574 def RtBaseAddress(self):\r
4231a819
CJ
575 if self._RtBaseAddress is None:\r
576 if self._Header is None:\r
ae7b6df8 577 self._GetHeaderInfo()\r
4231a819 578 if self._RtBaseAddress is None:\r
ae7b6df8
LG
579 self._RtBaseAddress = ''\r
580 return self._RtBaseAddress\r
581\r
582 ## Retrieve the top address for the load fix address\r
71cac3f7
CJ
583 @property\r
584 def LoadFixAddress(self):\r
4231a819
CJ
585 if self._LoadFixAddress is None:\r
586 if self._Header is None:\r
ae7b6df8
LG
587 self._GetHeaderInfo()\r
588\r
4231a819 589 if self._LoadFixAddress is None:\r
ae7b6df8
LG
590 self._LoadFixAddress = self._Macros.get(TAB_FIX_LOAD_TOP_MEMORY_ADDRESS, '0')\r
591\r
592 try:\r
593 self._LoadFixAddress = int (self._LoadFixAddress, 0)\r
594 except:\r
595 EdkLogger.error("build", PARAMETER_INVALID, "FIX_LOAD_TOP_MEMORY_ADDRESS %s is not valid dec or hex string" % (self._LoadFixAddress))\r
596\r
597 #\r
598 # If command line defined, should override the value in DSC file.\r
599 #\r
5a693b89 600 if 'FIX_LOAD_TOP_MEMORY_ADDRESS' in GlobalData.gCommandLineDefines:\r
ae7b6df8
LG
601 try:\r
602 self._LoadFixAddress = int(GlobalData.gCommandLineDefines['FIX_LOAD_TOP_MEMORY_ADDRESS'], 0)\r
603 except:\r
604 EdkLogger.error("build", PARAMETER_INVALID, "FIX_LOAD_TOP_MEMORY_ADDRESS %s is not valid dec or hex string" % (GlobalData.gCommandLineDefines['FIX_LOAD_TOP_MEMORY_ADDRESS']))\r
605\r
606 if self._LoadFixAddress < 0:\r
607 EdkLogger.error("build", PARAMETER_INVALID, "FIX_LOAD_TOP_MEMORY_ADDRESS is set to the invalid negative value 0x%x" % (self._LoadFixAddress))\r
608 if self._LoadFixAddress != 0xFFFFFFFFFFFFFFFF and self._LoadFixAddress % 0x1000 != 0:\r
609 EdkLogger.error("build", PARAMETER_INVALID, "FIX_LOAD_TOP_MEMORY_ADDRESS is set to the invalid unaligned 4K value 0x%x" % (self._LoadFixAddress))\r
610\r
611 return self._LoadFixAddress\r
612\r
613 ## Retrieve RFCLanguage filter\r
71cac3f7
CJ
614 @property\r
615 def RFCLanguages(self):\r
4231a819
CJ
616 if self._RFCLanguages is None:\r
617 if self._Header is None:\r
ae7b6df8 618 self._GetHeaderInfo()\r
4231a819 619 if self._RFCLanguages is None:\r
ae7b6df8
LG
620 self._RFCLanguages = []\r
621 return self._RFCLanguages\r
622\r
623 ## Retrieve ISOLanguage filter\r
71cac3f7
CJ
624 @property\r
625 def ISOLanguages(self):\r
4231a819
CJ
626 if self._ISOLanguages is None:\r
627 if self._Header is None:\r
ae7b6df8 628 self._GetHeaderInfo()\r
4231a819 629 if self._ISOLanguages is None:\r
ae7b6df8
LG
630 self._ISOLanguages = []\r
631 return self._ISOLanguages\r
71cac3f7 632\r
ae7b6df8 633 ## Retrieve the GUID string for VPD tool\r
71cac3f7
CJ
634 @property\r
635 def VpdToolGuid(self):\r
4231a819
CJ
636 if self._VpdToolGuid is None:\r
637 if self._Header is None:\r
ae7b6df8 638 self._GetHeaderInfo()\r
4231a819 639 if self._VpdToolGuid is None:\r
ae7b6df8
LG
640 self._VpdToolGuid = ''\r
641 return self._VpdToolGuid\r
642\r
643 ## Retrieve [SkuIds] section information\r
71cac3f7
CJ
644 @property\r
645 def SkuIds(self):\r
4231a819 646 if self._SkuIds is None:\r
a0767bae 647 self._SkuIds = OrderedDict()\r
ae7b6df8
LG
648 RecordList = self._RawData[MODEL_EFI_SKU_ID, self._Arch]\r
649 for Record in RecordList:\r
c93356ad 650 if not Record[0]:\r
ae7b6df8
LG
651 EdkLogger.error('build', FORMAT_INVALID, 'No Sku ID number',\r
652 File=self.MetaFile, Line=Record[-1])\r
c93356ad 653 if not Record[1]:\r
ae7b6df8
LG
654 EdkLogger.error('build', FORMAT_INVALID, 'No Sku ID name',\r
655 File=self.MetaFile, Line=Record[-1])\r
fe1abb4b 656 if not Pattern.match(Record[0]) and not HexPattern.match(Record[0]):\r
e6b10112 657 EdkLogger.error('build', FORMAT_INVALID, "The format of the Sku ID number is invalid. It only support Integer and HexNumber",\r
8518bf0b 658 File=self.MetaFile, Line=Record[-1])\r
24bd035c
Z
659 if not SkuIdPattern.match(Record[1]) or (Record[2] and not SkuIdPattern.match(Record[2])):\r
660 EdkLogger.error('build', FORMAT_INVALID, "The format of the Sku ID name is invalid. The correct format is '(a-zA-Z_)(a-zA-Z0-9_)*'",\r
8518bf0b 661 File=self.MetaFile, Line=Record[-1])\r
9e508f3a 662 self._SkuIds[Record[1].upper()] = (str(DscBuildData.ToInt(Record[0])), Record[1].upper(), Record[2].upper())\r
55c84777
CJ
663 if TAB_DEFAULT not in self._SkuIds:\r
664 self._SkuIds[TAB_DEFAULT] = ("0", TAB_DEFAULT, TAB_DEFAULT)\r
665 if TAB_COMMON not in self._SkuIds:\r
666 self._SkuIds[TAB_COMMON] = ("0", TAB_DEFAULT, TAB_DEFAULT)\r
ae7b6df8 667 return self._SkuIds\r
9e508f3a
CJ
668\r
669 @staticmethod\r
670 def ToInt(intstr):\r
ccaa7754 671 return int(intstr, 16) if intstr.upper().startswith("0X") else int(intstr)\r
9e508f3a 672\r
8518bf0b 673 def _GetDefaultStores(self):\r
4231a819 674 if self.DefaultStores is None:\r
a0767bae 675 self.DefaultStores = OrderedDict()\r
8518bf0b
LG
676 RecordList = self._RawData[MODEL_EFI_DEFAULT_STORES, self._Arch]\r
677 for Record in RecordList:\r
c93356ad 678 if not Record[0]:\r
8518bf0b
LG
679 EdkLogger.error('build', FORMAT_INVALID, 'No DefaultStores ID number',\r
680 File=self.MetaFile, Line=Record[-1])\r
c93356ad 681 if not Record[1]:\r
8518bf0b
LG
682 EdkLogger.error('build', FORMAT_INVALID, 'No DefaultStores ID name',\r
683 File=self.MetaFile, Line=Record[-1])\r
fe1abb4b 684 if not Pattern.match(Record[0]) and not HexPattern.match(Record[0]):\r
767ddbe8
YZ
685 EdkLogger.error('build', FORMAT_INVALID, "The format of the DefaultStores ID number is invalid. It only support Integer and HexNumber",\r
686 File=self.MetaFile, Line=Record[-1])\r
687 if not IsValidWord(Record[1]):\r
688 EdkLogger.error('build', FORMAT_INVALID, "The format of the DefaultStores ID name is invalid. The correct format is '(a-zA-Z0-9_)(a-zA-Z0-9_-.)*'",\r
689 File=self.MetaFile, Line=Record[-1])\r
ccaa7754 690 self.DefaultStores[Record[1].upper()] = (DscBuildData.ToInt(Record[0]), Record[1].upper())\r
8518bf0b 691 if TAB_DEFAULT_STORES_DEFAULT not in self.DefaultStores:\r
ccaa7754 692 self.DefaultStores[TAB_DEFAULT_STORES_DEFAULT] = (0, TAB_DEFAULT_STORES_DEFAULT)\r
5a693b89 693 GlobalData.gDefaultStores = sorted(self.DefaultStores.keys())\r
8518bf0b 694 return self.DefaultStores\r
ae7b6df8 695\r
5bc96263
FB
696 def OverrideDuplicateModule(self):\r
697 RecordList = self._RawData[MODEL_META_DATA_COMPONENT, self._Arch]\r
698 Macros = self._Macros\r
5bc96263
FB
699 Components = {}\r
700 for Record in RecordList:\r
701 ModuleId = Record[6]\r
702 file_guid = self._RawData[MODEL_META_DATA_HEADER, self._Arch, None, ModuleId]\r
703 file_guid_str = file_guid[0][2] if file_guid else "NULL"\r
704 ModuleFile = PathClass(NormPath(Record[0], Macros), GlobalData.gWorkspace, Arch=self._Arch)\r
705 if self._Arch != TAB_ARCH_COMMON and (file_guid_str,str(ModuleFile)) in Components:\r
706 self._RawData.DisableOverrideComponent(Components[(file_guid_str,str(ModuleFile))])\r
707 Components[(file_guid_str,str(ModuleFile))] = ModuleId\r
708 self._RawData._PostProcessed = False\r
bf1ea933
FZ
709\r
710 ## Retrieve packages this Platform depends on\r
711 @cached_property\r
712 def Packages(self):\r
713 RetVal = set()\r
714 RecordList = self._RawData[MODEL_META_DATA_PACKAGE, self._Arch]\r
715 Macros = self._Macros\r
716 for Record in RecordList:\r
717 File = PathClass(NormPath(Record[0], Macros), GlobalData.gWorkspace, Arch=self._Arch)\r
718 # check the file validation\r
719 ErrorCode, ErrorInfo = File.Validate('.dec')\r
720 if ErrorCode != 0:\r
721 LineNo = Record[-1]\r
722 EdkLogger.error('build', ErrorCode, ExtraData=ErrorInfo, File=self.MetaFile, Line=LineNo)\r
723 # parse this package now. we need it to get protocol/ppi/guid value\r
724 RetVal.add(self._Bdb[File, self._Arch, self._Target, self._Toolchain])\r
725 return RetVal\r
726\r
ae7b6df8 727 ## Retrieve [Components] section information\r
71cac3f7
CJ
728 @property\r
729 def Modules(self):\r
4231a819 730 if self._Modules is not None:\r
ae7b6df8 731 return self._Modules\r
5bc96263 732 self.OverrideDuplicateModule()\r
a0767bae 733 self._Modules = OrderedDict()\r
ae7b6df8
LG
734 RecordList = self._RawData[MODEL_META_DATA_COMPONENT, self._Arch]\r
735 Macros = self._Macros\r
ae7b6df8 736 for Record in RecordList:\r
ae7b6df8 737 ModuleFile = PathClass(NormPath(Record[0], Macros), GlobalData.gWorkspace, Arch=self._Arch)\r
8518bf0b
LG
738 ModuleId = Record[6]\r
739 LineNo = Record[7]\r
ae7b6df8
LG
740\r
741 # check the file validation\r
742 ErrorCode, ErrorInfo = ModuleFile.Validate('.inf')\r
743 if ErrorCode != 0:\r
744 EdkLogger.error('build', ErrorCode, File=self.MetaFile, Line=LineNo,\r
745 ExtraData=ErrorInfo)\r
ae7b6df8 746\r
09af9bd9 747 ModuleBuildData = self._Bdb[ModuleFile, self._Arch, self._Target, self._Toolchain]\r
ae7b6df8
LG
748 Module = ModuleBuildClassObject()\r
749 Module.MetaFile = ModuleFile\r
09af9bd9 750 Module.Guid = ModuleBuildData.Guid\r
ae7b6df8
LG
751 # get module private library instance\r
752 RecordList = self._RawData[MODEL_EFI_LIBRARY_CLASS, self._Arch, None, ModuleId]\r
753 for Record in RecordList:\r
754 LibraryClass = Record[0]\r
755 LibraryPath = PathClass(NormPath(Record[1], Macros), GlobalData.gWorkspace, Arch=self._Arch)\r
756 LineNo = Record[-1]\r
757\r
758 # check the file validation\r
759 ErrorCode, ErrorInfo = LibraryPath.Validate('.inf')\r
760 if ErrorCode != 0:\r
761 EdkLogger.error('build', ErrorCode, File=self.MetaFile, Line=LineNo,\r
762 ExtraData=ErrorInfo)\r
763\r
764 if LibraryClass == '' or LibraryClass == 'NULL':\r
765 self._NullLibraryNumber += 1\r
766 LibraryClass = 'NULL%d' % self._NullLibraryNumber\r
767 EdkLogger.verbose("Found forced library for %s\n\t%s [%s]" % (ModuleFile, LibraryPath, LibraryClass))\r
768 Module.LibraryClasses[LibraryClass] = LibraryPath\r
769 if LibraryPath not in self.LibraryInstances:\r
770 self.LibraryInstances.append(LibraryPath)\r
09af9bd9 771 S_PcdSet = []\r
ae7b6df8
LG
772 # get module private PCD setting\r
773 for Type in [MODEL_PCD_FIXED_AT_BUILD, MODEL_PCD_PATCHABLE_IN_MODULE, \\r
774 MODEL_PCD_FEATURE_FLAG, MODEL_PCD_DYNAMIC, MODEL_PCD_DYNAMIC_EX]:\r
775 RecordList = self._RawData[Type, self._Arch, None, ModuleId]\r
ccaa7754 776 for TokenSpaceGuid, PcdCName, Setting, Dummy1, Dummy2, Dummy3, Dummy4, Dummy5 in RecordList:\r
ae7b6df8
LG
777 TokenList = GetSplitValueList(Setting)\r
778 DefaultValue = TokenList[0]\r
cdbf45ad
YZ
779 # the format is PcdName| Value | VOID* | MaxDatumSize\r
780 if len(TokenList) > 2:\r
781 MaxDatumSize = TokenList[2]\r
ae7b6df8
LG
782 else:\r
783 MaxDatumSize = ''\r
784 TypeString = self._PCD_TYPE_STRING_[Type]\r
ae7b6df8 785\r
09af9bd9
BF
786 TCName,PCName,DimensionAttr,Field = self.ParsePcdNameStruct(TokenSpaceGuid, PcdCName)\r
787\r
788 if ("." in TokenSpaceGuid or "[" in PcdCName):\r
789 S_PcdSet.append([ TCName,PCName,DimensionAttr,Field, ModuleBuildData.Guid, "", Dummy5, AnalyzePcdExpression(Setting)[0]])\r
790 DefaultValue = ''\r
791 if ( PCName,TCName) not in Module.Pcds:\r
792 Pcd = PcdClassObject(\r
793 PCName,\r
794 TCName,\r
795 TypeString,\r
796 '',\r
797 DefaultValue,\r
798 '',\r
799 MaxDatumSize,\r
800 {},\r
801 False,\r
802 None,\r
803 IsDsc=True)\r
804 Module.Pcds[PCName, TCName] = Pcd\r
805\r
806 Module.StrPcdSet = S_PcdSet\r
807 for TCName,PCName, _,_,_,_,_,_ in S_PcdSet:\r
808 if (PCName,TCName) in Module.Pcds:\r
809 Module.StrPcdOverallValue[(PCName,TCName)] = Module.Pcds[(PCName,TCName)].DefaultValue, self.MetaFile,Dummy5\r
ae7b6df8
LG
810 # get module private build options\r
811 RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch, None, ModuleId]\r
ccaa7754 812 for ToolChainFamily, ToolChain, Option, Dummy1, Dummy2, Dummy3, Dummy4, Dummy5 in RecordList:\r
ae7b6df8
LG
813 if (ToolChainFamily, ToolChain) not in Module.BuildOptions:\r
814 Module.BuildOptions[ToolChainFamily, ToolChain] = Option\r
815 else:\r
816 OptionString = Module.BuildOptions[ToolChainFamily, ToolChain]\r
817 Module.BuildOptions[ToolChainFamily, ToolChain] = OptionString + " " + Option\r
818\r
819 RecordList = self._RawData[MODEL_META_DATA_HEADER, self._Arch, None, ModuleId]\r
ae7b6df8
LG
820 if RecordList:\r
821 if len(RecordList) != 1:\r
822 EdkLogger.error('build', OPTION_UNKNOWN, 'Only FILE_GUID can be listed in <Defines> section.',\r
823 File=self.MetaFile, ExtraData=str(ModuleFile), Line=LineNo)\r
824 ModuleFile = ProcessDuplicatedInf(ModuleFile, RecordList[0][2], GlobalData.gWorkspace)\r
825 ModuleFile.Arch = self._Arch\r
09af9bd9
BF
826 Module.Guid = RecordList[0][2]\r
827 for item in Module.StrPcdSet:\r
828 item[4] = RecordList[0][2]\r
ae7b6df8
LG
829 self._Modules[ModuleFile] = Module\r
830 return self._Modules\r
831\r
832 ## Retrieve all possible library instances used in this platform\r
71cac3f7
CJ
833 @property\r
834 def LibraryInstances(self):\r
4231a819 835 if self._LibraryInstances is None:\r
71cac3f7 836 self.LibraryClasses\r
ae7b6df8
LG
837 return self._LibraryInstances\r
838\r
839 ## Retrieve [LibraryClasses] information\r
71cac3f7
CJ
840 @property\r
841 def LibraryClasses(self):\r
4231a819 842 if self._LibraryClasses is None:\r
ae7b6df8
LG
843 self._LibraryInstances = []\r
844 #\r
845 # tdict is a special dict kind of type, used for selecting correct\r
846 # library instance for given library class and module type\r
847 #\r
848 LibraryClassDict = tdict(True, 3)\r
849 # track all library class names\r
850 LibraryClassSet = set()\r
851 RecordList = self._RawData[MODEL_EFI_LIBRARY_CLASS, self._Arch, None, -1]\r
852 Macros = self._Macros\r
853 for Record in RecordList:\r
ccaa7754 854 LibraryClass, LibraryInstance, Dummy, Arch, ModuleType, Dummy, Dummy, LineNo = Record\r
ae7b6df8
LG
855 if LibraryClass == '' or LibraryClass == 'NULL':\r
856 self._NullLibraryNumber += 1\r
857 LibraryClass = 'NULL%d' % self._NullLibraryNumber\r
858 EdkLogger.verbose("Found forced library for arch=%s\n\t%s [%s]" % (Arch, LibraryInstance, LibraryClass))\r
859 LibraryClassSet.add(LibraryClass)\r
860 LibraryInstance = PathClass(NormPath(LibraryInstance, Macros), GlobalData.gWorkspace, Arch=self._Arch)\r
861 # check the file validation\r
862 ErrorCode, ErrorInfo = LibraryInstance.Validate('.inf')\r
863 if ErrorCode != 0:\r
864 EdkLogger.error('build', ErrorCode, File=self.MetaFile, Line=LineNo,\r
865 ExtraData=ErrorInfo)\r
866\r
55c84777 867 if ModuleType != TAB_COMMON and ModuleType not in SUP_MODULE_LIST:\r
ae7b6df8
LG
868 EdkLogger.error('build', OPTION_UNKNOWN, "Unknown module type [%s]" % ModuleType,\r
869 File=self.MetaFile, ExtraData=LibraryInstance, Line=LineNo)\r
870 LibraryClassDict[Arch, ModuleType, LibraryClass] = LibraryInstance\r
871 if LibraryInstance not in self._LibraryInstances:\r
872 self._LibraryInstances.append(LibraryInstance)\r
873\r
874 # resolve the specific library instance for each class and each module type\r
875 self._LibraryClasses = tdict(True)\r
876 for LibraryClass in LibraryClassSet:\r
877 # try all possible module types\r
878 for ModuleType in SUP_MODULE_LIST:\r
879 LibraryInstance = LibraryClassDict[self._Arch, ModuleType, LibraryClass]\r
4231a819 880 if LibraryInstance is None:\r
ae7b6df8
LG
881 continue\r
882 self._LibraryClasses[LibraryClass, ModuleType] = LibraryInstance\r
883\r
ae7b6df8
LG
884 RecordList = self._RawData[MODEL_EFI_LIBRARY_INSTANCE, self._Arch]\r
885 for Record in RecordList:\r
886 File = PathClass(NormPath(Record[0], Macros), GlobalData.gWorkspace, Arch=self._Arch)\r
887 LineNo = Record[-1]\r
888 # check the file validation\r
889 ErrorCode, ErrorInfo = File.Validate('.inf')\r
890 if ErrorCode != 0:\r
891 EdkLogger.error('build', ErrorCode, File=self.MetaFile, Line=LineNo,\r
892 ExtraData=ErrorInfo)\r
893 if File not in self._LibraryInstances:\r
894 self._LibraryInstances.append(File)\r
895 #\r
896 # we need the module name as the library class name, so we have\r
897 # to parse it here. (self._Bdb[] will trigger a file parse if it\r
898 # hasn't been parsed)\r
899 #\r
900 Library = self._Bdb[File, self._Arch, self._Target, self._Toolchain]\r
901 self._LibraryClasses[Library.BaseName, ':dummy:'] = Library\r
902 return self._LibraryClasses\r
903\r
904 def _ValidatePcd(self, PcdCName, TokenSpaceGuid, Setting, PcdType, LineNo):\r
643556fc 905 if not self._DecPcds:\r
2b8a6c44 906\r
ae7b6df8
LG
907 FdfInfList = []\r
908 if GlobalData.gFdfParser:\r
909 FdfInfList = GlobalData.gFdfParser.Profile.InfList\r
910\r
911 PkgSet = set()\r
912 for Inf in FdfInfList:\r
913 ModuleFile = PathClass(NormPath(Inf), GlobalData.gWorkspace, Arch=self._Arch)\r
914 if ModuleFile in self._Modules:\r
915 continue\r
916 ModuleData = self._Bdb[ModuleFile, self._Arch, self._Target, self._Toolchain]\r
917 PkgSet.update(ModuleData.Packages)\r
bf1ea933
FZ
918 if self.Packages:\r
919 PkgSet.update(self.Packages)\r
ccaa7754 920 self._DecPcds, self._GuidDict = GetDeclaredPcd(self, self._Bdb, self._Arch, self._Target, self._Toolchain, PkgSet)\r
9efe8d60 921 self._GuidDict.update(GlobalData.gPlatformPcds)\r
2b8a6c44
LG
922\r
923 if (PcdCName, TokenSpaceGuid) not in self._DecPcds:\r
ae7b6df8 924 EdkLogger.error('build', PARSER_ERROR,\r
209d0959 925 "Pcd (%s.%s) defined in DSC is not declared in DEC files referenced in INF files in FDF. Arch: ['%s']" % (TokenSpaceGuid, PcdCName, self._Arch),\r
ae7b6df8
LG
926 File=self.MetaFile, Line=LineNo)\r
927 ValueList, IsValid, Index = AnalyzeDscPcd(Setting, PcdType, self._DecPcds[PcdCName, TokenSpaceGuid].DatumType)\r
520365de
B
928 if not IsValid:\r
929 if PcdType not in [MODEL_PCD_FEATURE_FLAG, MODEL_PCD_FIXED_AT_BUILD]:\r
930 EdkLogger.error('build', FORMAT_INVALID, "Pcd format incorrect.", File=self.MetaFile, Line=LineNo,\r
931 ExtraData="%s.%s|%s" % (TokenSpaceGuid, PcdCName, Setting))\r
932 else:\r
933 if ValueList[2] == '-1':\r
934 EdkLogger.error('build', FORMAT_INVALID, "Pcd format incorrect.", File=self.MetaFile, Line=LineNo,\r
935 ExtraData="%s.%s|%s" % (TokenSpaceGuid, PcdCName, Setting))\r
35f613d9
YF
936 if ValueList[Index]:\r
937 DatumType = self._DecPcds[PcdCName, TokenSpaceGuid].DatumType\r
72a1d776 938 if "{CODE(" not in ValueList[Index]:\r
939 try:\r
940 ValueList[Index] = ValueExpressionEx(ValueList[Index], DatumType, self._GuidDict)(True)\r
941 except BadExpression as Value:\r
942 EdkLogger.error('Parser', FORMAT_INVALID, Value, File=self.MetaFile, Line=LineNo,\r
943 ExtraData="PCD [%s.%s] Value \"%s\" " % (\r
944 TokenSpaceGuid, PcdCName, ValueList[Index]))\r
945 except EvaluationException as Excpt:\r
946 if hasattr(Excpt, 'Pcd'):\r
947 if Excpt.Pcd in GlobalData.gPlatformOtherPcds:\r
948 EdkLogger.error('Parser', FORMAT_INVALID, "Cannot use this PCD (%s) in an expression as"\r
949 " it must be defined in a [PcdsFixedAtBuild] or [PcdsFeatureFlag] section"\r
950 " of the DSC file" % Excpt.Pcd,\r
951 File=self.MetaFile, Line=LineNo)\r
952 else:\r
953 EdkLogger.error('Parser', FORMAT_INVALID, "PCD (%s) is not defined in DSC file" % Excpt.Pcd,\r
954 File=self.MetaFile, Line=LineNo)\r
ae7b6df8 955 else:\r
72a1d776 956 EdkLogger.error('Parser', FORMAT_INVALID, "Invalid expression: %s" % str(Excpt),\r
ae7b6df8 957 File=self.MetaFile, Line=LineNo)\r
35f613d9 958\r
ae7b6df8
LG
959 if ValueList[Index]:\r
960 Valid, ErrStr = CheckPcdDatum(self._DecPcds[PcdCName, TokenSpaceGuid].DatumType, ValueList[Index])\r
961 if not Valid:\r
962 EdkLogger.error('build', FORMAT_INVALID, ErrStr, File=self.MetaFile, Line=LineNo,\r
963 ExtraData="%s.%s" % (TokenSpaceGuid, PcdCName))\r
f2cc33d8 964 if PcdType in (MODEL_PCD_DYNAMIC_DEFAULT, MODEL_PCD_DYNAMIC_EX_DEFAULT, MODEL_PCD_FIXED_AT_BUILD, MODEL_PCD_PATCHABLE_IN_MODULE):\r
afe8c411 965 if self._DecPcds[PcdCName, TokenSpaceGuid].DatumType.strip() != ValueList[1].strip():\r
8b4b2fb9
FZ
966 DecPcd = self._DecPcds[PcdCName, TokenSpaceGuid]\r
967 EdkLogger.error('build', FORMAT_INVALID,\r
968 "Pcd datumtype used in DSC file is not the same as its declaration. DatumType:%s"%DecPcd.DatumType,\r
969 File=self.MetaFile, Line=LineNo,\r
970 ExtraData="Dsc:%s.%s|%s\n Dec:%s.%s|%s|%s|%s" % (TokenSpaceGuid, PcdCName, Setting, TokenSpaceGuid, \\r
971 PcdCName, DecPcd.DefaultValue, DecPcd.DatumType, DecPcd.TokenValue))\r
35f613d9
YF
972 if (TokenSpaceGuid + '.' + PcdCName) in GlobalData.gPlatformPcds:\r
973 if GlobalData.gPlatformPcds[TokenSpaceGuid + '.' + PcdCName] != ValueList[Index]:\r
974 GlobalData.gPlatformPcds[TokenSpaceGuid + '.' + PcdCName] = ValueList[Index]\r
ae7b6df8
LG
975 return ValueList\r
976\r
ccaa7754 977 def _FilterPcdBySkuUsage(self, Pcds):\r
8518bf0b
LG
978 available_sku = self.SkuIdMgr.AvailableSkuIdSet\r
979 sku_usage = self.SkuIdMgr.SkuUsageType\r
980 if sku_usage == SkuClass.SINGLE:\r
981 for pcdname in Pcds:\r
982 pcd = Pcds[pcdname]\r
55c84777 983 Pcds[pcdname].SkuInfoList = {TAB_DEFAULT:pcd.SkuInfoList[skuid] for skuid in pcd.SkuInfoList if skuid in available_sku}\r
0d1f5b2b 984 if isinstance(pcd, StructurePcd) and pcd.SkuOverrideValues:\r
55c84777 985 Pcds[pcdname].SkuOverrideValues = {TAB_DEFAULT:pcd.SkuOverrideValues[skuid] for skuid in pcd.SkuOverrideValues if skuid in available_sku}\r
8518bf0b
LG
986 else:\r
987 for pcdname in Pcds:\r
988 pcd = Pcds[pcdname]\r
989 Pcds[pcdname].SkuInfoList = {skuid:pcd.SkuInfoList[skuid] for skuid in pcd.SkuInfoList if skuid in available_sku}\r
0d1f5b2b 990 if isinstance(pcd, StructurePcd) and pcd.SkuOverrideValues:\r
65eff519 991 Pcds[pcdname].SkuOverrideValues = {skuid:pcd.SkuOverrideValues[skuid] for skuid in pcd.SkuOverrideValues if skuid in available_sku}\r
8518bf0b 992 return Pcds\r
71cac3f7 993\r
ccaa7754 994 def CompleteHiiPcdsDefaultStores(self, Pcds):\r
2b8a6c44
LG
995 HiiPcd = [Pcds[pcd] for pcd in Pcds if Pcds[pcd].Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]]\r
996 DefaultStoreMgr = DefaultStore(self.DefaultStores)\r
997 for pcd in HiiPcd:\r
998 for skuid in pcd.SkuInfoList:\r
999 skuobj = pcd.SkuInfoList.get(skuid)\r
4d3b9389 1000 if TAB_DEFAULT_STORES_DEFAULT not in skuobj.DefaultStoreDict:\r
c5c7e68a 1001 PcdDefaultStoreSet = set(defaultstorename for defaultstorename in skuobj.DefaultStoreDict)\r
2b8a6c44 1002 mindefaultstorename = DefaultStoreMgr.GetMin(PcdDefaultStoreSet)\r
9bf86b12 1003 skuobj.DefaultStoreDict[TAB_DEFAULT_STORES_DEFAULT] = skuobj.DefaultStoreDict[mindefaultstorename]\r
2b8a6c44
LG
1004 return Pcds\r
1005\r
6f49996c 1006 def RecoverCommandLinePcd(self):\r
0f228f19
B
1007 def UpdateCommandLineValue(pcd):\r
1008 if pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],\r
1009 self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:\r
1010 pcd.PcdValueFromComm = pcd.DefaultValue\r
1011 elif pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
55c84777 1012 pcd.PcdValueFromComm = pcd.SkuInfoList.get(TAB_DEFAULT).HiiDefaultValue\r
0f228f19 1013 else:\r
55c84777 1014 pcd.PcdValueFromComm = pcd.SkuInfoList.get(TAB_DEFAULT).DefaultValue\r
0f228f19 1015 for pcd in self._Pcds:\r
ccaa7754 1016 if isinstance(self._Pcds[pcd], StructurePcd) and (self._Pcds[pcd].PcdValueFromComm or self._Pcds[pcd].PcdFieldValueFromComm):\r
0f228f19
B
1017 UpdateCommandLineValue(self._Pcds[pcd])\r
1018\r
6f49996c
FB
1019 def __ParsePcdFromCommandLine(self):\r
1020 if GlobalData.BuildOptionPcd:\r
1021 for i, pcd in enumerate(GlobalData.BuildOptionPcd):\r
0d1f5b2b 1022 if isinstance(pcd, tuple):\r
6f49996c
FB
1023 continue\r
1024 (pcdname, pcdvalue) = pcd.split('=')\r
1025 if not pcdvalue:\r
1026 EdkLogger.error('build', AUTOGEN_ERROR, "No Value specified for the PCD %s." % (pcdname))\r
1027 if '.' in pcdname:\r
ccaa7754 1028 (Name1, Name2) = pcdname.split('.', 1)\r
6f49996c 1029 if "." in Name2:\r
ccaa7754
GL
1030 (Name3, FieldName) = Name2.split(".", 1)\r
1031 if ((Name3, Name1)) in self.DecPcds:\r
6f49996c
FB
1032 HasTokenSpace = True\r
1033 TokenCName = Name3\r
1034 TokenSpaceGuidCName = Name1\r
1035 else:\r
1036 FieldName = Name2\r
1037 TokenCName = Name1\r
1038 TokenSpaceGuidCName = ''\r
1039 HasTokenSpace = False\r
1040 else:\r
ccaa7754 1041 if ((Name2, Name1)) in self.DecPcds:\r
6f49996c
FB
1042 HasTokenSpace = True\r
1043 TokenCName = Name2\r
1044 TokenSpaceGuidCName = Name1\r
1045 FieldName =""\r
1046 else:\r
1047 FieldName = Name2\r
1048 TokenCName = Name1\r
1049 TokenSpaceGuidCName = ''\r
1050 HasTokenSpace = False\r
1051 else:\r
1052 FieldName = ""\r
1053 TokenCName = pcdname\r
1054 TokenSpaceGuidCName = ''\r
1055 HasTokenSpace = False\r
1056 TokenSpaceGuidCNameList = []\r
1057 FoundFlag = False\r
1058 PcdDatumType = ''\r
8565b582
YZ
1059 DisplayName = TokenCName\r
1060 if FieldName:\r
1061 DisplayName = TokenCName + '.' + FieldName\r
6f49996c
FB
1062 if not HasTokenSpace:\r
1063 for key in self.DecPcds:\r
8565b582
YZ
1064 PcdItem = self.DecPcds[key]\r
1065 if TokenCName == PcdItem.TokenCName:\r
1066 if not PcdItem.TokenSpaceGuidCName in TokenSpaceGuidCNameList:\r
1067 if len (TokenSpaceGuidCNameList) < 1:\r
1068 TokenSpaceGuidCNameList.append(PcdItem.TokenSpaceGuidCName)\r
1069 TokenSpaceGuidCName = PcdItem.TokenSpaceGuidCName\r
1070 PcdDatumType = PcdItem.DatumType\r
1071 FoundFlag = True\r
1072 else:\r
1073 EdkLogger.error(\r
1074 'build',\r
1075 AUTOGEN_ERROR,\r
1076 "The Pcd %s is found under multiple different TokenSpaceGuid: %s and %s." % (DisplayName, PcdItem.TokenSpaceGuidCName, TokenSpaceGuidCNameList[0])\r
1077 )\r
6f49996c
FB
1078 else:\r
1079 if (TokenCName, TokenSpaceGuidCName) in self.DecPcds:\r
87a1f65e 1080 PcdDatumType = self.DecPcds[(TokenCName, TokenSpaceGuidCName)].DatumType\r
6f49996c 1081 FoundFlag = True\r
6f49996c
FB
1082 if not FoundFlag:\r
1083 if HasTokenSpace:\r
8565b582 1084 EdkLogger.error('build', AUTOGEN_ERROR, "The Pcd %s.%s is not found in the DEC file." % (TokenSpaceGuidCName, DisplayName))\r
6f49996c 1085 else:\r
8565b582
YZ
1086 EdkLogger.error('build', AUTOGEN_ERROR, "The Pcd %s is not found in the DEC file." % (DisplayName))\r
1087 pcdvalue = pcdvalue.replace("\\\\\\'", '\\\\\\"').replace('\\\'', '\'').replace('\\\\\\"', "\\'")\r
1088 if FieldName:\r
9e508f3a 1089 pcdvalue = DscBuildData.HandleFlexiblePcd(TokenSpaceGuidCName, TokenCName, pcdvalue, PcdDatumType, self._GuidDict, FieldName)\r
8565b582 1090 else:\r
9e508f3a 1091 pcdvalue = DscBuildData.HandleFlexiblePcd(TokenSpaceGuidCName, TokenCName, pcdvalue, PcdDatumType, self._GuidDict)\r
8565b582
YZ
1092 IsValid, Cause = CheckPcdDatum(PcdDatumType, pcdvalue)\r
1093 if not IsValid:\r
1094 EdkLogger.error("build", FORMAT_INVALID, Cause, ExtraData="%s.%s" % (TokenSpaceGuidCName, TokenCName))\r
ccaa7754 1095 GlobalData.BuildOptionPcd[i] = (TokenSpaceGuidCName, TokenCName, FieldName, pcdvalue, ("build command options", 1))\r
8565b582 1096\r
5d54ab94 1097 if GlobalData.BuildOptionPcd:\r
a0792697 1098 inf_objs = [item for item in self._Bdb._CACHE_.values() if item.Arch == self.Arch and item.MetaFile.Ext.lower() == '.inf']\r
5d54ab94
YZ
1099 for pcd in GlobalData.BuildOptionPcd:\r
1100 (TokenSpaceGuidCName, TokenCName, FieldName, pcdvalue, _) = pcd\r
a0792697 1101 for BuildData in inf_objs:\r
6f49996c
FB
1102 for key in BuildData.Pcds:\r
1103 PcdItem = BuildData.Pcds[key]\r
1104 if (TokenSpaceGuidCName, TokenCName) == (PcdItem.TokenSpaceGuidCName, PcdItem.TokenCName) and FieldName =="":\r
8565b582 1105 PcdItem.DefaultValue = pcdvalue\r
c3d0f526 1106 PcdItem.PcdValueFromComm = pcdvalue\r
0fd04efd
ZZ
1107 #In command line, the latter full assign value in commandLine should override the former field assign value.\r
1108 #For example, --pcd Token.pcd.field="" --pcd Token.pcd=H"{}"\r
1109 delete_assign = []\r
1110 field_assign = {}\r
1111 if GlobalData.BuildOptionPcd:\r
1112 for pcdTuple in GlobalData.BuildOptionPcd:\r
1113 TokenSpaceGuid, Token, Field = pcdTuple[0], pcdTuple[1], pcdTuple[2]\r
1114 if Field:\r
1115 if (TokenSpaceGuid, Token) not in field_assign:\r
1116 field_assign[TokenSpaceGuid, Token] = []\r
1117 field_assign[TokenSpaceGuid, Token].append(pcdTuple)\r
1118 else:\r
1119 if (TokenSpaceGuid, Token) in field_assign:\r
1120 delete_assign.extend(field_assign[TokenSpaceGuid, Token])\r
1121 field_assign[TokenSpaceGuid, Token] = []\r
1122 for item in delete_assign:\r
1123 GlobalData.BuildOptionPcd.remove(item)\r
8565b582 1124\r
9e508f3a
CJ
1125 @staticmethod\r
1126 def HandleFlexiblePcd(TokenSpaceGuidCName, TokenCName, PcdValue, PcdDatumType, GuidDict, FieldName=''):\r
8565b582
YZ
1127 if FieldName:\r
1128 IsArray = False\r
1129 TokenCName += '.' + FieldName\r
1130 if PcdValue.startswith('H'):\r
2b95556c 1131 if FieldName and _IsFieldValueAnArray(PcdValue[1:]):\r
656d2539 1132 PcdDatumType = TAB_VOID\r
8565b582
YZ
1133 IsArray = True\r
1134 if FieldName and not IsArray:\r
1135 return PcdValue\r
1136 try:\r
1137 PcdValue = ValueExpressionEx(PcdValue[1:], PcdDatumType, GuidDict)(True)\r
5b0671c1 1138 except BadExpression as Value:\r
8565b582
YZ
1139 EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s", %s' %\r
1140 (TokenSpaceGuidCName, TokenCName, PcdValue, Value))\r
1141 elif PcdValue.startswith("L'") or PcdValue.startswith("'"):\r
2b95556c 1142 if FieldName and _IsFieldValueAnArray(PcdValue):\r
656d2539 1143 PcdDatumType = TAB_VOID\r
8565b582
YZ
1144 IsArray = True\r
1145 if FieldName and not IsArray:\r
1146 return PcdValue\r
1147 try:\r
1148 PcdValue = ValueExpressionEx(PcdValue, PcdDatumType, GuidDict)(True)\r
5b0671c1 1149 except BadExpression as Value:\r
8565b582
YZ
1150 EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s", %s' %\r
1151 (TokenSpaceGuidCName, TokenCName, PcdValue, Value))\r
1152 elif PcdValue.startswith('L'):\r
1153 PcdValue = 'L"' + PcdValue[1:] + '"'\r
2b95556c 1154 if FieldName and _IsFieldValueAnArray(PcdValue):\r
656d2539 1155 PcdDatumType = TAB_VOID\r
8565b582
YZ
1156 IsArray = True\r
1157 if FieldName and not IsArray:\r
1158 return PcdValue\r
1159 try:\r
1160 PcdValue = ValueExpressionEx(PcdValue, PcdDatumType, GuidDict)(True)\r
5b0671c1 1161 except BadExpression as Value:\r
8565b582
YZ
1162 EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s", %s' %\r
1163 (TokenSpaceGuidCName, TokenCName, PcdValue, Value))\r
1164 else:\r
1165 if PcdValue.upper() == 'FALSE':\r
1166 PcdValue = str(0)\r
1167 if PcdValue.upper() == 'TRUE':\r
1168 PcdValue = str(1)\r
1169 if not FieldName:\r
656d2539 1170 if PcdDatumType not in TAB_PCD_NUMERIC_TYPES:\r
8565b582 1171 PcdValue = '"' + PcdValue + '"'\r
0fab42ba
YZ
1172 elif not PcdValue.isdigit() and not PcdValue.upper().startswith('0X'):\r
1173 PcdValue = '"' + PcdValue + '"'\r
8565b582
YZ
1174 else:\r
1175 IsArray = False\r
1176 Base = 10\r
1177 if PcdValue.upper().startswith('0X'):\r
1178 Base = 16\r
1179 try:\r
1180 Num = int(PcdValue, Base)\r
1181 except:\r
1182 PcdValue = '"' + PcdValue + '"'\r
2b95556c 1183 if _IsFieldValueAnArray(PcdValue):\r
656d2539 1184 PcdDatumType = TAB_VOID\r
8565b582
YZ
1185 IsArray = True\r
1186 if not IsArray:\r
1187 return PcdValue\r
1188 try:\r
1189 PcdValue = ValueExpressionEx(PcdValue, PcdDatumType, GuidDict)(True)\r
5b0671c1 1190 except BadExpression as Value:\r
8565b582
YZ
1191 EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s", %s' %\r
1192 (TokenSpaceGuidCName, TokenCName, PcdValue, Value))\r
1193 return PcdValue\r
1194\r
ae7b6df8 1195 ## Retrieve all PCD settings in platform\r
71cac3f7
CJ
1196 @property\r
1197 def Pcds(self):\r
4231a819 1198 if self._Pcds is None:\r
a0767bae 1199 self._Pcds = OrderedDict()\r
6f49996c 1200 self.__ParsePcdFromCommandLine()\r
ae7b6df8
LG
1201 self._Pcds.update(self._GetPcd(MODEL_PCD_FIXED_AT_BUILD))\r
1202 self._Pcds.update(self._GetPcd(MODEL_PCD_PATCHABLE_IN_MODULE))\r
1203 self._Pcds.update(self._GetPcd(MODEL_PCD_FEATURE_FLAG))\r
1204 self._Pcds.update(self._GetDynamicPcd(MODEL_PCD_DYNAMIC_DEFAULT))\r
1205 self._Pcds.update(self._GetDynamicHiiPcd(MODEL_PCD_DYNAMIC_HII))\r
1206 self._Pcds.update(self._GetDynamicVpdPcd(MODEL_PCD_DYNAMIC_VPD))\r
1207 self._Pcds.update(self._GetDynamicPcd(MODEL_PCD_DYNAMIC_EX_DEFAULT))\r
1208 self._Pcds.update(self._GetDynamicHiiPcd(MODEL_PCD_DYNAMIC_EX_HII))\r
1209 self._Pcds.update(self._GetDynamicVpdPcd(MODEL_PCD_DYNAMIC_EX_VPD))\r
1210\r
8518bf0b 1211 self._Pcds = self.CompletePcdValues(self._Pcds)\r
543f5ac3
B
1212 self._Pcds = self.OverrideByFdfOverAll(self._Pcds)\r
1213 self._Pcds = self.OverrideByCommOverAll(self._Pcds)\r
ae7b6df8 1214 self._Pcds = self.UpdateStructuredPcds(MODEL_PCD_TYPE_LIST, self._Pcds)\r
2b8a6c44 1215 self._Pcds = self.CompleteHiiPcdsDefaultStores(self._Pcds)\r
8518bf0b 1216 self._Pcds = self._FilterPcdBySkuUsage(self._Pcds)\r
b854e2bf 1217\r
6f49996c 1218 self.RecoverCommandLinePcd()\r
ae7b6df8
LG
1219 return self._Pcds\r
1220\r
1221 ## Retrieve [BuildOptions]\r
71cac3f7
CJ
1222 @property\r
1223 def BuildOptions(self):\r
4231a819 1224 if self._BuildOptions is None:\r
a0767bae 1225 self._BuildOptions = OrderedDict()\r
ae7b6df8
LG
1226 #\r
1227 # Retrieve build option for EDKII and EDK style module\r
1228 #\r
1229 for CodeBase in (EDKII_NAME, EDK_NAME):\r
1230 RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch, CodeBase]\r
ccaa7754 1231 for ToolChainFamily, ToolChain, Option, Dummy1, Dummy2, Dummy3, Dummy4, Dummy5 in RecordList:\r
55c84777 1232 if Dummy3.upper() != TAB_COMMON:\r
c05c2c05 1233 continue\r
ae7b6df8
LG
1234 CurKey = (ToolChainFamily, ToolChain, CodeBase)\r
1235 #\r
1236 # Only flags can be appended\r
1237 #\r
1238 if CurKey not in self._BuildOptions or not ToolChain.endswith('_FLAGS') or Option.startswith('='):\r
1239 self._BuildOptions[CurKey] = Option\r
1240 else:\r
c05c2c05
LG
1241 if ' ' + Option not in self._BuildOptions[CurKey]:\r
1242 self._BuildOptions[CurKey] += ' ' + Option\r
ae7b6df8 1243 return self._BuildOptions\r
197ca7fe 1244 def GetBuildOptionsByPkg(self, Module, ModuleType):\r
ae7b6df8 1245\r
197ca7fe
FB
1246 local_pkg = os.path.split(Module.LocalPkg())[0]\r
1247 if self._ModuleTypeOptions is None:\r
1248 self._ModuleTypeOptions = OrderedDict()\r
1249 if ModuleType not in self._ModuleTypeOptions:\r
1250 options = OrderedDict()\r
1251 self._ModuleTypeOptions[ ModuleType] = options\r
1252 RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch]\r
1253 for ToolChainFamily, ToolChain, Option, Dummy1, Dummy2, Dummy3, Dummy4, Dummy5 in RecordList:\r
1254 if Dummy2 not in (TAB_COMMON,local_pkg.upper(),"EDKII"):\r
1255 continue\r
1256 Type = Dummy3\r
1257 if Type.upper() == ModuleType.upper():\r
1258 Key = (ToolChainFamily, ToolChain)\r
1259 if Key not in options or not ToolChain.endswith('_FLAGS') or Option.startswith('='):\r
1260 options[Key] = Option\r
1261 else:\r
1262 if ' ' + Option not in options[Key]:\r
1263 options[Key] += ' ' + Option\r
1264 return self._ModuleTypeOptions[ModuleType]\r
ae7b6df8 1265 def GetBuildOptionsByModuleType(self, Edk, ModuleType):\r
4231a819 1266 if self._ModuleTypeOptions is None:\r
a0767bae 1267 self._ModuleTypeOptions = OrderedDict()\r
ae7b6df8 1268 if (Edk, ModuleType) not in self._ModuleTypeOptions:\r
a0767bae 1269 options = OrderedDict()\r
ae7b6df8
LG
1270 self._ModuleTypeOptions[Edk, ModuleType] = options\r
1271 DriverType = '%s.%s' % (Edk, ModuleType)\r
55c84777 1272 CommonDriverType = '%s.%s' % (TAB_COMMON, ModuleType)\r
c05c2c05 1273 RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch]\r
ccaa7754 1274 for ToolChainFamily, ToolChain, Option, Dummy1, Dummy2, Dummy3, Dummy4, Dummy5 in RecordList:\r
c05c2c05
LG
1275 Type = Dummy2 + '.' + Dummy3\r
1276 if Type.upper() == DriverType.upper() or Type.upper() == CommonDriverType.upper():\r
ae7b6df8
LG
1277 Key = (ToolChainFamily, ToolChain, Edk)\r
1278 if Key not in options or not ToolChain.endswith('_FLAGS') or Option.startswith('='):\r
1279 options[Key] = Option\r
1280 else:\r
c05c2c05
LG
1281 if ' ' + Option not in options[Key]:\r
1282 options[Key] += ' ' + Option\r
ae7b6df8
LG
1283 return self._ModuleTypeOptions[Edk, ModuleType]\r
1284\r
9759febd
CJ
1285 @staticmethod\r
1286 def GetStructurePcdInfo(PcdSet):\r
1287 structure_pcd_data = defaultdict(list)\r
ae7b6df8 1288 for item in PcdSet:\r
ccaa7754 1289 structure_pcd_data[(item[0], item[1])].append(item)\r
ae7b6df8
LG
1290\r
1291 return structure_pcd_data\r
9e508f3a
CJ
1292\r
1293 @staticmethod\r
543f5ac3
B
1294 def OverrideByFdf(StruPcds,workspace):\r
1295 if GlobalData.gFdfParser is None:\r
1296 return StruPcds\r
1297 StructurePcdInFdf = OrderedDict()\r
1298 fdfpcd = GlobalData.gFdfParser.Profile.PcdDict\r
1299 fdfpcdlocation = GlobalData.gFdfParser.Profile.PcdLocalDict\r
1300 for item in fdfpcd :\r
1301 if len(item[2]) and (item[0],item[1]) in StruPcds:\r
1302 StructurePcdInFdf[(item[1],item[0],item[2] )] = fdfpcd[item]\r
1303 GlobalPcds = {(item[0],item[1]) for item in StructurePcdInFdf}\r
1304 for Pcd in StruPcds.values():\r
1305 if (Pcd.TokenSpaceGuidCName,Pcd.TokenCName) not in GlobalPcds:\r
1306 continue\r
1307 FieldValues = OrderedDict()\r
1308 for item in StructurePcdInFdf:\r
1309 if (Pcd.TokenSpaceGuidCName,Pcd.TokenCName) == (item[0],item[1]) and item[2]:\r
1310 FieldValues[item[2]] = StructurePcdInFdf[item]\r
1311 for field in FieldValues:\r
1312 if field not in Pcd.PcdFieldValueFromFdf:\r
1313 Pcd.PcdFieldValueFromFdf[field] = ["","",""]\r
1314 Pcd.PcdFieldValueFromFdf[field][0] = FieldValues[field]\r
1315 Pcd.PcdFieldValueFromFdf[field][1] = os.path.relpath(fdfpcdlocation[(Pcd.TokenCName,Pcd.TokenSpaceGuidCName,field)][0],workspace)\r
1316 Pcd.PcdFieldValueFromFdf[field][2] = fdfpcdlocation[(Pcd.TokenCName,Pcd.TokenSpaceGuidCName,field)][1]\r
1317\r
1318 return StruPcds\r
1319\r
1320 @staticmethod\r
1321 def OverrideByComm(StruPcds):\r
b854e2bf
B
1322 StructurePcdInCom = OrderedDict()\r
1323 for item in GlobalData.BuildOptionPcd:\r
ccaa7754
GL
1324 if len(item) == 5 and (item[1], item[0]) in StruPcds:\r
1325 StructurePcdInCom[(item[0], item[1], item[2] )] = (item[3], item[4])\r
1326 GlobalPcds = {(item[0], item[1]) for item in StructurePcdInCom}\r
6f49996c 1327 for Pcd in StruPcds.values():\r
ccaa7754 1328 if (Pcd.TokenSpaceGuidCName, Pcd.TokenCName) not in GlobalPcds:\r
6f49996c 1329 continue\r
b854e2bf
B
1330 FieldValues = OrderedDict()\r
1331 for item in StructurePcdInCom:\r
ccaa7754 1332 if (Pcd.TokenSpaceGuidCName, Pcd.TokenCName) == (item[0], item[1]) and item[2]:\r
b854e2bf
B
1333 FieldValues[item[2]] = StructurePcdInCom[item]\r
1334 for field in FieldValues:\r
1335 if field not in Pcd.PcdFieldValueFromComm:\r
ccaa7754 1336 Pcd.PcdFieldValueFromComm[field] = ["", "", ""]\r
b854e2bf
B
1337 Pcd.PcdFieldValueFromComm[field][0] = FieldValues[field][0]\r
1338 Pcd.PcdFieldValueFromComm[field][1] = FieldValues[field][1][0]\r
1339 Pcd.PcdFieldValueFromComm[field][2] = FieldValues[field][1][1]\r
6f49996c 1340 return StruPcds\r
9e508f3a 1341\r
543f5ac3 1342 def OverrideByCommOverAll(self,AllPcds):\r
6f49996c
FB
1343 def CheckStructureInComm(commpcds):\r
1344 if not commpcds:\r
1345 return False\r
1346 if len(commpcds[0]) == 5:\r
1347 return True\r
1348 return False\r
57ee97c0 1349 NoFiledValues = OrderedDict()\r
6f49996c 1350 if CheckStructureInComm(GlobalData.BuildOptionPcd):\r
57ee97c0
B
1351 StructurePcdInCom = OrderedDict()\r
1352 for item in GlobalData.BuildOptionPcd:\r
1353 StructurePcdInCom[(item[0], item[1], item[2] )] = (item[3], item[4])\r
1354 for item in StructurePcdInCom:\r
1355 if not item[2]:\r
1356 NoFiledValues[(item[0], item[1])] = StructurePcdInCom[item]\r
6f49996c 1357 else:\r
57ee97c0
B
1358 for item in GlobalData.BuildOptionPcd:\r
1359 NoFiledValues[(item[0], item[1])] = [item[2]]\r
ccaa7754
GL
1360 for Guid, Name in NoFiledValues:\r
1361 if (Name, Guid) in AllPcds:\r
1362 Pcd = AllPcds.get((Name, Guid))\r
1363 if isinstance(self._DecPcds.get((Pcd.TokenCName, Pcd.TokenSpaceGuidCName), None), StructurePcd):\r
1364 self._DecPcds.get((Pcd.TokenCName, Pcd.TokenSpaceGuidCName)).PcdValueFromComm = NoFiledValues[(Pcd.TokenSpaceGuidCName, Pcd.TokenCName)][0]\r
b854e2bf 1365 else:\r
da2d4f76
Z
1366 Pcd.PcdValueFromComm = NoFiledValues[(Pcd.TokenSpaceGuidCName, Pcd.TokenCName)][0]\r
1367 Pcd.DefaultValue = NoFiledValues[(Pcd.TokenSpaceGuidCName, Pcd.TokenCName)][0]\r
b854e2bf
B
1368 for sku in Pcd.SkuInfoList:\r
1369 SkuInfo = Pcd.SkuInfoList[sku]\r
1370 if SkuInfo.DefaultValue:\r
da2d4f76 1371 SkuInfo.DefaultValue = NoFiledValues[(Pcd.TokenSpaceGuidCName, Pcd.TokenCName)][0]\r
b854e2bf 1372 else:\r
da2d4f76 1373 SkuInfo.HiiDefaultValue = NoFiledValues[(Pcd.TokenSpaceGuidCName, Pcd.TokenCName)][0]\r
b854e2bf 1374 for defaultstore in SkuInfo.DefaultStoreDict:\r
da2d4f76 1375 SkuInfo.DefaultStoreDict[defaultstore] = NoFiledValues[(Pcd.TokenSpaceGuidCName, Pcd.TokenCName)][0]\r
c8ae65ac 1376 if Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII]]:\r
656d2539 1377 if Pcd.DatumType == TAB_VOID:\r
c8ae65ac
YZ
1378 if not Pcd.MaxDatumSize:\r
1379 Pcd.MaxDatumSize = '0'\r
ccaa7754 1380 CurrentSize = int(Pcd.MaxDatumSize, 16) if Pcd.MaxDatumSize.upper().startswith("0X") else int(Pcd.MaxDatumSize)\r
c8ae65ac
YZ
1381 OptionSize = len((StringToArray(Pcd.PcdValueFromComm)).split(","))\r
1382 MaxSize = max(CurrentSize, OptionSize)\r
1383 Pcd.MaxDatumSize = str(MaxSize)\r
6f49996c 1384 else:\r
ccaa7754 1385 PcdInDec = self.DecPcds.get((Name, Guid))\r
6f49996c 1386 if PcdInDec:\r
da2d4f76 1387 PcdInDec.PcdValueFromComm = NoFiledValues[(Guid, Name)][0]\r
6f49996c 1388 if PcdInDec.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],\r
b7bfcd1a 1389 self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE],\r
7c193787
FB
1390 self._PCD_TYPE_STRING_[MODEL_PCD_FEATURE_FLAG],\r
1391 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC],\r
1392 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX]]:\r
e8449e1d
FB
1393 self._Pcds[Name, Guid] = copy.deepcopy(PcdInDec)\r
1394 self._Pcds[Name, Guid].DefaultValue = NoFiledValues[( Guid, Name)][0]\r
7c193787
FB
1395 if PcdInDec.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC],\r
1396 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX]]:\r
e8449e1d 1397 self._Pcds[Name, Guid].SkuInfoList = {TAB_DEFAULT:SkuInfoClass(TAB_DEFAULT, self.SkuIds[TAB_DEFAULT][0], '', '', '', '', '', NoFiledValues[( Guid, Name)][0])}\r
6f49996c 1398 return AllPcds\r
543f5ac3
B
1399\r
1400 def OverrideByFdfOverAll(self,AllPcds):\r
1401\r
1402 if GlobalData.gFdfParser is None:\r
1403 return AllPcds\r
1404 NoFiledValues = GlobalData.gFdfParser.Profile.PcdDict\r
4c6d0de7 1405 for Name,Guid,Field in NoFiledValues:\r
543f5ac3
B
1406 if len(Field):\r
1407 continue\r
4c6d0de7 1408 Value = NoFiledValues[(Name,Guid,Field)]\r
543f5ac3
B
1409 if (Name,Guid) in AllPcds:\r
1410 Pcd = AllPcds.get((Name,Guid))\r
1411 if isinstance(self._DecPcds.get((Pcd.TokenCName,Pcd.TokenSpaceGuidCName), None),StructurePcd):\r
1412 self._DecPcds.get((Pcd.TokenCName,Pcd.TokenSpaceGuidCName)).PcdValueFromComm = Value\r
1413 else:\r
1414 Pcd.PcdValueFromComm = Value\r
1415 Pcd.DefaultValue = Value\r
1416 for sku in Pcd.SkuInfoList:\r
1417 SkuInfo = Pcd.SkuInfoList[sku]\r
1418 if SkuInfo.DefaultValue:\r
1419 SkuInfo.DefaultValue = Value\r
1420 else:\r
1421 SkuInfo.HiiDefaultValue = Value\r
1422 for defaultstore in SkuInfo.DefaultStoreDict:\r
1423 SkuInfo.DefaultStoreDict[defaultstore] = Value\r
1424 if Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII]]:\r
1425 if Pcd.DatumType == TAB_VOID:\r
1426 if not Pcd.MaxDatumSize:\r
1427 Pcd.MaxDatumSize = '0'\r
1428 CurrentSize = int(Pcd.MaxDatumSize,16) if Pcd.MaxDatumSize.upper().startswith("0X") else int(Pcd.MaxDatumSize)\r
1429 OptionSize = len((StringToArray(Pcd.PcdValueFromComm)).split(","))\r
1430 MaxSize = max(CurrentSize, OptionSize)\r
1431 Pcd.MaxDatumSize = str(MaxSize)\r
1432 else:\r
1433 PcdInDec = self.DecPcds.get((Name,Guid))\r
1434 if PcdInDec:\r
4c6d0de7 1435 PcdInDec.PcdValueFromFdf = Value\r
543f5ac3
B
1436 if PcdInDec.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],\r
1437 self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE],\r
1438 self._PCD_TYPE_STRING_[MODEL_PCD_FEATURE_FLAG]]:\r
e8449e1d
FB
1439 self._Pcds[Name, Guid] = copy.deepcopy(PcdInDec)\r
1440 self._Pcds[Name, Guid].DefaultValue = Value\r
543f5ac3
B
1441 return AllPcds\r
1442\r
72a1d776 1443 def ParsePcdNameStruct(self,NamePart1,NamePart2):\r
1444 TokenSpaceCName = PcdCName = DimensionAttr = Field = ""\r
1445 if "." in NamePart1:\r
1446 TokenSpaceCName, TempPcdCName = NamePart1.split(".")\r
1447 if "[" in TempPcdCName:\r
1448 PcdCName = TempPcdCName[:TempPcdCName.index("[")]\r
1449 DimensionAttr = TempPcdCName[TempPcdCName.index("["):]\r
1450 else:\r
1451 PcdCName = TempPcdCName\r
1452 Field = NamePart2\r
1453 else:\r
1454 TokenSpaceCName = NamePart1\r
1455 if "[" in NamePart2:\r
1456 PcdCName = NamePart2[:NamePart2.index("[")]\r
1457 DimensionAttr = NamePart2[NamePart2.index("["):]\r
1458 else:\r
1459 PcdCName = NamePart2\r
1460\r
1461 return TokenSpaceCName,PcdCName,DimensionAttr,Field\r
1462\r
ae7b6df8 1463 def UpdateStructuredPcds(self, TypeList, AllPcds):\r
65eff519
LG
1464\r
1465 DynamicPcdType = [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_DEFAULT],\r
1466 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII],\r
1467 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_VPD],\r
1468 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_DEFAULT],\r
1469 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII],\r
1470 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_VPD]]\r
1471\r
ae7b6df8 1472 Pcds = AllPcds\r
8518bf0b 1473 DefaultStoreMgr = DefaultStore(self.DefaultStores)\r
84a52d4d 1474 SkuIds = self.SkuIds\r
aa52648c 1475 self.SkuIdMgr.AvailableSkuIdSet.update({TAB_DEFAULT:0})\r
b491aa95 1476 DefaultStores = {storename for pcdobj in AllPcds.values() for skuobj in pcdobj.SkuInfoList.values() for storename in skuobj.DefaultStoreDict}\r
8022aca8 1477 DefaultStores.add(TAB_DEFAULT_STORES_DEFAULT)\r
ae7b6df8
LG
1478\r
1479 S_PcdSet = []\r
1480 # Find out all possible PCD candidates for self._Arch\r
1481 RecordList = []\r
2b8a6c44 1482\r
ae7b6df8
LG
1483 for Type in TypeList:\r
1484 RecordList.extend(self._RawData[Type, self._Arch])\r
1485\r
ccaa7754 1486 for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, default_store, Dummy4, Dummy5 in RecordList:\r
2b8a6c44
LG
1487 SkuName = SkuName.upper()\r
1488 default_store = default_store.upper()\r
55c84777 1489 SkuName = TAB_DEFAULT if SkuName == TAB_COMMON else SkuName\r
8518bf0b
LG
1490 if SkuName not in SkuIds:\r
1491 continue\r
72a1d776 1492 TCName,PCName,DimensionAttr,Field = self.ParsePcdNameStruct(TokenSpaceGuid, PcdCName)\r
1493 pcd_in_dec = self._DecPcds.get((PCName,TCName), None)\r
1494 if pcd_in_dec is None:\r
1495 EdkLogger.error('build', PARSER_ERROR,\r
1496 "Pcd (%s.%s) defined in DSC is not declared in DEC files. Arch: ['%s']" % (TCName, PCName, self._Arch),\r
1497 File=self.MetaFile, Line = Dummy5)\r
1498 if SkuName in SkuIds and ("." in TokenSpaceGuid or "[" in PcdCName):\r
1499 if not isinstance (pcd_in_dec, StructurePcd):\r
1500 EdkLogger.error('build', PARSER_ERROR,\r
1501 "Pcd (%s.%s) is not declared as Structure PCD in DEC files. Arch: ['%s']" % (TCName, PCName, self._Arch),\r
1502 File=self.MetaFile, Line = Dummy5)\r
2b8a6c44 1503\r
72a1d776 1504 S_PcdSet.append([ TCName,PCName,DimensionAttr,Field, SkuName, default_store, Dummy5, AnalyzePcdExpression(Setting)[0]])\r
09af9bd9
BF
1505 ModuleScopeOverallValue = {}\r
1506 for m in self.Modules.values():\r
1507 mguid = m.Guid\r
1508 if m.StrPcdSet:\r
1509 S_PcdSet.extend(m.StrPcdSet)\r
1510 mguid = m.StrPcdSet[0][4]\r
1511 for (PCName,TCName) in m.StrPcdOverallValue:\r
1512 Value, dsc_file, lineNo = m.StrPcdOverallValue[(PCName,TCName)]\r
1513 ModuleScopeOverallValue.setdefault((PCName,TCName),{})[mguid] = Value, dsc_file, lineNo\r
ae7b6df8 1514 # handle pcd value override\r
9759febd 1515 StrPcdSet = DscBuildData.GetStructurePcdInfo(S_PcdSet)\r
79820e32 1516 S_pcd_set = OrderedDict()\r
ae7b6df8 1517 for str_pcd in StrPcdSet:\r
8518bf0b
LG
1518 str_pcd_obj = Pcds.get((str_pcd[1], str_pcd[0]), None)\r
1519 str_pcd_dec = self._DecPcds.get((str_pcd[1], str_pcd[0]), None)\r
72a1d776 1520 str_pcd_obj_str = StructurePcd()\r
1521 str_pcd_obj_str.copy(str_pcd_dec)\r
1522 if str_pcd_obj:\r
1523 str_pcd_obj_str.copy(str_pcd_obj)\r
1524 if str_pcd_obj.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
1525 str_pcd_obj_str.DefaultFromDSC = {skuname:{defaultstore: str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.get(defaultstore, str_pcd_obj.SkuInfoList[skuname].HiiDefaultValue) for defaultstore in DefaultStores} for skuname in str_pcd_obj.SkuInfoList}\r
1526 else:\r
1527 str_pcd_obj_str.DefaultFromDSC = {skuname:{defaultstore: str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.get(defaultstore, str_pcd_obj.SkuInfoList[skuname].DefaultValue) for defaultstore in DefaultStores} for skuname in str_pcd_obj.SkuInfoList}\r
1528 for str_pcd_data in StrPcdSet[str_pcd]:\r
1529 if str_pcd_data[4] in SkuIds:\r
1530 str_pcd_obj_str.AddOverrideValue(str_pcd_data[3], str(str_pcd_data[7]), TAB_DEFAULT if str_pcd_data[4] == TAB_COMMON else str_pcd_data[4], TAB_DEFAULT_STORES_DEFAULT if str_pcd_data[5] == TAB_COMMON else str_pcd_data[5], self.MetaFile.File if self.WorkspaceDir not in self.MetaFile.File else self.MetaFile.File[len(self.WorkspaceDir) if self.WorkspaceDir.endswith(os.path.sep) else len(self.WorkspaceDir)+1:], LineNo=str_pcd_data[6],DimensionAttr = str_pcd_data[2])\r
09af9bd9
BF
1531 elif GlobalData.gGuidPattern.match(str_pcd_data[4]):\r
1532 str_pcd_obj_str.AddComponentOverrideValue(str_pcd_data[3], str(str_pcd_data[7]), str_pcd_data[4].replace("-","S"), self.MetaFile.File if self.WorkspaceDir not in self.MetaFile.File else self.MetaFile.File[len(self.WorkspaceDir) if self.WorkspaceDir.endswith(os.path.sep) else len(self.WorkspaceDir)+1:], LineNo=str_pcd_data[6],DimensionAttr = str_pcd_data[2])\r
1533 PcdComponentValue = ModuleScopeOverallValue.get((str_pcd_obj_str.TokenCName,str_pcd_obj_str.TokenSpaceGuidCName))\r
1534 for module_guid in PcdComponentValue:\r
1535 str_pcd_obj_str.PcdValueFromComponents[module_guid.replace("-","S")] = PcdComponentValue[module_guid]\r
72a1d776 1536 S_pcd_set[str_pcd[1], str_pcd[0]] = str_pcd_obj_str\r
1537\r
ae7b6df8 1538 # Add the Structure PCD that only defined in DEC, don't have override in DSC file\r
5644e5ce 1539 for Pcd in self.DecPcds:\r
0d1f5b2b 1540 if isinstance(self._DecPcds[Pcd], StructurePcd):\r
ae7b6df8
LG
1541 if Pcd not in S_pcd_set:\r
1542 str_pcd_obj_str = StructurePcd()\r
1543 str_pcd_obj_str.copy(self._DecPcds[Pcd])\r
1544 str_pcd_obj = Pcds.get(Pcd, None)\r
1545 if str_pcd_obj:\r
1546 str_pcd_obj_str.copy(str_pcd_obj)\r
77204d60
FB
1547 if str_pcd_obj.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
1548 str_pcd_obj_str.DefaultFromDSC = {skuname:{defaultstore: str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.get(defaultstore, str_pcd_obj.SkuInfoList[skuname].HiiDefaultValue) for defaultstore in DefaultStores} for skuname in str_pcd_obj.SkuInfoList}\r
1549 else:\r
1550 str_pcd_obj_str.DefaultFromDSC = {skuname:{defaultstore: str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.get(defaultstore, str_pcd_obj.SkuInfoList[skuname].DefaultValue) for defaultstore in DefaultStores} for skuname in str_pcd_obj.SkuInfoList}\r
ae7b6df8
LG
1551 S_pcd_set[Pcd] = str_pcd_obj_str\r
1552 if S_pcd_set:\r
97c8f5b9
FZ
1553 GlobalData.gStructurePcd[self.Arch] = S_pcd_set.copy()\r
1554 self.FilterStrcturePcd(S_pcd_set)\r
8518bf0b 1555 for stru_pcd in S_pcd_set.values():\r
67e63e9a
LG
1556 for skuid in SkuIds:\r
1557 if skuid in stru_pcd.SkuOverrideValues:\r
1558 continue\r
1559 nextskuid = self.SkuIdMgr.GetNextSkuId(skuid)\r
1560 NoDefault = False\r
f3b31433
FB
1561 if skuid not in stru_pcd.SkuOverrideValues:\r
1562 while nextskuid not in stru_pcd.SkuOverrideValues:\r
55c84777 1563 if nextskuid == TAB_DEFAULT:\r
f3b31433
FB
1564 NoDefault = True\r
1565 break\r
1566 nextskuid = self.SkuIdMgr.GetNextSkuId(nextskuid)\r
71127ce8 1567 stru_pcd.SkuOverrideValues[skuid] = copy.deepcopy(stru_pcd.SkuOverrideValues[nextskuid]) if not NoDefault else copy.deepcopy({defaultstorename: stru_pcd.DefaultValues for defaultstorename in DefaultStores} if DefaultStores else {}) #{TAB_DEFAULT_STORES_DEFAULT:stru_pcd.DefaultValues})\r
f3b31433 1568 if not NoDefault:\r
ccaa7754 1569 stru_pcd.ValueChain.add((skuid, ''))\r
8a64c7ea
FZ
1570 if 'DEFAULT' in stru_pcd.SkuOverrideValues and not GlobalData.gPcdSkuOverrides.get((stru_pcd.TokenCName, stru_pcd.TokenSpaceGuidCName)):\r
1571 GlobalData.gPcdSkuOverrides.update(\r
1572 {(stru_pcd.TokenCName, stru_pcd.TokenSpaceGuidCName): {'DEFAULT':stru_pcd.SkuOverrideValues['DEFAULT']}})\r
8518bf0b
LG
1573 if stru_pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
1574 for skuid in SkuIds:\r
1575 nextskuid = skuid\r
2b8a6c44 1576 NoDefault = False\r
8518bf0b
LG
1577 if skuid not in stru_pcd.SkuOverrideValues:\r
1578 while nextskuid not in stru_pcd.SkuOverrideValues:\r
55c84777 1579 if nextskuid == TAB_DEFAULT:\r
2b8a6c44
LG
1580 NoDefault = True\r
1581 break\r
8518bf0b 1582 nextskuid = self.SkuIdMgr.GetNextSkuId(nextskuid)\r
2b8a6c44
LG
1583 if NoDefault:\r
1584 continue\r
c5c7e68a 1585 PcdDefaultStoreSet = set(defaultstorename for defaultstorename in stru_pcd.SkuOverrideValues[nextskuid])\r
8518bf0b 1586 mindefaultstorename = DefaultStoreMgr.GetMin(PcdDefaultStoreSet)\r
2b8a6c44 1587\r
8518bf0b
LG
1588 for defaultstoreid in DefaultStores:\r
1589 if defaultstoreid not in stru_pcd.SkuOverrideValues[skuid]:\r
bf9e6366 1590 stru_pcd.SkuOverrideValues[skuid][defaultstoreid] = CopyDict(stru_pcd.SkuOverrideValues[nextskuid][mindefaultstorename])\r
ccaa7754 1591 stru_pcd.ValueChain.add((skuid, defaultstoreid))\r
543f5ac3
B
1592 S_pcd_set = DscBuildData.OverrideByFdf(S_pcd_set,self.WorkspaceDir)\r
1593 S_pcd_set = DscBuildData.OverrideByComm(S_pcd_set)\r
09af9bd9
BF
1594\r
1595 # Create a tool to caculate structure pcd value\r
ae7b6df8 1596 Str_Pcd_Values = self.GenerateByteArrayValue(S_pcd_set)\r
09af9bd9 1597\r
ae7b6df8 1598 if Str_Pcd_Values:\r
ccaa7754 1599 for (skuname, StoreName, PcdGuid, PcdName, PcdValue) in Str_Pcd_Values:\r
8518bf0b 1600 str_pcd_obj = S_pcd_set.get((PcdName, PcdGuid))\r
ae7b6df8 1601 if str_pcd_obj is None:\r
72443dd2 1602 print(PcdName, PcdGuid)\r
ae7b6df8
LG
1603 raise\r
1604 if str_pcd_obj.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII],\r
1605 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
8518bf0b
LG
1606 if skuname not in str_pcd_obj.SkuInfoList:\r
1607 str_pcd_obj.SkuInfoList[skuname] = SkuInfoClass(SkuIdName=skuname, SkuId=self.SkuIds[skuname][0], HiiDefaultValue=PcdValue, DefaultStore = {StoreName:PcdValue})\r
ae7b6df8 1608 else:\r
8518bf0b
LG
1609 str_pcd_obj.SkuInfoList[skuname].HiiDefaultValue = PcdValue\r
1610 str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.update({StoreName:PcdValue})\r
ae7b6df8
LG
1611 elif str_pcd_obj.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],\r
1612 self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:\r
55c84777 1613 if skuname in (self.SkuIdMgr.SystemSkuId, TAB_DEFAULT, TAB_COMMON):\r
8518bf0b 1614 str_pcd_obj.DefaultValue = PcdValue\r
09af9bd9
BF
1615 else:\r
1616 #Module Scope Structure Pcd\r
1617 moduleguid = skuname.replace("S","-")\r
1618 if GlobalData.gGuidPattern.match(moduleguid):\r
1619 for component in self.Modules.values():\r
1620 if component.Guid == moduleguid:\r
1621 component.Pcds[(PcdName, PcdGuid)].DefaultValue = PcdValue\r
1622\r
ae7b6df8 1623 else:\r
8518bf0b 1624 if skuname not in str_pcd_obj.SkuInfoList:\r
65eff519
LG
1625 nextskuid = self.SkuIdMgr.GetNextSkuId(skuname)\r
1626 NoDefault = False\r
1627 while nextskuid not in str_pcd_obj.SkuInfoList:\r
55c84777 1628 if nextskuid == TAB_DEFAULT:\r
65eff519
LG
1629 NoDefault = True\r
1630 break\r
1631 nextskuid = self.SkuIdMgr.GetNextSkuId(nextskuid)\r
1632 str_pcd_obj.SkuInfoList[skuname] = copy.deepcopy(str_pcd_obj.SkuInfoList[nextskuid]) if not NoDefault else SkuInfoClass(SkuIdName=skuname, SkuId=self.SkuIds[skuname][0], DefaultValue=PcdValue)\r
1633 str_pcd_obj.SkuInfoList[skuname].SkuId = self.SkuIds[skuname][0]\r
1634 str_pcd_obj.SkuInfoList[skuname].SkuIdName = skuname\r
ae7b6df8 1635 else:\r
8518bf0b
LG
1636 str_pcd_obj.SkuInfoList[skuname].DefaultValue = PcdValue\r
1637 for str_pcd_obj in S_pcd_set.values():\r
1638 if str_pcd_obj.Type not in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII],\r
1639 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
1640 continue\r
c5c7e68a 1641 PcdDefaultStoreSet = set(defaultstorename for skuobj in str_pcd_obj.SkuInfoList.values() for defaultstorename in skuobj.DefaultStoreDict)\r
8518bf0b
LG
1642 DefaultStoreObj = DefaultStore(self._GetDefaultStores())\r
1643 mindefaultstorename = DefaultStoreObj.GetMin(PcdDefaultStoreSet)\r
1644 str_pcd_obj.SkuInfoList[self.SkuIdMgr.SystemSkuId].HiiDefaultValue = str_pcd_obj.SkuInfoList[self.SkuIdMgr.SystemSkuId].DefaultStoreDict[mindefaultstorename]\r
ae7b6df8
LG
1645\r
1646 for str_pcd_obj in S_pcd_set.values():\r
2b8a6c44 1647\r
4c6e6f9f 1648 str_pcd_obj.MaxDatumSize = DscBuildData.GetStructurePcdMaxSize(str_pcd_obj)\r
ae7b6df8 1649 Pcds[str_pcd_obj.TokenCName, str_pcd_obj.TokenSpaceGuidCName] = str_pcd_obj\r
6a147d6d 1650 Pcds[str_pcd_obj.TokenCName, str_pcd_obj.TokenSpaceGuidCName].CustomAttribute['IsStru']=True\r
ae7b6df8 1651\r
65eff519
LG
1652 for pcdkey in Pcds:\r
1653 pcd = Pcds[pcdkey]\r
55c84777
CJ
1654 if TAB_DEFAULT not in pcd.SkuInfoList and TAB_COMMON in pcd.SkuInfoList:\r
1655 pcd.SkuInfoList[TAB_DEFAULT] = pcd.SkuInfoList[TAB_COMMON]\r
1656 del pcd.SkuInfoList[TAB_COMMON]\r
1657 elif TAB_DEFAULT in pcd.SkuInfoList and TAB_COMMON in pcd.SkuInfoList:\r
1658 del pcd.SkuInfoList[TAB_COMMON]\r
65eff519 1659\r
5895f7f6 1660 list(map(self.FilterSkuSettings, [Pcds[pcdkey] for pcdkey in Pcds if Pcds[pcdkey].Type in DynamicPcdType]))\r
ae7b6df8 1661 return Pcds\r
34e733f2
FB
1662 @cached_property\r
1663 def PlatformUsedPcds(self):\r
1664 FdfInfList = []\r
1665 if GlobalData.gFdfParser:\r
1666 FdfInfList = GlobalData.gFdfParser.Profile.InfList\r
1667 FdfModuleList = [PathClass(NormPath(Inf), GlobalData.gWorkspace, Arch=self._Arch) for Inf in FdfInfList]\r
1668 AllModulePcds = set()\r
d943b0c3 1669 ModuleSet = set(list(self._Modules.keys()) + FdfModuleList)\r
34e733f2
FB
1670 for ModuleFile in ModuleSet:\r
1671 ModuleData = self._Bdb[ModuleFile, self._Arch, self._Target, self._Toolchain]\r
1672 AllModulePcds = AllModulePcds | ModuleData.PcdsName\r
1673 for ModuleFile in self.LibraryInstances:\r
1674 ModuleData = self._Bdb.CreateBuildObject(ModuleFile, self._Arch, self._Target, self._Toolchain)\r
1675 AllModulePcds = AllModulePcds | ModuleData.PcdsName\r
1676 return AllModulePcds\r
1677\r
1678 #Filter the StrucutrePcd that is not used by any module in dsc file and fdf file.\r
1679 def FilterStrcturePcd(self, S_pcd_set):\r
1680 UnusedStruPcds = set(S_pcd_set.keys()) - self.PlatformUsedPcds\r
1681 for (Token, TokenSpaceGuid) in UnusedStruPcds:\r
1682 del S_pcd_set[(Token, TokenSpaceGuid)]\r
ae7b6df8
LG
1683\r
1684 ## Retrieve non-dynamic PCD settings\r
1685 #\r
1686 # @param Type PCD type\r
1687 #\r
1688 # @retval a dict object contains settings of given PCD type\r
1689 #\r
1690 def _GetPcd(self, Type):\r
a0767bae 1691 Pcds = OrderedDict()\r
ae7b6df8
LG
1692 #\r
1693 # tdict is a special dict kind of type, used for selecting correct\r
1694 # PCD settings for certain ARCH\r
1695 #\r
2b8a6c44 1696 AvailableSkuIdSet = copy.copy(self.SkuIds)\r
ae7b6df8 1697\r
8022aca8 1698 PcdDict = tdict(True, 4)\r
273190e1 1699 PcdList = []\r
ae7b6df8
LG
1700 # Find out all possible PCD candidates for self._Arch\r
1701 RecordList = self._RawData[Type, self._Arch]\r
a0767bae 1702 PcdValueDict = OrderedDict()\r
ccaa7754 1703 for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, Dummy3, Dummy4, Dummy5 in RecordList:\r
2b8a6c44 1704 SkuName = SkuName.upper()\r
55c84777 1705 SkuName = TAB_DEFAULT if SkuName == TAB_COMMON else SkuName\r
2b8a6c44
LG
1706 if SkuName not in AvailableSkuIdSet:\r
1707 EdkLogger.error('build ', PARAMETER_INVALID, 'Sku %s is not defined in [SkuIds] section' % SkuName,\r
1708 File=self.MetaFile, Line=Dummy5)\r
72a1d776 1709 if SkuName in (self.SkuIdMgr.SystemSkuId, TAB_DEFAULT, TAB_COMMON):\r
273190e1
FZ
1710 if "." not in TokenSpaceGuid and "[" not in PcdCName and (PcdCName, TokenSpaceGuid, SkuName, Dummy5) not in PcdList:\r
1711 PcdList.append((PcdCName, TokenSpaceGuid, SkuName, Dummy5))\r
72a1d776 1712 PcdDict[Arch, PcdCName, TokenSpaceGuid, SkuName] = Setting\r
ae7b6df8 1713\r
273190e1 1714 for PcdCName, TokenSpaceGuid, SkuName, Dummy4 in PcdList:\r
ae7b6df8 1715 Setting = PcdDict[self._Arch, PcdCName, TokenSpaceGuid, SkuName]\r
4231a819 1716 if Setting is None:\r
ae7b6df8
LG
1717 continue\r
1718 PcdValue, DatumType, MaxDatumSize = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4)\r
f843a328
YZ
1719 if MaxDatumSize:\r
1720 if int(MaxDatumSize, 0) > 0xFFFF:\r
1721 EdkLogger.error('build', FORMAT_INVALID, "The size value must not exceed the maximum value of 0xFFFF (UINT16) for %s." % ".".join((TokenSpaceGuid, PcdCName)),\r
1722 File=self.MetaFile, Line=Dummy4)\r
1723 if int(MaxDatumSize, 0) < 0:\r
1724 EdkLogger.error('build', FORMAT_INVALID, "The size value can't be set to negative value for %s." % ".".join((TokenSpaceGuid, PcdCName)),\r
1725 File=self.MetaFile, Line=Dummy4)\r
ae7b6df8 1726 if (PcdCName, TokenSpaceGuid) in PcdValueDict:\r
afe8c411 1727 PcdValueDict[PcdCName, TokenSpaceGuid][SkuName] = (PcdValue, DatumType, MaxDatumSize,Dummy4)\r
ae7b6df8 1728 else:\r
afe8c411 1729 PcdValueDict[PcdCName, TokenSpaceGuid] = {SkuName:(PcdValue, DatumType, MaxDatumSize,Dummy4)}\r
ae7b6df8 1730\r
3a041437 1731 for ((PcdCName, TokenSpaceGuid), PcdSetting) in PcdValueDict.items():\r
8518bf0b 1732 if self.SkuIdMgr.SystemSkuId in PcdSetting:\r
afe8c411 1733 PcdValue, DatumType, MaxDatumSize,_ = PcdSetting[self.SkuIdMgr.SystemSkuId]\r
a77e5bca 1734 elif TAB_DEFAULT in PcdSetting:\r
afe8c411 1735 PcdValue, DatumType, MaxDatumSize,_ = PcdSetting[TAB_DEFAULT]\r
a77e5bca 1736 elif TAB_COMMON in PcdSetting:\r
afe8c411 1737 PcdValue, DatumType, MaxDatumSize,_ = PcdSetting[TAB_COMMON]\r
a77e5bca
CJ
1738 else:\r
1739 PcdValue = None\r
1740 DatumType = None\r
1741 MaxDatumSize = None\r
ae7b6df8
LG
1742\r
1743 Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject(\r
1744 PcdCName,\r
1745 TokenSpaceGuid,\r
1746 self._PCD_TYPE_STRING_[Type],\r
1747 DatumType,\r
1748 PcdValue,\r
1749 '',\r
1750 MaxDatumSize,\r
1751 {},\r
1752 False,\r
1753 None,\r
1754 IsDsc=True)\r
8022aca8
Z
1755 for SkuName in PcdValueDict[PcdCName, TokenSpaceGuid]:\r
1756 Settings = PcdValueDict[PcdCName, TokenSpaceGuid][SkuName]\r
1757 if SkuName not in Pcds[PcdCName, TokenSpaceGuid].DscRawValue:\r
1758 Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName] = {}\r
afe8c411 1759 Pcds[PcdCName, TokenSpaceGuid].DscRawValueInfo[SkuName] = {}\r
8022aca8 1760 Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName][TAB_DEFAULT_STORES_DEFAULT] = Settings[0]\r
afe8c411 1761 Pcds[PcdCName, TokenSpaceGuid].DscRawValueInfo[SkuName][TAB_DEFAULT_STORES_DEFAULT] = (self.MetaFile.File,Settings[3])\r
ae7b6df8
LG
1762 return Pcds\r
1763\r
4c6e6f9f
FB
1764 @staticmethod\r
1765 def GetStructurePcdMaxSize(str_pcd):\r
ae7b6df8 1766 pcd_default_value = str_pcd.DefaultValue\r
4c6e6f9f 1767 sku_values = [skuobj.HiiDefaultValue if str_pcd.Type in [DscBuildData._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], DscBuildData._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]] else skuobj.DefaultValue for skuobj in str_pcd.SkuInfoList.values()]\r
ae7b6df8
LG
1768 sku_values.append(pcd_default_value)\r
1769\r
1770 def get_length(value):\r
1771 Value = value.strip()\r
a0939593 1772 if len(value) > 1:\r
91fa33ee 1773 if Value.startswith(TAB_GUID) and Value.endswith(')'):\r
a0939593
LG
1774 return 16\r
1775 if Value.startswith('L"') and Value.endswith('"'):\r
1776 return len(Value[2:-1])\r
1777 if Value[0] == '"' and Value[-1] == '"':\r
1778 return len(Value) - 2\r
4c6e6f9f
FB
1779 if Value.strip().startswith("{CODE("):\r
1780 tmpValue = RemoveCComments(Value)\r
1781 return len(tmpValue.split(","))\r
1782 if (Value[0] == '{' and Value[-1] == '}'):\r
a0939593
LG
1783 return len(Value.split(","))\r
1784 if Value.startswith("L'") and Value.endswith("'") and len(list(Value[2:-1])) > 1:\r
1785 return len(list(Value[2:-1]))\r
1786 if Value[0] == "'" and Value[-1] == "'" and len(list(Value[1:-1])) > 1:\r
1787 return len(Value) - 2\r
ae7b6df8
LG
1788 return len(Value)\r
1789\r
8252e6bf 1790 return str(max(get_length(item) for item in sku_values))\r
ae7b6df8 1791\r
9e508f3a
CJ
1792 @staticmethod\r
1793 def ExecuteCommand (Command):\r
ae7b6df8
LG
1794 try:\r
1795 Process = subprocess.Popen(Command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)\r
1796 except:\r
5db9414c 1797 EdkLogger.error('Build', COMMAND_FAILURE, 'Can not execute command: %s' % Command)\r
ae7b6df8 1798 Result = Process.communicate()\r
0dee1d13 1799 return Process.returncode, Result[0].decode(errors='ignore'), Result[1].decode(errors='ignore')\r
ae7b6df8 1800\r
9e508f3a
CJ
1801 @staticmethod\r
1802 def IntToCString(Value, ValueSize):\r
ae7b6df8
LG
1803 Result = '"'\r
1804 if not isinstance (Value, str):\r
1805 for Index in range(0, ValueSize):\r
1806 Result = Result + '\\x%02x' % (Value & 0xff)\r
1807 Value = Value >> 8\r
1808 Result = Result + '"'\r
1809 return Result\r
1810\r
ccaa7754 1811 def GenerateSizeFunction(self, Pcd):\r
79820e32
B
1812 CApp = "// Default Value in Dec \n"\r
1813 CApp = CApp + "void Cal_%s_%s_Size(UINT32 *Size){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
afe8c411
FZ
1814\r
1815 if Pcd.IsArray() and Pcd.Capacity[-1] != "-1":\r
1816 CApp += " *Size = (sizeof (%s) > *Size ? sizeof (%s) : *Size);\n" % (Pcd.DatumType,Pcd.DatumType)\r
1817 else:\r
1818 if "{CODE(" in Pcd.DefaultValueFromDec:\r
1819 CApp += " *Size = (sizeof (%s_%s_INIT_Value) > *Size ? sizeof (%s_%s_INIT_Value) : *Size);\n" % (Pcd.TokenSpaceGuidCName,Pcd.TokenCName,Pcd.TokenSpaceGuidCName,Pcd.TokenCName)\r
672601cf
FB
1820 if Pcd.Type in PCD_DYNAMIC_TYPE_SET | PCD_DYNAMIC_EX_TYPE_SET:\r
1821 for skuname in Pcd.SkuInfoList:\r
1822 skuobj = Pcd.SkuInfoList[skuname]\r
1823 if skuobj.VariableName:\r
1824 for defaultstore in skuobj.DefaultStoreDict:\r
1825 pcddef = self.GetPcdDscRawDefaultValue(Pcd,skuname,defaultstore)\r
afe8c411
FZ
1826 if pcddef:\r
1827 if "{CODE(" in pcddef:\r
1828 CApp += " *Size = (sizeof (%s_%s_%s_%s_Value) > *Size ? sizeof (%s_%s_%s_%s_Value) : *Size);\n" % (Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,defaultstore,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,defaultstore)\r
1829 else:\r
1830 CApp += " *Size = %s > *Size ? %s : *Size;\n" % (self.GetStructurePcdMaxSize(Pcd),self.GetStructurePcdMaxSize(Pcd))\r
672601cf
FB
1831 else:\r
1832 pcddef = self.GetPcdDscRawDefaultValue(Pcd,skuname,TAB_DEFAULT_STORES_DEFAULT)\r
afe8c411
FZ
1833 if pcddef:\r
1834 if "{CODE(" in pcddef:\r
1835 CApp += " *Size = (sizeof (%s_%s_%s_%s_Value) > *Size ? sizeof (%s_%s_%s_%s_Value) : *Size);\n" % (Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,TAB_DEFAULT_STORES_DEFAULT,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,TAB_DEFAULT_STORES_DEFAULT)\r
1836 else:\r
1837 CApp += " *Size = %s > *Size ? %s : *Size;\n" % (self.GetStructurePcdMaxSize(Pcd),self.GetStructurePcdMaxSize(Pcd))\r
672601cf
FB
1838 else:\r
1839 pcddef = self.GetPcdDscRawDefaultValue(Pcd,TAB_DEFAULT,TAB_DEFAULT_STORES_DEFAULT)\r
afe8c411
FZ
1840 if pcddef:\r
1841 if "{CODE(" in pcddef:\r
1842 CApp += " *Size = (sizeof (%s_%s_%s_%s_Value) > *Size ? sizeof (%s_%s_%s_%s_Value) : *Size);\n" % (Pcd.TokenSpaceGuidCName,Pcd.TokenCName,TAB_DEFAULT,TAB_DEFAULT_STORES_DEFAULT,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,TAB_DEFAULT,TAB_DEFAULT_STORES_DEFAULT)\r
1843 else:\r
1844 CApp += " *Size = %s > *Size ? %s : *Size;\n" % (self.GetStructurePcdMaxSize(Pcd),self.GetStructurePcdMaxSize(Pcd))\r
1845 ActualCap = []\r
72a1d776 1846 for index in Pcd.DefaultValues:\r
afe8c411
FZ
1847 if index:\r
1848 ActualCap.append(index)\r
72a1d776 1849 FieldList = Pcd.DefaultValues[index]\r
79820e32
B
1850 if not FieldList:\r
1851 continue\r
1852 for FieldName in FieldList:\r
1853 FieldName = "." + FieldName\r
2b95556c 1854 IsArray = _IsFieldValueAnArray(FieldList[FieldName.strip(".")][0])\r
79820e32
B
1855 if IsArray and not (FieldList[FieldName.strip(".")][0].startswith('{GUID') and FieldList[FieldName.strip(".")][0].endswith('}')):\r
1856 try:\r
656d2539 1857 Value = ValueExpressionEx(FieldList[FieldName.strip(".")][0], TAB_VOID, self._GuidDict)(True)\r
79820e32
B
1858 except BadExpression:\r
1859 EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
1860 (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName.strip('.'))), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2]))\r
1861 Value, ValueSize = ParseFieldValue(Value)\r
a004d17d 1862 if not Pcd.IsArray():\r
9f30e401 1863 CApp = CApp + ' __FLEXIBLE_SIZE(*Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s) + ((%d %% __ARRAY_ELEMENT_SIZE(%s, %s)) ? 1 : 0)); // From %s Line %d Value %s \n' % (Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2], FieldList[FieldName.strip(".")][0]);\r
79820e32
B
1864 else:\r
1865 NewFieldName = ''\r
1866 FieldName_ori = FieldName.strip('.')\r
1867 while '[' in FieldName:\r
1868 NewFieldName = NewFieldName + FieldName.split('[', 1)[0] + '[0]'\r
afe8c411 1869 Array_Index = int(FieldName.split('[', 1)[1].split(']', 1)[0])\r
79820e32
B
1870 FieldName = FieldName.split(']', 1)[1]\r
1871 FieldName = NewFieldName + FieldName\r
a004d17d 1872 while '[' in FieldName and not Pcd.IsArray():\r
79820e32 1873 FieldName = FieldName.rsplit('[', 1)[0]\r
afe8c411 1874 CApp = CApp + ' __FLEXIBLE_SIZE(*Size, %s, %s, %d); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName.strip("."), Array_Index + 1, FieldList[FieldName_ori][1], FieldList[FieldName_ori][2], FieldList[FieldName_ori][0])\r
79820e32 1875 for skuname in Pcd.SkuOverrideValues:\r
55c84777 1876 if skuname == TAB_COMMON:\r
79820e32
B
1877 continue\r
1878 for defaultstorenameitem in Pcd.SkuOverrideValues[skuname]:\r
1879 CApp = CApp + "// SkuName: %s, DefaultStoreName: %s \n" % (skuname, defaultstorenameitem)\r
72a1d776 1880 for index in Pcd.SkuOverrideValues[skuname][defaultstorenameitem]:\r
afe8c411
FZ
1881 if index:\r
1882 ActualCap.append(index)\r
72a1d776 1883 for FieldList in [Pcd.SkuOverrideValues[skuname][defaultstorenameitem][index]]:\r
1884 if not FieldList:\r
1885 continue\r
1886 for FieldName in FieldList:\r
1887 FieldName = "." + FieldName\r
2b95556c 1888 IsArray = _IsFieldValueAnArray(FieldList[FieldName.strip(".")][0])\r
72a1d776 1889 if IsArray and not (FieldList[FieldName.strip(".")][0].startswith('{GUID') and FieldList[FieldName.strip(".")][0].endswith('}')):\r
1890 try:\r
1891 Value = ValueExpressionEx(FieldList[FieldName.strip(".")][0], TAB_VOID, self._GuidDict)(True)\r
1892 except BadExpression:\r
1893 EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
1894 (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName.strip('.'))), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2]))\r
1895 Value, ValueSize = ParseFieldValue(Value)\r
a004d17d 1896 if not Pcd.IsArray():\r
9f30e401 1897 CApp = CApp + ' __FLEXIBLE_SIZE(*Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s) + ((%d %% __ARRAY_ELEMENT_SIZE(%s, %s)) ? 1 : 0)); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2], FieldList[FieldName.strip(".")][0]);\r
72a1d776 1898 else:\r
1899 NewFieldName = ''\r
1900 FieldName_ori = FieldName.strip('.')\r
1901 while '[' in FieldName:\r
1902 NewFieldName = NewFieldName + FieldName.split('[', 1)[0] + '[0]'\r
afe8c411 1903 Array_Index = int(FieldName.split('[', 1)[1].split(']', 1)[0])\r
72a1d776 1904 FieldName = FieldName.split(']', 1)[1]\r
1905 FieldName = NewFieldName + FieldName\r
a004d17d 1906 while '[' in FieldName and not Pcd.IsArray():\r
72a1d776 1907 FieldName = FieldName.rsplit('[', 1)[0]\r
afe8c411 1908 CApp = CApp + ' __FLEXIBLE_SIZE(*Size, %s, %s, %d); // From %s Line %d Value %s \n' % (Pcd.DatumType, FieldName.strip("."), Array_Index + 1, FieldList[FieldName_ori][1], FieldList[FieldName_ori][2], FieldList[FieldName_ori][0])\r
543f5ac3
B
1909 if Pcd.PcdFieldValueFromFdf:\r
1910 CApp = CApp + "// From fdf \n"\r
1911 for FieldName in Pcd.PcdFieldValueFromFdf:\r
1912 FieldName = "." + FieldName\r
2b95556c 1913 IsArray = _IsFieldValueAnArray(Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][0])\r
543f5ac3
B
1914 if IsArray and not (Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][0].startswith('{GUID') and Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][0].endswith('}')):\r
1915 try:\r
1916 Value = ValueExpressionEx(Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][0], TAB_VOID, self._GuidDict)(True)\r
1917 except BadExpression:\r
1918 EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
1919 (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName.strip('.'))), Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][1], Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][2]))\r
1920 Value, ValueSize = ParseFieldValue(Value)\r
a004d17d 1921 if not Pcd.IsArray():\r
9f30e401 1922 CApp = CApp + ' __FLEXIBLE_SIZE(*Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s) + ((%d %% __ARRAY_ELEMENT_SIZE(%s, %s)) ? 1 : 0)); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][1], Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][2], Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][0]);\r
543f5ac3
B
1923 else:\r
1924 NewFieldName = ''\r
1925 FieldName_ori = FieldName.strip('.')\r
1926 while '[' in FieldName:\r
1927 NewFieldName = NewFieldName + FieldName.split('[', 1)[0] + '[0]'\r
afe8c411 1928 Array_Index = int(FieldName.split('[', 1)[1].split(']', 1)[0])\r
543f5ac3
B
1929 FieldName = FieldName.split(']', 1)[1]\r
1930 FieldName = NewFieldName + FieldName\r
1931 while '[' in FieldName:\r
1932 FieldName = FieldName.rsplit('[', 1)[0]\r
afe8c411 1933 CApp = CApp + ' __FLEXIBLE_SIZE(*Size, %s, %s, %d); // From %s Line %s Value %s \n' % (Pcd.DatumType, FieldName.strip("."), Array_Index + 1, Pcd.PcdFieldValueFromFdf[FieldName_ori][1], Pcd.PcdFieldValueFromFdf[FieldName_ori][2], Pcd.PcdFieldValueFromFdf[FieldName_ori][0])\r
b854e2bf
B
1934 if Pcd.PcdFieldValueFromComm:\r
1935 CApp = CApp + "// From Command Line \n"\r
1936 for FieldName in Pcd.PcdFieldValueFromComm:\r
1937 FieldName = "." + FieldName\r
2b95556c 1938 IsArray = _IsFieldValueAnArray(Pcd.PcdFieldValueFromComm[FieldName.strip(".")][0])\r
1667eec6 1939 if IsArray and not (Pcd.PcdFieldValueFromComm[FieldName.strip(".")][0].startswith('{GUID') and Pcd.PcdFieldValueFromComm[FieldName.strip(".")][0].endswith('}')):\r
b854e2bf 1940 try:\r
656d2539 1941 Value = ValueExpressionEx(Pcd.PcdFieldValueFromComm[FieldName.strip(".")][0], TAB_VOID, self._GuidDict)(True)\r
b854e2bf
B
1942 except BadExpression:\r
1943 EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
1667eec6 1944 (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName.strip('.'))), Pcd.PcdFieldValueFromComm[FieldName.strip(".")][1], Pcd.PcdFieldValueFromComm[FieldName.strip(".")][2]))\r
b854e2bf 1945 Value, ValueSize = ParseFieldValue(Value)\r
a004d17d 1946 if not Pcd.IsArray():\r
9f30e401 1947 CApp = CApp + ' __FLEXIBLE_SIZE(*Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s) + ((%d %% __ARRAY_ELEMENT_SIZE(%s, %s)) ? 1 : 0)); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), Pcd.PcdFieldValueFromComm[FieldName.strip(".")][1], Pcd.PcdFieldValueFromComm[FieldName.strip(".")][2], Pcd.PcdFieldValueFromComm[FieldName.strip(".")][0]);\r
b854e2bf
B
1948 else:\r
1949 NewFieldName = ''\r
1950 FieldName_ori = FieldName.strip('.')\r
1951 while '[' in FieldName:\r
1952 NewFieldName = NewFieldName + FieldName.split('[', 1)[0] + '[0]'\r
afe8c411 1953 Array_Index = int(FieldName.split('[', 1)[1].split(']', 1)[0])\r
b854e2bf
B
1954 FieldName = FieldName.split(']', 1)[1]\r
1955 FieldName = NewFieldName + FieldName\r
a004d17d 1956 while '[' in FieldName and not Pcd.IsArray():\r
b854e2bf 1957 FieldName = FieldName.rsplit('[', 1)[0]\r
afe8c411 1958 CApp = CApp + ' __FLEXIBLE_SIZE(*Size, %s, %s, %d); // From %s Line %d Value %s \n' % (Pcd.DatumType, FieldName.strip("."), Array_Index + 1, Pcd.PcdFieldValueFromComm[FieldName_ori][1], Pcd.PcdFieldValueFromComm[FieldName_ori][2], Pcd.PcdFieldValueFromComm[FieldName_ori][0])\r
72a1d776 1959 if Pcd.GetPcdMaxSize():\r
1960 CApp = CApp + " *Size = (%d > *Size ? %d : *Size); // The Pcd maxsize is %d \n" % (Pcd.GetPcdMaxSize(), Pcd.GetPcdMaxSize(), Pcd.GetPcdMaxSize())\r
afe8c411
FZ
1961 ArraySizeByAssign = self.CalculateActualCap(ActualCap)\r
1962 if ArraySizeByAssign > 1:\r
1963 CApp = CApp + " *Size = (%d > *Size ? %d : *Size); \n" % (ArraySizeByAssign, ArraySizeByAssign)\r
79820e32
B
1964 CApp = CApp + "}\n"\r
1965 return CApp\r
afe8c411
FZ
1966 def CalculateActualCap(self,ActualCap):\r
1967 if not ActualCap:\r
1968 return 1\r
1969 maxsize = 1\r
1970 for item in ActualCap:\r
1971 index_elements = ArrayIndex.findall(item)\r
1972 rt = 1\r
1973 for index_e in index_elements:\r
1974 index_num = index_e.lstrip("[").rstrip("]").strip()\r
1975 if not index_num:\r
1976 # Not support flexiable pcd array assignment\r
1977 return 1\r
1978 index_num = int(index_num,16) if index_num.startswith(("0x","0X")) else int(index_num)\r
1979 rt = rt * (index_num+1)\r
1980 if rt >maxsize:\r
1981 maxsize = rt\r
1982\r
1983 return maxsize\r
9e508f3a
CJ
1984\r
1985 @staticmethod\r
672601cf 1986 def GenerateSizeStatments(Pcd,skuname,defaultstorename):\r
72a1d776 1987 if Pcd.IsArray():\r
1988 r_datatype = [Pcd.BaseDatumType]\r
672601cf 1989 lastoneisEmpty = False\r
72a1d776 1990 for dem in Pcd.Capacity:\r
672601cf
FB
1991 if lastoneisEmpty:\r
1992 EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. " %\r
1993 (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName))))\r
1994 if dem == '0' or dem == "-1":\r
72a1d776 1995 r_datatype.append("[1]")\r
672601cf 1996 lastoneisEmpty = True\r
72a1d776 1997 else:\r
1998 r_datatype.append("[" + dem + "]")\r
672601cf
FB
1999\r
2000 if Pcd.Type in [MODEL_PCD_DYNAMIC_EX_HII, MODEL_PCD_DYNAMIC_HII]:\r
2001 PcdDefValue = Pcd.SkuInfoList.get(skuname).DefaultStoreDict.get(defaultstorename)\r
2002 elif Pcd.Type in [MODEL_PCD_DYNAMIC_EX_DEFAULT,MODEL_PCD_DYNAMIC_VPD,MODEL_PCD_DYNAMIC_DEFAULT,MODEL_PCD_DYNAMIC_EX_VPD]:\r
2003 PcdDefValue = Pcd.SkuInfoList.get(skuname).DefaultValue\r
2004 else:\r
2005 PcdDefValue = Pcd.DefaultValue\r
2006 if lastoneisEmpty:\r
2007 if "{CODE(" not in PcdDefValue:\r
9f30e401
FB
2008 sizebasevalue_plus = "(%s / sizeof(%s) + 1)" % ((DscBuildData.GetStructurePcdMaxSize(Pcd), Pcd.BaseDatumType))\r
2009 sizebasevalue = "(%s / sizeof(%s))" % ((DscBuildData.GetStructurePcdMaxSize(Pcd), Pcd.BaseDatumType))\r
672601cf 2010 sizeof = "sizeof(%s)" % Pcd.BaseDatumType\r
9f30e401
FB
2011 CApp = ' int ArraySize = %s %% %s ? %s : %s ;\n' % ( (DscBuildData.GetStructurePcdMaxSize(Pcd), sizeof, sizebasevalue_plus, sizebasevalue))\r
2012 CApp += ' Size = ArraySize * sizeof(%s); \n' % Pcd.BaseDatumType\r
672601cf
FB
2013 else:\r
2014 CApp = " Size = 0;\n"\r
2015 else:\r
2016 CApp = ' Size = sizeof(%s);\n' % ("".join(r_datatype) )\r
72a1d776 2017 else:\r
2018 CApp = ' Size = sizeof(%s);\n' % (Pcd.DatumType)\r
79820e32
B
2019 CApp = CApp + ' Cal_%s_%s_Size(&Size);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
2020 return CApp\r
9e508f3a 2021\r
72a1d776 2022 def GetIndicator(self,index,FieldName,Pcd):\r
2023 def cleanupindex(indexstr):\r
2024 return indexstr.strip("[").strip("]").strip()\r
2025 index_elements = ArrayIndex.findall(index)\r
2026 pcd_capacity = Pcd.Capacity\r
2027 if index:\r
2028 indicator = "(Pcd"\r
2029 if len(pcd_capacity)>2:\r
1590d123 2030 for i in range(0,len(index_elements)):\r
72a1d776 2031 index_ele = index_elements[i]\r
2032 index_num = index_ele.strip("[").strip("]").strip()\r
2033 if i == len(index_elements) -2:\r
2034 indicator += "+ %d*Size/sizeof(%s)/%d + %s)" %(int(cleanupindex(index_elements[i+1])),Pcd.BaseDatumType,reduce(lambda x,y: int(x)*int(y),pcd_capacity[:-1]), cleanupindex(index_elements[i]))\r
2035 break\r
2036 else:\r
2037 indicator += " + %d*%s*Size/sizeof(%s)/%d" %(int(cleanupindex(index_elements[i])),reduce(lambda x,y: int(x)*int(y),pcd_capacity[i+1:-1]),Pcd.BaseDatumType,reduce(lambda x,y: int(x)*int(y),pcd_capacity[:-1]))\r
2038 elif len(pcd_capacity) == 2:\r
2039 indicator += "+ %d*Size/sizeof(%s)/%d + %s)" %(int(cleanupindex(index_elements[0])),Pcd.BaseDatumType,int(pcd_capacity[0]), index_elements[1].strip("[").strip("]").strip())\r
2040 elif len(pcd_capacity) == 1:\r
2041 index_ele = index_elements[0]\r
2042 index_num = index_ele.strip("[").strip("]").strip()\r
2043 indicator += " + %s)" % (index_num)\r
2044 else:\r
2045 indicator = "Pcd"\r
2046 if FieldName:\r
2047 indicator += "->" + FieldName\r
2048 return indicator\r
2049\r
2050 def GetStarNum(self,Pcd):\r
2051 if not Pcd.IsArray():\r
2052 return 1\r
2053 elif Pcd.IsSimpleTypeArray():\r
2054 return len(Pcd.Capacity)\r
2055 else:\r
2056 return len(Pcd.Capacity) + 1\r
ccaa7754 2057 def GenerateDefaultValueAssignFunction(self, Pcd):\r
79820e32 2058 CApp = "// Default value in Dec \n"\r
72a1d776 2059 CApp = CApp + "void Assign_%s_%s_Default_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.BaseDatumType)\r
79820e32
B
2060 CApp = CApp + ' UINT32 FieldSize;\n'\r
2061 CApp = CApp + ' CHAR8 *Value;\n'\r
afe8c411 2062 CApp = CApp + ' UINT32 PcdArraySize;\n'\r
79820e32 2063 DefaultValueFromDec = Pcd.DefaultValueFromDec\r
2b95556c 2064 IsArray = _IsFieldValueAnArray(Pcd.DefaultValueFromDec)\r
79820e32
B
2065 if IsArray:\r
2066 try:\r
656d2539 2067 DefaultValueFromDec = ValueExpressionEx(Pcd.DefaultValueFromDec, TAB_VOID)(True)\r
79820e32
B
2068 except BadExpression:\r
2069 EdkLogger.error("Build", FORMAT_INVALID, "Invalid value format for %s.%s, from DEC: %s" %\r
2070 (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, DefaultValueFromDec))\r
0f228f19 2071 DefaultValueFromDec = StringToArray(DefaultValueFromDec)\r
79820e32 2072 Value, ValueSize = ParseFieldValue (DefaultValueFromDec)\r
9f30e401 2073 if IsArray:\r
afe8c411
FZ
2074 #\r
2075 # Use memcpy() to copy value into field\r
2076 #\r
2077 if Pcd.IsArray():\r
2078 pcdarraysize = Pcd.PcdArraySize()\r
2079 if "{CODE(" in Pcd.DefaultValueFromDec:\r
2080 if Pcd.Capacity[-1] != "-1":\r
2081 CApp = CApp + '__STATIC_ASSERT(sizeof(%s_%s_INIT_Value) < %d * sizeof(%s), "Pcd %s.%s Value in Dec exceed the array capability %s"); // From %s Line %s \n ' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,pcdarraysize,Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Pcd.DatumType,Pcd.DefaultValueFromDecInfo[0],Pcd.DefaultValueFromDecInfo[1])\r
2082 CApp = CApp + ' PcdArraySize = sizeof(%s_%s_INIT_Value);\n ' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
2083 CApp = CApp + ' memcpy (Pcd, %s_%s_INIT_Value,PcdArraySize);\n ' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
2084 else:\r
2085 if Pcd.Capacity[-1] != "-1":\r
2086 CApp = CApp + '__STATIC_ASSERT(%d < %d * sizeof(%s), "Pcd %s.%s Value in Dec exceed the array capability %s"); // From %s Line %s \n' % (ValueSize,pcdarraysize,Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Pcd.DatumType,Pcd.DefaultValueFromDecInfo[0],Pcd.DefaultValueFromDecInfo[1])\r
2087 CApp = CApp + ' PcdArraySize = %d;\n' % ValueSize\r
2088 CApp = CApp + ' Value = %s; // From DEC Default Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.DefaultValueFromDec)\r
2089 CApp = CApp + ' memcpy (Pcd, Value, PcdArraySize);\n'\r
72a1d776 2090 else:\r
afe8c411
FZ
2091 if "{CODE(" in Pcd.DefaultValueFromDec:\r
2092 CApp = CApp + ' PcdArraySize = sizeof(%s_%s_INIT_Value);\n ' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
2093 CApp = CApp + ' memcpy (Pcd, &%s_%s_INIT_Value,PcdArraySize);\n ' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
2094 else:\r
2095 CApp = CApp + ' Value = %s; // From DEC Default Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.DefaultValueFromDec)\r
2096 CApp = CApp + ' memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
9f30e401
FB
2097 elif isinstance(Value, str):\r
2098 CApp = CApp + ' Pcd = %s; // From DEC Default Value %s\n' % (Value, Pcd.DefaultValueFromDec)\r
72a1d776 2099 for index in Pcd.DefaultValues:\r
2100 FieldList = Pcd.DefaultValues[index]\r
79820e32
B
2101 if not FieldList:\r
2102 continue\r
2103 for FieldName in FieldList:\r
2b95556c 2104 IsArray = _IsFieldValueAnArray(FieldList[FieldName][0])\r
79820e32
B
2105 if IsArray:\r
2106 try:\r
656d2539 2107 FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], TAB_VOID, self._GuidDict)(True)\r
79820e32
B
2108 except BadExpression:\r
2109 EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
ccaa7754 2110 (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName)), FieldList[FieldName][1], FieldList[FieldName][2]))\r
79820e32
B
2111\r
2112 try:\r
2113 Value, ValueSize = ParseFieldValue (FieldList[FieldName][0])\r
2114 except Exception:\r
ccaa7754 2115 EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " % (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName)), FieldList[FieldName][1], FieldList[FieldName][2]))\r
72a1d776 2116\r
2117 indicator = self.GetIndicator(index, FieldName,Pcd)\r
9f30e401 2118 if IsArray:\r
79820e32
B
2119 #\r
2120 # Use memcpy() to copy value into field\r
2121 #\r
68c67d3a 2122 CApp = CApp + ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.BaseDatumType, FieldName)\r
9e508f3a 2123 CApp = CApp + ' Value = %s; // From %s Line %d Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
68c67d3a 2124 CApp = CApp + ' __STATIC_ASSERT((__FIELD_SIZE(%s, %s) >= %d) || (__FIELD_SIZE(%s, %s) == 0), "Input buffer exceeds the buffer array"); // From %s Line %d Value %s\n' % (Pcd.BaseDatumType, FieldName, ValueSize, Pcd.BaseDatumType, FieldName, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
72a1d776 2125 CApp = CApp + ' memcpy (&%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (indicator, ValueSize, ValueSize)\r
9f30e401
FB
2126 elif isinstance(Value, str):\r
2127 CApp = CApp + ' %s = %s; // From %s Line %d Value %s\n' % (indicator, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
79820e32 2128 else:\r
e451aaa6
Z
2129 if '[' in FieldName and ']' in FieldName:\r
2130 Index = int(FieldName.split('[')[1].split(']')[0])\r
2131 CApp = CApp + ' __STATIC_ASSERT((%d < __ARRAY_SIZE(Pcd->%s)) || (__ARRAY_SIZE(Pcd->%s) == 0), "array index exceeds the array number"); // From %s Line %d Index of %s\n' % (Index, FieldName.split('[')[0], FieldName.split('[')[0], FieldList[FieldName][1], FieldList[FieldName][2], FieldName)\r
79820e32 2132 if ValueSize > 4:\r
72a1d776 2133 CApp = CApp + ' %s = %dULL; // From %s Line %d Value %s\n' % (indicator, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
79820e32 2134 else:\r
72a1d776 2135 CApp = CApp + ' %s = %d; // From %s Line %d Value %s\n' % (indicator, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
f3b31433
FB
2136 CApp = CApp + "}\n"\r
2137 return CApp\r
9e508f3a
CJ
2138\r
2139 @staticmethod\r
2140 def GenerateDefaultValueAssignStatement(Pcd):\r
f3b31433
FB
2141 CApp = ' Assign_%s_%s_Default_Value(Pcd);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
2142 return CApp\r
9e508f3a 2143\r
672601cf
FB
2144 def GetPcdDscRawDefaultValue(self,Pcd, SkuName,DefaultStoreName):\r
2145 if Pcd.Type in PCD_DYNAMIC_TYPE_SET or Pcd.Type in PCD_DYNAMIC_EX_TYPE_SET:\r
2146 if (SkuName, DefaultStoreName) == (TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT):\r
2147 pcddefaultvalue = Pcd.DefaultFromDSC.get(TAB_DEFAULT, {}).get(TAB_DEFAULT_STORES_DEFAULT) if Pcd.DefaultFromDSC else None\r
2148 else:\r
2149 pcddefaultvalue = Pcd.DscRawValue.get(SkuName, {}).get(DefaultStoreName)\r
2150 else:\r
2151 pcddefaultvalue = Pcd.DscRawValue.get(SkuName, {}).get(TAB_DEFAULT_STORES_DEFAULT)\r
2152\r
2153 return pcddefaultvalue\r
afe8c411
FZ
2154 def GetPcdDscRawValueInfo(self,Pcd, SkuName,DefaultStoreName):\r
2155 DscValueInfo = Pcd.DscRawValueInfo.get(SkuName, {}).get(DefaultStoreName)\r
2156 if DscValueInfo:\r
2157 dscfilepath,lineno = DscValueInfo\r
2158 else:\r
2159 dscfilepath = self.MetaFile.File\r
2160 lineno = ""\r
2161 return dscfilepath,lineno\r
2162\r
ccaa7754
GL
2163 def GenerateInitValueFunction(self, Pcd, SkuName, DefaultStoreName):\r
2164 CApp = "// Value in Dsc for Sku: %s, DefaultStore %s\n" % (SkuName, DefaultStoreName)\r
72a1d776 2165 CApp = CApp + "void Assign_%s_%s_%s_%s_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, SkuName, DefaultStoreName, Pcd.BaseDatumType)\r
f3b31433
FB
2166 CApp = CApp + ' UINT32 FieldSize;\n'\r
2167 CApp = CApp + ' CHAR8 *Value;\n'\r
afe8c411 2168 CApp = CApp + ' UINT32 PcdArraySize;\n'\r
f3b31433 2169\r
55c84777 2170 CApp = CApp + "// SkuName: %s, DefaultStoreName: %s \n" % (TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT)\r
f3b31433 2171 inherit_OverrideValues = Pcd.SkuOverrideValues[SkuName]\r
afe8c411
FZ
2172 dscfilepath,lineno = self.GetPcdDscRawValueInfo(Pcd, SkuName, DefaultStoreName)\r
2173 if lineno:\r
2174 valuefrom = "%s Line %s" % (dscfilepath,str(lineno))\r
2175 else:\r
2176 valuefrom = dscfilepath\r
72a1d776 2177\r
672601cf 2178 pcddefaultvalue = self.GetPcdDscRawDefaultValue(Pcd, SkuName, DefaultStoreName)\r
72a1d776 2179 if pcddefaultvalue:\r
2180 FieldList = pcddefaultvalue\r
2b95556c 2181 IsArray = _IsFieldValueAnArray(FieldList)\r
72a1d776 2182 if IsArray:\r
2183 if "{CODE(" not in FieldList:\r
79820e32 2184 try:\r
656d2539 2185 FieldList = ValueExpressionEx(FieldList, TAB_VOID)(True)\r
79820e32
B
2186 except BadExpression:\r
2187 EdkLogger.error("Build", FORMAT_INVALID, "Invalid value format for %s.%s, from DSC: %s" %\r
2188 (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldList))\r
72a1d776 2189 Value, ValueSize = ParseFieldValue (FieldList)\r
f3b31433 2190\r
72a1d776 2191 if (SkuName, DefaultStoreName) == (TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT):\r
2192 if isinstance(Value, str):\r
2193 if "{CODE(" in Value:\r
afe8c411
FZ
2194 if Pcd.IsArray() and Pcd.Capacity[-1] != "-1":\r
2195 pcdarraysize = Pcd.PcdArraySize()\r
2196 CApp = CApp + '__STATIC_ASSERT(sizeof(%s_%s_%s_%s_Value) < %d * sizeof(%s), "Pcd %s.%s Value in Dsc exceed the array capability %s"); // From %s \n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName,pcdarraysize,Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Pcd.DatumType, valuefrom)\r
2197 CApp = CApp+ ' PcdArraySize = sizeof(%s_%s_%s_%s_Value);\n ' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName)\r
2198 CApp = CApp + ' memcpy (Pcd, &%s_%s_%s_%s_Value,PcdArraySize);\n ' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName)\r
72a1d776 2199 else:\r
ccaa7754 2200 CApp = CApp + ' Pcd = %s; // From DSC Default Value %s\n' % (Value, Pcd.DefaultFromDSC.get(TAB_DEFAULT, {}).get(TAB_DEFAULT_STORES_DEFAULT, Pcd.DefaultValue) if Pcd.DefaultFromDSC else Pcd.DefaultValue)\r
72a1d776 2201 elif IsArray:\r
afe8c411
FZ
2202 #\r
2203 # Use memcpy() to copy value into field\r
2204 #\r
2205 if Pcd.IsArray():\r
2206 pcdarraysize = Pcd.PcdArraySize()\r
2207 if "{CODE(" in pcddefaultvalue:\r
2208 if Pcd.Capacity[-1] != "-1":\r
2209 CApp = CApp + '__STATIC_ASSERT(sizeof(%s_%s_%s_%s_Value) < %d * sizeof(%s), "Pcd %s.%s Value in Dsc exceed the array capability %s"); // From %s \n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName,pcdarraysize,Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Pcd.DatumType,valuefrom)\r
2210 CApp = CApp + ' PcdArraySize = sizeof(%s_%s_%s_%s_Value);\n ' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName)\r
2211 CApp = CApp + ' memcpy (Pcd, %s_%s_%s_%s_Value, PcdArraySize);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName)\r
2212 else:\r
2213 if Pcd.Capacity[-1] != "-1":\r
2214 CApp = CApp + '__STATIC_ASSERT(%d < %d * sizeof(%s), "Pcd %s.%s Value in Dsc exceed the array capability %s"); // From %s \n' % (ValueSize,pcdarraysize,Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Pcd.DatumType,valuefrom)\r
2215 CApp = CApp + ' PcdArraySize = %d;\n' % ValueSize\r
2216 CApp = CApp + ' Value = %s; // From DSC Default Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.DefaultFromDSC.get(TAB_DEFAULT, {}).get(TAB_DEFAULT_STORES_DEFAULT, Pcd.DefaultValue) if Pcd.DefaultFromDSC else Pcd.DefaultValue)\r
2217 CApp = CApp + ' memcpy (Pcd, Value, PcdArraySize);\n'\r
72a1d776 2218 else:\r
afe8c411
FZ
2219 if "{CODE(" in pcddefaultvalue:\r
2220 CApp = CApp + ' PcdArraySize = %d < sizeof(%s) * %d ? %d: sizeof(%s) * %d;\n ' % (ValueSize,Pcd.BaseDatumType,pcdarraysize,ValueSize,Pcd.BaseDatumType,pcdarraysize)\r
2221 CApp = CApp + ' memcpy (Pcd, &%s_%s_%s_%s_Value, PcdArraySize);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName)\r
2222 else:\r
2223 CApp = CApp + ' Value = %s; // From DSC Default Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.DefaultFromDSC.get(TAB_DEFAULT, {}).get(TAB_DEFAULT_STORES_DEFAULT, Pcd.DefaultValue) if Pcd.DefaultFromDSC else Pcd.DefaultValue)\r
2224 CApp = CApp + ' memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
72a1d776 2225 else:\r
2226 if isinstance(Value, str):\r
2227 if "{CODE(" in Value:\r
afe8c411
FZ
2228 if Pcd.IsArray() and Pcd.Capacity[-1] != "-1":\r
2229 pcdarraysize = Pcd.PcdArraySize()\r
2230 CApp = CApp + '__STATIC_ASSERT(sizeof(%s_%s_%s_%s_Value) < %d * sizeof(%s), "Pcd %s.%s Value in Dsc exceed the array capability %s"); // From %s \n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName,pcdarraysize,Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Pcd.DatumType,valuefrom)\r
2231 CApp = CApp + ' PcdArraySize = sizeof(%s_%s_%s_%s_Value);\n '% (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName)\r
2232 CApp = CApp + ' memcpy (Pcd, &%s_%s_%s_%s_Value, PcdArraySize);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName)\r
72a1d776 2233 else:\r
ccaa7754 2234 CApp = CApp + ' Pcd = %s; // From DSC Default Value %s\n' % (Value, Pcd.DscRawValue.get(SkuName, {}).get(DefaultStoreName))\r
72a1d776 2235 elif IsArray:\r
afe8c411
FZ
2236 #\r
2237 # Use memcpy() to copy value into field\r
2238 #\r
2239 if Pcd.IsArray():\r
2240 pcdarraysize = Pcd.PcdArraySize()\r
2241 if "{CODE(" in pcddefaultvalue:\r
2242 if Pcd.Capacity[-1] != "-1":\r
2243 CApp = CApp + '__STATIC_ASSERT(sizeof(%s_%s_%s_%s_Value) < %d * sizeof(%s), "Pcd %s.%s Value in Dsc exceed the array capability %s"); // From %s \n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName,pcdarraysize,Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Pcd.DatumType,valuefrom)\r
2244 CApp + ' PcdArraySize = sizeof(%s_%s_%s_%s_Value);\n ' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName)\r
2245 CApp = CApp + ' memcpy (Pcd, %s_%s_%s_%s_Value, PcdArraySize);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName)\r
2246 else:\r
2247 if Pcd.Capacity[-1] != "-1":\r
2248 CApp = CApp + '__STATIC_ASSERT(%d < %d * sizeof(%s), "Pcd %s.%s Value in Dsc exceed the array capability %s"); // From %s \n' % (ValueSize,pcdarraysize,Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Pcd.DatumType,valuefrom)\r
2249 CApp = CApp + ' PcdArraySize = %d;\n' % ValueSize\r
2250 CApp = CApp + ' Value = %s; // From DSC Default Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.DscRawValue.get(TAB_DEFAULT, {}).get(TAB_DEFAULT_STORES_DEFAULT, Pcd.DefaultValue) if Pcd.DefaultFromDSC else Pcd.DefaultValue)\r
2251 CApp = CApp + ' memcpy (Pcd, Value, PcdArraySize);\n'\r
72a1d776 2252 else:\r
afe8c411
FZ
2253 if "{CODE(" in pcddefaultvalue:\r
2254 CApp = CApp + ' PcdArraySize = %d < sizeof(%s) * %d ? %d: sizeof(%s) * %d;\n ' % (ValueSize,Pcd.BaseDatumType,pcdarraysize,ValueSize,Pcd.BaseDatumType,pcdarraysize)\r
2255 CApp = CApp + ' memcpy (Pcd, &%s_%s_%s_%s_Value, PcdArraySize);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName, DefaultStoreName)\r
2256 else:\r
2257 CApp = CApp + ' Value = %s; // From DSC Default Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.DscRawValue.get(SkuName, {}).get(DefaultStoreName))\r
2258 CApp = CApp + ' memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
72a1d776 2259\r
2260 inheritvalue = inherit_OverrideValues.get(DefaultStoreName)\r
2261 if not inheritvalue:\r
2262 inheritvalue = []\r
2263 for index in inheritvalue:\r
2264 FieldList = inheritvalue[index]\r
2265 if not FieldList:\r
79820e32 2266 continue\r
ccaa7754 2267 if (SkuName, DefaultStoreName) == (TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT) or (( (SkuName, '') not in Pcd.ValueChain) and ( (SkuName, DefaultStoreName) not in Pcd.ValueChain )):\r
f3b31433 2268 for FieldName in FieldList:\r
72a1d776 2269 indicator = self.GetIndicator(index, FieldName,Pcd)\r
2b95556c 2270 IsArray = _IsFieldValueAnArray(FieldList[FieldName][0])\r
f3b31433
FB
2271 if IsArray:\r
2272 try:\r
2855e9c3 2273 FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], TAB_VOID, self._GuidDict)(True)\r
f3b31433
FB
2274 except BadExpression:\r
2275 EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
2276 (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName)), FieldList[FieldName][1], FieldList[FieldName][2]))\r
79820e32 2277 try:\r
2855e9c3 2278 Value, ValueSize = ParseFieldValue (FieldList[FieldName][0])\r
f3b31433 2279 except Exception:\r
ccaa7754 2280 EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " % (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName)), FieldList[FieldName][1], FieldList[FieldName][2]))\r
f3b31433
FB
2281 if isinstance(Value, str):\r
2282 CApp = CApp + ' Pcd->%s = %s; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
2283 elif IsArray:\r
2284 #\r
2285 # Use memcpy() to copy value into field\r
2286 #\r
72a1d776 2287 CApp = CApp + ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.BaseDatumType, FieldName)\r
9e508f3a 2288 CApp = CApp + ' Value = %s; // From %s Line %d Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
68c67d3a 2289 CApp = CApp + ' __STATIC_ASSERT((__FIELD_SIZE(%s, %s) >= %d) || (__FIELD_SIZE(%s, %s) == 0), "Input buffer exceeds the buffer array"); // From %s Line %d Value %s\n' % (Pcd.BaseDatumType, FieldName, ValueSize, Pcd.BaseDatumType, FieldName, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
72a1d776 2290 CApp = CApp + ' memcpy (&%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (indicator, ValueSize, ValueSize)\r
79820e32 2291 else:\r
e451aaa6
Z
2292 if '[' in FieldName and ']' in FieldName:\r
2293 Index = int(FieldName.split('[')[1].split(']')[0])\r
2294 CApp = CApp + ' __STATIC_ASSERT((%d < __ARRAY_SIZE(Pcd->%s)) || (__ARRAY_SIZE(Pcd->%s) == 0), "array index exceeds the array number"); // From %s Line %d Index of %s\n' % (Index, FieldName.split('[')[0], FieldName.split('[')[0], FieldList[FieldName][1], FieldList[FieldName][2], FieldName)\r
f3b31433 2295 if ValueSize > 4:\r
72a1d776 2296 CApp = CApp + ' %s = %dULL; // From %s Line %d Value %s\n' % (indicator, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
f3b31433 2297 else:\r
72a1d776 2298 CApp = CApp + ' %s = %d; // From %s Line %d Value %s\n' % (indicator, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
79820e32
B
2299 CApp = CApp + "}\n"\r
2300 return CApp\r
9e508f3a
CJ
2301\r
2302 @staticmethod\r
ccaa7754
GL
2303 def GenerateInitValueStatement(Pcd, SkuName, DefaultStoreName):\r
2304 CApp = ' Assign_%s_%s_%s_%s_Value(Pcd);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, SkuName, DefaultStoreName)\r
79820e32 2305 return CApp\r
9e508f3a 2306\r
ccaa7754 2307 def GenerateCommandLineValue(self, Pcd):\r
b854e2bf 2308 CApp = "// Value in CommandLine\n"\r
72a1d776 2309 CApp = CApp + "void Assign_%s_%s_CommandLine_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.BaseDatumType)\r
b854e2bf
B
2310 CApp = CApp + ' UINT32 FieldSize;\n'\r
2311 CApp = CApp + ' CHAR8 *Value;\n'\r
2312\r
2313 pcddefaultvalue = Pcd.PcdValueFromComm\r
ccaa7754 2314 for FieldList in [pcddefaultvalue, Pcd.PcdFieldValueFromComm]:\r
b854e2bf
B
2315 if not FieldList:\r
2316 continue\r
2317 if pcddefaultvalue and FieldList == pcddefaultvalue:\r
2b95556c 2318 IsArray = _IsFieldValueAnArray(FieldList)\r
b854e2bf
B
2319 if IsArray:\r
2320 try:\r
656d2539 2321 FieldList = ValueExpressionEx(FieldList, TAB_VOID)(True)\r
b854e2bf 2322 except BadExpression:\r
0f228f19 2323 EdkLogger.error("Build", FORMAT_INVALID, "Invalid value format for %s.%s, from Command: %s" %\r
b854e2bf
B
2324 (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldList))\r
2325 Value, ValueSize = ParseFieldValue (FieldList)\r
2326\r
2327 if isinstance(Value, str):\r
2328 CApp = CApp + ' Pcd = %s; // From Command Line \n' % (Value)\r
2329 elif IsArray:\r
2330 #\r
2331 # Use memcpy() to copy value into field\r
2332 #\r
9e508f3a 2333 CApp = CApp + ' Value = %s; // From Command Line.\n' % (DscBuildData.IntToCString(Value, ValueSize))\r
b854e2bf
B
2334 CApp = CApp + ' memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
2335 continue\r
2336 for FieldName in FieldList:\r
2b95556c 2337 IsArray = _IsFieldValueAnArray(FieldList[FieldName][0])\r
b854e2bf
B
2338 if IsArray:\r
2339 try:\r
656d2539 2340 FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], TAB_VOID, self._GuidDict)(True)\r
b854e2bf
B
2341 except BadExpression:\r
2342 EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
2343 (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName)), FieldList[FieldName][1], FieldList[FieldName][2]))\r
2344 except:\r
72443dd2 2345 print("error")\r
b854e2bf
B
2346 try:\r
2347 Value, ValueSize = ParseFieldValue (FieldList[FieldName][0])\r
2348 except Exception:\r
ccaa7754 2349 EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " % (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName)), FieldList[FieldName][1], FieldList[FieldName][2]))\r
b854e2bf
B
2350 if isinstance(Value, str):\r
2351 CApp = CApp + ' Pcd->%s = %s; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
2352 elif IsArray:\r
2353 #\r
2354 # Use memcpy() to copy value into field\r
2355 #\r
72a1d776 2356 CApp = CApp + ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.BaseDatumType, FieldName)\r
9e508f3a 2357 CApp = CApp + ' Value = %s; // From %s Line %d Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
68c67d3a 2358 CApp = CApp + ' __STATIC_ASSERT((__FIELD_SIZE(%s, %s) >= %d) || (__FIELD_SIZE(%s, %s) == 0), "Input buffer exceeds the buffer array"); // From %s Line %d Value %s\n' % (Pcd.BaseDatumType, FieldName, ValueSize, Pcd.BaseDatumType, FieldName, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
b854e2bf
B
2359 CApp = CApp + ' memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)\r
2360 else:\r
9f2b0594
Z
2361 if '[' in FieldName and ']' in FieldName:\r
2362 Index = int(FieldName.split('[')[1].split(']')[0])\r
2363 CApp = CApp + ' __STATIC_ASSERT((%d < __ARRAY_SIZE(Pcd->%s)) || (__ARRAY_SIZE(Pcd->%s) == 0), "array index exceeds the array number"); // From %s Line %d Index of %s\n' % (Index, FieldName.split('[')[0], FieldName.split('[')[0], FieldList[FieldName][1], FieldList[FieldName][2], FieldName)\r
b854e2bf
B
2364 if ValueSize > 4:\r
2365 CApp = CApp + ' Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
2366 else:\r
2367 CApp = CApp + ' Pcd->%s = %d; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
2368 CApp = CApp + "}\n"\r
2369 return CApp\r
9e508f3a 2370\r
09af9bd9
BF
2371 def GenerateModuleScopeValue(self, Pcd):\r
2372 CApp = "// Value in Dsc Module scope \n"\r
2373 for ModuleGuid in Pcd.PcdFiledValueFromDscComponent:\r
2374\r
2375 CApp = CApp + "void Assign_%s_%s_%s_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, ModuleGuid,Pcd.BaseDatumType)\r
2376 CApp = CApp + ' UINT32 FieldSize;\n'\r
2377 CApp = CApp + ' CHAR8 *Value;\n'\r
2378 pcddefaultvalue, file_path,lineNo = Pcd.PcdValueFromComponents.get(ModuleGuid,(None,None,None))\r
2379\r
2380 if pcddefaultvalue:\r
2381 IsArray = _IsFieldValueAnArray(pcddefaultvalue)\r
2382 if IsArray:\r
2383 try:\r
2384 FieldList = ValueExpressionEx(pcddefaultvalue, TAB_VOID)(True)\r
2385 except BadExpression:\r
2386 EdkLogger.error("Build", FORMAT_INVALID, "Invalid value format for %s.%s, from %s Line %s: %s" %\r
2387 (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, file_path, lineNo, FieldList))\r
2388 Value, ValueSize = ParseFieldValue (FieldList)\r
2389\r
2390 if isinstance(Value, str):\r
2391 CApp = CApp + ' Pcd = %s; // From %s Line %s \n' % (Value, file_path, lineNo)\r
2392 elif IsArray:\r
2393 #\r
2394 # Use memcpy() to copy value into field\r
2395 #\r
2396 CApp = CApp + ' Value = %s; // From %s Line %s.\n' % (DscBuildData.IntToCString(Value, ValueSize), file_path, lineNo)\r
2397 CApp = CApp + ' memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
2398\r
2399\r
2400 PcdFiledValue = Pcd.PcdFiledValueFromDscComponent.get(ModuleGuid)\r
2401 for index in PcdFiledValue:\r
2402 FieldList = PcdFiledValue[index]\r
2403 if not FieldList:\r
2404 continue\r
2405 for FieldName in FieldList:\r
2406 IsArray = _IsFieldValueAnArray(FieldList[FieldName][0])\r
2407 if IsArray:\r
2408 try:\r
2409 FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], TAB_VOID, self._GuidDict)(True)\r
2410 except BadExpression:\r
2411 EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
2412 (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName)), FieldList[FieldName][1], FieldList[FieldName][2]))\r
2413 except:\r
2414 print("error")\r
2415 try:\r
2416 Value, ValueSize = ParseFieldValue (FieldList[FieldName][0])\r
2417 except Exception:\r
2418 EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " % (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName)), FieldList[FieldName][1], FieldList[FieldName][2]))\r
2419 if isinstance(Value, str):\r
2420 CApp = CApp + ' Pcd->%s = %s; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
2421 elif IsArray:\r
2422 #\r
2423 # Use memcpy() to copy value into field\r
2424 #\r
2425 CApp = CApp + ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.BaseDatumType, FieldName)\r
2426 CApp = CApp + ' Value = %s; // From %s Line %d Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
2427 CApp = CApp + ' __STATIC_ASSERT((__FIELD_SIZE(%s, %s) >= %d) || (__FIELD_SIZE(%s, %s) == 0), "Input buffer exceeds the buffer array"); // From %s Line %d Value %s\n' % (Pcd.BaseDatumType, FieldName, ValueSize, Pcd.BaseDatumType, FieldName, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
2428 CApp = CApp + ' memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)\r
2429 else:\r
2430 if '[' in FieldName and ']' in FieldName:\r
2431 Index = int(FieldName.split('[')[1].split(']')[0])\r
2432 CApp = CApp + ' __STATIC_ASSERT((%d < __ARRAY_SIZE(Pcd->%s)) || (__ARRAY_SIZE(Pcd->%s) == 0), "array index exceeds the array number"); // From %s Line %d Index of %s\n' % (Index, FieldName.split('[')[0], FieldName.split('[')[0], FieldList[FieldName][1], FieldList[FieldName][2], FieldName)\r
2433 if ValueSize > 4:\r
2434 CApp = CApp + ' Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
2435 else:\r
2436 CApp = CApp + ' Pcd->%s = %d; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
2437 CApp = CApp + "}\n"\r
2438 return CApp\r
2439\r
9e508f3a
CJ
2440 @staticmethod\r
2441 def GenerateCommandLineValueStatement(Pcd):\r
b854e2bf
B
2442 CApp = ' Assign_%s_%s_CommandLine_Value(Pcd);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
2443 return CApp\r
543f5ac3
B
2444 def GenerateFdfValue(self,Pcd):\r
2445 CApp = "// Value in Fdf\n"\r
72a1d776 2446 CApp = CApp + "void Assign_%s_%s_Fdf_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Pcd.BaseDatumType)\r
543f5ac3
B
2447 CApp = CApp + ' UINT32 FieldSize;\n'\r
2448 CApp = CApp + ' CHAR8 *Value;\n'\r
2449\r
2450 pcddefaultvalue = Pcd.PcdValueFromFdf\r
2451 for FieldList in [pcddefaultvalue,Pcd.PcdFieldValueFromFdf]:\r
2452 if not FieldList:\r
2453 continue\r
2454 if pcddefaultvalue and FieldList == pcddefaultvalue:\r
2b95556c 2455 IsArray = _IsFieldValueAnArray(FieldList)\r
543f5ac3
B
2456 if IsArray:\r
2457 try:\r
2458 FieldList = ValueExpressionEx(FieldList, TAB_VOID)(True)\r
2459 except BadExpression:\r
2460 EdkLogger.error("Build", FORMAT_INVALID, "Invalid value format for %s.%s, from Fdf: %s" %\r
2461 (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldList))\r
2462 Value, ValueSize = ParseFieldValue (FieldList)\r
2463\r
2464 if isinstance(Value, str):\r
2465 CApp = CApp + ' Pcd = %s; // From Fdf \n' % (Value)\r
2466 elif IsArray:\r
2467 #\r
2468 # Use memcpy() to copy value into field\r
2469 #\r
2470 CApp = CApp + ' Value = %s; // From Fdf .\n' % (DscBuildData.IntToCString(Value, ValueSize))\r
2471 CApp = CApp + ' memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
2472 continue\r
2473 for FieldName in FieldList:\r
2b95556c 2474 IsArray = _IsFieldValueAnArray(FieldList[FieldName][0])\r
543f5ac3
B
2475 if IsArray:\r
2476 try:\r
2477 FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], TAB_VOID, self._GuidDict)(True)\r
2478 except BadExpression:\r
2479 EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
2480 (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName)), FieldList[FieldName][1], FieldList[FieldName][2]))\r
2481 except:\r
2482 print("error")\r
2483 try:\r
2484 Value, ValueSize = ParseFieldValue (FieldList[FieldName][0])\r
2485 except Exception:\r
2486 EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " % (".".join((Pcd.TokenSpaceGuidCName,Pcd.TokenCName,FieldName)),FieldList[FieldName][1], FieldList[FieldName][2]))\r
2487 if isinstance(Value, str):\r
2488 CApp = CApp + ' Pcd->%s = %s; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
2489 elif IsArray:\r
2490 #\r
2491 # Use memcpy() to copy value into field\r
2492 #\r
72a1d776 2493 CApp = CApp + ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.BaseDatumType, FieldName)\r
543f5ac3 2494 CApp = CApp + ' Value = %s; // From %s Line %d Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
68c67d3a 2495 CApp = CApp + ' __STATIC_ASSERT((__FIELD_SIZE(%s, %s) >= %d) || (__FIELD_SIZE(%s, %s) == 0), "Input buffer exceeds the buffer array"); // From %s Line %d Value %s\n' % (Pcd.BaseDatumType, FieldName, ValueSize, Pcd.BaseDatumType, FieldName, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
543f5ac3
B
2496 CApp = CApp + ' memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)\r
2497 else:\r
9f2b0594
Z
2498 if '[' in FieldName and ']' in FieldName:\r
2499 Index = int(FieldName.split('[')[1].split(']')[0])\r
2500 CApp = CApp + ' __STATIC_ASSERT((%d < __ARRAY_SIZE(Pcd->%s)) || (__ARRAY_SIZE(Pcd->%s) == 0), "array index exceeds the array number"); // From %s Line %d Index of %s\n' % (Index, FieldName.split('[')[0], FieldName.split('[')[0], FieldList[FieldName][1], FieldList[FieldName][2], FieldName)\r
543f5ac3
B
2501 if ValueSize > 4:\r
2502 CApp = CApp + ' Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
2503 else:\r
2504 CApp = CApp + ' Pcd->%s = %d; // From %s Line %s Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
2505 CApp = CApp + "}\n"\r
2506 return CApp\r
2507\r
2508 @staticmethod\r
2509 def GenerateFdfValueStatement(Pcd):\r
2510 CApp = ' Assign_%s_%s_Fdf_Value(Pcd);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
2511 return CApp\r
9e508f3a 2512\r
09af9bd9
BF
2513 @staticmethod\r
2514 def GenerateModuleValueStatement(module_guid, Pcd):\r
2515 CApp = " Assign_%s_%s_%s_Value(Pcd);\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, module_guid)\r
2516 return CApp\r
2517 def GenerateModuleScopeInitializeFunc(self,SkuName, Pcd, InitByteValue, CApp):\r
2518 for module_guid in Pcd.PcdFiledValueFromDscComponent:\r
2519 CApp = CApp + 'void\n'\r
2520 CApp = CApp + 'Initialize_%s_%s_%s_%s(\n' % (module_guid, TAB_DEFAULT_STORES_DEFAULT, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
2521 CApp = CApp + ' void\n'\r
2522 CApp = CApp + ' )\n'\r
2523 CApp = CApp + '{\n'\r
2524 CApp = CApp + ' UINT32 Size;\n'\r
2525 CApp = CApp + ' UINT32 FieldSize;\n'\r
2526 CApp = CApp + ' CHAR8 *Value;\n'\r
2527 CApp = CApp + ' UINT32 OriginalSize;\n'\r
2528 CApp = CApp + ' VOID *OriginalPcd;\n'\r
2529\r
2530 CApp = CApp + ' %s *Pcd; // From %s Line %d \n' % (Pcd.BaseDatumType,Pcd.PkgPath, Pcd.PcdDefineLineNo)\r
2531\r
2532 CApp = CApp + '\n'\r
2533\r
2534 PcdDefaultValue = StringToArray(Pcd.DefaultValueFromDec.strip())\r
2535 InitByteValue += '%s.%s.%s.%s|%s|%s\n' % (module_guid, TAB_DEFAULT_STORES_DEFAULT, Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.DatumType, PcdDefaultValue)\r
2536 #\r
2537 # Get current PCD value and size\r
2538 #\r
2539 CApp = CApp + ' OriginalPcd = PcdGetPtr (%s, %s, %s, %s, &OriginalSize);\n' % (module_guid, TAB_DEFAULT_STORES_DEFAULT, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
2540\r
2541 #\r
2542 # Determine the size of the PCD. For simple structures, sizeof(TYPE) provides\r
2543 # the correct value. For structures with a flexible array member, the flexible\r
2544 # array member is detected, and the size is based on the highest index used with\r
2545 # the flexible array member. The flexible array member must be the last field\r
2546 # in a structure. The size formula for this case is:\r
2547 # OFFSET_OF(FlexbleArrayField) + sizeof(FlexibleArray[0]) * (HighestIndex + 1)\r
2548 #\r
2549 CApp = CApp + DscBuildData.GenerateSizeStatments(Pcd,SkuName,TAB_DEFAULT_STORES_DEFAULT)\r
2550 if Pcd.IsArray() and Pcd.Capacity[-1] != "-1":\r
2551 CApp = CApp + ' OriginalSize = OriginalSize < sizeof(%s) * %d? OriginalSize:sizeof(%s) * %d; \n' % (Pcd.BaseDatumType,Pcd.PcdArraySize(),Pcd.BaseDatumType,Pcd.PcdArraySize())\r
2552 CApp = CApp + ' Size = sizeof(%s) * %d; \n' % (Pcd.BaseDatumType,Pcd.PcdArraySize())\r
2553\r
2554 #\r
2555 # Allocate and zero buffer for the PCD\r
2556 # Must handle cases where current value is smaller, larger, or same size\r
2557 # Always keep that larger one as the current size\r
2558 #\r
2559 CApp = CApp + ' Size = (OriginalSize > Size ? OriginalSize : Size);\n'\r
2560 CApp = CApp + ' Pcd = (%s *)malloc (Size);\n' % (Pcd.BaseDatumType,)\r
2561 CApp = CApp + ' memset (Pcd, 0, Size);\n'\r
2562\r
2563 #\r
2564 # Copy current PCD value into allocated buffer.\r
2565 #\r
2566 CApp = CApp + ' memcpy (Pcd, OriginalPcd, OriginalSize);\n'\r
2567\r
2568 #\r
2569 # Assign field values in PCD\r
2570 #\r
2571 CApp = CApp + DscBuildData.GenerateDefaultValueAssignStatement(Pcd)\r
2572\r
2573 CApp = CApp + "// SkuName: %s, DefaultStoreName: STANDARD \n" % self.SkuIdMgr.SystemSkuId\r
2574 CApp = CApp + DscBuildData.GenerateInitValueStatement(Pcd, self.SkuIdMgr.SystemSkuId, TAB_DEFAULT_STORES_DEFAULT)\r
2575 CApp = CApp + DscBuildData.GenerateModuleValueStatement(module_guid,Pcd)\r
2576 CApp = CApp + DscBuildData.GenerateFdfValueStatement(Pcd)\r
2577 CApp = CApp + DscBuildData.GenerateCommandLineValueStatement(Pcd)\r
2578\r
2579 #\r
2580 # Set new PCD value and size\r
2581 #\r
2582 CApp = CApp + ' PcdSetPtr (%s, %s, %s, %s, Size, (void *)Pcd);\n' % (module_guid, TAB_DEFAULT_STORES_DEFAULT, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
2583\r
2584 #\r
2585 # Free PCD\r
2586 #\r
2587 CApp = CApp + ' free (Pcd);\n'\r
2588 CApp = CApp + '}\n'\r
2589 CApp = CApp + '\n'\r
2590 return InitByteValue,CApp\r
2591\r
f3b31433 2592 def GenerateInitializeFunc(self, SkuName, DefaultStore, Pcd, InitByteValue, CApp):\r
72a1d776 2593 OverrideValues = {DefaultStore:{}}\r
ae7b6df8
LG
2594 if Pcd.SkuOverrideValues:\r
2595 OverrideValues = Pcd.SkuOverrideValues[SkuName]\r
71127ce8
FB
2596 if not OverrideValues:\r
2597 OverrideValues = {TAB_DEFAULT_STORES_DEFAULT:Pcd.DefaultValues}\r
5a693b89 2598 for DefaultStoreName in OverrideValues:\r
8518bf0b
LG
2599 CApp = CApp + 'void\n'\r
2600 CApp = CApp + 'Initialize_%s_%s_%s_%s(\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
2601 CApp = CApp + ' void\n'\r
2602 CApp = CApp + ' )\n'\r
2603 CApp = CApp + '{\n'\r
2604 CApp = CApp + ' UINT32 Size;\n'\r
2605 CApp = CApp + ' UINT32 FieldSize;\n'\r
b2395724 2606 CApp = CApp + ' CHAR8 *Value;\n'\r
8518bf0b
LG
2607 CApp = CApp + ' UINT32 OriginalSize;\n'\r
2608 CApp = CApp + ' VOID *OriginalPcd;\n'\r
72a1d776 2609\r
2610 CApp = CApp + ' %s *Pcd; // From %s Line %d \n' % (Pcd.BaseDatumType,Pcd.PkgPath, Pcd.PcdDefineLineNo)\r
2611\r
8518bf0b 2612 CApp = CApp + '\n'\r
47854fd5 2613\r
72a1d776 2614 PcdDefaultValue = StringToArray(Pcd.DefaultValueFromDec.strip())\r
47854fd5 2615\r
4c6e6f9f 2616 InitByteValue += '%s.%s.%s.%s|%s|%s\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.DatumType, PcdDefaultValue)\r
ae7b6df8 2617\r
8518bf0b
LG
2618 #\r
2619 # Get current PCD value and size\r
2620 #\r
2621 CApp = CApp + ' OriginalPcd = PcdGetPtr (%s, %s, %s, %s, &OriginalSize);\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
ae7b6df8 2622\r
8518bf0b
LG
2623 #\r
2624 # Determine the size of the PCD. For simple structures, sizeof(TYPE) provides\r
2625 # the correct value. For structures with a flexible array member, the flexible\r
2626 # array member is detected, and the size is based on the highest index used with\r
2627 # the flexible array member. The flexible array member must be the last field\r
2628 # in a structure. The size formula for this case is:\r
2629 # OFFSET_OF(FlexbleArrayField) + sizeof(FlexibleArray[0]) * (HighestIndex + 1)\r
2630 #\r
672601cf 2631 CApp = CApp + DscBuildData.GenerateSizeStatments(Pcd,SkuName,DefaultStoreName)\r
afe8c411
FZ
2632 if Pcd.IsArray() and Pcd.Capacity[-1] != "-1":\r
2633 CApp = CApp + ' OriginalSize = OriginalSize < sizeof(%s) * %d? OriginalSize:sizeof(%s) * %d; \n' % (Pcd.BaseDatumType,Pcd.PcdArraySize(),Pcd.BaseDatumType,Pcd.PcdArraySize())\r
2634 CApp = CApp + ' Size = sizeof(%s) * %d; \n' % (Pcd.BaseDatumType,Pcd.PcdArraySize())\r
ae7b6df8 2635\r
8518bf0b
LG
2636 #\r
2637 # Allocate and zero buffer for the PCD\r
2638 # Must handle cases where current value is smaller, larger, or same size\r
2639 # Always keep that larger one as the current size\r
2640 #\r
2641 CApp = CApp + ' Size = (OriginalSize > Size ? OriginalSize : Size);\n'\r
72a1d776 2642 CApp = CApp + ' Pcd = (%s *)malloc (Size);\n' % (Pcd.BaseDatumType,)\r
8518bf0b 2643 CApp = CApp + ' memset (Pcd, 0, Size);\n'\r
ae7b6df8 2644\r
8518bf0b
LG
2645 #\r
2646 # Copy current PCD value into allocated buffer.\r
2647 #\r
2648 CApp = CApp + ' memcpy (Pcd, OriginalPcd, OriginalSize);\n'\r
ae7b6df8 2649\r
8518bf0b
LG
2650 #\r
2651 # Assign field values in PCD\r
2652 #\r
9e508f3a 2653 CApp = CApp + DscBuildData.GenerateDefaultValueAssignStatement(Pcd)\r
f3b31433
FB
2654 if Pcd.Type not in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],\r
2655 self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:\r
2656 for skuname in self.SkuIdMgr.GetSkuChain(SkuName):\r
4d3b9389 2657 storeset = [DefaultStoreName] if DefaultStoreName == TAB_DEFAULT_STORES_DEFAULT else [TAB_DEFAULT_STORES_DEFAULT, DefaultStoreName]\r
f3b31433
FB
2658 for defaultstorenameitem in storeset:\r
2659 CApp = CApp + "// SkuName: %s, DefaultStoreName: %s \n" % (skuname, defaultstorenameitem)\r
ccaa7754 2660 CApp = CApp + DscBuildData.GenerateInitValueStatement(Pcd, skuname, defaultstorenameitem)\r
f3b31433
FB
2661 if skuname == SkuName:\r
2662 break\r
2663 else:\r
f832bb34 2664 CApp = CApp + "// SkuName: %s, DefaultStoreName: STANDARD \n" % self.SkuIdMgr.SystemSkuId\r
ccaa7754 2665 CApp = CApp + DscBuildData.GenerateInitValueStatement(Pcd, self.SkuIdMgr.SystemSkuId, TAB_DEFAULT_STORES_DEFAULT)\r
543f5ac3 2666 CApp = CApp + DscBuildData.GenerateFdfValueStatement(Pcd)\r
9e508f3a 2667 CApp = CApp + DscBuildData.GenerateCommandLineValueStatement(Pcd)\r
8518bf0b
LG
2668 #\r
2669 # Set new PCD value and size\r
2670 #\r
72a1d776 2671 CApp = CApp + ' PcdSetPtr (%s, %s, %s, %s, Size, (void *)Pcd);\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
ae7b6df8 2672\r
8518bf0b
LG
2673 #\r
2674 # Free PCD\r
2675 #\r
2676 CApp = CApp + ' free (Pcd);\n'\r
2677 CApp = CApp + '}\n'\r
2678 CApp = CApp + '\n'\r
ae7b6df8 2679 return InitByteValue, CApp\r
72a1d776 2680\r
2681 def GenerateArrayAssignment(self, Pcd):\r
2682 CApp = ""\r
2683 if not Pcd:\r
2684 return CApp\r
72a1d776 2685 Demesion = ""\r
2686 for d in Pcd.Capacity:\r
4c6e6f9f 2687 Demesion += "[]"\r
72a1d776 2688\r
2689 Value = Pcd.DefaultValueFromDec\r
2690 if "{CODE(" in Pcd.DefaultValueFromDec:\r
2691 realvalue = Pcd.DefaultValueFromDec.strip()[6:-2] # "{CODE(").rstrip(")}"\r
672601cf 2692 CApp += "static %s %s_%s_INIT_Value%s = %s;\n" % (Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,Demesion,realvalue)\r
72a1d776 2693\r
4c6e6f9f
FB
2694 if Pcd.Type in PCD_DYNAMIC_TYPE_SET | PCD_DYNAMIC_EX_TYPE_SET:\r
2695 for skuname in Pcd.SkuInfoList:\r
2696 skuinfo = Pcd.SkuInfoList[skuname]\r
2697 if skuinfo.VariableName:\r
2698 for defaultstore in skuinfo.DefaultStoreDict:\r
672601cf
FB
2699 pcddscrawdefaultvalue = self.GetPcdDscRawDefaultValue(Pcd, skuname, defaultstore)\r
2700 if pcddscrawdefaultvalue:\r
2cfb9d0f 2701 Value = skuinfo.DefaultStoreDict[defaultstore]\r
672601cf
FB
2702 if "{CODE(" in Value:\r
2703 realvalue = Value.strip()[6:-2] # "{CODE(").rstrip(")}"\r
2704 CApp += "static %s %s_%s_%s_%s_Value%s = %s;\n" % (Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,defaultstore,Demesion,realvalue)\r
2705 else:\r
2706 pcddscrawdefaultvalue = self.GetPcdDscRawDefaultValue(Pcd, skuname, TAB_DEFAULT_STORES_DEFAULT)\r
2707 if pcddscrawdefaultvalue:\r
2708 Value = skuinfo.DefaultValue\r
4c6e6f9f
FB
2709 if "{CODE(" in Value:\r
2710 realvalue = Value.strip()[6:-2] # "{CODE(").rstrip(")}"\r
672601cf 2711 CApp += "static %s %s_%s_%s_%s_Value%s = %s;\n" % (Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,skuname,TAB_DEFAULT_STORES_DEFAULT,Demesion,realvalue)\r
4c6e6f9f 2712 else:\r
672601cf
FB
2713 pcddscrawdefaultvalue = self.GetPcdDscRawDefaultValue(Pcd, TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT)\r
2714 if pcddscrawdefaultvalue:\r
2715 if "{CODE(" in Pcd.DefaultValue:\r
2716 realvalue = Pcd.DefaultValue.strip()[6:-2] # "{CODE(").rstrip(")}"\r
2717 CApp += "static %s %s_%s_DEFAULT_STANDARD_Value%s = %s;\n" % (Pcd.BaseDatumType,Pcd.TokenSpaceGuidCName,Pcd.TokenCName,Demesion,realvalue)\r
2718\r
72a1d776 2719 return CApp\r
672601cf 2720\r
71127ce8
FB
2721 def SkuOverrideValuesEmpty(self,OverrideValues):\r
2722 if not OverrideValues:\r
2723 return True\r
2724 for key in OverrideValues:\r
2725 if OverrideValues[key]:\r
2726 return False\r
2727 return True\r
ae7b6df8 2728\r
c95f600e
B
2729 def ParseCCFlags(self, ccflag):\r
2730 ccflags = set()\r
9601046b
B
2731 ccflaglist = ccflag.split(" ")\r
2732 i = 0\r
2733 while i < len(ccflaglist):\r
2734 item = ccflaglist[i].strip()\r
2735 if item in (r"/D", r"/U","-D","-U"):\r
2736 ccflags.add(" ".join((ccflaglist[i],ccflaglist[i+1])))\r
2737 i = i+1\r
2738 elif item.startswith((r"/D", r"/U","-D","-U")):\r
2739 ccflags.add(item)\r
2740 i +=1\r
c95f600e 2741 return ccflags\r
ae7b6df8
LG
2742 def GenerateByteArrayValue (self, StructuredPcds):\r
2743 #\r
2744 # Generate/Compile/Run C application to determine if there are any flexible array members\r
2745 #\r
2746 if not StructuredPcds:\r
2747 return\r
2748\r
2749 InitByteValue = ""\r
2750 CApp = PcdMainCHeader\r
2751\r
34d808ad 2752 IncludeFiles = set()\r
ae7b6df8
LG
2753 for PcdName in StructuredPcds:\r
2754 Pcd = StructuredPcds[PcdName]\r
81add864 2755 for IncludeFile in Pcd.StructuredPcdIncludeFile:\r
1d5fde83 2756 if IncludeFile not in IncludeFiles:\r
34d808ad 2757 IncludeFiles.add(IncludeFile)\r
81add864 2758 CApp = CApp + '#include <%s>\n' % (IncludeFile)\r
ae7b6df8 2759 CApp = CApp + '\n'\r
72a1d776 2760 for Pcd in StructuredPcds.values():\r
2761 CApp = CApp + self.GenerateArrayAssignment(Pcd)\r
859e0952 2762 for PcdName in sorted(StructuredPcds.keys()):\r
ae7b6df8 2763 Pcd = StructuredPcds[PcdName]\r
09af9bd9
BF
2764\r
2765 #create void void Cal_tocken_cname_Size functions\r
79820e32 2766 CApp = CApp + self.GenerateSizeFunction(Pcd)\r
09af9bd9
BF
2767\r
2768 #create void Assign_ functions\r
2769\r
2770 # From DEC\r
79820e32 2771 CApp = CApp + self.GenerateDefaultValueAssignFunction(Pcd)\r
09af9bd9 2772 # From Fdf\r
543f5ac3 2773 CApp = CApp + self.GenerateFdfValue(Pcd)\r
09af9bd9 2774 # From CommandLine\r
b854e2bf 2775 CApp = CApp + self.GenerateCommandLineValue(Pcd)\r
09af9bd9
BF
2776\r
2777 # From Dsc Global setting\r
71127ce8 2778 if self.SkuOverrideValuesEmpty(Pcd.SkuOverrideValues) or Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],\r
f3b31433 2779 self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:\r
ccaa7754 2780 CApp = CApp + self.GenerateInitValueFunction(Pcd, self.SkuIdMgr.SystemSkuId, TAB_DEFAULT_STORES_DEFAULT)\r
f3b31433
FB
2781 else:\r
2782 for SkuName in self.SkuIdMgr.SkuOverrideOrder():\r
2783 if SkuName not in Pcd.SkuOverrideValues:\r
2784 continue\r
2785 for DefaultStoreName in Pcd.SkuOverrideValues[SkuName]:\r
ccaa7754 2786 CApp = CApp + self.GenerateInitValueFunction(Pcd, SkuName, DefaultStoreName)\r
09af9bd9
BF
2787\r
2788 # From Dsc module scope setting\r
2789 CApp = CApp + self.GenerateModuleScopeValue(Pcd)\r
2790\r
2791 #create Initialize_ functions\r
71127ce8 2792 if self.SkuOverrideValuesEmpty(Pcd.SkuOverrideValues) or Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],\r
0a57a978 2793 self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:\r
4d3b9389 2794 InitByteValue, CApp = self.GenerateInitializeFunc(self.SkuIdMgr.SystemSkuId, TAB_DEFAULT_STORES_DEFAULT, Pcd, InitByteValue, CApp)\r
09af9bd9 2795 InitByteValue, CApp = self.GenerateModuleScopeInitializeFunc(self.SkuIdMgr.SystemSkuId,Pcd,InitByteValue,CApp)\r
ae7b6df8 2796 else:\r
c05c2c05
LG
2797 for SkuName in self.SkuIdMgr.SkuOverrideOrder():\r
2798 if SkuName not in Pcd.SkuOverrideValues:\r
2799 continue\r
ae7b6df8
LG
2800 for DefaultStoreName in Pcd.DefaultStoreName:\r
2801 Pcd = StructuredPcds[PcdName]\r
2802 InitByteValue, CApp = self.GenerateInitializeFunc(SkuName, DefaultStoreName, Pcd, InitByteValue, CApp)\r
2803\r
2804 CApp = CApp + 'VOID\n'\r
2805 CApp = CApp + 'PcdEntryPoint(\n'\r
2806 CApp = CApp + ' VOID\n'\r
2807 CApp = CApp + ' )\n'\r
2808 CApp = CApp + '{\n'\r
2809 for Pcd in StructuredPcds.values():\r
71127ce8 2810 if self.SkuOverrideValuesEmpty(Pcd.SkuOverrideValues) or Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD], self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:\r
4d3b9389 2811 CApp = CApp + ' Initialize_%s_%s_%s_%s();\n' % (self.SkuIdMgr.SystemSkuId, TAB_DEFAULT_STORES_DEFAULT, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
09af9bd9
BF
2812 for ModuleGuid in Pcd.PcdFiledValueFromDscComponent:\r
2813 CApp += " Initialize_%s_%s_%s_%s();\n" % (ModuleGuid,TAB_DEFAULT_STORES_DEFAULT ,Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
ae7b6df8 2814 else:\r
c05c2c05 2815 for SkuName in self.SkuIdMgr.SkuOverrideOrder():\r
84a52d4d 2816 if SkuName not in self.SkuIdMgr.AvailableSkuIdSet:\r
c05c2c05 2817 continue\r
8518bf0b 2818 for DefaultStoreName in Pcd.SkuOverrideValues[SkuName]:\r
ae7b6df8
LG
2819 CApp = CApp + ' Initialize_%s_%s_%s_%s();\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
2820 CApp = CApp + '}\n'\r
2821\r
2822 CApp = CApp + PcdMainCEntry + '\n'\r
2823\r
2824 if not os.path.exists(self.OutputPath):\r
2825 os.makedirs(self.OutputPath)\r
2826 CAppBaseFileName = os.path.join(self.OutputPath, PcdValueInitName)\r
0a57a978 2827 SaveFileOnChange(CAppBaseFileName + '.c', CApp, False)\r
ae7b6df8 2828\r
09af9bd9 2829 # start generating makefile\r
ae7b6df8
LG
2830 MakeApp = PcdMakefileHeader\r
2831 if sys.platform == "win32":\r
484b1534 2832 MakeApp = MakeApp + 'APPFILE = %s\%s.exe\n' % (self.OutputPath, PcdValueInitName) + 'APPNAME = %s\n' % (PcdValueInitName) + 'OBJECTS = %s\%s.obj %s.obj\n' % (self.OutputPath, PcdValueInitName, os.path.join(self.OutputPath, PcdValueCommonName)) + 'INC = '\r
ae7b6df8
LG
2833 else:\r
2834 MakeApp = MakeApp + PcdGccMakefile\r
484b1534 2835 MakeApp = MakeApp + 'APPFILE = %s/%s\n' % (self.OutputPath, PcdValueInitName) + 'APPNAME = %s\n' % (PcdValueInitName) + 'OBJECTS = %s/%s.o %s.o\n' % (self.OutputPath, PcdValueInitName, os.path.join(self.OutputPath, PcdValueCommonName)) + \\r
151c2708 2836 'include $(MAKEROOT)/Makefiles/app.makefile\n' + 'TOOL_INCLUDE +='\r
ae7b6df8 2837\r
34d808ad 2838 IncSearchList = []\r
57ee97c0 2839 PlatformInc = OrderedDict()\r
ae7b6df8
LG
2840 for Cache in self._Bdb._CACHE_.values():\r
2841 if Cache.MetaFile.Ext.lower() != '.dec':\r
2842 continue\r
2843 if Cache.Includes:\r
2844 if str(Cache.MetaFile.Path) not in PlatformInc:\r
b005802a
LG
2845 PlatformInc[str(Cache.MetaFile.Path)] = []\r
2846 PlatformInc[str(Cache.MetaFile.Path)].append (os.path.dirname(Cache.MetaFile.Path))\r
2847 PlatformInc[str(Cache.MetaFile.Path)].extend (Cache.CommonIncludes)\r
ae7b6df8
LG
2848\r
2849 PcdDependDEC = []\r
2850 for Pcd in StructuredPcds.values():\r
2851 for PackageDec in Pcd.PackageDecs:\r
2852 Package = os.path.normpath(mws.join(GlobalData.gWorkspace, PackageDec))\r
2853 if not os.path.exists(Package):\r
2854 EdkLogger.error('Build', RESOURCE_NOT_AVAILABLE, "The dependent Package %s of PCD %s.%s is not exist." % (PackageDec, Pcd.TokenSpaceGuidCName, Pcd.TokenCName))\r
2855 if Package not in PcdDependDEC:\r
2856 PcdDependDEC.append(Package)\r
2857\r
2858 if PlatformInc and PcdDependDEC:\r
2859 for pkg in PcdDependDEC:\r
2860 if pkg in PlatformInc:\r
2861 for inc in PlatformInc[pkg]:\r
b47fe265
MK
2862 #\r
2863 # Get list of files in potential -I include path\r
2864 #\r
2865 FileList = os.listdir (str(inc))\r
2866 #\r
2867 # Skip -I include path if one of the include files required\r
2868 # by PcdValueInit.c are present in the include paths from\r
2869 # the DEC file. PcdValueInit.c must use the standard include\r
2870 # files from the host compiler.\r
2871 #\r
2872 if 'stdio.h' in FileList:\r
2873 continue\r
2874 if 'stdlib.h' in FileList:\r
2875 continue\r
2876 if 'string.h' in FileList:\r
2877 continue\r
ae7b6df8 2878 MakeApp += '-I' + str(inc) + ' '\r
34d808ad 2879 IncSearchList.append(inc)\r
ae7b6df8 2880 MakeApp = MakeApp + '\n'\r
68ba919f
YZ
2881\r
2882 CC_FLAGS = LinuxCFLAGS\r
2883 if sys.platform == "win32":\r
2884 CC_FLAGS = WindowsCFLAGS\r
57ee97c0 2885 BuildOptions = OrderedDict()\r
68ba919f
YZ
2886 for Options in self.BuildOptions:\r
2887 if Options[2] != EDKII_NAME:\r
2888 continue\r
2889 Family = Options[0]\r
2890 if Family and Family != self.ToolChainFamily:\r
2891 continue\r
2892 Target, Tag, Arch, Tool, Attr = Options[1].split("_")\r
2893 if Tool != 'CC':\r
2894 continue\r
c95f600e
B
2895 if Attr != "FLAGS":\r
2896 continue\r
bc39c5cb
JC
2897 if Target == TAB_STAR or Target == self._Target:\r
2898 if Tag == TAB_STAR or Tag == self._Toolchain:\r
c95f600e
B
2899 if 'COMMON' not in BuildOptions:\r
2900 BuildOptions['COMMON'] = set()\r
bc39c5cb 2901 if Arch == TAB_STAR:\r
9601046b 2902 BuildOptions['COMMON']|= self.ParseCCFlags(self.BuildOptions[Options])\r
c95f600e
B
2903 if Arch in self.SupArchList:\r
2904 if Arch not in BuildOptions:\r
2905 BuildOptions[Arch] = set()\r
2906 BuildOptions[Arch] |= self.ParseCCFlags(self.BuildOptions[Options])\r
2907\r
68ba919f 2908 if BuildOptions:\r
c95f600e
B
2909 ArchBuildOptions = {arch:flags for arch,flags in BuildOptions.items() if arch != 'COMMON'}\r
2910 if len(ArchBuildOptions.keys()) == 1:\r
f8d11e5a 2911 BuildOptions['COMMON'] |= (list(ArchBuildOptions.values())[0])\r
c95f600e
B
2912 elif len(ArchBuildOptions.keys()) > 1:\r
2913 CommonBuildOptions = reduce(lambda x,y: x&y, ArchBuildOptions.values())\r
2914 BuildOptions['COMMON'] |= CommonBuildOptions\r
1d06b46c
FB
2915 ValueList = [item for item in BuildOptions['COMMON'] if item.startswith((r"/U","-U"))]\r
2916 ValueList.extend([item for item in BuildOptions['COMMON'] if item.startswith((r"/D", "-D"))])\r
9601046b 2917 CC_FLAGS += " ".join(ValueList)\r
68ba919f
YZ
2918 MakeApp += CC_FLAGS\r
2919\r
ae7b6df8
LG
2920 if sys.platform == "win32":\r
2921 MakeApp = MakeApp + PcdMakefileEnd\r
c637c602
B
2922 MakeApp = MakeApp + AppTarget % ("""\tcopy $(APPLICATION) $(APPFILE) /y """)\r
2923 else:\r
2924 MakeApp = MakeApp + AppTarget % ("""\tcp $(APPLICATION) $(APPFILE) """)\r
34d808ad
B
2925 MakeApp = MakeApp + '\n'\r
2926 IncludeFileFullPaths = []\r
2927 for includefile in IncludeFiles:\r
2928 for includepath in IncSearchList:\r
ccaa7754 2929 includefullpath = os.path.join(str(includepath), includefile)\r
34d808ad
B
2930 if os.path.exists(includefullpath):\r
2931 IncludeFileFullPaths.append(os.path.normpath(includefullpath))\r
2932 break\r
2933 SearchPathList = []\r
45b0be38
KM
2934 SearchPathList.append(os.path.normpath(mws.join(GlobalData.gGlobalDefines["EDK_TOOLS_PATH"], "BaseTools/Source/C/Include")))\r
2935 SearchPathList.append(os.path.normpath(mws.join(GlobalData.gGlobalDefines["EDK_TOOLS_PATH"], "BaseTools/Source/C/Common")))\r
8252e6bf 2936 SearchPathList.extend(str(item) for item in IncSearchList)\r
ccaa7754 2937 IncFileList = GetDependencyList(IncludeFileFullPaths, SearchPathList)\r
34d808ad
B
2938 for include_file in IncFileList:\r
2939 MakeApp += "$(OBJECTS) : %s\n" % include_file\r
484b1534
FZ
2940 if sys.platform == "win32":\r
2941 PcdValueCommonPath = os.path.normpath(mws.join(GlobalData.gGlobalDefines["EDK_TOOLS_PATH"], "Source\C\Common\PcdValueCommon.c"))\r
2942 MakeApp = MakeApp + '%s\PcdValueCommon.c : %s\n' % (self.OutputPath, PcdValueCommonPath)\r
2943 MakeApp = MakeApp + '\tcopy /y %s $@\n' % (PcdValueCommonPath)\r
2944 else:\r
2945 PcdValueCommonPath = os.path.normpath(mws.join(GlobalData.gGlobalDefines["EDK_TOOLS_PATH"], "Source/C/Common/PcdValueCommon.c"))\r
2946 MakeApp = MakeApp + '%s/PcdValueCommon.c : %s\n' % (self.OutputPath, PcdValueCommonPath)\r
2947 MakeApp = MakeApp + '\tcp -f %s %s/PcdValueCommon.c\n' % (PcdValueCommonPath, self.OutputPath)\r
ae7b6df8 2948 MakeFileName = os.path.join(self.OutputPath, 'Makefile')\r
34d808ad 2949 MakeApp += "$(OBJECTS) : %s\n" % MakeFileName\r
0a57a978 2950 SaveFileOnChange(MakeFileName, MakeApp, False)\r
ae7b6df8 2951\r
09af9bd9 2952 # start generating input file\r
ae7b6df8
LG
2953 InputValueFile = os.path.join(self.OutputPath, 'Input.txt')\r
2954 OutputValueFile = os.path.join(self.OutputPath, 'Output.txt')\r
0a57a978 2955 SaveFileOnChange(InputValueFile, InitByteValue, False)\r
ae7b6df8 2956\r
c637c602 2957 Dest_PcdValueInitExe = PcdValueInitName\r
ae7b6df8 2958 if not sys.platform == "win32":\r
c637c602 2959 Dest_PcdValueInitExe = os.path.join(self.OutputPath, PcdValueInitName)\r
5db9414c 2960 else:\r
c637c602 2961 Dest_PcdValueInitExe = os.path.join(self.OutputPath, PcdValueInitName) +".exe"\r
09af9bd9
BF
2962\r
2963 #start building the structure pcd value tool\r
34d808ad
B
2964 Messages = ''\r
2965 if sys.platform == "win32":\r
2966 MakeCommand = 'nmake -f %s' % (MakeFileName)\r
9e508f3a 2967 returncode, StdOut, StdErr = DscBuildData.ExecuteCommand (MakeCommand)\r
34d808ad
B
2968 Messages = StdOut\r
2969 else:\r
2970 MakeCommand = 'make -f %s' % (MakeFileName)\r
9e508f3a 2971 returncode, StdOut, StdErr = DscBuildData.ExecuteCommand (MakeCommand)\r
34d808ad 2972 Messages = StdErr\r
c637c602 2973\r
45b0be38 2974 EdkLogger.verbose ('%s\n%s\n%s' % (MakeCommand, StdOut, StdErr))\r
34d808ad
B
2975 Messages = Messages.split('\n')\r
2976 MessageGroup = []\r
9fb2cbda 2977 if returncode != 0:\r
34d808ad
B
2978 CAppBaseFileName = os.path.join(self.OutputPath, PcdValueInitName)\r
2979 File = open (CAppBaseFileName + '.c', 'r')\r
2980 FileData = File.readlines()\r
2981 File.close()\r
2982 for Message in Messages:\r
2983 if " error" in Message or "warning" in Message:\r
45b0be38
KM
2984 try:\r
2985 FileInfo = Message.strip().split('(')\r
2986 if len (FileInfo) > 1:\r
2987 FileName = FileInfo [0]\r
2988 FileLine = FileInfo [1].split (')')[0]\r
2989 else:\r
2990 FileInfo = Message.strip().split(':')\r
2991 if len(FileInfo) < 2:\r
2992 continue\r
2993 FileName = FileInfo [0]\r
2994 FileLine = FileInfo [1]\r
2995 except:\r
2996 continue\r
2997 if "PcdValueInit.c" not in FileName:\r
2998 continue\r
34d808ad
B
2999 if FileLine.isdigit():\r
3000 error_line = FileData[int (FileLine) - 1]\r
3001 if r"//" in error_line:\r
ccaa7754 3002 c_line, dsc_line = error_line.split(r"//")\r
0a57a978 3003 else:\r
34d808ad
B
3004 dsc_line = error_line\r
3005 message_itmes = Message.split(":")\r
3006 Index = 0\r
3007 if "PcdValueInit.c" not in Message:\r
3008 if not MessageGroup:\r
3009 MessageGroup.append(Message)\r
3010 break\r
0a57a978 3011 else:\r
34d808ad
B
3012 for item in message_itmes:\r
3013 if "PcdValueInit.c" in item:\r
3014 Index = message_itmes.index(item)\r
3015 message_itmes[Index] = dsc_line.strip()\r
3016 break\r
3017 MessageGroup.append(":".join(message_itmes[Index:]).strip())\r
3018 continue\r
3019 else:\r
3020 MessageGroup.append(Message)\r
3021 if MessageGroup:\r
3022 EdkLogger.error("build", PCD_STRUCTURE_PCD_ERROR, "\n".join(MessageGroup) )\r
3023 else:\r
45b0be38 3024 EdkLogger.error('Build', COMMAND_FAILURE, 'Can not execute command: %s\n%s\n%s' % (MakeCommand, StdOut, StdErr))\r
34d808ad 3025\r
09af9bd9 3026 #start executing the structure pcd value tool\r
c637c602
B
3027 if DscBuildData.NeedUpdateOutput(OutputValueFile, Dest_PcdValueInitExe, InputValueFile):\r
3028 Command = Dest_PcdValueInitExe + ' -i %s -o %s' % (InputValueFile, OutputValueFile)\r
9e508f3a 3029 returncode, StdOut, StdErr = DscBuildData.ExecuteCommand (Command)\r
45b0be38 3030 EdkLogger.verbose ('%s\n%s\n%s' % (Command, StdOut, StdErr))\r
87d2afd0 3031 if returncode != 0:\r
45b0be38 3032 EdkLogger.warn('Build', COMMAND_FAILURE, 'Can not collect output from command: %s\n%s\n' % (Command, StdOut, StdErr))\r
0a57a978 3033\r
09af9bd9 3034 #start update structure pcd final value\r
0a57a978
FB
3035 File = open (OutputValueFile, 'r')\r
3036 FileBuffer = File.readlines()\r
3037 File.close()\r
ae7b6df8
LG
3038\r
3039 StructurePcdSet = []\r
3040 for Pcd in FileBuffer:\r
3041 PcdValue = Pcd.split ('|')\r
3042 PcdInfo = PcdValue[0].split ('.')\r
ccaa7754 3043 StructurePcdSet.append((PcdInfo[0], PcdInfo[1], PcdInfo[2], PcdInfo[3], PcdValue[2].strip()))\r
ae7b6df8
LG
3044 return StructurePcdSet\r
3045\r
9e508f3a
CJ
3046 @staticmethod\r
3047 def NeedUpdateOutput(OutputFile, ValueCFile, StructureInput):\r
0a57a978
FB
3048 if not os.path.exists(OutputFile):\r
3049 return True\r
3050 if os.stat(OutputFile).st_mtime <= os.stat(ValueCFile).st_mtime:\r
3051 return True\r
0a57a978
FB
3052 if os.stat(OutputFile).st_mtime <= os.stat(StructureInput).st_mtime:\r
3053 return True\r
3054 return False\r
3055\r
ae7b6df8
LG
3056 ## Retrieve dynamic PCD settings\r
3057 #\r
3058 # @param Type PCD type\r
3059 #\r
3060 # @retval a dict object contains settings of given PCD type\r
3061 #\r
3062 def _GetDynamicPcd(self, Type):\r
3063\r
ae7b6df8 3064\r
a0767bae 3065 Pcds = OrderedDict()\r
ae7b6df8
LG
3066 #\r
3067 # tdict is a special dict kind of type, used for selecting correct\r
3068 # PCD settings for certain ARCH and SKU\r
3069 #\r
3070 PcdDict = tdict(True, 4)\r
3071 PcdList = []\r
3072 # Find out all possible PCD candidates for self._Arch\r
3073 RecordList = self._RawData[Type, self._Arch]\r
8518bf0b 3074 AvailableSkuIdSet = copy.copy(self.SkuIds)\r
ae7b6df8 3075\r
ae7b6df8 3076\r
ccaa7754 3077 for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, Dummy3, Dummy4, Dummy5 in RecordList:\r
2b8a6c44 3078 SkuName = SkuName.upper()\r
55c84777 3079 SkuName = TAB_DEFAULT if SkuName == TAB_COMMON else SkuName\r
ae7b6df8 3080 if SkuName not in AvailableSkuIdSet:\r
2b8a6c44
LG
3081 EdkLogger.error('build', PARAMETER_INVALID, 'Sku %s is not defined in [SkuIds] section' % SkuName,\r
3082 File=self.MetaFile, Line=Dummy5)\r
273190e1 3083 if "." not in TokenSpaceGuid and "[" not in PcdCName and (PcdCName, TokenSpaceGuid, SkuName, Dummy5) not in PcdList:\r
5db9414c 3084 PcdList.append((PcdCName, TokenSpaceGuid, SkuName, Dummy5))\r
ae7b6df8
LG
3085 PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid] = Setting\r
3086\r
3087 # Remove redundant PCD candidates, per the ARCH and SKU\r
3088 for PcdCName, TokenSpaceGuid, SkuName, Dummy4 in PcdList:\r
3089\r
3090 Setting = PcdDict[self._Arch, SkuName, PcdCName, TokenSpaceGuid]\r
4231a819 3091 if Setting is None:\r
ae7b6df8
LG
3092 continue\r
3093\r
3094 PcdValue, DatumType, MaxDatumSize = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4)\r
f843a328
YZ
3095 if MaxDatumSize:\r
3096 if int(MaxDatumSize, 0) > 0xFFFF:\r
3097 EdkLogger.error('build', FORMAT_INVALID, "The size value must not exceed the maximum value of 0xFFFF (UINT16) for %s." % ".".join((TokenSpaceGuid, PcdCName)),\r
3098 File=self.MetaFile, Line=Dummy4)\r
3099 if int(MaxDatumSize, 0) < 0:\r
3100 EdkLogger.error('build', FORMAT_INVALID, "The size value can't be set to negative value for %s." % ".".join((TokenSpaceGuid, PcdCName)),\r
3101 File=self.MetaFile, Line=Dummy4)\r
8518bf0b 3102 SkuInfo = SkuInfoClass(SkuName, self.SkuIds[SkuName][0], '', '', '', '', '', PcdValue)\r
5a693b89 3103 if (PcdCName, TokenSpaceGuid) in Pcds:\r
ae7b6df8
LG
3104 pcdObject = Pcds[PcdCName, TokenSpaceGuid]\r
3105 pcdObject.SkuInfoList[SkuName] = SkuInfo\r
3106 if MaxDatumSize.strip():\r
3107 CurrentMaxSize = int(MaxDatumSize.strip(), 0)\r
3108 else:\r
3109 CurrentMaxSize = 0\r
3110 if pcdObject.MaxDatumSize:\r
3111 PcdMaxSize = int(pcdObject.MaxDatumSize, 0)\r
3112 else:\r
3113 PcdMaxSize = 0\r
3114 if CurrentMaxSize > PcdMaxSize:\r
3115 pcdObject.MaxDatumSize = str(CurrentMaxSize)\r
3116 else:\r
3117 Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject(\r
3118 PcdCName,\r
3119 TokenSpaceGuid,\r
3120 self._PCD_TYPE_STRING_[Type],\r
3121 DatumType,\r
3122 PcdValue,\r
3123 '',\r
3124 MaxDatumSize,\r
57ee97c0 3125 OrderedDict({SkuName : SkuInfo}),\r
ae7b6df8
LG
3126 False,\r
3127 None,\r
3128 IsDsc=True)\r
3129\r
71127ce8
FB
3130 if SkuName not in Pcds[PcdCName, TokenSpaceGuid].DscRawValue:\r
3131 Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName] = {}\r
afe8c411 3132 Pcds[PcdCName, TokenSpaceGuid].DscRawValueInfo[SkuName] = {}\r
71127ce8 3133 Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName][TAB_DEFAULT_STORES_DEFAULT] = PcdValue\r
afe8c411 3134 Pcds[PcdCName, TokenSpaceGuid].DscRawValueInfo[SkuName][TAB_DEFAULT_STORES_DEFAULT] = (self.MetaFile.File,Dummy4)\r
71127ce8 3135\r
ae7b6df8
LG
3136 for pcd in Pcds.values():\r
3137 pcdDecObject = self._DecPcds[pcd.TokenCName, pcd.TokenSpaceGuidCName]\r
e651d06c
LG
3138 # Only fix the value while no value provided in DSC file.\r
3139 for sku in pcd.SkuInfoList.values():\r
128d435f 3140 if not sku.DefaultValue:\r
e651d06c 3141 sku.DefaultValue = pcdDecObject.DefaultValue\r
55c84777 3142 if TAB_DEFAULT not in pcd.SkuInfoList and TAB_COMMON not in pcd.SkuInfoList:\r
ae7b6df8 3143 valuefromDec = pcdDecObject.DefaultValue\r
55c84777
CJ
3144 SkuInfo = SkuInfoClass(TAB_DEFAULT, '0', '', '', '', '', '', valuefromDec)\r
3145 pcd.SkuInfoList[TAB_DEFAULT] = SkuInfo\r
3146 elif TAB_DEFAULT not in pcd.SkuInfoList and TAB_COMMON in pcd.SkuInfoList:\r
3147 pcd.SkuInfoList[TAB_DEFAULT] = pcd.SkuInfoList[TAB_COMMON]\r
3148 del pcd.SkuInfoList[TAB_COMMON]\r
3149 elif TAB_DEFAULT in pcd.SkuInfoList and TAB_COMMON in pcd.SkuInfoList:\r
3150 del pcd.SkuInfoList[TAB_COMMON]\r
65eff519 3151\r
f8d11e5a 3152 list(map(self.FilterSkuSettings, Pcds.values()))\r
ae7b6df8
LG
3153\r
3154 return Pcds\r
3155\r
65eff519
LG
3156 def FilterSkuSettings(self, PcdObj):\r
3157\r
3158 if self.SkuIdMgr.SkuUsageType == self.SkuIdMgr.SINGLE:\r
55c84777
CJ
3159 if TAB_DEFAULT in PcdObj.SkuInfoList and self.SkuIdMgr.SystemSkuId not in PcdObj.SkuInfoList:\r
3160 PcdObj.SkuInfoList[self.SkuIdMgr.SystemSkuId] = PcdObj.SkuInfoList[TAB_DEFAULT]\r
3161 PcdObj.SkuInfoList = {TAB_DEFAULT:PcdObj.SkuInfoList[self.SkuIdMgr.SystemSkuId]}\r
3162 PcdObj.SkuInfoList[TAB_DEFAULT].SkuIdName = TAB_DEFAULT\r
3163 PcdObj.SkuInfoList[TAB_DEFAULT].SkuId = '0'\r
65eff519
LG
3164\r
3165 elif self.SkuIdMgr.SkuUsageType == self.SkuIdMgr.DEFAULT:\r
55c84777 3166 PcdObj.SkuInfoList = {TAB_DEFAULT:PcdObj.SkuInfoList[TAB_DEFAULT]}\r
65eff519
LG
3167\r
3168 return PcdObj\r
3169\r
9e508f3a
CJ
3170 @staticmethod\r
3171 def CompareVarAttr(Attr1, Attr2):\r
ae7b6df8
LG
3172 if not Attr1 or not Attr2: # for empty string\r
3173 return True\r
3174 Attr1s = [attr.strip() for attr in Attr1.split(",")]\r
3175 Attr1Set = set(Attr1s)\r
3176 Attr2s = [attr.strip() for attr in Attr2.split(",")]\r
3177 Attr2Set = set(Attr2s)\r
3178 if Attr2Set == Attr1Set:\r
3179 return True\r
3180 else:\r
3181 return False\r
9e508f3a 3182\r
ccaa7754 3183 def CompletePcdValues(self, PcdSet):\r
57ee97c0 3184 Pcds = OrderedDict()\r
8518bf0b 3185 DefaultStoreObj = DefaultStore(self._GetDefaultStores())\r
ccaa7754 3186 SkuIds = {skuname:skuid for skuname, skuid in self.SkuIdMgr.AvailableSkuIdSet.items() if skuname != TAB_COMMON}\r
c5c7e68a 3187 DefaultStores = set(storename for pcdobj in PcdSet.values() for skuobj in pcdobj.SkuInfoList.values() for storename in skuobj.DefaultStoreDict)\r
8518bf0b
LG
3188 for PcdCName, TokenSpaceGuid in PcdSet:\r
3189 PcdObj = PcdSet[(PcdCName, TokenSpaceGuid)]\r
71127ce8 3190\r
8518bf0b
LG
3191 if PcdObj.Type not in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_DEFAULT],\r
3192 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII],\r
3193 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_VPD],\r
3194 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_DEFAULT],\r
3195 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII],\r
3196 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_VPD]]:\r
3197 Pcds[PcdCName, TokenSpaceGuid]= PcdObj\r
3198 continue\r
3199 PcdType = PcdObj.Type\r
3200 if PcdType in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
3201 for skuid in PcdObj.SkuInfoList:\r
3202 skuobj = PcdObj.SkuInfoList[skuid]\r
8252e6bf 3203 mindefaultstorename = DefaultStoreObj.GetMin(set(defaultstorename for defaultstorename in skuobj.DefaultStoreDict))\r
8518bf0b
LG
3204 for defaultstorename in DefaultStores:\r
3205 if defaultstorename not in skuobj.DefaultStoreDict:\r
9bf86b12 3206 skuobj.DefaultStoreDict[defaultstorename] = skuobj.DefaultStoreDict[mindefaultstorename]\r
8518bf0b 3207 skuobj.HiiDefaultValue = skuobj.DefaultStoreDict[mindefaultstorename]\r
ccaa7754 3208 for skuname, skuid in SkuIds.items():\r
2b8a6c44
LG
3209 if skuname not in PcdObj.SkuInfoList:\r
3210 nextskuid = self.SkuIdMgr.GetNextSkuId(skuname)\r
8518bf0b
LG
3211 while nextskuid not in PcdObj.SkuInfoList:\r
3212 nextskuid = self.SkuIdMgr.GetNextSkuId(nextskuid)\r
2b8a6c44
LG
3213 PcdObj.SkuInfoList[skuname] = copy.deepcopy(PcdObj.SkuInfoList[nextskuid])\r
3214 PcdObj.SkuInfoList[skuname].SkuId = skuid\r
3215 PcdObj.SkuInfoList[skuname].SkuIdName = skuname\r
8518bf0b 3216 if PcdType in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
f8d11e5a 3217 PcdObj.DefaultValue = list(PcdObj.SkuInfoList.values())[0].HiiDefaultValue if self.SkuIdMgr.SkuUsageType == self.SkuIdMgr.SINGLE else PcdObj.SkuInfoList[TAB_DEFAULT].HiiDefaultValue\r
8518bf0b
LG
3218 Pcds[PcdCName, TokenSpaceGuid]= PcdObj\r
3219 return Pcds\r
ae7b6df8
LG
3220 ## Retrieve dynamic HII PCD settings\r
3221 #\r
3222 # @param Type PCD type\r
3223 #\r
3224 # @retval a dict object contains settings of given PCD type\r
3225 #\r
3226 def _GetDynamicHiiPcd(self, Type):\r
3227\r
ae7b6df8
LG
3228 VariableAttrs = {}\r
3229\r
a0767bae 3230 Pcds = OrderedDict()\r
ced86858 3231 UserDefinedDefaultStores = []\r
ae7b6df8
LG
3232 #\r
3233 # tdict is a special dict kind of type, used for selecting correct\r
3234 # PCD settings for certain ARCH and SKU\r
3235 #\r
8518bf0b 3236 PcdDict = tdict(True, 5)\r
273190e1 3237 PcdList = []\r
ae7b6df8
LG
3238 RecordList = self._RawData[Type, self._Arch]\r
3239 # Find out all possible PCD candidates for self._Arch\r
8518bf0b 3240 AvailableSkuIdSet = copy.copy(self.SkuIds)\r
2b8a6c44 3241 DefaultStoresDefine = self._GetDefaultStores()\r
ae7b6df8 3242\r
ccaa7754 3243 for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, DefaultStore, Dummy4, Dummy5 in RecordList:\r
2b8a6c44 3244 SkuName = SkuName.upper()\r
55c84777 3245 SkuName = TAB_DEFAULT if SkuName == TAB_COMMON else SkuName\r
2b8a6c44 3246 DefaultStore = DefaultStore.upper()\r
55c84777 3247 if DefaultStore == TAB_COMMON:\r
4d3b9389 3248 DefaultStore = TAB_DEFAULT_STORES_DEFAULT\r
ced86858
ZZ
3249 else:\r
3250 #The end user define [DefaultStores] and [SKUID_IDENTIFIER.Menufacturing] in DSC\r
3251 UserDefinedDefaultStores.append((PcdCName, TokenSpaceGuid))\r
ae7b6df8 3252 if SkuName not in AvailableSkuIdSet:\r
2b8a6c44
LG
3253 EdkLogger.error('build', PARAMETER_INVALID, 'Sku %s is not defined in [SkuIds] section' % SkuName,\r
3254 File=self.MetaFile, Line=Dummy5)\r
3255 if DefaultStore not in DefaultStoresDefine:\r
3256 EdkLogger.error('build', PARAMETER_INVALID, 'DefaultStores %s is not defined in [DefaultStores] section' % DefaultStore,\r
3257 File=self.MetaFile, Line=Dummy5)\r
273190e1
FZ
3258 if "." not in TokenSpaceGuid and "[" not in PcdCName and (PcdCName, TokenSpaceGuid, SkuName, DefaultStore, Dummy5) not in PcdList:\r
3259 PcdList.append((PcdCName, TokenSpaceGuid, SkuName, DefaultStore, Dummy5))\r
ccaa7754 3260 PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid, DefaultStore] = Setting\r
ae7b6df8
LG
3261\r
3262\r
3263 # Remove redundant PCD candidates, per the ARCH and SKU\r
cbe7543e 3264 for index,(PcdCName, TokenSpaceGuid, SkuName, DefaultStore, Dummy4) in enumerate(PcdList):\r
ae7b6df8 3265\r
ccaa7754 3266 Setting = PcdDict[self._Arch, SkuName, PcdCName, TokenSpaceGuid, DefaultStore]\r
4231a819 3267 if Setting is None:\r
ae7b6df8
LG
3268 continue\r
3269 VariableName, VariableGuid, VariableOffset, DefaultValue, VarAttribute = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4)\r
3270\r
3271 rt, Msg = VariableAttributes.ValidateVarAttributes(VarAttribute)\r
3272 if not rt:\r
3273 EdkLogger.error("build", PCD_VARIABLE_ATTRIBUTES_ERROR, "Variable attributes settings for %s is incorrect.\n %s" % (".".join((TokenSpaceGuid, PcdCName)), Msg),\r
3274 ExtraData="[%s]" % VarAttribute)\r
3275 ExceedMax = False\r
3276 FormatCorrect = True\r
3277 if VariableOffset.isdigit():\r
3278 if int(VariableOffset, 10) > 0xFFFF:\r
3279 ExceedMax = True\r
3e4faa26 3280 elif variablePattern.match(VariableOffset):\r
ae7b6df8
LG
3281 if int(VariableOffset, 16) > 0xFFFF:\r
3282 ExceedMax = True\r
3283 # For Offset written in "A.B"\r
3284 elif VariableOffset.find('.') > -1:\r
3285 VariableOffsetList = VariableOffset.split(".")\r
3286 if not (len(VariableOffsetList) == 2\r
3287 and IsValidWord(VariableOffsetList[0])\r
3288 and IsValidWord(VariableOffsetList[1])):\r
3289 FormatCorrect = False\r
3290 else:\r
3291 FormatCorrect = False\r
3292 if not FormatCorrect:\r
3293 EdkLogger.error('Build', FORMAT_INVALID, "Invalid syntax or format of the variable offset value is incorrect for %s." % ".".join((TokenSpaceGuid, PcdCName)))\r
3294\r
3295 if ExceedMax:\r
3296 EdkLogger.error('Build', OPTION_VALUE_INVALID, "The variable offset value must not exceed the maximum value of 0xFFFF (UINT16) for %s." % ".".join((TokenSpaceGuid, PcdCName)))\r
3297 if (VariableName, VariableGuid) not in VariableAttrs:\r
3298 VariableAttrs[(VariableName, VariableGuid)] = VarAttribute\r
3299 else:\r
9e508f3a 3300 if not DscBuildData.CompareVarAttr(VariableAttrs[(VariableName, VariableGuid)], VarAttribute):\r
ae7b6df8
LG
3301 EdkLogger.error('Build', PCD_VARIABLE_ATTRIBUTES_CONFLICT_ERROR, "The variable %s.%s for DynamicHii PCDs has conflicting attributes [%s] and [%s] " % (VariableGuid, VariableName, VarAttribute, VariableAttrs[(VariableName, VariableGuid)]))\r
3302\r
ae7b6df8 3303 pcdDecObject = self._DecPcds[PcdCName, TokenSpaceGuid]\r
5a693b89 3304 if (PcdCName, TokenSpaceGuid) in Pcds:\r
ae7b6df8 3305 pcdObject = Pcds[PcdCName, TokenSpaceGuid]\r
8518bf0b
LG
3306 if SkuName in pcdObject.SkuInfoList:\r
3307 Skuitem = pcdObject.SkuInfoList[SkuName]\r
3308 Skuitem.DefaultStoreDict.update({DefaultStore:DefaultValue})\r
3309 else:\r
ccaa7754 3310 SkuInfo = SkuInfoClass(SkuName, self.SkuIds[SkuName][0], VariableName, VariableGuid, VariableOffset, DefaultValue, VariableAttribute=VarAttribute, DefaultStore={DefaultStore:DefaultValue})\r
8518bf0b 3311 pcdObject.SkuInfoList[SkuName] = SkuInfo\r
ae7b6df8 3312 else:\r
ccaa7754 3313 SkuInfo = SkuInfoClass(SkuName, self.SkuIds[SkuName][0], VariableName, VariableGuid, VariableOffset, DefaultValue, VariableAttribute=VarAttribute, DefaultStore={DefaultStore:DefaultValue})\r
ced86858 3314 PcdClassObj = PcdClassObject(\r
ae7b6df8
LG
3315 PcdCName,\r
3316 TokenSpaceGuid,\r
3317 self._PCD_TYPE_STRING_[Type],\r
3318 '',\r
3319 DefaultValue,\r
3320 '',\r
3321 '',\r
57ee97c0 3322 OrderedDict({SkuName : SkuInfo}),\r
ae7b6df8
LG
3323 False,\r
3324 None,\r
3325 pcdDecObject.validateranges,\r
3326 pcdDecObject.validlists,\r
3327 pcdDecObject.expressions,\r
3328 IsDsc=True)\r
ced86858
ZZ
3329 if (PcdCName, TokenSpaceGuid) in UserDefinedDefaultStores:\r
3330 PcdClassObj.UserDefinedDefaultStoresFlag = True\r
3331 Pcds[PcdCName, TokenSpaceGuid] = PcdClassObj\r
ae7b6df8 3332\r
cbe7543e 3333 Pcds[PcdCName, TokenSpaceGuid].CustomAttribute['DscPosition'] = index\r
71127ce8
FB
3334 if SkuName not in Pcds[PcdCName, TokenSpaceGuid].DscRawValue:\r
3335 Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName] = {}\r
afe8c411 3336 Pcds[PcdCName, TokenSpaceGuid].DscRawValueInfo[SkuName] = {}\r
71127ce8 3337 Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName][DefaultStore] = DefaultValue\r
afe8c411 3338 Pcds[PcdCName, TokenSpaceGuid].DscRawValueInfo[SkuName][DefaultStore] = (self.MetaFile.File,Dummy4)\r
ae7b6df8 3339 for pcd in Pcds.values():\r
ae7b6df8 3340 pcdDecObject = self._DecPcds[pcd.TokenCName, pcd.TokenSpaceGuidCName]\r
e1511113 3341 pcd.DatumType = pcdDecObject.DatumType\r
ae7b6df8
LG
3342 # Only fix the value while no value provided in DSC file.\r
3343 for sku in pcd.SkuInfoList.values():\r
4231a819 3344 if (sku.HiiDefaultValue == "" or sku.HiiDefaultValue is None):\r
ae7b6df8 3345 sku.HiiDefaultValue = pcdDecObject.DefaultValue\r
e1511113
B
3346 for default_store in sku.DefaultStoreDict:\r
3347 sku.DefaultStoreDict[default_store]=pcdDecObject.DefaultValue\r
3348 pcd.DefaultValue = pcdDecObject.DefaultValue\r
55c84777 3349 if TAB_DEFAULT not in pcd.SkuInfoList and TAB_COMMON not in pcd.SkuInfoList:\r
f8d11e5a 3350 SkuInfoObj = list(pcd.SkuInfoList.values())[0]\r
ae7b6df8 3351 valuefromDec = pcdDecObject.DefaultValue\r
ccaa7754 3352 SkuInfo = SkuInfoClass(TAB_DEFAULT, '0', SkuInfoObj.VariableName, SkuInfoObj.VariableGuid, SkuInfoObj.VariableOffset, valuefromDec, VariableAttribute=SkuInfoObj.VariableAttribute, DefaultStore={DefaultStore:valuefromDec})\r
55c84777
CJ
3353 pcd.SkuInfoList[TAB_DEFAULT] = SkuInfo\r
3354 elif TAB_DEFAULT not in pcd.SkuInfoList and TAB_COMMON in pcd.SkuInfoList:\r
3355 pcd.SkuInfoList[TAB_DEFAULT] = pcd.SkuInfoList[TAB_COMMON]\r
3356 del pcd.SkuInfoList[TAB_COMMON]\r
3357 elif TAB_DEFAULT in pcd.SkuInfoList and TAB_COMMON in pcd.SkuInfoList:\r
3358 del pcd.SkuInfoList[TAB_COMMON]\r
ae7b6df8 3359\r
ae7b6df8
LG
3360 if pcd.MaxDatumSize.strip():\r
3361 MaxSize = int(pcd.MaxDatumSize, 0)\r
3362 else:\r
3363 MaxSize = 0\r
656d2539 3364 if pcd.DatumType not in TAB_PCD_NUMERIC_TYPES:\r
2b8a6c44 3365 for (_, skuobj) in pcd.SkuInfoList.items():\r
ae7b6df8 3366 datalen = 0\r
47854fd5
LG
3367 skuobj.HiiDefaultValue = StringToArray(skuobj.HiiDefaultValue)\r
3368 datalen = len(skuobj.HiiDefaultValue.split(","))\r
ae7b6df8
LG
3369 if datalen > MaxSize:\r
3370 MaxSize = datalen\r
47854fd5
LG
3371 for defaultst in skuobj.DefaultStoreDict:\r
3372 skuobj.DefaultStoreDict[defaultst] = StringToArray(skuobj.DefaultStoreDict[defaultst])\r
3373 pcd.DefaultValue = StringToArray(pcd.DefaultValue)\r
ae7b6df8 3374 pcd.MaxDatumSize = str(MaxSize)\r
9e508f3a 3375 rt, invalidhii = DscBuildData.CheckVariableNameAssignment(Pcds)\r
2b8a6c44
LG
3376 if not rt:\r
3377 invalidpcd = ",".join(invalidhii)\r
3378 EdkLogger.error('build', PCD_VARIABLE_INFO_ERROR, Message='The same HII PCD must map to the same EFI variable for all SKUs', File=self.MetaFile, ExtraData=invalidpcd)\r
65eff519 3379\r
f8d11e5a 3380 list(map(self.FilterSkuSettings, Pcds.values()))\r
65eff519 3381\r
ae7b6df8
LG
3382 return Pcds\r
3383\r
9e508f3a
CJ
3384 @staticmethod\r
3385 def CheckVariableNameAssignment(Pcds):\r
2b8a6c44
LG
3386 invalidhii = []\r
3387 for pcdname in Pcds:\r
3388 pcd = Pcds[pcdname]\r
ccaa7754 3389 varnameset = set(sku.VariableName for (skuid, sku) in pcd.SkuInfoList.items())\r
2b8a6c44 3390 if len(varnameset) > 1:\r
ccaa7754 3391 invalidhii.append(".".join((pcdname[1], pcdname[0])))\r
2b8a6c44 3392 if len(invalidhii):\r
ccaa7754 3393 return False, invalidhii\r
2b8a6c44
LG
3394 else:\r
3395 return True, []\r
ae7b6df8
LG
3396 ## Retrieve dynamic VPD PCD settings\r
3397 #\r
3398 # @param Type PCD type\r
3399 #\r
3400 # @retval a dict object contains settings of given PCD type\r
3401 #\r
3402 def _GetDynamicVpdPcd(self, Type):\r
3403\r
ae7b6df8 3404\r
a0767bae 3405 Pcds = OrderedDict()\r
ae7b6df8
LG
3406 #\r
3407 # tdict is a special dict kind of type, used for selecting correct\r
3408 # PCD settings for certain ARCH and SKU\r
3409 #\r
3410 PcdDict = tdict(True, 4)\r
3411 PcdList = []\r
3412\r
3413 # Find out all possible PCD candidates for self._Arch\r
3414 RecordList = self._RawData[Type, self._Arch]\r
8518bf0b 3415 AvailableSkuIdSet = copy.copy(self.SkuIds)\r
ae7b6df8 3416\r
ccaa7754 3417 for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, Dummy3, Dummy4, Dummy5 in RecordList:\r
2b8a6c44 3418 SkuName = SkuName.upper()\r
55c84777 3419 SkuName = TAB_DEFAULT if SkuName == TAB_COMMON else SkuName\r
ae7b6df8 3420 if SkuName not in AvailableSkuIdSet:\r
2b8a6c44
LG
3421 EdkLogger.error('build', PARAMETER_INVALID, 'Sku %s is not defined in [SkuIds] section' % SkuName,\r
3422 File=self.MetaFile, Line=Dummy5)\r
273190e1 3423 if "." not in TokenSpaceGuid and "[" not in PcdCName and (PcdCName, TokenSpaceGuid, SkuName, Dummy5) not in PcdList:\r
5db9414c 3424 PcdList.append((PcdCName, TokenSpaceGuid, SkuName, Dummy5))\r
ae7b6df8
LG
3425 PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid] = Setting\r
3426\r
3427 # Remove redundant PCD candidates, per the ARCH and SKU\r
3428 for PcdCName, TokenSpaceGuid, SkuName, Dummy4 in PcdList:\r
3429 Setting = PcdDict[self._Arch, SkuName, PcdCName, TokenSpaceGuid]\r
4231a819 3430 if Setting is None:\r
ae7b6df8
LG
3431 continue\r
3432 #\r
3433 # For the VOID* type, it can have optional data of MaxDatumSize and InitialValue\r
3434 # For the Integer & Boolean type, the optional data can only be InitialValue.\r
3435 # At this point, we put all the data into the PcdClssObject for we don't know the PCD's datumtype\r
3436 # until the DEC parser has been called.\r
3437 #\r
3438 VpdOffset, MaxDatumSize, InitialValue = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4)\r
f843a328
YZ
3439 if MaxDatumSize:\r
3440 if int(MaxDatumSize, 0) > 0xFFFF:\r
3441 EdkLogger.error('build', FORMAT_INVALID, "The size value must not exceed the maximum value of 0xFFFF (UINT16) for %s." % ".".join((TokenSpaceGuid, PcdCName)),\r
3442 File=self.MetaFile, Line=Dummy4)\r
3443 if int(MaxDatumSize, 0) < 0:\r
3444 EdkLogger.error('build', FORMAT_INVALID, "The size value can't be set to negative value for %s." % ".".join((TokenSpaceGuid, PcdCName)),\r
3445 File=self.MetaFile, Line=Dummy4)\r
8518bf0b 3446 SkuInfo = SkuInfoClass(SkuName, self.SkuIds[SkuName][0], '', '', '', '', VpdOffset, InitialValue)\r
5a693b89 3447 if (PcdCName, TokenSpaceGuid) in Pcds:\r
ae7b6df8
LG
3448 pcdObject = Pcds[PcdCName, TokenSpaceGuid]\r
3449 pcdObject.SkuInfoList[SkuName] = SkuInfo\r
3450 if MaxDatumSize.strip():\r
3451 CurrentMaxSize = int(MaxDatumSize.strip(), 0)\r
3452 else:\r
3453 CurrentMaxSize = 0\r
3454 if pcdObject.MaxDatumSize:\r
3455 PcdMaxSize = int(pcdObject.MaxDatumSize, 0)\r
3456 else:\r
3457 PcdMaxSize = 0\r
3458 if CurrentMaxSize > PcdMaxSize:\r
3459 pcdObject.MaxDatumSize = str(CurrentMaxSize)\r
3460 else:\r
3461 Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject(\r
3462 PcdCName,\r
3463 TokenSpaceGuid,\r
3464 self._PCD_TYPE_STRING_[Type],\r
3465 '',\r
3466 InitialValue,\r
3467 '',\r
3468 MaxDatumSize,\r
57ee97c0 3469 OrderedDict({SkuName : SkuInfo}),\r
ae7b6df8
LG
3470 False,\r
3471 None,\r
3472 IsDsc=True)\r
71127ce8
FB
3473\r
3474 if SkuName not in Pcds[PcdCName, TokenSpaceGuid].DscRawValue:\r
3475 Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName] = {}\r
afe8c411 3476 Pcds[PcdCName, TokenSpaceGuid].DscRawValueInfo[SkuName] = {}\r
71127ce8 3477 Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName][TAB_DEFAULT_STORES_DEFAULT] = InitialValue\r
afe8c411 3478 Pcds[PcdCName, TokenSpaceGuid].DscRawValueInfo[SkuName][TAB_DEFAULT_STORES_DEFAULT] = (self.MetaFile.File,Dummy4)\r
ae7b6df8 3479 for pcd in Pcds.values():\r
ae7b6df8 3480 pcdDecObject = self._DecPcds[pcd.TokenCName, pcd.TokenSpaceGuidCName]\r
8aa4db4b 3481 pcd.DatumType = pcdDecObject.DatumType\r
e651d06c
LG
3482 # Only fix the value while no value provided in DSC file.\r
3483 for sku in pcd.SkuInfoList.values():\r
128d435f 3484 if not sku.DefaultValue:\r
e651d06c 3485 sku.DefaultValue = pcdDecObject.DefaultValue\r
55c84777 3486 if TAB_DEFAULT not in pcd.SkuInfoList and TAB_COMMON not in pcd.SkuInfoList:\r
f8d11e5a 3487 SkuInfoObj = list(pcd.SkuInfoList.values())[0]\r
ae7b6df8 3488 valuefromDec = pcdDecObject.DefaultValue\r
55c84777
CJ
3489 SkuInfo = SkuInfoClass(TAB_DEFAULT, '0', '', '', '', '', SkuInfoObj.VpdOffset, valuefromDec)\r
3490 pcd.SkuInfoList[TAB_DEFAULT] = SkuInfo\r
3491 elif TAB_DEFAULT not in pcd.SkuInfoList and TAB_COMMON in pcd.SkuInfoList:\r
3492 pcd.SkuInfoList[TAB_DEFAULT] = pcd.SkuInfoList[TAB_COMMON]\r
3493 del pcd.SkuInfoList[TAB_COMMON]\r
3494 elif TAB_DEFAULT in pcd.SkuInfoList and TAB_COMMON in pcd.SkuInfoList:\r
3495 del pcd.SkuInfoList[TAB_COMMON]\r
ae7b6df8 3496\r
073891a3
Z
3497 #For the same one VOID* pcd, if the default value type of one SKU is "Unicode string",\r
3498 #the other SKUs are "OtherVOID*"(ASCII string or byte array),Then convert "Unicode string" to "byte array".\r
3499 for pcd in Pcds.values():\r
3500 PcdValueTypeSet = set()\r
3501 for sku in pcd.SkuInfoList.values():\r
3502 PcdValueTypeSet.add("UnicodeString" if sku.DefaultValue.startswith(('L"',"L'")) else "OtherVOID*")\r
3503 if len(PcdValueTypeSet) > 1:\r
3504 for sku in pcd.SkuInfoList.values():\r
3505 sku.DefaultValue = StringToArray(sku.DefaultValue) if sku.DefaultValue.startswith(('L"',"L'")) else sku.DefaultValue\r
65eff519 3506\r
f8d11e5a 3507 list(map(self.FilterSkuSettings, Pcds.values()))\r
ae7b6df8
LG
3508 return Pcds\r
3509\r
3510 ## Add external modules\r
3511 #\r
3512 # The external modules are mostly those listed in FDF file, which don't\r
3513 # need "build".\r
3514 #\r
3515 # @param FilePath The path of module description file\r
3516 #\r
3517 def AddModule(self, FilePath):\r
3518 FilePath = NormPath(FilePath)\r
3519 if FilePath not in self.Modules:\r
3520 Module = ModuleBuildClassObject()\r
3521 Module.MetaFile = FilePath\r
3522 self.Modules.append(Module)\r
3523\r
71cac3f7
CJ
3524 @property\r
3525 def ToolChainFamily(self):\r
94c04559 3526 self._ToolChainFamily = TAB_COMPILER_MSFT\r
4465cd12
FZ
3527 TargetObj = TargetTxtDict()\r
3528 TargetTxt = TargetObj.Target\r
68ba919f
YZ
3529 BuildConfigurationFile = os.path.normpath(os.path.join(GlobalData.gConfDirectory, "target.txt"))\r
3530 if os.path.isfile(BuildConfigurationFile) == True:\r
68ba919f
YZ
3531 ToolDefinitionFile = TargetTxt.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_TOOL_CHAIN_CONF]\r
3532 if ToolDefinitionFile == '':\r
3533 ToolDefinitionFile = "tools_def.txt"\r
3534 ToolDefinitionFile = os.path.normpath(mws.join(self.WorkspaceDir, 'Conf', ToolDefinitionFile))\r
3535 if os.path.isfile(ToolDefinitionFile) == True:\r
4465cd12
FZ
3536 ToolDefObj = ToolDefDict((os.path.join(os.getenv("WORKSPACE"), "Conf")))\r
3537 ToolDefinition = ToolDefObj.ToolDef.ToolsDefTxtDatabase\r
68ba919f
YZ
3538 if TAB_TOD_DEFINES_FAMILY not in ToolDefinition \\r
3539 or self._Toolchain not in ToolDefinition[TAB_TOD_DEFINES_FAMILY] \\r
3540 or not ToolDefinition[TAB_TOD_DEFINES_FAMILY][self._Toolchain]:\r
94c04559 3541 self._ToolChainFamily = TAB_COMPILER_MSFT\r
68ba919f
YZ
3542 else:\r
3543 self._ToolChainFamily = ToolDefinition[TAB_TOD_DEFINES_FAMILY][self._Toolchain]\r
3544 return self._ToolChainFamily\r
3545\r
ae7b6df8
LG
3546 ## Add external PCDs\r
3547 #\r
3548 # The external PCDs are mostly those listed in FDF file to specify address\r
3549 # or offset information.\r
3550 #\r
3551 # @param Name Name of the PCD\r
3552 # @param Guid Token space guid of the PCD\r
3553 # @param Value Value of the PCD\r
3554 #\r
3555 def AddPcd(self, Name, Guid, Value):\r
3556 if (Name, Guid) not in self.Pcds:\r
3557 self.Pcds[Name, Guid] = PcdClassObject(Name, Guid, '', '', '', '', '', {}, False, None)\r
3558 self.Pcds[Name, Guid].DefaultValue = Value\r
71cac3f7 3559\r
5644e5ce
FB
3560 @property\r
3561 def DecPcds(self):\r
4231a819 3562 if self._DecPcds is None:\r
5644e5ce
FB
3563 FdfInfList = []\r
3564 if GlobalData.gFdfParser:\r
3565 FdfInfList = GlobalData.gFdfParser.Profile.InfList\r
3566 PkgSet = set()\r
3567 for Inf in FdfInfList:\r
3568 ModuleFile = PathClass(NormPath(Inf), GlobalData.gWorkspace, Arch=self._Arch)\r
3569 if ModuleFile in self._Modules:\r
3570 continue\r
3571 ModuleData = self._Bdb[ModuleFile, self._Arch, self._Target, self._Toolchain]\r
3572 PkgSet.update(ModuleData.Packages)\r
bf1ea933
FZ
3573 if self.Packages:\r
3574 PkgSet.update(self.Packages)\r
ccaa7754 3575 self._DecPcds, self._GuidDict = GetDeclaredPcd(self, self._Bdb, self._Arch, self._Target, self._Toolchain, PkgSet)\r
53c64f42 3576 self._GuidDict.update(GlobalData.gPlatformPcds)\r
5644e5ce 3577 return self._DecPcds\r