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