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