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