]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/Workspace/DscBuildData.py
IntelSiliconPkg/Vtd: Add missing dump in ExtContext.
[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
e6b10112 4# Copyright (c) 2008 - 2018, Intel Corporation. All rights reserved.<BR>\r
ae7b6df8
LG
5# (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>\r
6# This program and the accompanying materials\r
7# are licensed and made available under the terms and conditions of the BSD License\r
8# which accompanies this distribution. The full text of the license may be found at\r
9# http://opensource.org/licenses/bsd-license.php\r
10#\r
11# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13#\r
14\r
15## Platform build information from DSC file\r
16#\r
17# This class is used to retrieve information stored in database and convert them\r
18# into PlatformBuildClassObject form for easier use for AutoGen.\r
19#\r
20from Common.String import *\r
21from Common.DataType import *\r
22from Common.Misc import *\r
23from types import *\r
8565b582 24from Common.Expression import *\r
ae7b6df8 25from CommonDataClass.CommonClass import SkuInfoClass\r
68ba919f
YZ
26from Common.TargetTxtClassObject import *\r
27from Common.ToolDefClassObject import *\r
ae7b6df8
LG
28from MetaDataTable import *\r
29from MetaFileTable import *\r
30from MetaFileParser import *\r
31\r
32from WorkspaceCommon import GetDeclaredPcd\r
33from Common.Misc import AnalyzeDscPcd\r
34from Common.Misc import ProcessDuplicatedInf\r
35import re\r
36from Common.Parsing import IsValidWord\r
37from Common.VariableAttributes import VariableAttributes\r
38import Common.GlobalData as GlobalData\r
39import subprocess\r
0a57a978 40from Common.Misc import SaveFileOnChange\r
ae7b6df8 41from Workspace.BuildClassObject import PlatformBuildClassObject, StructurePcd, PcdClassObject, ModuleBuildClassObject\r
79820e32 42from collections import OrderedDict\r
ae7b6df8
LG
43\r
44#\r
45# Treat CHAR16 as a synonym for UINT16. CHAR16 support is required for VFR C structs\r
46#\r
47PcdValueInitName = 'PcdValueInit'\r
48PcdSupportedBaseTypes = ['BOOLEAN', 'UINT8', 'UINT16', 'UINT32', 'UINT64', 'CHAR16']\r
49PcdSupportedBaseTypeWidth = {'BOOLEAN':8, 'UINT8':8, 'UINT16':16, 'UINT32':32, 'UINT64':64}\r
50PcdUnsupportedBaseTypes = ['INT8', 'INT16', 'INT32', 'INT64', 'CHAR8', 'UINTN', 'INTN', 'VOID']\r
51\r
52PcdMainCHeader = '''\r
53/**\r
54 DO NOT EDIT\r
55 FILE auto-generated\r
56**/\r
57\r
58#include <stdio.h>\r
59#include <stdlib.h>\r
60#include <string.h>\r
61#include <PcdValueCommon.h>\r
62'''\r
63\r
64PcdMainCEntry = '''\r
65int\r
66main (\r
67 int argc,\r
68 char *argv[]\r
69 )\r
70{\r
71 return PcdValueMain (argc, argv);\r
72}\r
73'''\r
74\r
75PcdMakefileHeader = '''\r
76#\r
77# DO NOT EDIT\r
78# This file is auto-generated by build utility\r
79#\r
80\r
81'''\r
82\r
68ba919f
YZ
83WindowsCFLAGS = 'CFLAGS = $(CFLAGS) /wd4200 /wd4034 /wd4101 '\r
84LinuxCFLAGS = 'BUILD_CFLAGS += -Wno-pointer-to-int-cast -Wno-unused-variable '\r
ae7b6df8
LG
85PcdMakefileEnd = '''\r
86!INCLUDE $(BASE_TOOLS_PATH)\Source\C\Makefiles\ms.common\r
87\r
ae7b6df8
LG
88LIBS = $(LIB_PATH)\Common.lib\r
89\r
90!INCLUDE $(BASE_TOOLS_PATH)\Source\C\Makefiles\ms.app\r
91'''\r
92\r
93PcdGccMakefile = '''\r
ae7b6df8
LG
94MAKEROOT ?= $(EDK_TOOLS_PATH)/Source/C\r
95LIBS = -lCommon\r
96'''\r
97\r
98class DscBuildData(PlatformBuildClassObject):\r
99 # dict used to convert PCD type in database to string used by build tool\r
100 _PCD_TYPE_STRING_ = {\r
101 MODEL_PCD_FIXED_AT_BUILD : "FixedAtBuild",\r
102 MODEL_PCD_PATCHABLE_IN_MODULE : "PatchableInModule",\r
103 MODEL_PCD_FEATURE_FLAG : "FeatureFlag",\r
104 MODEL_PCD_DYNAMIC : "Dynamic",\r
105 MODEL_PCD_DYNAMIC_DEFAULT : "Dynamic",\r
106 MODEL_PCD_DYNAMIC_HII : "DynamicHii",\r
107 MODEL_PCD_DYNAMIC_VPD : "DynamicVpd",\r
108 MODEL_PCD_DYNAMIC_EX : "DynamicEx",\r
109 MODEL_PCD_DYNAMIC_EX_DEFAULT : "DynamicEx",\r
110 MODEL_PCD_DYNAMIC_EX_HII : "DynamicExHii",\r
111 MODEL_PCD_DYNAMIC_EX_VPD : "DynamicExVpd",\r
112 }\r
113\r
114 # dict used to convert part of [Defines] to members of DscBuildData directly\r
115 _PROPERTY_ = {\r
116 #\r
117 # Required Fields\r
118 #\r
119 TAB_DSC_DEFINES_PLATFORM_NAME : "_PlatformName",\r
120 TAB_DSC_DEFINES_PLATFORM_GUID : "_Guid",\r
121 TAB_DSC_DEFINES_PLATFORM_VERSION : "_Version",\r
122 TAB_DSC_DEFINES_DSC_SPECIFICATION : "_DscSpecification",\r
123 # TAB_DSC_DEFINES_OUTPUT_DIRECTORY : "_OutputDirectory",\r
124 # TAB_DSC_DEFINES_SUPPORTED_ARCHITECTURES : "_SupArchList",\r
125 # TAB_DSC_DEFINES_BUILD_TARGETS : "_BuildTargets",\r
126 TAB_DSC_DEFINES_SKUID_IDENTIFIER : "_SkuName",\r
127 # TAB_DSC_DEFINES_FLASH_DEFINITION : "_FlashDefinition",\r
128 TAB_DSC_DEFINES_BUILD_NUMBER : "_BuildNumber",\r
129 TAB_DSC_DEFINES_MAKEFILE_NAME : "_MakefileName",\r
130 TAB_DSC_DEFINES_BS_BASE_ADDRESS : "_BsBaseAddress",\r
131 TAB_DSC_DEFINES_RT_BASE_ADDRESS : "_RtBaseAddress",\r
132 # TAB_DSC_DEFINES_RFC_LANGUAGES : "_RFCLanguages",\r
133 # TAB_DSC_DEFINES_ISO_LANGUAGES : "_ISOLanguages",\r
134 }\r
135\r
136 # used to compose dummy library class name for those forced library instances\r
137 _NullLibraryNumber = 0\r
138\r
139 ## Constructor of DscBuildData\r
140 #\r
141 # Initialize object of DscBuildData\r
142 #\r
143 # @param FilePath The path of platform description file\r
144 # @param RawData The raw data of DSC file\r
145 # @param BuildDataBase Database used to retrieve module/package information\r
146 # @param Arch The target architecture\r
147 # @param Platform (not used for DscBuildData)\r
148 # @param Macros Macros used for replacement in DSC file\r
149 #\r
150 def __init__(self, FilePath, RawData, BuildDataBase, Arch='COMMON', Target=None, Toolchain=None):\r
151 self.MetaFile = FilePath\r
152 self._RawData = RawData\r
153 self._Bdb = BuildDataBase\r
154 self._Arch = Arch\r
155 self._Target = Target\r
156 self._Toolchain = Toolchain\r
68ba919f 157 self._ToolChainFamily = None\r
ae7b6df8
LG
158 self._Clear()\r
159 self._HandleOverridePath()\r
0a57a978 160 self.WorkspaceDir = os.getenv("WORKSPACE") if os.getenv("WORKSPACE") else ""\r
8518bf0b 161 self.DefaultStores = None\r
e651d06c 162 self.SkuIdMgr = SkuClass(self.SkuName, self.SkuIds)\r
0a57a978
FB
163 @property\r
164 def OutputPath(self):\r
165 if os.getenv("WORKSPACE"):\r
166 return os.path.join(os.getenv("WORKSPACE"), self.OutputDirectory, self._Target + "_" + self._Toolchain,PcdValueInitName)\r
167 else:\r
168 return os.path.dirname(self.DscFile)\r
ae7b6df8
LG
169\r
170 ## XXX[key] = value\r
171 def __setitem__(self, key, value):\r
172 self.__dict__[self._PROPERTY_[key]] = value\r
173\r
174 ## value = XXX[key]\r
175 def __getitem__(self, key):\r
176 return self.__dict__[self._PROPERTY_[key]]\r
177\r
178 ## "in" test support\r
179 def __contains__(self, key):\r
180 return key in self._PROPERTY_\r
181\r
182 ## Set all internal used members of DscBuildData to None\r
183 def _Clear(self):\r
184 self._Header = None\r
185 self._PlatformName = None\r
186 self._Guid = None\r
187 self._Version = None\r
188 self._DscSpecification = None\r
189 self._OutputDirectory = None\r
190 self._SupArchList = None\r
191 self._BuildTargets = None\r
192 self._SkuName = None\r
ae7b6df8
LG
193 self._PcdInfoFlag = None\r
194 self._VarCheckFlag = None\r
195 self._FlashDefinition = None\r
196 self._Prebuild = None\r
197 self._Postbuild = None\r
198 self._BuildNumber = None\r
199 self._MakefileName = None\r
200 self._BsBaseAddress = None\r
201 self._RtBaseAddress = None\r
202 self._SkuIds = None\r
203 self._Modules = None\r
204 self._LibraryInstances = None\r
205 self._LibraryClasses = None\r
206 self._Pcds = None\r
207 self._DecPcds = None\r
208 self._BuildOptions = None\r
209 self._ModuleTypeOptions = None\r
210 self._LoadFixAddress = None\r
211 self._RFCLanguages = None\r
212 self._ISOLanguages = None\r
213 self._VpdToolGuid = None\r
214 self.__Macros = None\r
8518bf0b 215 self.DefaultStores = None\r
ae7b6df8
LG
216\r
217\r
218 ## handle Override Path of Module\r
219 def _HandleOverridePath(self):\r
220 RecordList = self._RawData[MODEL_META_DATA_COMPONENT, self._Arch]\r
221 Macros = self._Macros\r
222 Macros["EDK_SOURCE"] = GlobalData.gEcpSource\r
223 for Record in RecordList:\r
8518bf0b
LG
224 ModuleId = Record[6]\r
225 LineNo = Record[7]\r
ae7b6df8
LG
226 ModuleFile = PathClass(NormPath(Record[0]), GlobalData.gWorkspace, Arch=self._Arch)\r
227 RecordList = self._RawData[MODEL_META_DATA_COMPONENT_SOURCE_OVERRIDE_PATH, self._Arch, None, ModuleId]\r
228 if RecordList != []:\r
229 SourceOverridePath = mws.join(GlobalData.gWorkspace, NormPath(RecordList[0][0]))\r
230\r
231 # Check if the source override path exists\r
232 if not os.path.isdir(SourceOverridePath):\r
233 EdkLogger.error('build', FILE_NOT_FOUND, Message='Source override path does not exist:', File=self.MetaFile, ExtraData=SourceOverridePath, Line=LineNo)\r
234\r
235 # Add to GlobalData Variables\r
236 GlobalData.gOverrideDir[ModuleFile.Key] = SourceOverridePath\r
237\r
238 ## Get current effective macros\r
239 def _GetMacros(self):\r
240 if self.__Macros == None:\r
241 self.__Macros = {}\r
242 self.__Macros.update(GlobalData.gPlatformDefines)\r
243 self.__Macros.update(GlobalData.gGlobalDefines)\r
244 self.__Macros.update(GlobalData.gCommandLineDefines)\r
245 return self.__Macros\r
246\r
247 ## Get architecture\r
248 def _GetArch(self):\r
249 return self._Arch\r
250\r
251 ## Set architecture\r
252 #\r
253 # Changing the default ARCH to another may affect all other information\r
254 # because all information in a platform may be ARCH-related. That's\r
255 # why we need to clear all internal used members, in order to cause all\r
256 # information to be re-retrieved.\r
257 #\r
258 # @param Value The value of ARCH\r
259 #\r
260 def _SetArch(self, Value):\r
261 if self._Arch == Value:\r
262 return\r
263 self._Arch = Value\r
264 self._Clear()\r
265\r
266 ## Retrieve all information in [Defines] section\r
267 #\r
268 # (Retriving all [Defines] information in one-shot is just to save time.)\r
269 #\r
270 def _GetHeaderInfo(self):\r
271 RecordList = self._RawData[MODEL_META_DATA_HEADER, self._Arch]\r
272 for Record in RecordList:\r
273 Name = Record[1]\r
274 # items defined _PROPERTY_ don't need additional processing\r
275\r
276 # some special items in [Defines] section need special treatment\r
277 if Name == TAB_DSC_DEFINES_OUTPUT_DIRECTORY:\r
278 self._OutputDirectory = NormPath(Record[2], self._Macros)\r
279 if ' ' in self._OutputDirectory:\r
280 EdkLogger.error("build", FORMAT_NOT_SUPPORTED, "No space is allowed in OUTPUT_DIRECTORY",\r
281 File=self.MetaFile, Line=Record[-1],\r
282 ExtraData=self._OutputDirectory)\r
283 elif Name == TAB_DSC_DEFINES_FLASH_DEFINITION:\r
284 self._FlashDefinition = PathClass(NormPath(Record[2], self._Macros), GlobalData.gWorkspace)\r
285 ErrorCode, ErrorInfo = self._FlashDefinition.Validate('.fdf')\r
286 if ErrorCode != 0:\r
287 EdkLogger.error('build', ErrorCode, File=self.MetaFile, Line=Record[-1],\r
288 ExtraData=ErrorInfo)\r
289 elif Name == TAB_DSC_PREBUILD:\r
290 PrebuildValue = Record[2]\r
291 if Record[2][0] == '"':\r
292 if Record[2][-1] != '"':\r
293 EdkLogger.error('build', FORMAT_INVALID, 'Missing double quotes in the end of %s statement.' % TAB_DSC_PREBUILD,\r
294 File=self.MetaFile, Line=Record[-1])\r
295 PrebuildValue = Record[2][1:-1]\r
296 self._Prebuild = PrebuildValue\r
297 elif Name == TAB_DSC_POSTBUILD:\r
298 PostbuildValue = Record[2]\r
299 if Record[2][0] == '"':\r
300 if Record[2][-1] != '"':\r
301 EdkLogger.error('build', FORMAT_INVALID, 'Missing double quotes in the end of %s statement.' % TAB_DSC_POSTBUILD,\r
302 File=self.MetaFile, Line=Record[-1])\r
303 PostbuildValue = Record[2][1:-1]\r
304 self._Postbuild = PostbuildValue\r
305 elif Name == TAB_DSC_DEFINES_SUPPORTED_ARCHITECTURES:\r
306 self._SupArchList = GetSplitValueList(Record[2], TAB_VALUE_SPLIT)\r
307 elif Name == TAB_DSC_DEFINES_BUILD_TARGETS:\r
308 self._BuildTargets = GetSplitValueList(Record[2])\r
309 elif Name == TAB_DSC_DEFINES_SKUID_IDENTIFIER:\r
310 if self._SkuName == None:\r
311 self._SkuName = Record[2]\r
e651d06c
LG
312 if GlobalData.gSKUID_CMD:\r
313 self._SkuName = GlobalData.gSKUID_CMD\r
ae7b6df8
LG
314 elif Name == TAB_DSC_DEFINES_PCD_INFO_GENERATION:\r
315 self._PcdInfoFlag = Record[2]\r
316 elif Name == TAB_DSC_DEFINES_PCD_VAR_CHECK_GENERATION:\r
317 self._VarCheckFlag = Record[2]\r
318 elif Name == TAB_FIX_LOAD_TOP_MEMORY_ADDRESS:\r
319 try:\r
320 self._LoadFixAddress = int (Record[2], 0)\r
321 except:\r
322 EdkLogger.error("build", PARAMETER_INVALID, "FIX_LOAD_TOP_MEMORY_ADDRESS %s is not valid dec or hex string" % (Record[2]))\r
323 elif Name == TAB_DSC_DEFINES_RFC_LANGUAGES:\r
324 if not Record[2] or Record[2][0] != '"' or Record[2][-1] != '"' or len(Record[2]) == 1:\r
325 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
326 File=self.MetaFile, Line=Record[-1])\r
327 LanguageCodes = Record[2][1:-1]\r
328 if not LanguageCodes:\r
329 EdkLogger.error('build', FORMAT_NOT_SUPPORTED, 'one or more RFC4646 format language code must be provided for RFC_LANGUAGES statement',\r
330 File=self.MetaFile, Line=Record[-1])\r
331 LanguageList = GetSplitValueList(LanguageCodes, TAB_SEMI_COLON_SPLIT)\r
332 # check whether there is empty entries in the list\r
333 if None in LanguageList:\r
334 EdkLogger.error('build', FORMAT_NOT_SUPPORTED, 'one or more empty language code is in RFC_LANGUAGES statement',\r
335 File=self.MetaFile, Line=Record[-1])\r
336 self._RFCLanguages = LanguageList\r
337 elif Name == TAB_DSC_DEFINES_ISO_LANGUAGES:\r
338 if not Record[2] or Record[2][0] != '"' or Record[2][-1] != '"' or len(Record[2]) == 1:\r
339 EdkLogger.error('build', FORMAT_NOT_SUPPORTED, 'language code for ISO_LANGUAGES must have double quotes around it, for example: ISO_LANGUAGES = "engchn"',\r
340 File=self.MetaFile, Line=Record[-1])\r
341 LanguageCodes = Record[2][1:-1]\r
342 if not LanguageCodes:\r
343 EdkLogger.error('build', FORMAT_NOT_SUPPORTED, 'one or more ISO639-2 format language code must be provided for ISO_LANGUAGES statement',\r
344 File=self.MetaFile, Line=Record[-1])\r
345 if len(LanguageCodes) % 3:\r
346 EdkLogger.error('build', FORMAT_NOT_SUPPORTED, 'bad ISO639-2 format for ISO_LANGUAGES',\r
347 File=self.MetaFile, Line=Record[-1])\r
348 LanguageList = []\r
349 for i in range(0, len(LanguageCodes), 3):\r
350 LanguageList.append(LanguageCodes[i:i + 3])\r
351 self._ISOLanguages = LanguageList\r
352 elif Name == TAB_DSC_DEFINES_VPD_TOOL_GUID:\r
353 #\r
354 # try to convert GUID to a real UUID value to see whether the GUID is format\r
355 # for VPD_TOOL_GUID is correct.\r
356 #\r
357 try:\r
358 uuid.UUID(Record[2])\r
359 except:\r
360 EdkLogger.error("build", FORMAT_INVALID, "Invalid GUID format for VPD_TOOL_GUID", File=self.MetaFile)\r
361 self._VpdToolGuid = Record[2]\r
362 elif Name in self:\r
363 self[Name] = Record[2]\r
364 # set _Header to non-None in order to avoid database re-querying\r
365 self._Header = 'DUMMY'\r
366\r
367 ## Retrieve platform name\r
368 def _GetPlatformName(self):\r
369 if self._PlatformName == None:\r
370 if self._Header == None:\r
371 self._GetHeaderInfo()\r
372 if self._PlatformName == None:\r
373 EdkLogger.error('build', ATTRIBUTE_NOT_AVAILABLE, "No PLATFORM_NAME", File=self.MetaFile)\r
374 return self._PlatformName\r
375\r
376 ## Retrieve file guid\r
377 def _GetFileGuid(self):\r
378 if self._Guid == None:\r
379 if self._Header == None:\r
380 self._GetHeaderInfo()\r
381 if self._Guid == None:\r
382 EdkLogger.error('build', ATTRIBUTE_NOT_AVAILABLE, "No PLATFORM_GUID", File=self.MetaFile)\r
383 return self._Guid\r
384\r
385 ## Retrieve platform version\r
386 def _GetVersion(self):\r
387 if self._Version == None:\r
388 if self._Header == None:\r
389 self._GetHeaderInfo()\r
390 if self._Version == None:\r
391 EdkLogger.error('build', ATTRIBUTE_NOT_AVAILABLE, "No PLATFORM_VERSION", File=self.MetaFile)\r
392 return self._Version\r
393\r
394 ## Retrieve platform description file version\r
395 def _GetDscSpec(self):\r
396 if self._DscSpecification == None:\r
397 if self._Header == None:\r
398 self._GetHeaderInfo()\r
399 if self._DscSpecification == None:\r
400 EdkLogger.error('build', ATTRIBUTE_NOT_AVAILABLE, "No DSC_SPECIFICATION", File=self.MetaFile)\r
401 return self._DscSpecification\r
402\r
403 ## Retrieve OUTPUT_DIRECTORY\r
404 def _GetOutpuDir(self):\r
405 if self._OutputDirectory == None:\r
406 if self._Header == None:\r
407 self._GetHeaderInfo()\r
408 if self._OutputDirectory == None:\r
409 self._OutputDirectory = os.path.join("Build", self._PlatformName)\r
410 return self._OutputDirectory\r
411\r
412 ## Retrieve SUPPORTED_ARCHITECTURES\r
413 def _GetSupArch(self):\r
414 if self._SupArchList == None:\r
415 if self._Header == None:\r
416 self._GetHeaderInfo()\r
417 if self._SupArchList == None:\r
418 EdkLogger.error('build', ATTRIBUTE_NOT_AVAILABLE, "No SUPPORTED_ARCHITECTURES", File=self.MetaFile)\r
419 return self._SupArchList\r
420\r
421 ## Retrieve BUILD_TARGETS\r
422 def _GetBuildTarget(self):\r
423 if self._BuildTargets == None:\r
424 if self._Header == None:\r
425 self._GetHeaderInfo()\r
426 if self._BuildTargets == None:\r
427 EdkLogger.error('build', ATTRIBUTE_NOT_AVAILABLE, "No BUILD_TARGETS", File=self.MetaFile)\r
428 return self._BuildTargets\r
429\r
430 def _GetPcdInfoFlag(self):\r
431 if self._PcdInfoFlag == None or self._PcdInfoFlag.upper() == 'FALSE':\r
432 return False\r
433 elif self._PcdInfoFlag.upper() == 'TRUE':\r
434 return True\r
435 else:\r
436 return False\r
437 def _GetVarCheckFlag(self):\r
438 if self._VarCheckFlag == None or self._VarCheckFlag.upper() == 'FALSE':\r
439 return False\r
440 elif self._VarCheckFlag.upper() == 'TRUE':\r
441 return True\r
442 else:\r
443 return False\r
e651d06c
LG
444\r
445 # # Retrieve SKUID_IDENTIFIER\r
ae7b6df8
LG
446 def _GetSkuName(self):\r
447 if self._SkuName == None:\r
448 if self._Header == None:\r
449 self._GetHeaderInfo()\r
e651d06c 450 if self._SkuName == None:\r
ae7b6df8
LG
451 self._SkuName = 'DEFAULT'\r
452 return self._SkuName\r
453\r
454 ## Override SKUID_IDENTIFIER\r
455 def _SetSkuName(self, Value):\r
456 self._SkuName = Value\r
ae7b6df8
LG
457\r
458 def _GetFdfFile(self):\r
459 if self._FlashDefinition == None:\r
460 if self._Header == None:\r
461 self._GetHeaderInfo()\r
462 if self._FlashDefinition == None:\r
463 self._FlashDefinition = ''\r
464 return self._FlashDefinition\r
465\r
466 def _GetPrebuild(self):\r
467 if self._Prebuild == None:\r
468 if self._Header == None:\r
469 self._GetHeaderInfo()\r
470 if self._Prebuild == None:\r
471 self._Prebuild = ''\r
472 return self._Prebuild\r
473\r
474 def _GetPostbuild(self):\r
475 if self._Postbuild == None:\r
476 if self._Header == None:\r
477 self._GetHeaderInfo()\r
478 if self._Postbuild == None:\r
479 self._Postbuild = ''\r
480 return self._Postbuild\r
481\r
482 ## Retrieve FLASH_DEFINITION\r
483 def _GetBuildNumber(self):\r
484 if self._BuildNumber == None:\r
485 if self._Header == None:\r
486 self._GetHeaderInfo()\r
487 if self._BuildNumber == None:\r
488 self._BuildNumber = ''\r
489 return self._BuildNumber\r
490\r
491 ## Retrieve MAKEFILE_NAME\r
492 def _GetMakefileName(self):\r
493 if self._MakefileName == None:\r
494 if self._Header == None:\r
495 self._GetHeaderInfo()\r
496 if self._MakefileName == None:\r
497 self._MakefileName = ''\r
498 return self._MakefileName\r
499\r
500 ## Retrieve BsBaseAddress\r
501 def _GetBsBaseAddress(self):\r
502 if self._BsBaseAddress == None:\r
503 if self._Header == None:\r
504 self._GetHeaderInfo()\r
505 if self._BsBaseAddress == None:\r
506 self._BsBaseAddress = ''\r
507 return self._BsBaseAddress\r
508\r
509 ## Retrieve RtBaseAddress\r
510 def _GetRtBaseAddress(self):\r
511 if self._RtBaseAddress == None:\r
512 if self._Header == None:\r
513 self._GetHeaderInfo()\r
514 if self._RtBaseAddress == None:\r
515 self._RtBaseAddress = ''\r
516 return self._RtBaseAddress\r
517\r
518 ## Retrieve the top address for the load fix address\r
519 def _GetLoadFixAddress(self):\r
520 if self._LoadFixAddress == None:\r
521 if self._Header == None:\r
522 self._GetHeaderInfo()\r
523\r
524 if self._LoadFixAddress == None:\r
525 self._LoadFixAddress = self._Macros.get(TAB_FIX_LOAD_TOP_MEMORY_ADDRESS, '0')\r
526\r
527 try:\r
528 self._LoadFixAddress = int (self._LoadFixAddress, 0)\r
529 except:\r
530 EdkLogger.error("build", PARAMETER_INVALID, "FIX_LOAD_TOP_MEMORY_ADDRESS %s is not valid dec or hex string" % (self._LoadFixAddress))\r
531\r
532 #\r
533 # If command line defined, should override the value in DSC file.\r
534 #\r
535 if 'FIX_LOAD_TOP_MEMORY_ADDRESS' in GlobalData.gCommandLineDefines.keys():\r
536 try:\r
537 self._LoadFixAddress = int(GlobalData.gCommandLineDefines['FIX_LOAD_TOP_MEMORY_ADDRESS'], 0)\r
538 except:\r
539 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
540\r
541 if self._LoadFixAddress < 0:\r
542 EdkLogger.error("build", PARAMETER_INVALID, "FIX_LOAD_TOP_MEMORY_ADDRESS is set to the invalid negative value 0x%x" % (self._LoadFixAddress))\r
543 if self._LoadFixAddress != 0xFFFFFFFFFFFFFFFF and self._LoadFixAddress % 0x1000 != 0:\r
544 EdkLogger.error("build", PARAMETER_INVALID, "FIX_LOAD_TOP_MEMORY_ADDRESS is set to the invalid unaligned 4K value 0x%x" % (self._LoadFixAddress))\r
545\r
546 return self._LoadFixAddress\r
547\r
548 ## Retrieve RFCLanguage filter\r
549 def _GetRFCLanguages(self):\r
550 if self._RFCLanguages == None:\r
551 if self._Header == None:\r
552 self._GetHeaderInfo()\r
553 if self._RFCLanguages == None:\r
554 self._RFCLanguages = []\r
555 return self._RFCLanguages\r
556\r
557 ## Retrieve ISOLanguage filter\r
558 def _GetISOLanguages(self):\r
559 if self._ISOLanguages == None:\r
560 if self._Header == None:\r
561 self._GetHeaderInfo()\r
562 if self._ISOLanguages == None:\r
563 self._ISOLanguages = []\r
564 return self._ISOLanguages\r
565 ## Retrieve the GUID string for VPD tool\r
566 def _GetVpdToolGuid(self):\r
567 if self._VpdToolGuid == None:\r
568 if self._Header == None:\r
569 self._GetHeaderInfo()\r
570 if self._VpdToolGuid == None:\r
571 self._VpdToolGuid = ''\r
572 return self._VpdToolGuid\r
573\r
574 ## Retrieve [SkuIds] section information\r
575 def _GetSkuIds(self):\r
576 if self._SkuIds == None:\r
577 self._SkuIds = sdict()\r
578 RecordList = self._RawData[MODEL_EFI_SKU_ID, self._Arch]\r
579 for Record in RecordList:\r
580 if Record[0] in [None, '']:\r
581 EdkLogger.error('build', FORMAT_INVALID, 'No Sku ID number',\r
582 File=self.MetaFile, Line=Record[-1])\r
583 if Record[1] in [None, '']:\r
584 EdkLogger.error('build', FORMAT_INVALID, 'No Sku ID name',\r
585 File=self.MetaFile, Line=Record[-1])\r
8518bf0b 586 Pattern = re.compile('^[1-9]\d*|0$')\r
e6b10112
YZ
587 HexPattern = re.compile(r'0[xX][0-9a-fA-F]+$')\r
588 if Pattern.match(Record[0]) == None and HexPattern.match(Record[0]) == None:\r
589 EdkLogger.error('build', FORMAT_INVALID, "The format of the Sku ID number is invalid. It only support Integer and HexNumber",\r
8518bf0b
LG
590 File=self.MetaFile, Line=Record[-1])\r
591 if not IsValidWord(Record[1]):\r
592 EdkLogger.error('build', FORMAT_INVALID, "The format of the Sku ID name is invalid. The correct format is '(a-zA-Z0-9_)(a-zA-Z0-9_-.)*'",\r
593 File=self.MetaFile, Line=Record[-1])\r
e6b10112 594 self._SkuIds[Record[1].upper()] = (str(self.ToInt(Record[0])), Record[1].upper(), Record[2].upper())\r
ae7b6df8 595 if 'DEFAULT' not in self._SkuIds:\r
8518bf0b 596 self._SkuIds['DEFAULT'] = ("0","DEFAULT","DEFAULT")\r
ae7b6df8 597 if 'COMMON' not in self._SkuIds:\r
8518bf0b 598 self._SkuIds['COMMON'] = ("0","DEFAULT","DEFAULT")\r
ae7b6df8 599 return self._SkuIds\r
8518bf0b
LG
600 def ToInt(self,intstr):\r
601 return int(intstr,16) if intstr.upper().startswith("0X") else int(intstr)\r
602 def _GetDefaultStores(self):\r
603 if self.DefaultStores == None:\r
604 self.DefaultStores = sdict()\r
605 RecordList = self._RawData[MODEL_EFI_DEFAULT_STORES, self._Arch]\r
606 for Record in RecordList:\r
607 if Record[0] in [None, '']:\r
608 EdkLogger.error('build', FORMAT_INVALID, 'No DefaultStores ID number',\r
609 File=self.MetaFile, Line=Record[-1])\r
610 if Record[1] in [None, '']:\r
611 EdkLogger.error('build', FORMAT_INVALID, 'No DefaultStores ID name',\r
612 File=self.MetaFile, Line=Record[-1])\r
767ddbe8
YZ
613 Pattern = re.compile('^[1-9]\d*|0$')\r
614 HexPattern = re.compile(r'0[xX][0-9a-fA-F]+$')\r
615 if Pattern.match(Record[0]) == None and HexPattern.match(Record[0]) == None:\r
616 EdkLogger.error('build', FORMAT_INVALID, "The format of the DefaultStores ID number is invalid. It only support Integer and HexNumber",\r
617 File=self.MetaFile, Line=Record[-1])\r
618 if not IsValidWord(Record[1]):\r
619 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
620 File=self.MetaFile, Line=Record[-1])\r
2b8a6c44 621 self.DefaultStores[Record[1].upper()] = (self.ToInt(Record[0]),Record[1].upper())\r
8518bf0b
LG
622 if TAB_DEFAULT_STORES_DEFAULT not in self.DefaultStores:\r
623 self.DefaultStores[TAB_DEFAULT_STORES_DEFAULT] = (0,TAB_DEFAULT_STORES_DEFAULT)\r
e651d06c
LG
624 GlobalData.gDefaultStores = self.DefaultStores.keys()\r
625 if GlobalData.gDefaultStores:\r
626 GlobalData.gDefaultStores.sort()\r
8518bf0b 627 return self.DefaultStores\r
ae7b6df8
LG
628\r
629 ## Retrieve [Components] section information\r
630 def _GetModules(self):\r
631 if self._Modules != None:\r
632 return self._Modules\r
633\r
634 self._Modules = sdict()\r
635 RecordList = self._RawData[MODEL_META_DATA_COMPONENT, self._Arch]\r
636 Macros = self._Macros\r
637 Macros["EDK_SOURCE"] = GlobalData.gEcpSource\r
638 for Record in RecordList:\r
639 DuplicatedFile = False\r
640\r
641 ModuleFile = PathClass(NormPath(Record[0], Macros), GlobalData.gWorkspace, Arch=self._Arch)\r
8518bf0b
LG
642 ModuleId = Record[6]\r
643 LineNo = Record[7]\r
ae7b6df8
LG
644\r
645 # check the file validation\r
646 ErrorCode, ErrorInfo = ModuleFile.Validate('.inf')\r
647 if ErrorCode != 0:\r
648 EdkLogger.error('build', ErrorCode, File=self.MetaFile, Line=LineNo,\r
649 ExtraData=ErrorInfo)\r
650 # Check duplication\r
651 # If arch is COMMON, no duplicate module is checked since all modules in all component sections are selected\r
652 if self._Arch != 'COMMON' and ModuleFile in self._Modules:\r
653 DuplicatedFile = True\r
654\r
655 Module = ModuleBuildClassObject()\r
656 Module.MetaFile = ModuleFile\r
657\r
658 # get module private library instance\r
659 RecordList = self._RawData[MODEL_EFI_LIBRARY_CLASS, self._Arch, None, ModuleId]\r
660 for Record in RecordList:\r
661 LibraryClass = Record[0]\r
662 LibraryPath = PathClass(NormPath(Record[1], Macros), GlobalData.gWorkspace, Arch=self._Arch)\r
663 LineNo = Record[-1]\r
664\r
665 # check the file validation\r
666 ErrorCode, ErrorInfo = LibraryPath.Validate('.inf')\r
667 if ErrorCode != 0:\r
668 EdkLogger.error('build', ErrorCode, File=self.MetaFile, Line=LineNo,\r
669 ExtraData=ErrorInfo)\r
670\r
671 if LibraryClass == '' or LibraryClass == 'NULL':\r
672 self._NullLibraryNumber += 1\r
673 LibraryClass = 'NULL%d' % self._NullLibraryNumber\r
674 EdkLogger.verbose("Found forced library for %s\n\t%s [%s]" % (ModuleFile, LibraryPath, LibraryClass))\r
675 Module.LibraryClasses[LibraryClass] = LibraryPath\r
676 if LibraryPath not in self.LibraryInstances:\r
677 self.LibraryInstances.append(LibraryPath)\r
678\r
679 # get module private PCD setting\r
680 for Type in [MODEL_PCD_FIXED_AT_BUILD, MODEL_PCD_PATCHABLE_IN_MODULE, \\r
681 MODEL_PCD_FEATURE_FLAG, MODEL_PCD_DYNAMIC, MODEL_PCD_DYNAMIC_EX]:\r
682 RecordList = self._RawData[Type, self._Arch, None, ModuleId]\r
8518bf0b 683 for TokenSpaceGuid, PcdCName, Setting, Dummy1, Dummy2, Dummy3, Dummy4,Dummy5 in RecordList:\r
ae7b6df8
LG
684 TokenList = GetSplitValueList(Setting)\r
685 DefaultValue = TokenList[0]\r
cdbf45ad
YZ
686 # the format is PcdName| Value | VOID* | MaxDatumSize\r
687 if len(TokenList) > 2:\r
688 MaxDatumSize = TokenList[2]\r
ae7b6df8
LG
689 else:\r
690 MaxDatumSize = ''\r
691 TypeString = self._PCD_TYPE_STRING_[Type]\r
692 Pcd = PcdClassObject(\r
693 PcdCName,\r
694 TokenSpaceGuid,\r
695 TypeString,\r
696 '',\r
697 DefaultValue,\r
698 '',\r
699 MaxDatumSize,\r
700 {},\r
701 False,\r
702 None\r
703 )\r
704 Module.Pcds[PcdCName, TokenSpaceGuid] = Pcd\r
705\r
706 # get module private build options\r
707 RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch, None, ModuleId]\r
8518bf0b 708 for ToolChainFamily, ToolChain, Option, Dummy1, Dummy2, Dummy3, Dummy4,Dummy5 in RecordList:\r
ae7b6df8
LG
709 if (ToolChainFamily, ToolChain) not in Module.BuildOptions:\r
710 Module.BuildOptions[ToolChainFamily, ToolChain] = Option\r
711 else:\r
712 OptionString = Module.BuildOptions[ToolChainFamily, ToolChain]\r
713 Module.BuildOptions[ToolChainFamily, ToolChain] = OptionString + " " + Option\r
714\r
715 RecordList = self._RawData[MODEL_META_DATA_HEADER, self._Arch, None, ModuleId]\r
716 if DuplicatedFile and not RecordList:\r
717 EdkLogger.error('build', FILE_DUPLICATED, File=self.MetaFile, ExtraData=str(ModuleFile), Line=LineNo)\r
718 if RecordList:\r
719 if len(RecordList) != 1:\r
720 EdkLogger.error('build', OPTION_UNKNOWN, 'Only FILE_GUID can be listed in <Defines> section.',\r
721 File=self.MetaFile, ExtraData=str(ModuleFile), Line=LineNo)\r
722 ModuleFile = ProcessDuplicatedInf(ModuleFile, RecordList[0][2], GlobalData.gWorkspace)\r
723 ModuleFile.Arch = self._Arch\r
724\r
725 self._Modules[ModuleFile] = Module\r
726 return self._Modules\r
727\r
728 ## Retrieve all possible library instances used in this platform\r
729 def _GetLibraryInstances(self):\r
730 if self._LibraryInstances == None:\r
731 self._GetLibraryClasses()\r
732 return self._LibraryInstances\r
733\r
734 ## Retrieve [LibraryClasses] information\r
735 def _GetLibraryClasses(self):\r
736 if self._LibraryClasses == None:\r
737 self._LibraryInstances = []\r
738 #\r
739 # tdict is a special dict kind of type, used for selecting correct\r
740 # library instance for given library class and module type\r
741 #\r
742 LibraryClassDict = tdict(True, 3)\r
743 # track all library class names\r
744 LibraryClassSet = set()\r
745 RecordList = self._RawData[MODEL_EFI_LIBRARY_CLASS, self._Arch, None, -1]\r
746 Macros = self._Macros\r
747 for Record in RecordList:\r
8518bf0b 748 LibraryClass, LibraryInstance, Dummy, Arch, ModuleType, Dummy,Dummy, LineNo = Record\r
ae7b6df8
LG
749 if LibraryClass == '' or LibraryClass == 'NULL':\r
750 self._NullLibraryNumber += 1\r
751 LibraryClass = 'NULL%d' % self._NullLibraryNumber\r
752 EdkLogger.verbose("Found forced library for arch=%s\n\t%s [%s]" % (Arch, LibraryInstance, LibraryClass))\r
753 LibraryClassSet.add(LibraryClass)\r
754 LibraryInstance = PathClass(NormPath(LibraryInstance, Macros), GlobalData.gWorkspace, Arch=self._Arch)\r
755 # check the file validation\r
756 ErrorCode, ErrorInfo = LibraryInstance.Validate('.inf')\r
757 if ErrorCode != 0:\r
758 EdkLogger.error('build', ErrorCode, File=self.MetaFile, Line=LineNo,\r
759 ExtraData=ErrorInfo)\r
760\r
761 if ModuleType != 'COMMON' and ModuleType not in SUP_MODULE_LIST:\r
762 EdkLogger.error('build', OPTION_UNKNOWN, "Unknown module type [%s]" % ModuleType,\r
763 File=self.MetaFile, ExtraData=LibraryInstance, Line=LineNo)\r
764 LibraryClassDict[Arch, ModuleType, LibraryClass] = LibraryInstance\r
765 if LibraryInstance not in self._LibraryInstances:\r
766 self._LibraryInstances.append(LibraryInstance)\r
767\r
768 # resolve the specific library instance for each class and each module type\r
769 self._LibraryClasses = tdict(True)\r
770 for LibraryClass in LibraryClassSet:\r
771 # try all possible module types\r
772 for ModuleType in SUP_MODULE_LIST:\r
773 LibraryInstance = LibraryClassDict[self._Arch, ModuleType, LibraryClass]\r
774 if LibraryInstance == None:\r
775 continue\r
776 self._LibraryClasses[LibraryClass, ModuleType] = LibraryInstance\r
777\r
778 # for Edk style library instances, which are listed in different section\r
779 Macros["EDK_SOURCE"] = GlobalData.gEcpSource\r
780 RecordList = self._RawData[MODEL_EFI_LIBRARY_INSTANCE, self._Arch]\r
781 for Record in RecordList:\r
782 File = PathClass(NormPath(Record[0], Macros), GlobalData.gWorkspace, Arch=self._Arch)\r
783 LineNo = Record[-1]\r
784 # check the file validation\r
785 ErrorCode, ErrorInfo = File.Validate('.inf')\r
786 if ErrorCode != 0:\r
787 EdkLogger.error('build', ErrorCode, File=self.MetaFile, Line=LineNo,\r
788 ExtraData=ErrorInfo)\r
789 if File not in self._LibraryInstances:\r
790 self._LibraryInstances.append(File)\r
791 #\r
792 # we need the module name as the library class name, so we have\r
793 # to parse it here. (self._Bdb[] will trigger a file parse if it\r
794 # hasn't been parsed)\r
795 #\r
796 Library = self._Bdb[File, self._Arch, self._Target, self._Toolchain]\r
797 self._LibraryClasses[Library.BaseName, ':dummy:'] = Library\r
798 return self._LibraryClasses\r
799\r
800 def _ValidatePcd(self, PcdCName, TokenSpaceGuid, Setting, PcdType, LineNo):\r
801 if self._DecPcds == None:\r
2b8a6c44 802\r
ae7b6df8
LG
803 FdfInfList = []\r
804 if GlobalData.gFdfParser:\r
805 FdfInfList = GlobalData.gFdfParser.Profile.InfList\r
806\r
807 PkgSet = set()\r
808 for Inf in FdfInfList:\r
809 ModuleFile = PathClass(NormPath(Inf), GlobalData.gWorkspace, Arch=self._Arch)\r
810 if ModuleFile in self._Modules:\r
811 continue\r
812 ModuleData = self._Bdb[ModuleFile, self._Arch, self._Target, self._Toolchain]\r
813 PkgSet.update(ModuleData.Packages)\r
ae7b6df8 814\r
726c501c 815 self._DecPcds, self._GuidDict = GetDeclaredPcd(self, self._Bdb, self._Arch, self._Target, self._Toolchain,PkgSet)\r
9efe8d60 816 self._GuidDict.update(GlobalData.gPlatformPcds)\r
2b8a6c44
LG
817\r
818 if (PcdCName, TokenSpaceGuid) not in self._DecPcds:\r
ae7b6df8
LG
819 EdkLogger.error('build', PARSER_ERROR,\r
820 "Pcd (%s.%s) defined in DSC is not declared in DEC files. Arch: ['%s']" % (TokenSpaceGuid, PcdCName, self._Arch),\r
821 File=self.MetaFile, Line=LineNo)\r
822 ValueList, IsValid, Index = AnalyzeDscPcd(Setting, PcdType, self._DecPcds[PcdCName, TokenSpaceGuid].DatumType)\r
520365de
B
823 if not IsValid:\r
824 if PcdType not in [MODEL_PCD_FEATURE_FLAG, MODEL_PCD_FIXED_AT_BUILD]:\r
825 EdkLogger.error('build', FORMAT_INVALID, "Pcd format incorrect.", File=self.MetaFile, Line=LineNo,\r
826 ExtraData="%s.%s|%s" % (TokenSpaceGuid, PcdCName, Setting))\r
827 else:\r
828 if ValueList[2] == '-1':\r
829 EdkLogger.error('build', FORMAT_INVALID, "Pcd format incorrect.", File=self.MetaFile, Line=LineNo,\r
830 ExtraData="%s.%s|%s" % (TokenSpaceGuid, PcdCName, Setting))\r
35f613d9
YF
831 if ValueList[Index]:\r
832 DatumType = self._DecPcds[PcdCName, TokenSpaceGuid].DatumType\r
ae7b6df8 833 try:\r
35f613d9 834 ValueList[Index] = ValueExpressionEx(ValueList[Index], DatumType, self._GuidDict)(True)\r
726c501c 835 except BadExpression, Value:\r
35f613d9
YF
836 EdkLogger.error('Parser', FORMAT_INVALID, Value, File=self.MetaFile, Line=LineNo,\r
837 ExtraData="PCD [%s.%s] Value \"%s\" " % (\r
838 TokenSpaceGuid, PcdCName, ValueList[Index]))\r
ae7b6df8
LG
839 except EvaluationException, Excpt:\r
840 if hasattr(Excpt, 'Pcd'):\r
841 if Excpt.Pcd in GlobalData.gPlatformOtherPcds:\r
842 EdkLogger.error('Parser', FORMAT_INVALID, "Cannot use this PCD (%s) in an expression as"\r
843 " it must be defined in a [PcdsFixedAtBuild] or [PcdsFeatureFlag] section"\r
844 " of the DSC file" % Excpt.Pcd,\r
845 File=self.MetaFile, Line=LineNo)\r
846 else:\r
847 EdkLogger.error('Parser', FORMAT_INVALID, "PCD (%s) is not defined in DSC file" % Excpt.Pcd,\r
848 File=self.MetaFile, Line=LineNo)\r
849 else:\r
850 EdkLogger.error('Parser', FORMAT_INVALID, "Invalid expression: %s" % str(Excpt),\r
851 File=self.MetaFile, Line=LineNo)\r
35f613d9 852\r
ae7b6df8
LG
853 if ValueList[Index]:\r
854 Valid, ErrStr = CheckPcdDatum(self._DecPcds[PcdCName, TokenSpaceGuid].DatumType, ValueList[Index])\r
855 if not Valid:\r
856 EdkLogger.error('build', FORMAT_INVALID, ErrStr, File=self.MetaFile, Line=LineNo,\r
857 ExtraData="%s.%s" % (TokenSpaceGuid, PcdCName))\r
520365de
B
858 if PcdType in (MODEL_PCD_DYNAMIC_DEFAULT, MODEL_PCD_DYNAMIC_EX_DEFAULT):\r
859 if self._DecPcds[PcdCName, TokenSpaceGuid].DatumType.strip() != ValueList[1].strip():\r
5db9414c 860 EdkLogger.error('build', FORMAT_INVALID, "Pcd datumtype used in DSC file is not the same as its declaration in DEC file." , File=self.MetaFile, Line=LineNo,\r
520365de 861 ExtraData="%s.%s|%s" % (TokenSpaceGuid, PcdCName, Setting))\r
35f613d9
YF
862 if (TokenSpaceGuid + '.' + PcdCName) in GlobalData.gPlatformPcds:\r
863 if GlobalData.gPlatformPcds[TokenSpaceGuid + '.' + PcdCName] != ValueList[Index]:\r
864 GlobalData.gPlatformPcds[TokenSpaceGuid + '.' + PcdCName] = ValueList[Index]\r
ae7b6df8
LG
865 return ValueList\r
866\r
8518bf0b
LG
867 def _FilterPcdBySkuUsage(self,Pcds):\r
868 available_sku = self.SkuIdMgr.AvailableSkuIdSet\r
869 sku_usage = self.SkuIdMgr.SkuUsageType\r
870 if sku_usage == SkuClass.SINGLE:\r
871 for pcdname in Pcds:\r
872 pcd = Pcds[pcdname]\r
873 Pcds[pcdname].SkuInfoList = {"DEFAULT":pcd.SkuInfoList[skuid] for skuid in pcd.SkuInfoList if skuid in available_sku}\r
65eff519
LG
874 if type(pcd) is StructurePcd and pcd.SkuOverrideValues:\r
875 Pcds[pcdname].SkuOverrideValues = {"DEFAULT":pcd.SkuOverrideValues[skuid] for skuid in pcd.SkuOverrideValues if skuid in available_sku}\r
8518bf0b
LG
876 else:\r
877 for pcdname in Pcds:\r
878 pcd = Pcds[pcdname]\r
879 Pcds[pcdname].SkuInfoList = {skuid:pcd.SkuInfoList[skuid] for skuid in pcd.SkuInfoList if skuid in available_sku}\r
65eff519
LG
880 if type(pcd) is StructurePcd and pcd.SkuOverrideValues:\r
881 Pcds[pcdname].SkuOverrideValues = {skuid:pcd.SkuOverrideValues[skuid] for skuid in pcd.SkuOverrideValues if skuid in available_sku}\r
8518bf0b 882 return Pcds\r
2b8a6c44
LG
883 def CompleteHiiPcdsDefaultStores(self,Pcds):\r
884 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
885 DefaultStoreMgr = DefaultStore(self.DefaultStores)\r
886 for pcd in HiiPcd:\r
887 for skuid in pcd.SkuInfoList:\r
888 skuobj = pcd.SkuInfoList.get(skuid)\r
889 if "STANDARD" not in skuobj.DefaultStoreDict:\r
890 PcdDefaultStoreSet = set([defaultstorename for defaultstorename in skuobj.DefaultStoreDict])\r
891 mindefaultstorename = DefaultStoreMgr.GetMin(PcdDefaultStoreSet)\r
892 skuobj.DefaultStoreDict['STANDARD'] = copy.deepcopy(skuobj.DefaultStoreDict[mindefaultstorename])\r
893 return Pcds\r
894\r
6f49996c 895 def RecoverCommandLinePcd(self):\r
0f228f19
B
896 def UpdateCommandLineValue(pcd):\r
897 if pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],\r
898 self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:\r
899 pcd.PcdValueFromComm = pcd.DefaultValue\r
900 elif pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
901 pcd.PcdValueFromComm = pcd.SkuInfoList.get("DEFAULT").HiiDefaultValue\r
902 else:\r
903 pcd.PcdValueFromComm = pcd.SkuInfoList.get("DEFAULT").DefaultValue\r
904 for pcd in self._Pcds:\r
905 if isinstance(self._Pcds[pcd],StructurePcd) and (self._Pcds[pcd].PcdValueFromComm or self._Pcds[pcd].PcdFieldValueFromComm):\r
906 UpdateCommandLineValue(self._Pcds[pcd])\r
907\r
6f49996c
FB
908 def __ParsePcdFromCommandLine(self):\r
909 if GlobalData.BuildOptionPcd:\r
910 for i, pcd in enumerate(GlobalData.BuildOptionPcd):\r
911 if type(pcd) is tuple:\r
912 continue\r
913 (pcdname, pcdvalue) = pcd.split('=')\r
914 if not pcdvalue:\r
915 EdkLogger.error('build', AUTOGEN_ERROR, "No Value specified for the PCD %s." % (pcdname))\r
916 if '.' in pcdname:\r
917 (Name1, Name2) = pcdname.split('.',1)\r
918 if "." in Name2:\r
919 (Name3, FieldName) = Name2.split(".",1)\r
920 if ((Name3,Name1)) in self.DecPcds:\r
921 HasTokenSpace = True\r
922 TokenCName = Name3\r
923 TokenSpaceGuidCName = Name1\r
924 else:\r
925 FieldName = Name2\r
926 TokenCName = Name1\r
927 TokenSpaceGuidCName = ''\r
928 HasTokenSpace = False\r
929 else:\r
930 if ((Name2,Name1)) in self.DecPcds:\r
931 HasTokenSpace = True\r
932 TokenCName = Name2\r
933 TokenSpaceGuidCName = Name1\r
934 FieldName =""\r
935 else:\r
936 FieldName = Name2\r
937 TokenCName = Name1\r
938 TokenSpaceGuidCName = ''\r
939 HasTokenSpace = False\r
940 else:\r
941 FieldName = ""\r
942 TokenCName = pcdname\r
943 TokenSpaceGuidCName = ''\r
944 HasTokenSpace = False\r
945 TokenSpaceGuidCNameList = []\r
946 FoundFlag = False\r
947 PcdDatumType = ''\r
8565b582
YZ
948 DisplayName = TokenCName\r
949 if FieldName:\r
950 DisplayName = TokenCName + '.' + FieldName\r
6f49996c
FB
951 if not HasTokenSpace:\r
952 for key in self.DecPcds:\r
8565b582
YZ
953 PcdItem = self.DecPcds[key]\r
954 if TokenCName == PcdItem.TokenCName:\r
955 if not PcdItem.TokenSpaceGuidCName in TokenSpaceGuidCNameList:\r
956 if len (TokenSpaceGuidCNameList) < 1:\r
957 TokenSpaceGuidCNameList.append(PcdItem.TokenSpaceGuidCName)\r
958 TokenSpaceGuidCName = PcdItem.TokenSpaceGuidCName\r
959 PcdDatumType = PcdItem.DatumType\r
960 FoundFlag = True\r
961 else:\r
962 EdkLogger.error(\r
963 'build',\r
964 AUTOGEN_ERROR,\r
965 "The Pcd %s is found under multiple different TokenSpaceGuid: %s and %s." % (DisplayName, PcdItem.TokenSpaceGuidCName, TokenSpaceGuidCNameList[0])\r
966 )\r
6f49996c
FB
967 else:\r
968 if (TokenCName, TokenSpaceGuidCName) in self.DecPcds:\r
969 FoundFlag = True\r
6f49996c
FB
970 if not FoundFlag:\r
971 if HasTokenSpace:\r
8565b582 972 EdkLogger.error('build', AUTOGEN_ERROR, "The Pcd %s.%s is not found in the DEC file." % (TokenSpaceGuidCName, DisplayName))\r
6f49996c 973 else:\r
8565b582
YZ
974 EdkLogger.error('build', AUTOGEN_ERROR, "The Pcd %s is not found in the DEC file." % (DisplayName))\r
975 pcdvalue = pcdvalue.replace("\\\\\\'", '\\\\\\"').replace('\\\'', '\'').replace('\\\\\\"', "\\'")\r
976 if FieldName:\r
977 pcdvalue = self.HandleFlexiblePcd(TokenSpaceGuidCName, TokenCName, pcdvalue, PcdDatumType, self._GuidDict, FieldName)\r
978 else:\r
979 pcdvalue = self.HandleFlexiblePcd(TokenSpaceGuidCName, TokenCName, pcdvalue, PcdDatumType, self._GuidDict)\r
980 IsValid, Cause = CheckPcdDatum(PcdDatumType, pcdvalue)\r
981 if not IsValid:\r
982 EdkLogger.error("build", FORMAT_INVALID, Cause, ExtraData="%s.%s" % (TokenSpaceGuidCName, TokenCName))\r
983 GlobalData.BuildOptionPcd[i] = (TokenSpaceGuidCName, TokenCName, FieldName, pcdvalue,("build command options",1))\r
984\r
6f49996c
FB
985 for BuildData in self._Bdb._CACHE_.values():\r
986 if BuildData.MetaFile.Ext == '.dec' or BuildData.MetaFile.Ext == '.dsc':\r
987 continue\r
988 for key in BuildData.Pcds:\r
989 PcdItem = BuildData.Pcds[key]\r
990 if (TokenSpaceGuidCName, TokenCName) == (PcdItem.TokenSpaceGuidCName, PcdItem.TokenCName) and FieldName =="":\r
8565b582
YZ
991 PcdItem.DefaultValue = pcdvalue\r
992\r
993 def HandleFlexiblePcd(self, TokenSpaceGuidCName, TokenCName, PcdValue, PcdDatumType, GuidDict, FieldName=''):\r
994 if FieldName:\r
995 IsArray = False\r
996 TokenCName += '.' + FieldName\r
997 if PcdValue.startswith('H'):\r
998 if FieldName and IsFieldValueAnArray(PcdValue[1:]):\r
999 PcdDatumType = 'VOID*'\r
1000 IsArray = True\r
1001 if FieldName and not IsArray:\r
1002 return PcdValue\r
1003 try:\r
1004 PcdValue = ValueExpressionEx(PcdValue[1:], PcdDatumType, GuidDict)(True)\r
1005 except BadExpression, Value: \r
1006 EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s", %s' %\r
1007 (TokenSpaceGuidCName, TokenCName, PcdValue, Value))\r
1008 elif PcdValue.startswith("L'") or PcdValue.startswith("'"):\r
1009 if FieldName and IsFieldValueAnArray(PcdValue):\r
1010 PcdDatumType = 'VOID*'\r
1011 IsArray = True\r
1012 if FieldName and not IsArray:\r
1013 return PcdValue\r
1014 try:\r
1015 PcdValue = ValueExpressionEx(PcdValue, PcdDatumType, GuidDict)(True)\r
1016 except BadExpression, Value:\r
1017 EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s", %s' %\r
1018 (TokenSpaceGuidCName, TokenCName, PcdValue, Value))\r
1019 elif PcdValue.startswith('L'):\r
1020 PcdValue = 'L"' + PcdValue[1:] + '"'\r
1021 if FieldName and IsFieldValueAnArray(PcdValue):\r
1022 PcdDatumType = 'VOID*'\r
1023 IsArray = True\r
1024 if FieldName and not IsArray:\r
1025 return PcdValue\r
1026 try:\r
1027 PcdValue = ValueExpressionEx(PcdValue, PcdDatumType, GuidDict)(True)\r
1028 except BadExpression, Value:\r
1029 EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s", %s' %\r
1030 (TokenSpaceGuidCName, TokenCName, PcdValue, Value))\r
1031 else:\r
1032 if PcdValue.upper() == 'FALSE':\r
1033 PcdValue = str(0)\r
1034 if PcdValue.upper() == 'TRUE':\r
1035 PcdValue = str(1)\r
1036 if not FieldName:\r
1037 if PcdDatumType not in ['UINT8','UINT16','UINT32','UINT64','BOOLEAN']:\r
1038 PcdValue = '"' + PcdValue + '"'\r
1039 else:\r
1040 IsArray = False\r
1041 Base = 10\r
1042 if PcdValue.upper().startswith('0X'):\r
1043 Base = 16\r
1044 try:\r
1045 Num = int(PcdValue, Base)\r
1046 except:\r
1047 PcdValue = '"' + PcdValue + '"'\r
1048 if IsFieldValueAnArray(PcdValue):\r
1049 PcdDatumType = 'VOID*'\r
1050 IsArray = True\r
1051 if not IsArray:\r
1052 return PcdValue\r
1053 try:\r
1054 PcdValue = ValueExpressionEx(PcdValue, PcdDatumType, GuidDict)(True)\r
1055 except BadExpression, Value:\r
1056 EdkLogger.error('Parser', FORMAT_INVALID, 'PCD [%s.%s] Value "%s", %s' %\r
1057 (TokenSpaceGuidCName, TokenCName, PcdValue, Value))\r
1058 return PcdValue\r
1059\r
ae7b6df8
LG
1060 ## Retrieve all PCD settings in platform\r
1061 def _GetPcds(self):\r
1062 if self._Pcds == None:\r
1063 self._Pcds = sdict()\r
6f49996c 1064 self.__ParsePcdFromCommandLine()\r
ae7b6df8
LG
1065 self._Pcds.update(self._GetPcd(MODEL_PCD_FIXED_AT_BUILD))\r
1066 self._Pcds.update(self._GetPcd(MODEL_PCD_PATCHABLE_IN_MODULE))\r
1067 self._Pcds.update(self._GetPcd(MODEL_PCD_FEATURE_FLAG))\r
1068 self._Pcds.update(self._GetDynamicPcd(MODEL_PCD_DYNAMIC_DEFAULT))\r
1069 self._Pcds.update(self._GetDynamicHiiPcd(MODEL_PCD_DYNAMIC_HII))\r
1070 self._Pcds.update(self._GetDynamicVpdPcd(MODEL_PCD_DYNAMIC_VPD))\r
1071 self._Pcds.update(self._GetDynamicPcd(MODEL_PCD_DYNAMIC_EX_DEFAULT))\r
1072 self._Pcds.update(self._GetDynamicHiiPcd(MODEL_PCD_DYNAMIC_EX_HII))\r
1073 self._Pcds.update(self._GetDynamicVpdPcd(MODEL_PCD_DYNAMIC_EX_VPD))\r
1074\r
8518bf0b 1075 self._Pcds = self.CompletePcdValues(self._Pcds)\r
b854e2bf 1076 self._Pcds = self.OverrideByFdfCommOverAll(self._Pcds)\r
ae7b6df8 1077 self._Pcds = self.UpdateStructuredPcds(MODEL_PCD_TYPE_LIST, self._Pcds)\r
2b8a6c44 1078 self._Pcds = self.CompleteHiiPcdsDefaultStores(self._Pcds)\r
8518bf0b 1079 self._Pcds = self._FilterPcdBySkuUsage(self._Pcds)\r
b854e2bf 1080\r
6f49996c 1081 self.RecoverCommandLinePcd()\r
ae7b6df8
LG
1082 return self._Pcds\r
1083\r
8518bf0b
LG
1084 def _dumpPcdInfo(self,Pcds):\r
1085 for pcd in Pcds:\r
1086 pcdobj = Pcds[pcd]\r
1087 if not pcdobj.TokenCName.startswith("Test"):\r
1088 continue\r
1089 for skuid in pcdobj.SkuInfoList:\r
1090 if pcdobj.Type in (self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII],self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]):\r
1091 for storename in pcdobj.SkuInfoList[skuid].DefaultStoreDict:\r
1092 print "PcdCName: %s, SkuName: %s, StoreName: %s, Value: %s" % (".".join((pcdobj.TokenSpaceGuidCName, pcdobj.TokenCName)), skuid,storename,str(pcdobj.SkuInfoList[skuid].DefaultStoreDict[storename]))\r
1093 else:\r
1094 print "PcdCName: %s, SkuName: %s, Value: %s" % (".".join((pcdobj.TokenSpaceGuidCName, pcdobj.TokenCName)), skuid,str(pcdobj.SkuInfoList[skuid].DefaultValue))\r
ae7b6df8
LG
1095 ## Retrieve [BuildOptions]\r
1096 def _GetBuildOptions(self):\r
1097 if self._BuildOptions == None:\r
1098 self._BuildOptions = sdict()\r
1099 #\r
1100 # Retrieve build option for EDKII and EDK style module\r
1101 #\r
1102 for CodeBase in (EDKII_NAME, EDK_NAME):\r
1103 RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch, CodeBase]\r
8518bf0b 1104 for ToolChainFamily, ToolChain, Option, Dummy1, Dummy2, Dummy3, Dummy4,Dummy5 in RecordList:\r
c05c2c05
LG
1105 if Dummy3.upper() != 'COMMON':\r
1106 continue\r
ae7b6df8
LG
1107 CurKey = (ToolChainFamily, ToolChain, CodeBase)\r
1108 #\r
1109 # Only flags can be appended\r
1110 #\r
1111 if CurKey not in self._BuildOptions or not ToolChain.endswith('_FLAGS') or Option.startswith('='):\r
1112 self._BuildOptions[CurKey] = Option\r
1113 else:\r
c05c2c05
LG
1114 if ' ' + Option not in self._BuildOptions[CurKey]:\r
1115 self._BuildOptions[CurKey] += ' ' + Option\r
ae7b6df8
LG
1116 return self._BuildOptions\r
1117\r
1118 def GetBuildOptionsByModuleType(self, Edk, ModuleType):\r
1119 if self._ModuleTypeOptions == None:\r
1120 self._ModuleTypeOptions = sdict()\r
1121 if (Edk, ModuleType) not in self._ModuleTypeOptions:\r
1122 options = sdict()\r
1123 self._ModuleTypeOptions[Edk, ModuleType] = options\r
1124 DriverType = '%s.%s' % (Edk, ModuleType)\r
1125 CommonDriverType = '%s.%s' % ('COMMON', ModuleType)\r
c05c2c05
LG
1126 RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch]\r
1127 for ToolChainFamily, ToolChain, Option, Dummy1, Dummy2, Dummy3, Dummy4,Dummy5 in RecordList:\r
1128 Type = Dummy2 + '.' + Dummy3\r
1129 if Type.upper() == DriverType.upper() or Type.upper() == CommonDriverType.upper():\r
ae7b6df8
LG
1130 Key = (ToolChainFamily, ToolChain, Edk)\r
1131 if Key not in options or not ToolChain.endswith('_FLAGS') or Option.startswith('='):\r
1132 options[Key] = Option\r
1133 else:\r
c05c2c05
LG
1134 if ' ' + Option not in options[Key]:\r
1135 options[Key] += ' ' + Option\r
ae7b6df8
LG
1136 return self._ModuleTypeOptions[Edk, ModuleType]\r
1137\r
1138 def GetStructurePcdInfo(self, PcdSet):\r
1139 structure_pcd_data = {}\r
1140 for item in PcdSet:\r
8518bf0b
LG
1141 if (item[0],item[1]) not in structure_pcd_data:\r
1142 structure_pcd_data[(item[0],item[1])] = []\r
1143 structure_pcd_data[(item[0],item[1])].append(item)\r
ae7b6df8
LG
1144\r
1145 return structure_pcd_data\r
6f49996c 1146 def OverrideByFdfComm(self,StruPcds):\r
b854e2bf
B
1147 StructurePcdInCom = OrderedDict()\r
1148 for item in GlobalData.BuildOptionPcd:\r
1149 if len(item) == 5 and (item[1],item[0]) in StruPcds:\r
1150 StructurePcdInCom[(item[0],item[1],item[2] )] = (item[3],item[4])\r
6f49996c
FB
1151 GlobalPcds = set([(item[0],item[1]) for item in StructurePcdInCom.keys()])\r
1152 for Pcd in StruPcds.values():\r
1153 if (Pcd.TokenSpaceGuidCName,Pcd.TokenCName) not in GlobalPcds:\r
1154 continue\r
b854e2bf
B
1155 FieldValues = OrderedDict()\r
1156 for item in StructurePcdInCom:\r
1157 if (Pcd.TokenSpaceGuidCName,Pcd.TokenCName) == (item[0],item[1]) and item[2]:\r
1158 FieldValues[item[2]] = StructurePcdInCom[item]\r
1159 for field in FieldValues:\r
1160 if field not in Pcd.PcdFieldValueFromComm:\r
1161 Pcd.PcdFieldValueFromComm[field] = ["","",""]\r
1162 Pcd.PcdFieldValueFromComm[field][0] = FieldValues[field][0]\r
1163 Pcd.PcdFieldValueFromComm[field][1] = FieldValues[field][1][0]\r
1164 Pcd.PcdFieldValueFromComm[field][2] = FieldValues[field][1][1]\r
6f49996c
FB
1165 return StruPcds\r
1166 def OverrideByFdfCommOverAll(self,AllPcds):\r
1167 def CheckStructureInComm(commpcds):\r
1168 if not commpcds:\r
1169 return False\r
1170 if len(commpcds[0]) == 5:\r
1171 return True\r
1172 return False\r
ae7b6df8 1173\r
6f49996c
FB
1174 if CheckStructureInComm(GlobalData.BuildOptionPcd):\r
1175 StructurePcdInCom = {(item[0],item[1],item[2] ):(item[3],item[4]) for item in GlobalData.BuildOptionPcd } if GlobalData.BuildOptionPcd else {}\r
1176 NoFiledValues = {(item[0],item[1]):StructurePcdInCom[item] for item in StructurePcdInCom if not item[2]}\r
1177 else:\r
1178 NoFiledValues = {(item[0],item[1]):[item[2]] for item in GlobalData.BuildOptionPcd}\r
1179 for Guid,Name in NoFiledValues:\r
1180 if (Name,Guid) in AllPcds:\r
1181 Pcd = AllPcds.get((Name,Guid))\r
b854e2bf
B
1182 if isinstance(self._DecPcds.get((Pcd.TokenCName,Pcd.TokenSpaceGuidCName), None),StructurePcd):\r
1183 self._DecPcds.get((Pcd.TokenCName,Pcd.TokenSpaceGuidCName)).PcdValueFromComm = NoFiledValues[(Pcd.TokenSpaceGuidCName,Pcd.TokenCName)][0]\r
1184 else:\r
0f228f19 1185 Pcd.PcdValueFromComm = NoFiledValues[(Pcd.TokenSpaceGuidCName,Pcd.TokenCName)][0]\r
b854e2bf
B
1186 Pcd.DefaultValue = NoFiledValues[(Pcd.TokenSpaceGuidCName,Pcd.TokenCName)][0]\r
1187 for sku in Pcd.SkuInfoList:\r
1188 SkuInfo = Pcd.SkuInfoList[sku]\r
1189 if SkuInfo.DefaultValue:\r
1190 SkuInfo.DefaultValue = NoFiledValues[(Pcd.TokenSpaceGuidCName,Pcd.TokenCName)][0]\r
1191 else:\r
1192 SkuInfo.HiiDefaultValue = NoFiledValues[(Pcd.TokenSpaceGuidCName,Pcd.TokenCName)][0]\r
1193 for defaultstore in SkuInfo.DefaultStoreDict:\r
1194 SkuInfo.DefaultStoreDict[defaultstore] = NoFiledValues[(Pcd.TokenSpaceGuidCName,Pcd.TokenCName)][0]\r
1195 if Pcd.DatumType == "VOID*":\r
1196 if Pcd.MaxDatumSize is None:\r
1197 Pcd.MaxDatumSize = '0'\r
1198 MaxSize = int(Pcd.MaxDatumSize,10)\r
1199 if Pcd.DefaultValue.startswith("{") and Pcd.DefaultValue.endswith("}"):\r
1200 MaxSize = max([len(Pcd.DefaultValue.split(",")),MaxSize])\r
1201 elif Pcd.DefaultValue.startswith("\"") or Pcd.DefaultValue.startswith("\'"):\r
1202 MaxSize = max([len(Pcd.DefaultValue)-2+1,MaxSize])\r
1203 elif Pcd.DefaultValue.startswith("L\""):\r
1204 MaxSize = max([2*(len(Pcd.DefaultValue)-3+1),MaxSize])\r
1205 else:\r
1206 MaxSize = max([len(Pcd.DefaultValue),MaxSize])\r
1207 Pcd.MaxDatumSize = str(MaxSize)\r
6f49996c
FB
1208 else:\r
1209 PcdInDec = self.DecPcds.get((Name,Guid))\r
1210 if PcdInDec:\r
0f228f19 1211 PcdInDec.PcdValueFromComm = NoFiledValues[(Guid,Name)][0]\r
6f49996c
FB
1212 if PcdInDec.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],\r
1213 self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:\r
1214 self.Pcds[Name, Guid] = copy.deepcopy(PcdInDec)\r
1215 self.Pcds[Name, Guid].DefaultValue = NoFiledValues[( Guid,Name)][0]\r
1216 return AllPcds\r
ae7b6df8 1217 def UpdateStructuredPcds(self, TypeList, AllPcds):\r
65eff519
LG
1218\r
1219 DynamicPcdType = [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_DEFAULT],\r
1220 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII],\r
1221 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_VPD],\r
1222 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_DEFAULT],\r
1223 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII],\r
1224 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_VPD]]\r
1225\r
ae7b6df8 1226 Pcds = AllPcds\r
8518bf0b 1227 DefaultStoreMgr = DefaultStore(self.DefaultStores)\r
65eff519
LG
1228 SkuIds = self.SkuIdMgr.AvailableSkuIdSet\r
1229 SkuIds.update({'DEFAULT':0})\r
8518bf0b 1230 DefaultStores = set([storename for pcdobj in AllPcds.values() for skuobj in pcdobj.SkuInfoList.values() for storename in skuobj.DefaultStoreDict.keys()])\r
ae7b6df8
LG
1231\r
1232 S_PcdSet = []\r
1233 # Find out all possible PCD candidates for self._Arch\r
1234 RecordList = []\r
2b8a6c44 1235\r
ae7b6df8
LG
1236 for Type in TypeList:\r
1237 RecordList.extend(self._RawData[Type, self._Arch])\r
1238\r
8518bf0b 1239 for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, default_store, Dummy4,Dummy5 in RecordList:\r
2b8a6c44
LG
1240 SkuName = SkuName.upper()\r
1241 default_store = default_store.upper()\r
1242 SkuName = 'DEFAULT' if SkuName == 'COMMON' else SkuName\r
8518bf0b
LG
1243 if SkuName not in SkuIds:\r
1244 continue\r
2b8a6c44 1245\r
8518bf0b 1246 if SkuName in SkuIds and "." in TokenSpaceGuid:\r
6f49996c 1247 S_PcdSet.append([ TokenSpaceGuid.split(".")[0],TokenSpaceGuid.split(".")[1], PcdCName,SkuName, default_store,Dummy5, AnalyzePcdExpression(Setting)[0]])\r
ae7b6df8
LG
1248\r
1249 # handle pcd value override\r
1250 StrPcdSet = self.GetStructurePcdInfo(S_PcdSet)\r
79820e32 1251 S_pcd_set = OrderedDict()\r
ae7b6df8 1252 for str_pcd in StrPcdSet:\r
8518bf0b
LG
1253 str_pcd_obj = Pcds.get((str_pcd[1], str_pcd[0]), None)\r
1254 str_pcd_dec = self._DecPcds.get((str_pcd[1], str_pcd[0]), None)\r
5db9414c
B
1255 if not isinstance (str_pcd_dec, StructurePcd):\r
1256 EdkLogger.error('build', PARSER_ERROR,\r
1257 "Pcd (%s.%s) is not declared as Structure PCD in DEC files. Arch: ['%s']" % (str_pcd[0], str_pcd[1], self._Arch),\r
1258 File=self.MetaFile,Line = StrPcdSet[str_pcd][0][5])\r
ae7b6df8
LG
1259 if str_pcd_dec:\r
1260 str_pcd_obj_str = StructurePcd()\r
1261 str_pcd_obj_str.copy(str_pcd_dec)\r
1262 if str_pcd_obj:\r
1263 str_pcd_obj_str.copy(str_pcd_obj)\r
f832bb34
FB
1264 if str_pcd_obj.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
1265 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
1266 else:\r
1267 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 1268 for str_pcd_data in StrPcdSet[str_pcd]:\r
8518bf0b 1269 if str_pcd_data[3] in SkuIds:\r
0a57a978 1270 str_pcd_obj_str.AddOverrideValue(str_pcd_data[2], str(str_pcd_data[6]), 'DEFAULT' if str_pcd_data[3] == 'COMMON' else str_pcd_data[3],'STANDARD' if str_pcd_data[4] == 'COMMON' else str_pcd_data[4], 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[5])\r
8518bf0b 1271 S_pcd_set[str_pcd[1], str_pcd[0]] = str_pcd_obj_str\r
2b8a6c44
LG
1272 else:\r
1273 EdkLogger.error('build', PARSER_ERROR,\r
1274 "Pcd (%s.%s) defined in DSC is not declared in DEC files. Arch: ['%s']" % (str_pcd[0], str_pcd[1], self._Arch),\r
1275 File=self.MetaFile,Line = StrPcdSet[str_pcd][0][5])\r
ae7b6df8 1276 # Add the Structure PCD that only defined in DEC, don't have override in DSC file\r
5644e5ce 1277 for Pcd in self.DecPcds:\r
ae7b6df8
LG
1278 if type (self._DecPcds[Pcd]) is StructurePcd:\r
1279 if Pcd not in S_pcd_set:\r
1280 str_pcd_obj_str = StructurePcd()\r
1281 str_pcd_obj_str.copy(self._DecPcds[Pcd])\r
1282 str_pcd_obj = Pcds.get(Pcd, None)\r
1283 if str_pcd_obj:\r
1284 str_pcd_obj_str.copy(str_pcd_obj)\r
77204d60
FB
1285 if str_pcd_obj.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
1286 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
1287 else:\r
1288 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
1289 S_pcd_set[Pcd] = str_pcd_obj_str\r
1290 if S_pcd_set:\r
1291 GlobalData.gStructurePcd[self.Arch] = S_pcd_set\r
8518bf0b 1292 for stru_pcd in S_pcd_set.values():\r
67e63e9a
LG
1293 for skuid in SkuIds:\r
1294 if skuid in stru_pcd.SkuOverrideValues:\r
1295 continue\r
1296 nextskuid = self.SkuIdMgr.GetNextSkuId(skuid)\r
1297 NoDefault = False\r
f3b31433
FB
1298 if skuid not in stru_pcd.SkuOverrideValues:\r
1299 while nextskuid not in stru_pcd.SkuOverrideValues:\r
1300 if nextskuid == "DEFAULT":\r
1301 NoDefault = True\r
1302 break\r
1303 nextskuid = self.SkuIdMgr.GetNextSkuId(nextskuid)\r
1304 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 {'STANDARD':stru_pcd.DefaultValues})\r
1305 if not NoDefault:\r
1306 stru_pcd.ValueChain[(skuid,'')]= (nextskuid,'')\r
8518bf0b
LG
1307 if stru_pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
1308 for skuid in SkuIds:\r
1309 nextskuid = skuid\r
2b8a6c44 1310 NoDefault = False\r
8518bf0b
LG
1311 if skuid not in stru_pcd.SkuOverrideValues:\r
1312 while nextskuid not in stru_pcd.SkuOverrideValues:\r
2b8a6c44
LG
1313 if nextskuid == "DEFAULT":\r
1314 NoDefault = True\r
1315 break\r
8518bf0b 1316 nextskuid = self.SkuIdMgr.GetNextSkuId(nextskuid)\r
2b8a6c44
LG
1317 if NoDefault:\r
1318 continue\r
1319 PcdDefaultStoreSet = set([defaultstorename for defaultstorename in stru_pcd.SkuOverrideValues[nextskuid]])\r
8518bf0b 1320 mindefaultstorename = DefaultStoreMgr.GetMin(PcdDefaultStoreSet)\r
2b8a6c44 1321\r
8518bf0b
LG
1322 for defaultstoreid in DefaultStores:\r
1323 if defaultstoreid not in stru_pcd.SkuOverrideValues[skuid]:\r
2b8a6c44 1324 stru_pcd.SkuOverrideValues[skuid][defaultstoreid] = copy.deepcopy(stru_pcd.SkuOverrideValues[nextskuid][mindefaultstorename])\r
f3b31433 1325 stru_pcd.ValueChain[(skuid,defaultstoreid)]= (nextskuid,mindefaultstorename)\r
6f49996c 1326 S_pcd_set = self.OverrideByFdfComm(S_pcd_set)\r
ae7b6df8
LG
1327 Str_Pcd_Values = self.GenerateByteArrayValue(S_pcd_set)\r
1328 if Str_Pcd_Values:\r
8518bf0b
LG
1329 for (skuname,StoreName,PcdGuid,PcdName,PcdValue) in Str_Pcd_Values:\r
1330 str_pcd_obj = S_pcd_set.get((PcdName, PcdGuid))\r
ae7b6df8 1331 if str_pcd_obj is None:\r
67e63e9a 1332 print PcdName, PcdGuid\r
ae7b6df8
LG
1333 raise\r
1334 if str_pcd_obj.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII],\r
1335 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
8518bf0b
LG
1336 if skuname not in str_pcd_obj.SkuInfoList:\r
1337 str_pcd_obj.SkuInfoList[skuname] = SkuInfoClass(SkuIdName=skuname, SkuId=self.SkuIds[skuname][0], HiiDefaultValue=PcdValue, DefaultStore = {StoreName:PcdValue})\r
ae7b6df8 1338 else:\r
8518bf0b
LG
1339 str_pcd_obj.SkuInfoList[skuname].HiiDefaultValue = PcdValue\r
1340 str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.update({StoreName:PcdValue})\r
ae7b6df8
LG
1341 elif str_pcd_obj.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],\r
1342 self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:\r
8518bf0b
LG
1343 if skuname in (self.SkuIdMgr.SystemSkuId, 'DEFAULT', 'COMMON'):\r
1344 str_pcd_obj.DefaultValue = PcdValue\r
ae7b6df8 1345 else:\r
8518bf0b 1346 if skuname not in str_pcd_obj.SkuInfoList:\r
65eff519
LG
1347 nextskuid = self.SkuIdMgr.GetNextSkuId(skuname)\r
1348 NoDefault = False\r
1349 while nextskuid not in str_pcd_obj.SkuInfoList:\r
1350 if nextskuid == "DEFAULT":\r
1351 NoDefault = True\r
1352 break\r
1353 nextskuid = self.SkuIdMgr.GetNextSkuId(nextskuid)\r
1354 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
1355 str_pcd_obj.SkuInfoList[skuname].SkuId = self.SkuIds[skuname][0]\r
1356 str_pcd_obj.SkuInfoList[skuname].SkuIdName = skuname\r
ae7b6df8 1357 else:\r
8518bf0b
LG
1358 str_pcd_obj.SkuInfoList[skuname].DefaultValue = PcdValue\r
1359 for str_pcd_obj in S_pcd_set.values():\r
1360 if str_pcd_obj.Type not in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII],\r
1361 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
1362 continue\r
1363 PcdDefaultStoreSet = set([defaultstorename for skuobj in str_pcd_obj.SkuInfoList.values() for defaultstorename in skuobj.DefaultStoreDict])\r
1364 DefaultStoreObj = DefaultStore(self._GetDefaultStores())\r
1365 mindefaultstorename = DefaultStoreObj.GetMin(PcdDefaultStoreSet)\r
1366 str_pcd_obj.SkuInfoList[self.SkuIdMgr.SystemSkuId].HiiDefaultValue = str_pcd_obj.SkuInfoList[self.SkuIdMgr.SystemSkuId].DefaultStoreDict[mindefaultstorename]\r
ae7b6df8
LG
1367\r
1368 for str_pcd_obj in S_pcd_set.values():\r
2b8a6c44 1369\r
ae7b6df8
LG
1370 str_pcd_obj.MaxDatumSize = self.GetStructurePcdMaxSize(str_pcd_obj)\r
1371 Pcds[str_pcd_obj.TokenCName, str_pcd_obj.TokenSpaceGuidCName] = str_pcd_obj\r
1372\r
65eff519
LG
1373 for pcdkey in Pcds:\r
1374 pcd = Pcds[pcdkey]\r
1375 if 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys():\r
1376 pcd.SkuInfoList['DEFAULT'] = pcd.SkuInfoList['COMMON']\r
1377 del(pcd.SkuInfoList['COMMON'])\r
1378 elif 'DEFAULT' in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys():\r
1379 del(pcd.SkuInfoList['COMMON'])\r
1380\r
1381 map(self.FilterSkuSettings,[Pcds[pcdkey] for pcdkey in Pcds if Pcds[pcdkey].Type in DynamicPcdType])\r
ae7b6df8
LG
1382 return Pcds\r
1383\r
1384 ## Retrieve non-dynamic PCD settings\r
1385 #\r
1386 # @param Type PCD type\r
1387 #\r
1388 # @retval a dict object contains settings of given PCD type\r
1389 #\r
1390 def _GetPcd(self, Type):\r
1391 Pcds = sdict()\r
1392 #\r
1393 # tdict is a special dict kind of type, used for selecting correct\r
1394 # PCD settings for certain ARCH\r
1395 #\r
2b8a6c44 1396 AvailableSkuIdSet = copy.copy(self.SkuIds)\r
ae7b6df8
LG
1397\r
1398 PcdDict = tdict(True, 3)\r
1399 PcdSet = set()\r
1400 # Find out all possible PCD candidates for self._Arch\r
1401 RecordList = self._RawData[Type, self._Arch]\r
ae7b6df8 1402 PcdValueDict = sdict()\r
8518bf0b 1403 for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, Dummy3, Dummy4,Dummy5 in RecordList:\r
2b8a6c44
LG
1404 SkuName = SkuName.upper()\r
1405 SkuName = 'DEFAULT' if SkuName == 'COMMON' else SkuName\r
1406 if SkuName not in AvailableSkuIdSet:\r
1407 EdkLogger.error('build ', PARAMETER_INVALID, 'Sku %s is not defined in [SkuIds] section' % SkuName,\r
1408 File=self.MetaFile, Line=Dummy5)\r
8518bf0b
LG
1409 if SkuName in (self.SkuIdMgr.SystemSkuId, 'DEFAULT', 'COMMON'):\r
1410 if "." not in TokenSpaceGuid:\r
5db9414c 1411 PcdSet.add((PcdCName, TokenSpaceGuid, SkuName, Dummy5))\r
ae7b6df8 1412 PcdDict[Arch, PcdCName, TokenSpaceGuid, SkuName] = Setting\r
ae7b6df8
LG
1413\r
1414 for PcdCName, TokenSpaceGuid, SkuName, Dummy4 in PcdSet:\r
1415 Setting = PcdDict[self._Arch, PcdCName, TokenSpaceGuid, SkuName]\r
1416 if Setting == None:\r
1417 continue\r
1418 PcdValue, DatumType, MaxDatumSize = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4)\r
1419 if (PcdCName, TokenSpaceGuid) in PcdValueDict:\r
1420 PcdValueDict[PcdCName, TokenSpaceGuid][SkuName] = (PcdValue, DatumType, MaxDatumSize)\r
1421 else:\r
1422 PcdValueDict[PcdCName, TokenSpaceGuid] = {SkuName:(PcdValue, DatumType, MaxDatumSize)}\r
1423\r
1424 PcdsKeys = PcdValueDict.keys()\r
1425 for PcdCName, TokenSpaceGuid in PcdsKeys:\r
1426\r
1427 PcdSetting = PcdValueDict[PcdCName, TokenSpaceGuid]\r
1428 PcdValue = None\r
1429 DatumType = None\r
1430 MaxDatumSize = None\r
1431 if 'COMMON' in PcdSetting:\r
1432 PcdValue, DatumType, MaxDatumSize = PcdSetting['COMMON']\r
1433 if 'DEFAULT' in PcdSetting:\r
1434 PcdValue, DatumType, MaxDatumSize = PcdSetting['DEFAULT']\r
8518bf0b
LG
1435 if self.SkuIdMgr.SystemSkuId in PcdSetting:\r
1436 PcdValue, DatumType, MaxDatumSize = PcdSetting[self.SkuIdMgr.SystemSkuId]\r
ae7b6df8
LG
1437\r
1438 Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject(\r
1439 PcdCName,\r
1440 TokenSpaceGuid,\r
1441 self._PCD_TYPE_STRING_[Type],\r
1442 DatumType,\r
1443 PcdValue,\r
1444 '',\r
1445 MaxDatumSize,\r
1446 {},\r
1447 False,\r
1448 None,\r
1449 IsDsc=True)\r
1450\r
1451\r
1452 return Pcds\r
1453\r
8518bf0b
LG
1454 def __UNICODE2OCTList(self,Value):\r
1455 Value = Value.strip()\r
1456 Value = Value[2:-1]\r
1457 List = []\r
1458 for Item in Value:\r
1459 Temp = '%04X' % ord(Item)\r
1460 List.append('0x' + Temp[2:4])\r
1461 List.append('0x' + Temp[0:2])\r
1462 List.append('0x00')\r
1463 List.append('0x00')\r
1464 return List\r
1465 def __STRING2OCTList(self,Value):\r
1466 OCTList = []\r
1467 Value = Value.strip('"')\r
1468 for char in Value:\r
1469 Temp = '%02X' % ord(char)\r
1470 OCTList.append('0x' + Temp)\r
1471 OCTList.append('0x00')\r
1472 return OCTList\r
1473\r
ae7b6df8
LG
1474 def GetStructurePcdMaxSize(self, str_pcd):\r
1475 pcd_default_value = str_pcd.DefaultValue\r
1476 sku_values = [skuobj.HiiDefaultValue if str_pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]] else skuobj.DefaultValue for skuobj in str_pcd.SkuInfoList.values()]\r
1477 sku_values.append(pcd_default_value)\r
1478\r
1479 def get_length(value):\r
1480 Value = value.strip()\r
a0939593
LG
1481 if len(value) > 1:\r
1482 if Value.startswith('GUID') and Value.endswith(')'):\r
1483 return 16\r
1484 if Value.startswith('L"') and Value.endswith('"'):\r
1485 return len(Value[2:-1])\r
1486 if Value[0] == '"' and Value[-1] == '"':\r
1487 return len(Value) - 2\r
1488 if Value[0] == '{' and Value[-1] == '}':\r
1489 return len(Value.split(","))\r
1490 if Value.startswith("L'") and Value.endswith("'") and len(list(Value[2:-1])) > 1:\r
1491 return len(list(Value[2:-1]))\r
1492 if Value[0] == "'" and Value[-1] == "'" and len(list(Value[1:-1])) > 1:\r
1493 return len(Value) - 2\r
ae7b6df8
LG
1494 return len(Value)\r
1495\r
1496 return str(max([pcd_size for pcd_size in [get_length(item) for item in sku_values]]))\r
1497\r
ae7b6df8
LG
1498 def ExecuteCommand (self, Command):\r
1499 try:\r
1500 Process = subprocess.Popen(Command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)\r
1501 except:\r
5db9414c 1502 EdkLogger.error('Build', COMMAND_FAILURE, 'Can not execute command: %s' % Command)\r
ae7b6df8 1503 Result = Process.communicate()\r
5db9414c 1504 return Process.returncode, Result[0], Result[1]\r
ae7b6df8
LG
1505\r
1506 def IntToCString(self, Value, ValueSize):\r
1507 Result = '"'\r
1508 if not isinstance (Value, str):\r
1509 for Index in range(0, ValueSize):\r
1510 Result = Result + '\\x%02x' % (Value & 0xff)\r
1511 Value = Value >> 8\r
1512 Result = Result + '"'\r
1513 return Result\r
1514\r
b854e2bf
B
1515 def GetPcdMaxSize(self,Pcd):\r
1516 MaxSize = int(Pcd.MaxDatumSize,10) if Pcd.MaxDatumSize else 0\r
1517 if Pcd.DatumType not in ['BOOLEAN','UINT8','UINT16','UINT32','UINT64']:\r
1518 if Pcd.PcdValueFromComm:\r
1519 if Pcd.PcdValueFromComm.startswith("{") and Pcd.PcdValueFromComm.endswith("}"):\r
1520 MaxSize = max([len(Pcd.PcdValueFromComm.split(",")),MaxSize])\r
1521 elif Pcd.PcdValueFromComm.startswith("\"") or Pcd.PcdValueFromComm.startswith("\'"):\r
1522 MaxSize = max([len(Pcd.PcdValueFromComm)-2+1,MaxSize])\r
1523 elif Pcd.PcdValueFromComm.startswith("L\""):\r
1524 MaxSize = max([2*(len(Pcd.PcdValueFromComm)-3+1),MaxSize])\r
1525 else:\r
1526 MaxSize = max([len(Pcd.PcdValueFromComm),MaxSize])\r
1527 elif Pcd.DatumType not in ['BOOLEAN','UINT8']:\r
1528 MaxSize = 1\r
1529 elif Pcd.DatumType == 'UINT16':\r
1530 MaxSize = 2\r
1531 elif Pcd.DatumType == 'UINT32':\r
1532 MaxSize = 4\r
1533 elif Pcd.DatumType == 'UINT64':\r
1534 MaxSize = 8\r
1535 return MaxSize\r
79820e32
B
1536 def GenerateSizeFunction(self,Pcd):\r
1537 CApp = "// Default Value in Dec \n"\r
1538 CApp = CApp + "void Cal_%s_%s_Size(UINT32 *Size){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
1539 for FieldList in [Pcd.DefaultValues]:\r
1540 if not FieldList:\r
1541 continue\r
1542 for FieldName in FieldList:\r
1543 FieldName = "." + FieldName\r
8565b582 1544 IsArray = IsFieldValueAnArray(FieldList[FieldName.strip(".")][0])\r
79820e32
B
1545 if IsArray and not (FieldList[FieldName.strip(".")][0].startswith('{GUID') and FieldList[FieldName.strip(".")][0].endswith('}')):\r
1546 try:\r
1547 Value = ValueExpressionEx(FieldList[FieldName.strip(".")][0], "VOID*", self._GuidDict)(True)\r
1548 except BadExpression:\r
1549 EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
1550 (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName.strip('.'))), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2]))\r
1551 Value, ValueSize = ParseFieldValue(Value)\r
1552 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
1553 else:\r
1554 NewFieldName = ''\r
1555 FieldName_ori = FieldName.strip('.')\r
1556 while '[' in FieldName:\r
1557 NewFieldName = NewFieldName + FieldName.split('[', 1)[0] + '[0]'\r
1558 ArrayIndex = int(FieldName.split('[', 1)[1].split(']', 1)[0])\r
1559 FieldName = FieldName.split(']', 1)[1]\r
1560 FieldName = NewFieldName + FieldName\r
1561 while '[' in FieldName:\r
1562 FieldName = FieldName.rsplit('[', 1)[0]\r
1563 CApp = CApp + ' __FLEXIBLE_SIZE(*Size, %s, %s, %d); // From %s Line %d Value %s\n' % (Pcd.DatumType, FieldName.strip("."), ArrayIndex + 1, FieldList[FieldName_ori][1], FieldList[FieldName_ori][2], FieldList[FieldName_ori][0])\r
1564 for skuname in Pcd.SkuOverrideValues:\r
1565 if skuname == "COMMON":\r
1566 continue\r
1567 for defaultstorenameitem in Pcd.SkuOverrideValues[skuname]:\r
1568 CApp = CApp + "// SkuName: %s, DefaultStoreName: %s \n" % (skuname, defaultstorenameitem)\r
1569 for FieldList in [Pcd.SkuOverrideValues[skuname].get(defaultstorenameitem)]:\r
1570 if not FieldList:\r
1571 continue\r
1572 for FieldName in FieldList:\r
1573 FieldName = "." + FieldName\r
8565b582 1574 IsArray = IsFieldValueAnArray(FieldList[FieldName.strip(".")][0])\r
79820e32
B
1575 if IsArray and not (FieldList[FieldName.strip(".")][0].startswith('{GUID') and FieldList[FieldName.strip(".")][0].endswith('}')):\r
1576 try:\r
1577 Value = ValueExpressionEx(FieldList[FieldName.strip(".")][0], "VOID*", self._GuidDict)(True)\r
1578 except BadExpression:\r
1579 EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
1580 (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName.strip('.'))), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2]))\r
1581 Value, ValueSize = ParseFieldValue(Value)\r
1582 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
1583 else:\r
1584 NewFieldName = ''\r
1585 FieldName_ori = FieldName.strip('.')\r
1586 while '[' in FieldName:\r
1587 NewFieldName = NewFieldName + FieldName.split('[', 1)[0] + '[0]'\r
1588 ArrayIndex = int(FieldName.split('[', 1)[1].split(']', 1)[0])\r
1589 FieldName = FieldName.split(']', 1)[1]\r
1590 FieldName = NewFieldName + FieldName\r
1591 while '[' in FieldName:\r
1592 FieldName = FieldName.rsplit('[', 1)[0]\r
1593 CApp = CApp + ' __FLEXIBLE_SIZE(*Size, %s, %s, %d); // From %s Line %d Value %s \n' % (Pcd.DatumType, FieldName.strip("."), ArrayIndex + 1, FieldList[FieldName_ori][1], FieldList[FieldName_ori][2], FieldList[FieldName_ori][0])\r
b854e2bf
B
1594 if Pcd.PcdFieldValueFromComm:\r
1595 CApp = CApp + "// From Command Line \n"\r
1596 for FieldName in Pcd.PcdFieldValueFromComm:\r
1597 FieldName = "." + FieldName\r
8565b582 1598 IsArray = IsFieldValueAnArray(Pcd.PcdFieldValueFromComm[FieldName.strip(".")][0])\r
1667eec6 1599 if IsArray and not (Pcd.PcdFieldValueFromComm[FieldName.strip(".")][0].startswith('{GUID') and Pcd.PcdFieldValueFromComm[FieldName.strip(".")][0].endswith('}')):\r
b854e2bf 1600 try:\r
1667eec6 1601 Value = ValueExpressionEx(Pcd.PcdFieldValueFromComm[FieldName.strip(".")][0], "VOID*", self._GuidDict)(True)\r
b854e2bf
B
1602 except BadExpression:\r
1603 EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
1667eec6 1604 (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName.strip('.'))), Pcd.PcdFieldValueFromComm[FieldName.strip(".")][1], Pcd.PcdFieldValueFromComm[FieldName.strip(".")][2]))\r
b854e2bf 1605 Value, ValueSize = ParseFieldValue(Value)\r
1667eec6 1606 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
1607 else:\r
1608 NewFieldName = ''\r
1609 FieldName_ori = FieldName.strip('.')\r
1610 while '[' in FieldName:\r
1611 NewFieldName = NewFieldName + FieldName.split('[', 1)[0] + '[0]'\r
1612 ArrayIndex = int(FieldName.split('[', 1)[1].split(']', 1)[0])\r
1613 FieldName = FieldName.split(']', 1)[1]\r
1614 FieldName = NewFieldName + FieldName\r
1615 while '[' in FieldName:\r
1616 FieldName = FieldName.rsplit('[', 1)[0]\r
1667eec6 1617 CApp = CApp + ' __FLEXIBLE_SIZE(*Size, %s, %s, %d); // From %s Line %d Value %s \n' % (Pcd.DatumType, FieldName.strip("."), ArrayIndex + 1, Pcd.PcdFieldValueFromComm[FieldName_ori][1], Pcd.PcdFieldValueFromComm[FieldName_ori][2], Pcd.PcdFieldValueFromComm[FieldName_ori][0])\r
b854e2bf 1618 CApp = CApp + " *Size = (%d > *Size ? %d : *Size); // The Pcd maxsize is %d \n" % (self.GetPcdMaxSize(Pcd),self.GetPcdMaxSize(Pcd),self.GetPcdMaxSize(Pcd))\r
79820e32
B
1619 CApp = CApp + "}\n"\r
1620 return CApp\r
1621 def GenerateSizeStatments(self,Pcd):\r
1622 CApp = ' Size = sizeof(%s);\n' % (Pcd.DatumType)\r
1623 CApp = CApp + ' Cal_%s_%s_Size(&Size);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
1624 return CApp\r
1625 def GenerateDefaultValueAssignFunction(self,Pcd):\r
1626 CApp = "// Default value in Dec \n"\r
1627 CApp = CApp + "void Assign_%s_%s_Default_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Pcd.DatumType)\r
1628 CApp = CApp + ' UINT32 FieldSize;\n'\r
1629 CApp = CApp + ' CHAR8 *Value;\n'\r
1630 DefaultValueFromDec = Pcd.DefaultValueFromDec\r
8565b582 1631 IsArray = IsFieldValueAnArray(Pcd.DefaultValueFromDec)\r
79820e32
B
1632 if IsArray:\r
1633 try:\r
1634 DefaultValueFromDec = ValueExpressionEx(Pcd.DefaultValueFromDec, "VOID*")(True)\r
1635 except BadExpression:\r
1636 EdkLogger.error("Build", FORMAT_INVALID, "Invalid value format for %s.%s, from DEC: %s" %\r
1637 (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, DefaultValueFromDec))\r
0f228f19 1638 DefaultValueFromDec = StringToArray(DefaultValueFromDec)\r
79820e32
B
1639 Value, ValueSize = ParseFieldValue (DefaultValueFromDec)\r
1640 if isinstance(Value, str):\r
1641 CApp = CApp + ' Pcd = %s; // From DEC Default Value %s\n' % (Value, Pcd.DefaultValueFromDec)\r
1642 elif IsArray:\r
1643 #\r
1644 # Use memcpy() to copy value into field\r
1645 #\r
1646 CApp = CApp + ' Value = %s; // From DEC Default Value %s\n' % (self.IntToCString(Value, ValueSize), Pcd.DefaultValueFromDec)\r
1647 CApp = CApp + ' memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
1648 for FieldList in [Pcd.DefaultValues]:\r
1649 if not FieldList:\r
1650 continue\r
1651 for FieldName in FieldList:\r
8565b582 1652 IsArray = IsFieldValueAnArray(FieldList[FieldName][0])\r
79820e32
B
1653 if IsArray:\r
1654 try:\r
1655 FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], "VOID*", self._GuidDict)(True)\r
1656 except BadExpression:\r
1657 EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
1658 (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName)), FieldList[FieldName][1],FieldList[FieldName][2]))\r
1659\r
1660 try:\r
1661 Value, ValueSize = ParseFieldValue (FieldList[FieldName][0])\r
1662 except Exception:\r
1663 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
1664 if isinstance(Value, str):\r
1665 CApp = CApp + ' Pcd->%s = %s; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
1666 elif IsArray:\r
1667 #\r
1668 # Use memcpy() to copy value into field\r
1669 #\r
1670 CApp = CApp + ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.DatumType, FieldName)\r
1671 CApp = CApp + ' Value = %s; // From %s Line %d Value %s\n' % (self.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
1672 CApp = CApp + ' memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)\r
1673 else:\r
1674 if ValueSize > 4:\r
1675 CApp = CApp + ' Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
1676 else:\r
1677 CApp = CApp + ' Pcd->%s = %d; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
f3b31433
FB
1678 CApp = CApp + "}\n"\r
1679 return CApp\r
1680 def GenerateDefaultValueAssignStatement(self,Pcd):\r
1681 CApp = ' Assign_%s_%s_Default_Value(Pcd);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
1682 return CApp\r
1683 def GenerateInitValueFunction(self,Pcd,SkuName,DefaultStoreName):\r
1684 CApp = "// Value in Dsc for Sku: %s, DefaultStore %s\n" % (SkuName,DefaultStoreName)\r
1685 CApp = CApp + "void Assign_%s_%s_%s_%s_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName,DefaultStoreName,Pcd.DatumType)\r
1686 CApp = CApp + ' UINT32 FieldSize;\n'\r
1687 CApp = CApp + ' CHAR8 *Value;\n'\r
1688\r
79820e32 1689 CApp = CApp + "// SkuName: %s, DefaultStoreName: %s \n" % ('DEFAULT', 'STANDARD')\r
f3b31433
FB
1690 inherit_OverrideValues = Pcd.SkuOverrideValues[SkuName]\r
1691 if (SkuName,DefaultStoreName) == ('DEFAULT','STANDARD'):\r
1692 pcddefaultvalue = Pcd.DefaultFromDSC.get('DEFAULT',{}).get('STANDARD', Pcd.DefaultValue) if Pcd.DefaultFromDSC else Pcd.DefaultValue\r
1693 else:\r
f832bb34
FB
1694 if not Pcd.DscRawValue:\r
1695 # handle the case that structure pcd is not appear in DSC\r
1696 self.CopyDscRawValue(Pcd)\r
f3b31433
FB
1697 pcddefaultvalue = Pcd.DscRawValue.get(SkuName,{}).get(DefaultStoreName)\r
1698 for FieldList in [pcddefaultvalue,inherit_OverrideValues.get(DefaultStoreName)]:\r
79820e32
B
1699 if not FieldList:\r
1700 continue\r
1701 if pcddefaultvalue and FieldList == pcddefaultvalue:\r
8565b582 1702 IsArray = IsFieldValueAnArray(FieldList)\r
79820e32
B
1703 if IsArray:\r
1704 try:\r
1705 FieldList = ValueExpressionEx(FieldList, "VOID*")(True)\r
1706 except BadExpression:\r
1707 EdkLogger.error("Build", FORMAT_INVALID, "Invalid value format for %s.%s, from DSC: %s" %\r
1708 (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldList))\r
1709 Value, ValueSize = ParseFieldValue (FieldList)\r
f3b31433
FB
1710\r
1711 if (SkuName,DefaultStoreName) == ('DEFAULT','STANDARD'):\r
1712 if isinstance(Value, str):\r
1713 CApp = CApp + ' Pcd = %s; // From DSC Default Value %s\n' % (Value, Pcd.DefaultFromDSC.get('DEFAULT',{}).get('STANDARD', Pcd.DefaultValue) if Pcd.DefaultFromDSC else Pcd.DefaultValue)\r
1714 elif IsArray:\r
1715 #\r
1716 # Use memcpy() to copy value into field\r
1717 #\r
1718 CApp = CApp + ' Value = %s; // From DSC Default Value %s\n' % (self.IntToCString(Value, ValueSize), Pcd.DefaultFromDSC.get('DEFAULT',{}).get('STANDARD', Pcd.DefaultValue) if Pcd.DefaultFromDSC else Pcd.DefaultValue)\r
1719 CApp = CApp + ' memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
1720 else:\r
1721 if isinstance(Value, str):\r
1722 CApp = CApp + ' Pcd = %s; // From DSC Default Value %s\n' % (Value, Pcd.DscRawValue.get(SkuName,{}).get(DefaultStoreName))\r
1723 elif IsArray:\r
1724 #\r
1725 # Use memcpy() to copy value into field\r
1726 #\r
1727 CApp = CApp + ' Value = %s; // From DSC Default Value %s\n' % (self.IntToCString(Value, ValueSize), Pcd.DscRawValue.get(SkuName,{}).get(DefaultStoreName))\r
1728 CApp = CApp + ' memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
79820e32 1729 continue\r
f3b31433
FB
1730 if (SkuName,DefaultStoreName) == ('DEFAULT','STANDARD') or (( (SkuName,'') not in Pcd.ValueChain) and ( (SkuName,DefaultStoreName) not in Pcd.ValueChain )):\r
1731 for FieldName in FieldList:\r
8565b582 1732 IsArray = IsFieldValueAnArray(FieldList[FieldName][0])\r
f3b31433
FB
1733 if IsArray:\r
1734 try:\r
1735 FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], "VOID*", self._GuidDict)(True)\r
1736 except BadExpression:\r
1737 EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
1738 (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName)), FieldList[FieldName][1], FieldList[FieldName][2]))\r
79820e32 1739 try:\r
f3b31433
FB
1740 Value, ValueSize = ParseFieldValue (FieldList[FieldName][0])\r
1741 except Exception:\r
1742 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
1743 if isinstance(Value, str):\r
1744 CApp = CApp + ' Pcd->%s = %s; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
1745 elif IsArray:\r
1746 #\r
1747 # Use memcpy() to copy value into field\r
1748 #\r
1749 CApp = CApp + ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.DatumType, FieldName)\r
1750 CApp = CApp + ' Value = %s; // From %s Line %d Value %s\n' % (self.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
1751 CApp = CApp + ' memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)\r
79820e32 1752 else:\r
f3b31433
FB
1753 if ValueSize > 4:\r
1754 CApp = CApp + ' Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
1755 else:\r
1756 CApp = CApp + ' Pcd->%s = %d; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
79820e32
B
1757 CApp = CApp + "}\n"\r
1758 return CApp\r
f3b31433
FB
1759 def GenerateInitValueStatement(self,Pcd,SkuName,DefaultStoreName):\r
1760 CApp = ' Assign_%s_%s_%s_%s_Value(Pcd);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,SkuName,DefaultStoreName)\r
79820e32 1761 return CApp\r
b854e2bf
B
1762 def GenerateCommandLineValue(self,Pcd):\r
1763 CApp = "// Value in CommandLine\n"\r
1764 CApp = CApp + "void Assign_%s_%s_CommandLine_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Pcd.DatumType)\r
1765 CApp = CApp + ' UINT32 FieldSize;\n'\r
1766 CApp = CApp + ' CHAR8 *Value;\n'\r
1767\r
1768 pcddefaultvalue = Pcd.PcdValueFromComm\r
1769 for FieldList in [pcddefaultvalue,Pcd.PcdFieldValueFromComm]:\r
1770 if not FieldList:\r
1771 continue\r
1772 if pcddefaultvalue and FieldList == pcddefaultvalue:\r
8565b582 1773 IsArray = IsFieldValueAnArray(FieldList)\r
b854e2bf
B
1774 if IsArray:\r
1775 try:\r
1776 FieldList = ValueExpressionEx(FieldList, "VOID*")(True)\r
1777 except BadExpression:\r
0f228f19 1778 EdkLogger.error("Build", FORMAT_INVALID, "Invalid value format for %s.%s, from Command: %s" %\r
b854e2bf
B
1779 (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldList))\r
1780 Value, ValueSize = ParseFieldValue (FieldList)\r
1781\r
1782 if isinstance(Value, str):\r
1783 CApp = CApp + ' Pcd = %s; // From Command Line \n' % (Value)\r
1784 elif IsArray:\r
1785 #\r
1786 # Use memcpy() to copy value into field\r
1787 #\r
1788 CApp = CApp + ' Value = %s; // From Command Line.\n' % (self.IntToCString(Value, ValueSize))\r
1789 CApp = CApp + ' memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
1790 continue\r
1791 for FieldName in FieldList:\r
8565b582 1792 IsArray = IsFieldValueAnArray(FieldList[FieldName][0])\r
b854e2bf
B
1793 if IsArray:\r
1794 try:\r
1795 FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], "VOID*", self._GuidDict)(True)\r
1796 except BadExpression:\r
1797 EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
1798 (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName)), FieldList[FieldName][1], FieldList[FieldName][2]))\r
1799 except:\r
1800 print "error"\r
1801 try:\r
1802 Value, ValueSize = ParseFieldValue (FieldList[FieldName][0])\r
1803 except Exception:\r
1804 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
1805 if isinstance(Value, str):\r
1806 CApp = CApp + ' Pcd->%s = %s; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
1807 elif IsArray:\r
1808 #\r
1809 # Use memcpy() to copy value into field\r
1810 #\r
1811 CApp = CApp + ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.DatumType, FieldName)\r
1812 CApp = CApp + ' Value = %s; // From %s Line %d Value %s\n' % (self.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
1813 CApp = CApp + ' memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)\r
1814 else:\r
1815 if ValueSize > 4:\r
1816 CApp = CApp + ' Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
1817 else:\r
1818 CApp = CApp + ' Pcd->%s = %d; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
1819 CApp = CApp + "}\n"\r
1820 return CApp\r
1821 def GenerateCommandLineValueStatement(self,Pcd):\r
1822 CApp = ' Assign_%s_%s_CommandLine_Value(Pcd);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
1823 return CApp\r
f3b31433
FB
1824 def GenerateInitializeFunc(self, SkuName, DefaultStore, Pcd, InitByteValue, CApp):\r
1825 OverrideValues = {DefaultStore:""}\r
ae7b6df8
LG
1826 if Pcd.SkuOverrideValues:\r
1827 OverrideValues = Pcd.SkuOverrideValues[SkuName]\r
8518bf0b
LG
1828 for DefaultStoreName in OverrideValues.keys():\r
1829 CApp = CApp + 'void\n'\r
1830 CApp = CApp + 'Initialize_%s_%s_%s_%s(\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
1831 CApp = CApp + ' void\n'\r
1832 CApp = CApp + ' )\n'\r
1833 CApp = CApp + '{\n'\r
1834 CApp = CApp + ' UINT32 Size;\n'\r
1835 CApp = CApp + ' UINT32 FieldSize;\n'\r
b2395724 1836 CApp = CApp + ' CHAR8 *Value;\n'\r
8518bf0b
LG
1837 CApp = CApp + ' UINT32 OriginalSize;\n'\r
1838 CApp = CApp + ' VOID *OriginalPcd;\n'\r
6a103440 1839 CApp = CApp + ' %s *Pcd; // From %s Line %d \n' % (Pcd.DatumType, Pcd.PkgPath, Pcd.PcdDefineLineNo)\r
8518bf0b 1840 CApp = CApp + '\n'\r
47854fd5 1841\r
8e011d83 1842 if SkuName in Pcd.SkuInfoList:\r
f3b31433 1843 DefaultValue = Pcd.SkuInfoList[SkuName].DefaultStoreDict.get(DefaultStoreName,Pcd.SkuInfoList[SkuName].HiiDefaultValue if Pcd.SkuInfoList[SkuName].HiiDefaultValue else Pcd.SkuInfoList[SkuName].DefaultValue)\r
8e011d83
FB
1844 else:\r
1845 DefaultValue = Pcd.DefaultValue\r
1846 PcdDefaultValue = StringToArray(DefaultValue.strip())\r
47854fd5 1847\r
8518bf0b 1848 InitByteValue += '%s.%s.%s.%s|%s|%s\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.DatumType, PcdDefaultValue)\r
ae7b6df8 1849\r
8518bf0b
LG
1850 #\r
1851 # Get current PCD value and size\r
1852 #\r
1853 CApp = CApp + ' OriginalPcd = PcdGetPtr (%s, %s, %s, %s, &OriginalSize);\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
ae7b6df8 1854\r
8518bf0b
LG
1855 #\r
1856 # Determine the size of the PCD. For simple structures, sizeof(TYPE) provides\r
1857 # the correct value. For structures with a flexible array member, the flexible\r
1858 # array member is detected, and the size is based on the highest index used with\r
1859 # the flexible array member. The flexible array member must be the last field\r
1860 # in a structure. The size formula for this case is:\r
1861 # OFFSET_OF(FlexbleArrayField) + sizeof(FlexibleArray[0]) * (HighestIndex + 1)\r
1862 #\r
79820e32 1863 CApp = CApp + self.GenerateSizeStatments(Pcd)\r
ae7b6df8 1864\r
8518bf0b
LG
1865 #\r
1866 # Allocate and zero buffer for the PCD\r
1867 # Must handle cases where current value is smaller, larger, or same size\r
1868 # Always keep that larger one as the current size\r
1869 #\r
1870 CApp = CApp + ' Size = (OriginalSize > Size ? OriginalSize : Size);\n'\r
1871 CApp = CApp + ' Pcd = (%s *)malloc (Size);\n' % (Pcd.DatumType)\r
1872 CApp = CApp + ' memset (Pcd, 0, Size);\n'\r
ae7b6df8 1873\r
8518bf0b
LG
1874 #\r
1875 # Copy current PCD value into allocated buffer.\r
1876 #\r
1877 CApp = CApp + ' memcpy (Pcd, OriginalPcd, OriginalSize);\n'\r
ae7b6df8 1878\r
8518bf0b
LG
1879 #\r
1880 # Assign field values in PCD\r
1881 #\r
79820e32 1882 CApp = CApp + self.GenerateDefaultValueAssignStatement(Pcd)\r
f3b31433
FB
1883 if Pcd.Type not in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],\r
1884 self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:\r
1885 for skuname in self.SkuIdMgr.GetSkuChain(SkuName):\r
1886 storeset = [DefaultStoreName] if DefaultStoreName == 'STANDARD' else ['STANDARD', DefaultStoreName]\r
1887 for defaultstorenameitem in storeset:\r
1888 CApp = CApp + "// SkuName: %s, DefaultStoreName: %s \n" % (skuname, defaultstorenameitem)\r
1889 CApp = CApp + self.GenerateInitValueStatement(Pcd,skuname,defaultstorenameitem)\r
1890 if skuname == SkuName:\r
1891 break\r
1892 else:\r
f832bb34
FB
1893 CApp = CApp + "// SkuName: %s, DefaultStoreName: STANDARD \n" % self.SkuIdMgr.SystemSkuId\r
1894 CApp = CApp + self.GenerateInitValueStatement(Pcd,self.SkuIdMgr.SystemSkuId,"STANDARD")\r
b854e2bf 1895 CApp = CApp + self.GenerateCommandLineValueStatement(Pcd)\r
8518bf0b
LG
1896 #\r
1897 # Set new PCD value and size\r
1898 #\r
1899 CApp = CApp + ' PcdSetPtr (%s, %s, %s, %s, Size, (UINT8 *)Pcd);\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
ae7b6df8 1900\r
8518bf0b
LG
1901 #\r
1902 # Free PCD\r
1903 #\r
1904 CApp = CApp + ' free (Pcd);\n'\r
1905 CApp = CApp + '}\n'\r
1906 CApp = CApp + '\n'\r
ae7b6df8
LG
1907 return InitByteValue, CApp\r
1908\r
1909 def GenerateByteArrayValue (self, StructuredPcds):\r
1910 #\r
1911 # Generate/Compile/Run C application to determine if there are any flexible array members\r
1912 #\r
1913 if not StructuredPcds:\r
1914 return\r
1915\r
1916 InitByteValue = ""\r
1917 CApp = PcdMainCHeader\r
1918\r
1919 Includes = {}\r
1920 for PcdName in StructuredPcds:\r
1921 Pcd = StructuredPcds[PcdName]\r
81add864
FB
1922 for IncludeFile in Pcd.StructuredPcdIncludeFile:\r
1923 if IncludeFile not in Includes:\r
1924 Includes[IncludeFile] = True\r
1925 CApp = CApp + '#include <%s>\n' % (IncludeFile)\r
ae7b6df8 1926 CApp = CApp + '\n'\r
ae7b6df8
LG
1927 for PcdName in StructuredPcds:\r
1928 Pcd = StructuredPcds[PcdName]\r
79820e32
B
1929 CApp = CApp + self.GenerateSizeFunction(Pcd)\r
1930 CApp = CApp + self.GenerateDefaultValueAssignFunction(Pcd)\r
b854e2bf 1931 CApp = CApp + self.GenerateCommandLineValue(Pcd)\r
f3b31433
FB
1932 if not Pcd.SkuOverrideValues or Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],\r
1933 self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:\r
1934 CApp = CApp + self.GenerateInitValueFunction(Pcd,self.SkuIdMgr.SystemSkuId, 'STANDARD')\r
1935 else:\r
1936 for SkuName in self.SkuIdMgr.SkuOverrideOrder():\r
1937 if SkuName not in Pcd.SkuOverrideValues:\r
1938 continue\r
1939 for DefaultStoreName in Pcd.SkuOverrideValues[SkuName]:\r
1940 CApp = CApp + self.GenerateInitValueFunction(Pcd,SkuName,DefaultStoreName)\r
0a57a978
FB
1941 if not Pcd.SkuOverrideValues or Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],\r
1942 self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:\r
8518bf0b 1943 InitByteValue, CApp = self.GenerateInitializeFunc(self.SkuIdMgr.SystemSkuId, 'STANDARD', Pcd, InitByteValue, CApp)\r
ae7b6df8 1944 else:\r
c05c2c05
LG
1945 for SkuName in self.SkuIdMgr.SkuOverrideOrder():\r
1946 if SkuName not in Pcd.SkuOverrideValues:\r
1947 continue\r
ae7b6df8
LG
1948 for DefaultStoreName in Pcd.DefaultStoreName:\r
1949 Pcd = StructuredPcds[PcdName]\r
1950 InitByteValue, CApp = self.GenerateInitializeFunc(SkuName, DefaultStoreName, Pcd, InitByteValue, CApp)\r
1951\r
1952 CApp = CApp + 'VOID\n'\r
1953 CApp = CApp + 'PcdEntryPoint(\n'\r
1954 CApp = CApp + ' VOID\n'\r
1955 CApp = CApp + ' )\n'\r
1956 CApp = CApp + '{\n'\r
1957 for Pcd in StructuredPcds.values():\r
0a57a978 1958 if not 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
8518bf0b 1959 CApp = CApp + ' Initialize_%s_%s_%s_%s();\n' % (self.SkuIdMgr.SystemSkuId, 'STANDARD', Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
ae7b6df8 1960 else:\r
c05c2c05
LG
1961 for SkuName in self.SkuIdMgr.SkuOverrideOrder():\r
1962 if SkuName not in Pcd.SkuOverrideValues:\r
1963 continue\r
8518bf0b 1964 for DefaultStoreName in Pcd.SkuOverrideValues[SkuName]:\r
ae7b6df8
LG
1965 CApp = CApp + ' Initialize_%s_%s_%s_%s();\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
1966 CApp = CApp + '}\n'\r
1967\r
1968 CApp = CApp + PcdMainCEntry + '\n'\r
1969\r
1970 if not os.path.exists(self.OutputPath):\r
1971 os.makedirs(self.OutputPath)\r
1972 CAppBaseFileName = os.path.join(self.OutputPath, PcdValueInitName)\r
0a57a978 1973 SaveFileOnChange(CAppBaseFileName + '.c', CApp, False)\r
ae7b6df8
LG
1974\r
1975 MakeApp = PcdMakefileHeader\r
1976 if sys.platform == "win32":\r
0a57a978 1977 MakeApp = MakeApp + 'APPNAME = %s\n' % (PcdValueInitName) + 'OBJECTS = %s\%s.obj\n' % (self.OutputPath, PcdValueInitName) + 'INC = '\r
ae7b6df8
LG
1978 else:\r
1979 MakeApp = MakeApp + PcdGccMakefile\r
1980 MakeApp = MakeApp + 'APPNAME = %s\n' % (PcdValueInitName) + 'OBJECTS = %s/%s.o\n' % (self.OutputPath, PcdValueInitName) + \\r
68ba919f 1981 'include $(MAKEROOT)/Makefiles/app.makefile\n' + 'INCLUDE +='\r
ae7b6df8
LG
1982\r
1983 PlatformInc = {}\r
1984 for Cache in self._Bdb._CACHE_.values():\r
1985 if Cache.MetaFile.Ext.lower() != '.dec':\r
1986 continue\r
1987 if Cache.Includes:\r
1988 if str(Cache.MetaFile.Path) not in PlatformInc:\r
0a57a978 1989 PlatformInc[str(Cache.MetaFile.Path)] = Cache.CommonIncludes\r
ae7b6df8
LG
1990\r
1991 PcdDependDEC = []\r
1992 for Pcd in StructuredPcds.values():\r
1993 for PackageDec in Pcd.PackageDecs:\r
1994 Package = os.path.normpath(mws.join(GlobalData.gWorkspace, PackageDec))\r
1995 if not os.path.exists(Package):\r
1996 EdkLogger.error('Build', RESOURCE_NOT_AVAILABLE, "The dependent Package %s of PCD %s.%s is not exist." % (PackageDec, Pcd.TokenSpaceGuidCName, Pcd.TokenCName))\r
1997 if Package not in PcdDependDEC:\r
1998 PcdDependDEC.append(Package)\r
1999\r
2000 if PlatformInc and PcdDependDEC:\r
2001 for pkg in PcdDependDEC:\r
2002 if pkg in PlatformInc:\r
2003 for inc in PlatformInc[pkg]:\r
2004 MakeApp += '-I' + str(inc) + ' '\r
2005 MakeApp = MakeApp + '\n'\r
68ba919f
YZ
2006\r
2007 CC_FLAGS = LinuxCFLAGS\r
2008 if sys.platform == "win32":\r
2009 CC_FLAGS = WindowsCFLAGS\r
2010 BuildOptions = {}\r
2011 for Options in self.BuildOptions:\r
2012 if Options[2] != EDKII_NAME:\r
2013 continue\r
2014 Family = Options[0]\r
2015 if Family and Family != self.ToolChainFamily:\r
2016 continue\r
2017 Target, Tag, Arch, Tool, Attr = Options[1].split("_")\r
2018 if Tool != 'CC':\r
2019 continue\r
2020\r
2021 if Target == "*" or Target == self._Target:\r
2022 if Tag == "*" or Tag == self._Toolchain:\r
2023 if Arch == "*" or Arch == self.Arch:\r
2024 if Tool not in BuildOptions:\r
2025 BuildOptions[Tool] = {}\r
2026 if Attr != "FLAGS" or Attr not in BuildOptions[Tool] or self.BuildOptions[Options].startswith('='):\r
2027 BuildOptions[Tool][Attr] = self.BuildOptions[Options]\r
2028 else:\r
2029 # append options for the same tool except PATH\r
2030 if Attr != 'PATH':\r
2031 BuildOptions[Tool][Attr] += " " + self.BuildOptions[Options]\r
2032 else:\r
2033 BuildOptions[Tool][Attr] = self.BuildOptions[Options]\r
2034 if BuildOptions:\r
2035 for Tool in BuildOptions:\r
2036 for Attr in BuildOptions[Tool]:\r
2037 if Attr == "FLAGS":\r
2038 Value = BuildOptions[Tool][Attr]\r
2039 ValueList = Value.split()\r
2040 if ValueList:\r
2041 for Id, Item in enumerate(ValueList):\r
2042 if Item == '-D' or Item == '/D':\r
2043 CC_FLAGS += ' ' + Item\r
2044 if Id + 1 < len(ValueList):\r
2045 CC_FLAGS += ' ' + ValueList[Id + 1]\r
2046 elif Item.startswith('/D') or Item.startswith('-D'):\r
2047 CC_FLAGS += ' ' + Item\r
2048 MakeApp += CC_FLAGS\r
2049\r
ae7b6df8
LG
2050 if sys.platform == "win32":\r
2051 MakeApp = MakeApp + PcdMakefileEnd\r
2052 MakeFileName = os.path.join(self.OutputPath, 'Makefile')\r
0a57a978 2053 SaveFileOnChange(MakeFileName, MakeApp, False)\r
ae7b6df8
LG
2054\r
2055 InputValueFile = os.path.join(self.OutputPath, 'Input.txt')\r
2056 OutputValueFile = os.path.join(self.OutputPath, 'Output.txt')\r
0a57a978 2057 SaveFileOnChange(InputValueFile, InitByteValue, False)\r
ae7b6df8
LG
2058\r
2059 PcdValueInitExe = PcdValueInitName\r
2060 if not sys.platform == "win32":\r
2061 PcdValueInitExe = os.path.join(os.getenv("EDK_TOOLS_PATH"), 'Source', 'C', 'bin', PcdValueInitName)\r
5db9414c 2062 else:\r
0a57a978
FB
2063 PcdValueInitExe = os.path.join(os.getenv("EDK_TOOLS_PATH"), 'Bin', 'Win32', PcdValueInitName) +".exe"\r
2064 if not os.path.exists(PcdValueInitExe) or self.NeedUpdateOutput(OutputValueFile, CAppBaseFileName + '.c',MakeFileName,InputValueFile):\r
2065 Messages = ''\r
2066 if sys.platform == "win32":\r
2067 MakeCommand = 'nmake clean & nmake -f %s' % (MakeFileName)\r
2068 returncode, StdOut, StdErr = self.ExecuteCommand (MakeCommand)\r
2069 Messages = StdOut\r
2070 else:\r
2071 MakeCommand = 'make clean & make -f %s' % (MakeFileName)\r
2072 returncode, StdOut, StdErr = self.ExecuteCommand (MakeCommand)\r
2073 Messages = StdErr\r
2074 Messages = Messages.split('\n')\r
2075 MessageGroup = []\r
2076 if returncode <>0:\r
2077 CAppBaseFileName = os.path.join(self.OutputPath, PcdValueInitName)\r
2078 File = open (CAppBaseFileName + '.c', 'r')\r
2079 FileData = File.readlines()\r
2080 File.close()\r
2081 for Message in Messages:\r
2082 if " error" in Message or "warning" in Message:\r
2083 FileInfo = Message.strip().split('(')\r
2084 if len (FileInfo) > 1:\r
2085 FileName = FileInfo [0]\r
2086 FileLine = FileInfo [1].split (')')[0]\r
2087 else:\r
2088 FileInfo = Message.strip().split(':')\r
2089 FileName = FileInfo [0]\r
2090 FileLine = FileInfo [1]\r
2091 if FileLine.isdigit():\r
2092 error_line = FileData[int (FileLine) - 1]\r
2093 if r"//" in error_line:\r
2094 c_line,dsc_line = error_line.split(r"//")\r
2095 else:\r
2096 dsc_line = error_line\r
2097 message_itmes = Message.split(":")\r
2098 Index = 0\r
2099 if "PcdValueInit.c" not in Message:\r
2100 if not MessageGroup:\r
2101 MessageGroup.append(Message)\r
2102 break\r
2103 else:\r
2104 for item in message_itmes:\r
2105 if "PcdValueInit.c" in item:\r
2106 Index = message_itmes.index(item)\r
2107 message_itmes[Index] = dsc_line.strip()\r
2108 break\r
2109 MessageGroup.append(":".join(message_itmes[Index:]).strip())\r
2110 continue\r
2111 else:\r
2112 MessageGroup.append(Message)\r
2113 if MessageGroup:\r
2114 EdkLogger.error("build", PCD_STRUCTURE_PCD_ERROR, "\n".join(MessageGroup) )\r
2115 else:\r
2116 EdkLogger.error('Build', COMMAND_FAILURE, 'Can not execute command: %s' % MakeCommand)\r
2117 Command = PcdValueInitExe + ' -i %s -o %s' % (InputValueFile, OutputValueFile)\r
2118 returncode, StdOut, StdErr = self.ExecuteCommand (Command)\r
2119 if returncode <> 0:\r
2120 EdkLogger.warn('Build', COMMAND_FAILURE, 'Can not collect output from command: %s' % Command)\r
2121\r
2122 File = open (OutputValueFile, 'r')\r
2123 FileBuffer = File.readlines()\r
2124 File.close()\r
ae7b6df8
LG
2125\r
2126 StructurePcdSet = []\r
2127 for Pcd in FileBuffer:\r
2128 PcdValue = Pcd.split ('|')\r
2129 PcdInfo = PcdValue[0].split ('.')\r
8518bf0b 2130 StructurePcdSet.append((PcdInfo[0],PcdInfo[1], PcdInfo[2], PcdInfo[3], PcdValue[2].strip()))\r
ae7b6df8
LG
2131 return StructurePcdSet\r
2132\r
0a57a978
FB
2133 def NeedUpdateOutput(self,OutputFile, ValueCFile, MakeFile, StructureInput):\r
2134 if not os.path.exists(OutputFile):\r
2135 return True\r
2136 if os.stat(OutputFile).st_mtime <= os.stat(ValueCFile).st_mtime:\r
2137 return True\r
2138 if os.stat(OutputFile).st_mtime <= os.stat(MakeFile).st_mtime:\r
2139 return True\r
2140 if os.stat(OutputFile).st_mtime <= os.stat(StructureInput).st_mtime:\r
2141 return True\r
2142 return False\r
2143\r
ae7b6df8
LG
2144 ## Retrieve dynamic PCD settings\r
2145 #\r
2146 # @param Type PCD type\r
2147 #\r
2148 # @retval a dict object contains settings of given PCD type\r
2149 #\r
2150 def _GetDynamicPcd(self, Type):\r
2151\r
ae7b6df8
LG
2152\r
2153 Pcds = sdict()\r
2154 #\r
2155 # tdict is a special dict kind of type, used for selecting correct\r
2156 # PCD settings for certain ARCH and SKU\r
2157 #\r
2158 PcdDict = tdict(True, 4)\r
2159 PcdList = []\r
2160 # Find out all possible PCD candidates for self._Arch\r
2161 RecordList = self._RawData[Type, self._Arch]\r
8518bf0b 2162 AvailableSkuIdSet = copy.copy(self.SkuIds)\r
ae7b6df8 2163\r
ae7b6df8 2164\r
8518bf0b 2165 for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, Dummy3, Dummy4,Dummy5 in RecordList:\r
2b8a6c44
LG
2166 SkuName = SkuName.upper()\r
2167 SkuName = 'DEFAULT' if SkuName == 'COMMON' else SkuName\r
ae7b6df8 2168 if SkuName not in AvailableSkuIdSet:\r
2b8a6c44
LG
2169 EdkLogger.error('build', PARAMETER_INVALID, 'Sku %s is not defined in [SkuIds] section' % SkuName,\r
2170 File=self.MetaFile, Line=Dummy5)\r
ae7b6df8 2171 if "." not in TokenSpaceGuid:\r
5db9414c 2172 PcdList.append((PcdCName, TokenSpaceGuid, SkuName, Dummy5))\r
ae7b6df8
LG
2173 PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid] = Setting\r
2174\r
2175 # Remove redundant PCD candidates, per the ARCH and SKU\r
2176 for PcdCName, TokenSpaceGuid, SkuName, Dummy4 in PcdList:\r
2177\r
2178 Setting = PcdDict[self._Arch, SkuName, PcdCName, TokenSpaceGuid]\r
2179 if Setting == None:\r
2180 continue\r
2181\r
2182 PcdValue, DatumType, MaxDatumSize = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4)\r
8518bf0b 2183 SkuInfo = SkuInfoClass(SkuName, self.SkuIds[SkuName][0], '', '', '', '', '', PcdValue)\r
ae7b6df8
LG
2184 if (PcdCName, TokenSpaceGuid) in Pcds.keys():\r
2185 pcdObject = Pcds[PcdCName, TokenSpaceGuid]\r
2186 pcdObject.SkuInfoList[SkuName] = SkuInfo\r
2187 if MaxDatumSize.strip():\r
2188 CurrentMaxSize = int(MaxDatumSize.strip(), 0)\r
2189 else:\r
2190 CurrentMaxSize = 0\r
2191 if pcdObject.MaxDatumSize:\r
2192 PcdMaxSize = int(pcdObject.MaxDatumSize, 0)\r
2193 else:\r
2194 PcdMaxSize = 0\r
2195 if CurrentMaxSize > PcdMaxSize:\r
2196 pcdObject.MaxDatumSize = str(CurrentMaxSize)\r
2197 else:\r
2198 Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject(\r
2199 PcdCName,\r
2200 TokenSpaceGuid,\r
2201 self._PCD_TYPE_STRING_[Type],\r
2202 DatumType,\r
2203 PcdValue,\r
2204 '',\r
2205 MaxDatumSize,\r
2206 {SkuName : SkuInfo},\r
2207 False,\r
2208 None,\r
2209 IsDsc=True)\r
2210\r
2211 for pcd in Pcds.values():\r
2212 pcdDecObject = self._DecPcds[pcd.TokenCName, pcd.TokenSpaceGuidCName]\r
e651d06c
LG
2213 # Only fix the value while no value provided in DSC file.\r
2214 for sku in pcd.SkuInfoList.values():\r
2215 if (sku.DefaultValue == "" or sku.DefaultValue==None):\r
2216 sku.DefaultValue = pcdDecObject.DefaultValue\r
ae7b6df8
LG
2217 if 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' not in pcd.SkuInfoList.keys():\r
2218 valuefromDec = pcdDecObject.DefaultValue\r
2219 SkuInfo = SkuInfoClass('DEFAULT', '0', '', '', '', '', '', valuefromDec)\r
2220 pcd.SkuInfoList['DEFAULT'] = SkuInfo\r
2221 elif 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys():\r
2222 pcd.SkuInfoList['DEFAULT'] = pcd.SkuInfoList['COMMON']\r
2223 del(pcd.SkuInfoList['COMMON'])\r
2224 elif 'DEFAULT' in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys():\r
2225 del(pcd.SkuInfoList['COMMON'])\r
65eff519
LG
2226\r
2227 map(self.FilterSkuSettings,Pcds.values())\r
ae7b6df8
LG
2228\r
2229 return Pcds\r
2230\r
65eff519
LG
2231 def FilterSkuSettings(self, PcdObj):\r
2232\r
2233 if self.SkuIdMgr.SkuUsageType == self.SkuIdMgr.SINGLE:\r
2234 if 'DEFAULT' in PcdObj.SkuInfoList.keys() and self.SkuIdMgr.SystemSkuId not in PcdObj.SkuInfoList.keys():\r
2235 PcdObj.SkuInfoList[self.SkuIdMgr.SystemSkuId] = PcdObj.SkuInfoList['DEFAULT']\r
2236 PcdObj.SkuInfoList = {'DEFAULT':PcdObj.SkuInfoList[self.SkuIdMgr.SystemSkuId]}\r
2237 PcdObj.SkuInfoList['DEFAULT'].SkuIdName = 'DEFAULT'\r
2238 PcdObj.SkuInfoList['DEFAULT'].SkuId = '0'\r
2239\r
2240 elif self.SkuIdMgr.SkuUsageType == self.SkuIdMgr.DEFAULT:\r
2241 PcdObj.SkuInfoList = {'DEFAULT':PcdObj.SkuInfoList['DEFAULT']}\r
2242\r
2243 return PcdObj\r
2244\r
2245\r
ae7b6df8
LG
2246 def CompareVarAttr(self, Attr1, Attr2):\r
2247 if not Attr1 or not Attr2: # for empty string\r
2248 return True\r
2249 Attr1s = [attr.strip() for attr in Attr1.split(",")]\r
2250 Attr1Set = set(Attr1s)\r
2251 Attr2s = [attr.strip() for attr in Attr2.split(",")]\r
2252 Attr2Set = set(Attr2s)\r
2253 if Attr2Set == Attr1Set:\r
2254 return True\r
2255 else:\r
2256 return False\r
f3b31433
FB
2257 def CopyDscRawValue(self,Pcd):\r
2258 if Pcd.DscRawValue is None:\r
2259 Pcd.DscRawValue = dict()\r
f832bb34
FB
2260 if Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD], self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:\r
2261 if self.SkuIdMgr.SystemSkuId not in Pcd.DscRawValue:\r
2262 Pcd.DscRawValue[self.SkuIdMgr.SystemSkuId] = {}\r
2263 Pcd.DscRawValue[self.SkuIdMgr.SystemSkuId]['STANDARD'] = Pcd.DefaultValue\r
f3b31433
FB
2264 for skuname in Pcd.SkuInfoList:\r
2265 Pcd.DscRawValue[skuname] = {}\r
2266 if Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
2267 for defaultstore in Pcd.SkuInfoList[skuname].DefaultStoreDict:\r
2268 Pcd.DscRawValue[skuname][defaultstore] = Pcd.SkuInfoList[skuname].DefaultStoreDict[defaultstore]\r
2269 else:\r
2270 Pcd.DscRawValue[skuname]['STANDARD'] = Pcd.SkuInfoList[skuname].DefaultValue\r
8518bf0b
LG
2271 def CompletePcdValues(self,PcdSet):\r
2272 Pcds = {}\r
2273 DefaultStoreObj = DefaultStore(self._GetDefaultStores())\r
98eb1364 2274 SkuIds = {skuname:skuid for skuname,skuid in self.SkuIdMgr.AvailableSkuIdSet.items() if skuname !='COMMON'}\r
8518bf0b
LG
2275 DefaultStores = set([storename for pcdobj in PcdSet.values() for skuobj in pcdobj.SkuInfoList.values() for storename in skuobj.DefaultStoreDict.keys()])\r
2276 for PcdCName, TokenSpaceGuid in PcdSet:\r
2277 PcdObj = PcdSet[(PcdCName, TokenSpaceGuid)]\r
f832bb34 2278 self.CopyDscRawValue(PcdObj)\r
8518bf0b
LG
2279 if PcdObj.Type not in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_DEFAULT],\r
2280 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII],\r
2281 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_VPD],\r
2282 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_DEFAULT],\r
2283 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII],\r
2284 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_VPD]]:\r
2285 Pcds[PcdCName, TokenSpaceGuid]= PcdObj\r
2286 continue\r
2287 PcdType = PcdObj.Type\r
2288 if PcdType in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
2289 for skuid in PcdObj.SkuInfoList:\r
2290 skuobj = PcdObj.SkuInfoList[skuid]\r
2291 mindefaultstorename = DefaultStoreObj.GetMin(set([defaultstorename for defaultstorename in skuobj.DefaultStoreDict]))\r
2292 for defaultstorename in DefaultStores:\r
2293 if defaultstorename not in skuobj.DefaultStoreDict:\r
2b8a6c44 2294 skuobj.DefaultStoreDict[defaultstorename] = copy.deepcopy(skuobj.DefaultStoreDict[mindefaultstorename])\r
8518bf0b 2295 skuobj.HiiDefaultValue = skuobj.DefaultStoreDict[mindefaultstorename]\r
8ac16789 2296 for skuname,skuid in SkuIds.items():\r
2b8a6c44
LG
2297 if skuname not in PcdObj.SkuInfoList:\r
2298 nextskuid = self.SkuIdMgr.GetNextSkuId(skuname)\r
8518bf0b
LG
2299 while nextskuid not in PcdObj.SkuInfoList:\r
2300 nextskuid = self.SkuIdMgr.GetNextSkuId(nextskuid)\r
2b8a6c44
LG
2301 PcdObj.SkuInfoList[skuname] = copy.deepcopy(PcdObj.SkuInfoList[nextskuid])\r
2302 PcdObj.SkuInfoList[skuname].SkuId = skuid\r
2303 PcdObj.SkuInfoList[skuname].SkuIdName = skuname\r
8518bf0b
LG
2304 if PcdType in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
2305 PcdObj.DefaultValue = PcdObj.SkuInfoList.values()[0].HiiDefaultValue if self.SkuIdMgr.SkuUsageType == self.SkuIdMgr.SINGLE else PcdObj.SkuInfoList["DEFAULT"].HiiDefaultValue\r
2306 Pcds[PcdCName, TokenSpaceGuid]= PcdObj\r
2307 return Pcds\r
ae7b6df8
LG
2308 ## Retrieve dynamic HII PCD settings\r
2309 #\r
2310 # @param Type PCD type\r
2311 #\r
2312 # @retval a dict object contains settings of given PCD type\r
2313 #\r
2314 def _GetDynamicHiiPcd(self, Type):\r
2315\r
ae7b6df8
LG
2316 VariableAttrs = {}\r
2317\r
2318 Pcds = sdict()\r
2319 #\r
2320 # tdict is a special dict kind of type, used for selecting correct\r
2321 # PCD settings for certain ARCH and SKU\r
2322 #\r
8518bf0b 2323 PcdDict = tdict(True, 5)\r
ae7b6df8
LG
2324 PcdSet = set()\r
2325 RecordList = self._RawData[Type, self._Arch]\r
2326 # Find out all possible PCD candidates for self._Arch\r
8518bf0b 2327 AvailableSkuIdSet = copy.copy(self.SkuIds)\r
2b8a6c44 2328 DefaultStoresDefine = self._GetDefaultStores()\r
ae7b6df8 2329\r
8518bf0b 2330 for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, DefaultStore, Dummy4,Dummy5 in RecordList:\r
2b8a6c44
LG
2331 SkuName = SkuName.upper()\r
2332 SkuName = 'DEFAULT' if SkuName == 'COMMON' else SkuName\r
2333 DefaultStore = DefaultStore.upper()\r
8518bf0b
LG
2334 if DefaultStore == "COMMON":\r
2335 DefaultStore = "STANDARD"\r
ae7b6df8 2336 if SkuName not in AvailableSkuIdSet:\r
2b8a6c44
LG
2337 EdkLogger.error('build', PARAMETER_INVALID, 'Sku %s is not defined in [SkuIds] section' % SkuName,\r
2338 File=self.MetaFile, Line=Dummy5)\r
2339 if DefaultStore not in DefaultStoresDefine:\r
2340 EdkLogger.error('build', PARAMETER_INVALID, 'DefaultStores %s is not defined in [DefaultStores] section' % DefaultStore,\r
2341 File=self.MetaFile, Line=Dummy5)\r
ae7b6df8 2342 if "." not in TokenSpaceGuid:\r
5db9414c 2343 PcdSet.add((PcdCName, TokenSpaceGuid, SkuName,DefaultStore, Dummy5))\r
8518bf0b 2344 PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid,DefaultStore] = Setting\r
ae7b6df8
LG
2345\r
2346\r
2347 # Remove redundant PCD candidates, per the ARCH and SKU\r
8518bf0b 2348 for PcdCName, TokenSpaceGuid, SkuName,DefaultStore, Dummy4 in PcdSet:\r
ae7b6df8 2349\r
8518bf0b 2350 Setting = PcdDict[self._Arch, SkuName, PcdCName, TokenSpaceGuid,DefaultStore]\r
ae7b6df8
LG
2351 if Setting == None:\r
2352 continue\r
2353 VariableName, VariableGuid, VariableOffset, DefaultValue, VarAttribute = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4)\r
2354\r
2355 rt, Msg = VariableAttributes.ValidateVarAttributes(VarAttribute)\r
2356 if not rt:\r
2357 EdkLogger.error("build", PCD_VARIABLE_ATTRIBUTES_ERROR, "Variable attributes settings for %s is incorrect.\n %s" % (".".join((TokenSpaceGuid, PcdCName)), Msg),\r
2358 ExtraData="[%s]" % VarAttribute)\r
2359 ExceedMax = False\r
2360 FormatCorrect = True\r
2361 if VariableOffset.isdigit():\r
2362 if int(VariableOffset, 10) > 0xFFFF:\r
2363 ExceedMax = True\r
2364 elif re.match(r'[\t\s]*0[xX][a-fA-F0-9]+$', VariableOffset):\r
2365 if int(VariableOffset, 16) > 0xFFFF:\r
2366 ExceedMax = True\r
2367 # For Offset written in "A.B"\r
2368 elif VariableOffset.find('.') > -1:\r
2369 VariableOffsetList = VariableOffset.split(".")\r
2370 if not (len(VariableOffsetList) == 2\r
2371 and IsValidWord(VariableOffsetList[0])\r
2372 and IsValidWord(VariableOffsetList[1])):\r
2373 FormatCorrect = False\r
2374 else:\r
2375 FormatCorrect = False\r
2376 if not FormatCorrect:\r
2377 EdkLogger.error('Build', FORMAT_INVALID, "Invalid syntax or format of the variable offset value is incorrect for %s." % ".".join((TokenSpaceGuid, PcdCName)))\r
2378\r
2379 if ExceedMax:\r
2380 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
2381 if (VariableName, VariableGuid) not in VariableAttrs:\r
2382 VariableAttrs[(VariableName, VariableGuid)] = VarAttribute\r
2383 else:\r
2384 if not self.CompareVarAttr(VariableAttrs[(VariableName, VariableGuid)], VarAttribute):\r
2385 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
2386\r
ae7b6df8
LG
2387 pcdDecObject = self._DecPcds[PcdCName, TokenSpaceGuid]\r
2388 if (PcdCName, TokenSpaceGuid) in Pcds.keys():\r
2389 pcdObject = Pcds[PcdCName, TokenSpaceGuid]\r
8518bf0b
LG
2390 if SkuName in pcdObject.SkuInfoList:\r
2391 Skuitem = pcdObject.SkuInfoList[SkuName]\r
2392 Skuitem.DefaultStoreDict.update({DefaultStore:DefaultValue})\r
2393 else:\r
2394 SkuInfo = SkuInfoClass(SkuName, self.SkuIds[SkuName][0], VariableName, VariableGuid, VariableOffset, DefaultValue, VariableAttribute=VarAttribute,DefaultStore={DefaultStore:DefaultValue})\r
2395 pcdObject.SkuInfoList[SkuName] = SkuInfo\r
ae7b6df8 2396 else:\r
8518bf0b 2397 SkuInfo = SkuInfoClass(SkuName, self.SkuIds[SkuName][0], VariableName, VariableGuid, VariableOffset, DefaultValue, VariableAttribute=VarAttribute,DefaultStore={DefaultStore:DefaultValue})\r
ae7b6df8
LG
2398 Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject(\r
2399 PcdCName,\r
2400 TokenSpaceGuid,\r
2401 self._PCD_TYPE_STRING_[Type],\r
2402 '',\r
2403 DefaultValue,\r
2404 '',\r
2405 '',\r
2406 {SkuName : SkuInfo},\r
2407 False,\r
2408 None,\r
2409 pcdDecObject.validateranges,\r
2410 pcdDecObject.validlists,\r
2411 pcdDecObject.expressions,\r
2412 IsDsc=True)\r
2413\r
2414\r
2415 for pcd in Pcds.values():\r
2416 SkuInfoObj = pcd.SkuInfoList.values()[0]\r
2417 pcdDecObject = self._DecPcds[pcd.TokenCName, pcd.TokenSpaceGuidCName]\r
e1511113 2418 pcd.DatumType = pcdDecObject.DatumType\r
ae7b6df8
LG
2419 # Only fix the value while no value provided in DSC file.\r
2420 for sku in pcd.SkuInfoList.values():\r
2421 if (sku.HiiDefaultValue == "" or sku.HiiDefaultValue == None):\r
2422 sku.HiiDefaultValue = pcdDecObject.DefaultValue\r
e1511113
B
2423 for default_store in sku.DefaultStoreDict:\r
2424 sku.DefaultStoreDict[default_store]=pcdDecObject.DefaultValue\r
2425 pcd.DefaultValue = pcdDecObject.DefaultValue\r
ae7b6df8
LG
2426 if 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' not in pcd.SkuInfoList.keys():\r
2427 valuefromDec = pcdDecObject.DefaultValue\r
2b8a6c44 2428 SkuInfo = SkuInfoClass('DEFAULT', '0', SkuInfoObj.VariableName, SkuInfoObj.VariableGuid, SkuInfoObj.VariableOffset, valuefromDec,VariableAttribute=SkuInfoObj.VariableAttribute,DefaultStore={DefaultStore:valuefromDec})\r
ae7b6df8
LG
2429 pcd.SkuInfoList['DEFAULT'] = SkuInfo\r
2430 elif 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys():\r
2431 pcd.SkuInfoList['DEFAULT'] = pcd.SkuInfoList['COMMON']\r
2432 del(pcd.SkuInfoList['COMMON'])\r
2433 elif 'DEFAULT' in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys():\r
2434 del(pcd.SkuInfoList['COMMON'])\r
2435\r
ae7b6df8
LG
2436 if pcd.MaxDatumSize.strip():\r
2437 MaxSize = int(pcd.MaxDatumSize, 0)\r
2438 else:\r
2439 MaxSize = 0\r
b854e2bf 2440 if pcd.DatumType not in ['BOOLEAN','UINT8','UINT16','UINT32','UINT64']:\r
2b8a6c44 2441 for (_, skuobj) in pcd.SkuInfoList.items():\r
ae7b6df8 2442 datalen = 0\r
47854fd5
LG
2443 skuobj.HiiDefaultValue = StringToArray(skuobj.HiiDefaultValue)\r
2444 datalen = len(skuobj.HiiDefaultValue.split(","))\r
ae7b6df8
LG
2445 if datalen > MaxSize:\r
2446 MaxSize = datalen\r
47854fd5
LG
2447 for defaultst in skuobj.DefaultStoreDict:\r
2448 skuobj.DefaultStoreDict[defaultst] = StringToArray(skuobj.DefaultStoreDict[defaultst])\r
2449 pcd.DefaultValue = StringToArray(pcd.DefaultValue)\r
ae7b6df8 2450 pcd.MaxDatumSize = str(MaxSize)\r
2b8a6c44
LG
2451 rt, invalidhii = self.CheckVariableNameAssignment(Pcds)\r
2452 if not rt:\r
2453 invalidpcd = ",".join(invalidhii)\r
2454 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
LG
2455\r
2456 map(self.FilterSkuSettings,Pcds.values())\r
2457\r
ae7b6df8
LG
2458 return Pcds\r
2459\r
2b8a6c44
LG
2460 def CheckVariableNameAssignment(self,Pcds):\r
2461 invalidhii = []\r
2462 for pcdname in Pcds:\r
2463 pcd = Pcds[pcdname]\r
2464 varnameset = set([sku.VariableName for (skuid,sku) in pcd.SkuInfoList.items()])\r
2465 if len(varnameset) > 1:\r
2466 invalidhii.append(".".join((pcdname[1],pcdname[0])))\r
2467 if len(invalidhii):\r
2468 return False,invalidhii\r
2469 else:\r
2470 return True, []\r
ae7b6df8
LG
2471 ## Retrieve dynamic VPD PCD settings\r
2472 #\r
2473 # @param Type PCD type\r
2474 #\r
2475 # @retval a dict object contains settings of given PCD type\r
2476 #\r
2477 def _GetDynamicVpdPcd(self, Type):\r
2478\r
ae7b6df8
LG
2479\r
2480 Pcds = sdict()\r
2481 #\r
2482 # tdict is a special dict kind of type, used for selecting correct\r
2483 # PCD settings for certain ARCH and SKU\r
2484 #\r
2485 PcdDict = tdict(True, 4)\r
2486 PcdList = []\r
2487\r
2488 # Find out all possible PCD candidates for self._Arch\r
2489 RecordList = self._RawData[Type, self._Arch]\r
8518bf0b 2490 AvailableSkuIdSet = copy.copy(self.SkuIds)\r
ae7b6df8 2491\r
8518bf0b 2492 for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, Dummy3, Dummy4,Dummy5 in RecordList:\r
2b8a6c44
LG
2493 SkuName = SkuName.upper()\r
2494 SkuName = 'DEFAULT' if SkuName == 'COMMON' else SkuName\r
ae7b6df8 2495 if SkuName not in AvailableSkuIdSet:\r
2b8a6c44
LG
2496 EdkLogger.error('build', PARAMETER_INVALID, 'Sku %s is not defined in [SkuIds] section' % SkuName,\r
2497 File=self.MetaFile, Line=Dummy5)\r
ae7b6df8 2498 if "." not in TokenSpaceGuid:\r
5db9414c 2499 PcdList.append((PcdCName, TokenSpaceGuid, SkuName, Dummy5))\r
ae7b6df8
LG
2500 PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid] = Setting\r
2501\r
2502 # Remove redundant PCD candidates, per the ARCH and SKU\r
2503 for PcdCName, TokenSpaceGuid, SkuName, Dummy4 in PcdList:\r
2504 Setting = PcdDict[self._Arch, SkuName, PcdCName, TokenSpaceGuid]\r
2505 if Setting == None:\r
2506 continue\r
2507 #\r
2508 # For the VOID* type, it can have optional data of MaxDatumSize and InitialValue\r
2509 # For the Integer & Boolean type, the optional data can only be InitialValue.\r
2510 # At this point, we put all the data into the PcdClssObject for we don't know the PCD's datumtype\r
2511 # until the DEC parser has been called.\r
2512 #\r
2513 VpdOffset, MaxDatumSize, InitialValue = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4)\r
8518bf0b 2514 SkuInfo = SkuInfoClass(SkuName, self.SkuIds[SkuName][0], '', '', '', '', VpdOffset, InitialValue)\r
ae7b6df8
LG
2515 if (PcdCName, TokenSpaceGuid) in Pcds.keys():\r
2516 pcdObject = Pcds[PcdCName, TokenSpaceGuid]\r
2517 pcdObject.SkuInfoList[SkuName] = SkuInfo\r
2518 if MaxDatumSize.strip():\r
2519 CurrentMaxSize = int(MaxDatumSize.strip(), 0)\r
2520 else:\r
2521 CurrentMaxSize = 0\r
2522 if pcdObject.MaxDatumSize:\r
2523 PcdMaxSize = int(pcdObject.MaxDatumSize, 0)\r
2524 else:\r
2525 PcdMaxSize = 0\r
2526 if CurrentMaxSize > PcdMaxSize:\r
2527 pcdObject.MaxDatumSize = str(CurrentMaxSize)\r
2528 else:\r
2529 Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject(\r
2530 PcdCName,\r
2531 TokenSpaceGuid,\r
2532 self._PCD_TYPE_STRING_[Type],\r
2533 '',\r
2534 InitialValue,\r
2535 '',\r
2536 MaxDatumSize,\r
2537 {SkuName : SkuInfo},\r
2538 False,\r
2539 None,\r
2540 IsDsc=True)\r
2541 for pcd in Pcds.values():\r
2542 SkuInfoObj = pcd.SkuInfoList.values()[0]\r
2543 pcdDecObject = self._DecPcds[pcd.TokenCName, pcd.TokenSpaceGuidCName]\r
8aa4db4b 2544 pcd.DatumType = pcdDecObject.DatumType\r
e651d06c
LG
2545 # Only fix the value while no value provided in DSC file.\r
2546 for sku in pcd.SkuInfoList.values():\r
2547 if (sku.DefaultValue == "" or sku.DefaultValue==None):\r
2548 sku.DefaultValue = pcdDecObject.DefaultValue\r
ae7b6df8
LG
2549 if 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' not in pcd.SkuInfoList.keys():\r
2550 valuefromDec = pcdDecObject.DefaultValue\r
2551 SkuInfo = SkuInfoClass('DEFAULT', '0', '', '', '', '', SkuInfoObj.VpdOffset, valuefromDec)\r
2552 pcd.SkuInfoList['DEFAULT'] = SkuInfo\r
2553 elif 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys():\r
2554 pcd.SkuInfoList['DEFAULT'] = pcd.SkuInfoList['COMMON']\r
2555 del(pcd.SkuInfoList['COMMON'])\r
2556 elif 'DEFAULT' in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys():\r
2557 del(pcd.SkuInfoList['COMMON'])\r
ae7b6df8 2558\r
65eff519
LG
2559\r
2560 map(self.FilterSkuSettings,Pcds.values())\r
ae7b6df8
LG
2561 return Pcds\r
2562\r
2563 ## Add external modules\r
2564 #\r
2565 # The external modules are mostly those listed in FDF file, which don't\r
2566 # need "build".\r
2567 #\r
2568 # @param FilePath The path of module description file\r
2569 #\r
2570 def AddModule(self, FilePath):\r
2571 FilePath = NormPath(FilePath)\r
2572 if FilePath not in self.Modules:\r
2573 Module = ModuleBuildClassObject()\r
2574 Module.MetaFile = FilePath\r
2575 self.Modules.append(Module)\r
2576\r
68ba919f
YZ
2577 def _GetToolChainFamily(self):\r
2578 self._ToolChainFamily = "MSFT"\r
2579 BuildConfigurationFile = os.path.normpath(os.path.join(GlobalData.gConfDirectory, "target.txt"))\r
2580 if os.path.isfile(BuildConfigurationFile) == True:\r
2581 TargetTxt = TargetTxtClassObject()\r
2582 TargetTxt.LoadTargetTxtFile(BuildConfigurationFile)\r
2583 ToolDefinitionFile = TargetTxt.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_TOOL_CHAIN_CONF]\r
2584 if ToolDefinitionFile == '':\r
2585 ToolDefinitionFile = "tools_def.txt"\r
2586 ToolDefinitionFile = os.path.normpath(mws.join(self.WorkspaceDir, 'Conf', ToolDefinitionFile))\r
2587 if os.path.isfile(ToolDefinitionFile) == True:\r
2588 ToolDef = ToolDefClassObject()\r
2589 ToolDef.LoadToolDefFile(ToolDefinitionFile)\r
2590 ToolDefinition = ToolDef.ToolsDefTxtDatabase\r
2591 if TAB_TOD_DEFINES_FAMILY not in ToolDefinition \\r
2592 or self._Toolchain not in ToolDefinition[TAB_TOD_DEFINES_FAMILY] \\r
2593 or not ToolDefinition[TAB_TOD_DEFINES_FAMILY][self._Toolchain]:\r
2594 self._ToolChainFamily = "MSFT"\r
2595 else:\r
2596 self._ToolChainFamily = ToolDefinition[TAB_TOD_DEFINES_FAMILY][self._Toolchain]\r
2597 return self._ToolChainFamily\r
2598\r
ae7b6df8
LG
2599 ## Add external PCDs\r
2600 #\r
2601 # The external PCDs are mostly those listed in FDF file to specify address\r
2602 # or offset information.\r
2603 #\r
2604 # @param Name Name of the PCD\r
2605 # @param Guid Token space guid of the PCD\r
2606 # @param Value Value of the PCD\r
2607 #\r
2608 def AddPcd(self, Name, Guid, Value):\r
2609 if (Name, Guid) not in self.Pcds:\r
2610 self.Pcds[Name, Guid] = PcdClassObject(Name, Guid, '', '', '', '', '', {}, False, None)\r
2611 self.Pcds[Name, Guid].DefaultValue = Value\r
5644e5ce
FB
2612 @property\r
2613 def DecPcds(self):\r
2614 if self._DecPcds == None:\r
2615 FdfInfList = []\r
2616 if GlobalData.gFdfParser:\r
2617 FdfInfList = GlobalData.gFdfParser.Profile.InfList\r
2618 PkgSet = set()\r
2619 for Inf in FdfInfList:\r
2620 ModuleFile = PathClass(NormPath(Inf), GlobalData.gWorkspace, Arch=self._Arch)\r
2621 if ModuleFile in self._Modules:\r
2622 continue\r
2623 ModuleData = self._Bdb[ModuleFile, self._Arch, self._Target, self._Toolchain]\r
2624 PkgSet.update(ModuleData.Packages)\r
726c501c 2625 self._DecPcds, self._GuidDict = GetDeclaredPcd(self, self._Bdb, self._Arch, self._Target, self._Toolchain,PkgSet)\r
5644e5ce 2626 return self._DecPcds\r
ae7b6df8
LG
2627 _Macros = property(_GetMacros)\r
2628 Arch = property(_GetArch, _SetArch)\r
2629 Platform = property(_GetPlatformName)\r
2630 PlatformName = property(_GetPlatformName)\r
2631 Guid = property(_GetFileGuid)\r
2632 Version = property(_GetVersion)\r
2633 DscSpecification = property(_GetDscSpec)\r
2634 OutputDirectory = property(_GetOutpuDir)\r
2635 SupArchList = property(_GetSupArch)\r
2636 BuildTargets = property(_GetBuildTarget)\r
2637 SkuName = property(_GetSkuName, _SetSkuName)\r
ae7b6df8
LG
2638 PcdInfoFlag = property(_GetPcdInfoFlag)\r
2639 VarCheckFlag = property(_GetVarCheckFlag)\r
2640 FlashDefinition = property(_GetFdfFile)\r
2641 Prebuild = property(_GetPrebuild)\r
2642 Postbuild = property(_GetPostbuild)\r
2643 BuildNumber = property(_GetBuildNumber)\r
2644 MakefileName = property(_GetMakefileName)\r
2645 BsBaseAddress = property(_GetBsBaseAddress)\r
2646 RtBaseAddress = property(_GetRtBaseAddress)\r
2647 LoadFixAddress = property(_GetLoadFixAddress)\r
2648 RFCLanguages = property(_GetRFCLanguages)\r
2649 ISOLanguages = property(_GetISOLanguages)\r
2650 VpdToolGuid = property(_GetVpdToolGuid)\r
2651 SkuIds = property(_GetSkuIds)\r
2652 Modules = property(_GetModules)\r
2653 LibraryInstances = property(_GetLibraryInstances)\r
2654 LibraryClasses = property(_GetLibraryClasses)\r
2655 Pcds = property(_GetPcds)\r
2656 BuildOptions = property(_GetBuildOptions)\r
68ba919f 2657 ToolChainFamily = property(_GetToolChainFamily)\r