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