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