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