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