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