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