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