]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/Workspace/DscBuildData.py
BaseTools: Add Platform Override Build Options for PcdValueInit
[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
a9d9ce8e 4# Copyright (c) 2008 - 2017, 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
24\r
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
40from Workspace.BuildClassObject import PlatformBuildClassObject, StructurePcd, PcdClassObject, ModuleBuildClassObject\r
41\r
42#\r
43# Treat CHAR16 as a synonym for UINT16. CHAR16 support is required for VFR C structs\r
44#\r
45PcdValueInitName = 'PcdValueInit'\r
46PcdSupportedBaseTypes = ['BOOLEAN', 'UINT8', 'UINT16', 'UINT32', 'UINT64', 'CHAR16']\r
47PcdSupportedBaseTypeWidth = {'BOOLEAN':8, 'UINT8':8, 'UINT16':16, 'UINT32':32, 'UINT64':64}\r
48PcdUnsupportedBaseTypes = ['INT8', 'INT16', 'INT32', 'INT64', 'CHAR8', 'UINTN', 'INTN', 'VOID']\r
49\r
50PcdMainCHeader = '''\r
51/**\r
52 DO NOT EDIT\r
53 FILE auto-generated\r
54**/\r
55\r
56#include <stdio.h>\r
57#include <stdlib.h>\r
58#include <string.h>\r
59#include <PcdValueCommon.h>\r
60'''\r
61\r
62PcdMainCEntry = '''\r
63int\r
64main (\r
65 int argc,\r
66 char *argv[]\r
67 )\r
68{\r
69 return PcdValueMain (argc, argv);\r
70}\r
71'''\r
72\r
73PcdMakefileHeader = '''\r
74#\r
75# DO NOT EDIT\r
76# This file is auto-generated by build utility\r
77#\r
78\r
79'''\r
80\r
68ba919f
YZ
81WindowsCFLAGS = 'CFLAGS = $(CFLAGS) /wd4200 /wd4034 /wd4101 '\r
82LinuxCFLAGS = 'BUILD_CFLAGS += -Wno-pointer-to-int-cast -Wno-unused-variable '\r
ae7b6df8
LG
83PcdMakefileEnd = '''\r
84!INCLUDE $(BASE_TOOLS_PATH)\Source\C\Makefiles\ms.common\r
85\r
ae7b6df8
LG
86LIBS = $(LIB_PATH)\Common.lib\r
87\r
88!INCLUDE $(BASE_TOOLS_PATH)\Source\C\Makefiles\ms.app\r
89'''\r
90\r
91PcdGccMakefile = '''\r
92ARCH ?= IA32\r
93MAKEROOT ?= $(EDK_TOOLS_PATH)/Source/C\r
94LIBS = -lCommon\r
95'''\r
96\r
97class DscBuildData(PlatformBuildClassObject):\r
98 # dict used to convert PCD type in database to string used by build tool\r
99 _PCD_TYPE_STRING_ = {\r
100 MODEL_PCD_FIXED_AT_BUILD : "FixedAtBuild",\r
101 MODEL_PCD_PATCHABLE_IN_MODULE : "PatchableInModule",\r
102 MODEL_PCD_FEATURE_FLAG : "FeatureFlag",\r
103 MODEL_PCD_DYNAMIC : "Dynamic",\r
104 MODEL_PCD_DYNAMIC_DEFAULT : "Dynamic",\r
105 MODEL_PCD_DYNAMIC_HII : "DynamicHii",\r
106 MODEL_PCD_DYNAMIC_VPD : "DynamicVpd",\r
107 MODEL_PCD_DYNAMIC_EX : "DynamicEx",\r
108 MODEL_PCD_DYNAMIC_EX_DEFAULT : "DynamicEx",\r
109 MODEL_PCD_DYNAMIC_EX_HII : "DynamicExHii",\r
110 MODEL_PCD_DYNAMIC_EX_VPD : "DynamicExVpd",\r
111 }\r
112\r
113 # dict used to convert part of [Defines] to members of DscBuildData directly\r
114 _PROPERTY_ = {\r
115 #\r
116 # Required Fields\r
117 #\r
118 TAB_DSC_DEFINES_PLATFORM_NAME : "_PlatformName",\r
119 TAB_DSC_DEFINES_PLATFORM_GUID : "_Guid",\r
120 TAB_DSC_DEFINES_PLATFORM_VERSION : "_Version",\r
121 TAB_DSC_DEFINES_DSC_SPECIFICATION : "_DscSpecification",\r
122 # TAB_DSC_DEFINES_OUTPUT_DIRECTORY : "_OutputDirectory",\r
123 # TAB_DSC_DEFINES_SUPPORTED_ARCHITECTURES : "_SupArchList",\r
124 # TAB_DSC_DEFINES_BUILD_TARGETS : "_BuildTargets",\r
125 TAB_DSC_DEFINES_SKUID_IDENTIFIER : "_SkuName",\r
126 # TAB_DSC_DEFINES_FLASH_DEFINITION : "_FlashDefinition",\r
127 TAB_DSC_DEFINES_BUILD_NUMBER : "_BuildNumber",\r
128 TAB_DSC_DEFINES_MAKEFILE_NAME : "_MakefileName",\r
129 TAB_DSC_DEFINES_BS_BASE_ADDRESS : "_BsBaseAddress",\r
130 TAB_DSC_DEFINES_RT_BASE_ADDRESS : "_RtBaseAddress",\r
131 # TAB_DSC_DEFINES_RFC_LANGUAGES : "_RFCLanguages",\r
132 # TAB_DSC_DEFINES_ISO_LANGUAGES : "_ISOLanguages",\r
133 }\r
134\r
135 # used to compose dummy library class name for those forced library instances\r
136 _NullLibraryNumber = 0\r
137\r
138 ## Constructor of DscBuildData\r
139 #\r
140 # Initialize object of DscBuildData\r
141 #\r
142 # @param FilePath The path of platform description file\r
143 # @param RawData The raw data of DSC file\r
144 # @param BuildDataBase Database used to retrieve module/package information\r
145 # @param Arch The target architecture\r
146 # @param Platform (not used for DscBuildData)\r
147 # @param Macros Macros used for replacement in DSC file\r
148 #\r
149 def __init__(self, FilePath, RawData, BuildDataBase, Arch='COMMON', Target=None, Toolchain=None):\r
150 self.MetaFile = FilePath\r
151 self._RawData = RawData\r
152 self._Bdb = BuildDataBase\r
153 self._Arch = Arch\r
154 self._Target = Target\r
155 self._Toolchain = Toolchain\r
68ba919f 156 self._ToolChainFamily = None\r
ae7b6df8
LG
157 self._Clear()\r
158 self._HandleOverridePath()\r
159 if os.getenv("WORKSPACE"):\r
160 self.OutputPath = os.path.join(os.getenv("WORKSPACE"), 'Build', PcdValueInitName)\r
161 else:\r
162 self.OutputPath = os.path.dirname(self.DscFile)\r
8518bf0b 163 self.DefaultStores = None\r
e651d06c 164 self.SkuIdMgr = SkuClass(self.SkuName, self.SkuIds)\r
8518bf0b 165 arraystr = self.SkuIdMgr.DumpSkuIdArrary()\r
ae7b6df8
LG
166\r
167 ## XXX[key] = value\r
168 def __setitem__(self, key, value):\r
169 self.__dict__[self._PROPERTY_[key]] = value\r
170\r
171 ## value = XXX[key]\r
172 def __getitem__(self, key):\r
173 return self.__dict__[self._PROPERTY_[key]]\r
174\r
175 ## "in" test support\r
176 def __contains__(self, key):\r
177 return key in self._PROPERTY_\r
178\r
179 ## Set all internal used members of DscBuildData to None\r
180 def _Clear(self):\r
181 self._Header = None\r
182 self._PlatformName = None\r
183 self._Guid = None\r
184 self._Version = None\r
185 self._DscSpecification = None\r
186 self._OutputDirectory = None\r
187 self._SupArchList = None\r
188 self._BuildTargets = None\r
189 self._SkuName = None\r
ae7b6df8
LG
190 self._PcdInfoFlag = None\r
191 self._VarCheckFlag = None\r
192 self._FlashDefinition = None\r
193 self._Prebuild = None\r
194 self._Postbuild = None\r
195 self._BuildNumber = None\r
196 self._MakefileName = None\r
197 self._BsBaseAddress = None\r
198 self._RtBaseAddress = None\r
199 self._SkuIds = None\r
200 self._Modules = None\r
201 self._LibraryInstances = None\r
202 self._LibraryClasses = None\r
203 self._Pcds = None\r
204 self._DecPcds = None\r
205 self._BuildOptions = None\r
206 self._ModuleTypeOptions = None\r
207 self._LoadFixAddress = None\r
208 self._RFCLanguages = None\r
209 self._ISOLanguages = None\r
210 self._VpdToolGuid = None\r
211 self.__Macros = None\r
8518bf0b 212 self.DefaultStores = None\r
ae7b6df8
LG
213\r
214\r
215 ## handle Override Path of Module\r
216 def _HandleOverridePath(self):\r
217 RecordList = self._RawData[MODEL_META_DATA_COMPONENT, self._Arch]\r
218 Macros = self._Macros\r
219 Macros["EDK_SOURCE"] = GlobalData.gEcpSource\r
220 for Record in RecordList:\r
8518bf0b
LG
221 ModuleId = Record[6]\r
222 LineNo = Record[7]\r
ae7b6df8
LG
223 ModuleFile = PathClass(NormPath(Record[0]), GlobalData.gWorkspace, Arch=self._Arch)\r
224 RecordList = self._RawData[MODEL_META_DATA_COMPONENT_SOURCE_OVERRIDE_PATH, self._Arch, None, ModuleId]\r
225 if RecordList != []:\r
226 SourceOverridePath = mws.join(GlobalData.gWorkspace, NormPath(RecordList[0][0]))\r
227\r
228 # Check if the source override path exists\r
229 if not os.path.isdir(SourceOverridePath):\r
230 EdkLogger.error('build', FILE_NOT_FOUND, Message='Source override path does not exist:', File=self.MetaFile, ExtraData=SourceOverridePath, Line=LineNo)\r
231\r
232 # Add to GlobalData Variables\r
233 GlobalData.gOverrideDir[ModuleFile.Key] = SourceOverridePath\r
234\r
235 ## Get current effective macros\r
236 def _GetMacros(self):\r
237 if self.__Macros == None:\r
238 self.__Macros = {}\r
239 self.__Macros.update(GlobalData.gPlatformDefines)\r
240 self.__Macros.update(GlobalData.gGlobalDefines)\r
241 self.__Macros.update(GlobalData.gCommandLineDefines)\r
242 return self.__Macros\r
243\r
244 ## Get architecture\r
245 def _GetArch(self):\r
246 return self._Arch\r
247\r
248 ## Set architecture\r
249 #\r
250 # Changing the default ARCH to another may affect all other information\r
251 # because all information in a platform may be ARCH-related. That's\r
252 # why we need to clear all internal used members, in order to cause all\r
253 # information to be re-retrieved.\r
254 #\r
255 # @param Value The value of ARCH\r
256 #\r
257 def _SetArch(self, Value):\r
258 if self._Arch == Value:\r
259 return\r
260 self._Arch = Value\r
261 self._Clear()\r
262\r
263 ## Retrieve all information in [Defines] section\r
264 #\r
265 # (Retriving all [Defines] information in one-shot is just to save time.)\r
266 #\r
267 def _GetHeaderInfo(self):\r
268 RecordList = self._RawData[MODEL_META_DATA_HEADER, self._Arch]\r
269 for Record in RecordList:\r
270 Name = Record[1]\r
271 # items defined _PROPERTY_ don't need additional processing\r
272\r
273 # some special items in [Defines] section need special treatment\r
274 if Name == TAB_DSC_DEFINES_OUTPUT_DIRECTORY:\r
275 self._OutputDirectory = NormPath(Record[2], self._Macros)\r
276 if ' ' in self._OutputDirectory:\r
277 EdkLogger.error("build", FORMAT_NOT_SUPPORTED, "No space is allowed in OUTPUT_DIRECTORY",\r
278 File=self.MetaFile, Line=Record[-1],\r
279 ExtraData=self._OutputDirectory)\r
280 elif Name == TAB_DSC_DEFINES_FLASH_DEFINITION:\r
281 self._FlashDefinition = PathClass(NormPath(Record[2], self._Macros), GlobalData.gWorkspace)\r
282 ErrorCode, ErrorInfo = self._FlashDefinition.Validate('.fdf')\r
283 if ErrorCode != 0:\r
284 EdkLogger.error('build', ErrorCode, File=self.MetaFile, Line=Record[-1],\r
285 ExtraData=ErrorInfo)\r
286 elif Name == TAB_DSC_PREBUILD:\r
287 PrebuildValue = Record[2]\r
288 if Record[2][0] == '"':\r
289 if Record[2][-1] != '"':\r
290 EdkLogger.error('build', FORMAT_INVALID, 'Missing double quotes in the end of %s statement.' % TAB_DSC_PREBUILD,\r
291 File=self.MetaFile, Line=Record[-1])\r
292 PrebuildValue = Record[2][1:-1]\r
293 self._Prebuild = PrebuildValue\r
294 elif Name == TAB_DSC_POSTBUILD:\r
295 PostbuildValue = Record[2]\r
296 if Record[2][0] == '"':\r
297 if Record[2][-1] != '"':\r
298 EdkLogger.error('build', FORMAT_INVALID, 'Missing double quotes in the end of %s statement.' % TAB_DSC_POSTBUILD,\r
299 File=self.MetaFile, Line=Record[-1])\r
300 PostbuildValue = Record[2][1:-1]\r
301 self._Postbuild = PostbuildValue\r
302 elif Name == TAB_DSC_DEFINES_SUPPORTED_ARCHITECTURES:\r
303 self._SupArchList = GetSplitValueList(Record[2], TAB_VALUE_SPLIT)\r
304 elif Name == TAB_DSC_DEFINES_BUILD_TARGETS:\r
305 self._BuildTargets = GetSplitValueList(Record[2])\r
306 elif Name == TAB_DSC_DEFINES_SKUID_IDENTIFIER:\r
307 if self._SkuName == None:\r
308 self._SkuName = Record[2]\r
e651d06c
LG
309 if GlobalData.gSKUID_CMD:\r
310 self._SkuName = GlobalData.gSKUID_CMD\r
ae7b6df8
LG
311 elif Name == TAB_DSC_DEFINES_PCD_INFO_GENERATION:\r
312 self._PcdInfoFlag = Record[2]\r
313 elif Name == TAB_DSC_DEFINES_PCD_VAR_CHECK_GENERATION:\r
314 self._VarCheckFlag = Record[2]\r
315 elif Name == TAB_FIX_LOAD_TOP_MEMORY_ADDRESS:\r
316 try:\r
317 self._LoadFixAddress = int (Record[2], 0)\r
318 except:\r
319 EdkLogger.error("build", PARAMETER_INVALID, "FIX_LOAD_TOP_MEMORY_ADDRESS %s is not valid dec or hex string" % (Record[2]))\r
320 elif Name == TAB_DSC_DEFINES_RFC_LANGUAGES:\r
321 if not Record[2] or Record[2][0] != '"' or Record[2][-1] != '"' or len(Record[2]) == 1:\r
322 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
323 File=self.MetaFile, Line=Record[-1])\r
324 LanguageCodes = Record[2][1:-1]\r
325 if not LanguageCodes:\r
326 EdkLogger.error('build', FORMAT_NOT_SUPPORTED, 'one or more RFC4646 format language code must be provided for RFC_LANGUAGES statement',\r
327 File=self.MetaFile, Line=Record[-1])\r
328 LanguageList = GetSplitValueList(LanguageCodes, TAB_SEMI_COLON_SPLIT)\r
329 # check whether there is empty entries in the list\r
330 if None in LanguageList:\r
331 EdkLogger.error('build', FORMAT_NOT_SUPPORTED, 'one or more empty language code is in RFC_LANGUAGES statement',\r
332 File=self.MetaFile, Line=Record[-1])\r
333 self._RFCLanguages = LanguageList\r
334 elif Name == TAB_DSC_DEFINES_ISO_LANGUAGES:\r
335 if not Record[2] or Record[2][0] != '"' or Record[2][-1] != '"' or len(Record[2]) == 1:\r
336 EdkLogger.error('build', FORMAT_NOT_SUPPORTED, 'language code for ISO_LANGUAGES must have double quotes around it, for example: ISO_LANGUAGES = "engchn"',\r
337 File=self.MetaFile, Line=Record[-1])\r
338 LanguageCodes = Record[2][1:-1]\r
339 if not LanguageCodes:\r
340 EdkLogger.error('build', FORMAT_NOT_SUPPORTED, 'one or more ISO639-2 format language code must be provided for ISO_LANGUAGES statement',\r
341 File=self.MetaFile, Line=Record[-1])\r
342 if len(LanguageCodes) % 3:\r
343 EdkLogger.error('build', FORMAT_NOT_SUPPORTED, 'bad ISO639-2 format for ISO_LANGUAGES',\r
344 File=self.MetaFile, Line=Record[-1])\r
345 LanguageList = []\r
346 for i in range(0, len(LanguageCodes), 3):\r
347 LanguageList.append(LanguageCodes[i:i + 3])\r
348 self._ISOLanguages = LanguageList\r
349 elif Name == TAB_DSC_DEFINES_VPD_TOOL_GUID:\r
350 #\r
351 # try to convert GUID to a real UUID value to see whether the GUID is format\r
352 # for VPD_TOOL_GUID is correct.\r
353 #\r
354 try:\r
355 uuid.UUID(Record[2])\r
356 except:\r
357 EdkLogger.error("build", FORMAT_INVALID, "Invalid GUID format for VPD_TOOL_GUID", File=self.MetaFile)\r
358 self._VpdToolGuid = Record[2]\r
359 elif Name in self:\r
360 self[Name] = Record[2]\r
361 # set _Header to non-None in order to avoid database re-querying\r
362 self._Header = 'DUMMY'\r
363\r
364 ## Retrieve platform name\r
365 def _GetPlatformName(self):\r
366 if self._PlatformName == None:\r
367 if self._Header == None:\r
368 self._GetHeaderInfo()\r
369 if self._PlatformName == None:\r
370 EdkLogger.error('build', ATTRIBUTE_NOT_AVAILABLE, "No PLATFORM_NAME", File=self.MetaFile)\r
371 return self._PlatformName\r
372\r
373 ## Retrieve file guid\r
374 def _GetFileGuid(self):\r
375 if self._Guid == None:\r
376 if self._Header == None:\r
377 self._GetHeaderInfo()\r
378 if self._Guid == None:\r
379 EdkLogger.error('build', ATTRIBUTE_NOT_AVAILABLE, "No PLATFORM_GUID", File=self.MetaFile)\r
380 return self._Guid\r
381\r
382 ## Retrieve platform version\r
383 def _GetVersion(self):\r
384 if self._Version == None:\r
385 if self._Header == None:\r
386 self._GetHeaderInfo()\r
387 if self._Version == None:\r
388 EdkLogger.error('build', ATTRIBUTE_NOT_AVAILABLE, "No PLATFORM_VERSION", File=self.MetaFile)\r
389 return self._Version\r
390\r
391 ## Retrieve platform description file version\r
392 def _GetDscSpec(self):\r
393 if self._DscSpecification == None:\r
394 if self._Header == None:\r
395 self._GetHeaderInfo()\r
396 if self._DscSpecification == None:\r
397 EdkLogger.error('build', ATTRIBUTE_NOT_AVAILABLE, "No DSC_SPECIFICATION", File=self.MetaFile)\r
398 return self._DscSpecification\r
399\r
400 ## Retrieve OUTPUT_DIRECTORY\r
401 def _GetOutpuDir(self):\r
402 if self._OutputDirectory == None:\r
403 if self._Header == None:\r
404 self._GetHeaderInfo()\r
405 if self._OutputDirectory == None:\r
406 self._OutputDirectory = os.path.join("Build", self._PlatformName)\r
407 return self._OutputDirectory\r
408\r
409 ## Retrieve SUPPORTED_ARCHITECTURES\r
410 def _GetSupArch(self):\r
411 if self._SupArchList == None:\r
412 if self._Header == None:\r
413 self._GetHeaderInfo()\r
414 if self._SupArchList == None:\r
415 EdkLogger.error('build', ATTRIBUTE_NOT_AVAILABLE, "No SUPPORTED_ARCHITECTURES", File=self.MetaFile)\r
416 return self._SupArchList\r
417\r
418 ## Retrieve BUILD_TARGETS\r
419 def _GetBuildTarget(self):\r
420 if self._BuildTargets == None:\r
421 if self._Header == None:\r
422 self._GetHeaderInfo()\r
423 if self._BuildTargets == None:\r
424 EdkLogger.error('build', ATTRIBUTE_NOT_AVAILABLE, "No BUILD_TARGETS", File=self.MetaFile)\r
425 return self._BuildTargets\r
426\r
427 def _GetPcdInfoFlag(self):\r
428 if self._PcdInfoFlag == None or self._PcdInfoFlag.upper() == 'FALSE':\r
429 return False\r
430 elif self._PcdInfoFlag.upper() == 'TRUE':\r
431 return True\r
432 else:\r
433 return False\r
434 def _GetVarCheckFlag(self):\r
435 if self._VarCheckFlag == None or self._VarCheckFlag.upper() == 'FALSE':\r
436 return False\r
437 elif self._VarCheckFlag.upper() == 'TRUE':\r
438 return True\r
439 else:\r
440 return False\r
e651d06c
LG
441\r
442 # # Retrieve SKUID_IDENTIFIER\r
ae7b6df8
LG
443 def _GetSkuName(self):\r
444 if self._SkuName == None:\r
445 if self._Header == None:\r
446 self._GetHeaderInfo()\r
e651d06c 447 if self._SkuName == None:\r
ae7b6df8
LG
448 self._SkuName = 'DEFAULT'\r
449 return self._SkuName\r
450\r
451 ## Override SKUID_IDENTIFIER\r
452 def _SetSkuName(self, Value):\r
453 self._SkuName = Value\r
454 self._Pcds = None\r
455\r
456 def _GetFdfFile(self):\r
457 if self._FlashDefinition == None:\r
458 if self._Header == None:\r
459 self._GetHeaderInfo()\r
460 if self._FlashDefinition == None:\r
461 self._FlashDefinition = ''\r
462 return self._FlashDefinition\r
463\r
464 def _GetPrebuild(self):\r
465 if self._Prebuild == None:\r
466 if self._Header == None:\r
467 self._GetHeaderInfo()\r
468 if self._Prebuild == None:\r
469 self._Prebuild = ''\r
470 return self._Prebuild\r
471\r
472 def _GetPostbuild(self):\r
473 if self._Postbuild == None:\r
474 if self._Header == None:\r
475 self._GetHeaderInfo()\r
476 if self._Postbuild == None:\r
477 self._Postbuild = ''\r
478 return self._Postbuild\r
479\r
480 ## Retrieve FLASH_DEFINITION\r
481 def _GetBuildNumber(self):\r
482 if self._BuildNumber == None:\r
483 if self._Header == None:\r
484 self._GetHeaderInfo()\r
485 if self._BuildNumber == None:\r
486 self._BuildNumber = ''\r
487 return self._BuildNumber\r
488\r
489 ## Retrieve MAKEFILE_NAME\r
490 def _GetMakefileName(self):\r
491 if self._MakefileName == None:\r
492 if self._Header == None:\r
493 self._GetHeaderInfo()\r
494 if self._MakefileName == None:\r
495 self._MakefileName = ''\r
496 return self._MakefileName\r
497\r
498 ## Retrieve BsBaseAddress\r
499 def _GetBsBaseAddress(self):\r
500 if self._BsBaseAddress == None:\r
501 if self._Header == None:\r
502 self._GetHeaderInfo()\r
503 if self._BsBaseAddress == None:\r
504 self._BsBaseAddress = ''\r
505 return self._BsBaseAddress\r
506\r
507 ## Retrieve RtBaseAddress\r
508 def _GetRtBaseAddress(self):\r
509 if self._RtBaseAddress == None:\r
510 if self._Header == None:\r
511 self._GetHeaderInfo()\r
512 if self._RtBaseAddress == None:\r
513 self._RtBaseAddress = ''\r
514 return self._RtBaseAddress\r
515\r
516 ## Retrieve the top address for the load fix address\r
517 def _GetLoadFixAddress(self):\r
518 if self._LoadFixAddress == None:\r
519 if self._Header == None:\r
520 self._GetHeaderInfo()\r
521\r
522 if self._LoadFixAddress == None:\r
523 self._LoadFixAddress = self._Macros.get(TAB_FIX_LOAD_TOP_MEMORY_ADDRESS, '0')\r
524\r
525 try:\r
526 self._LoadFixAddress = int (self._LoadFixAddress, 0)\r
527 except:\r
528 EdkLogger.error("build", PARAMETER_INVALID, "FIX_LOAD_TOP_MEMORY_ADDRESS %s is not valid dec or hex string" % (self._LoadFixAddress))\r
529\r
530 #\r
531 # If command line defined, should override the value in DSC file.\r
532 #\r
533 if 'FIX_LOAD_TOP_MEMORY_ADDRESS' in GlobalData.gCommandLineDefines.keys():\r
534 try:\r
535 self._LoadFixAddress = int(GlobalData.gCommandLineDefines['FIX_LOAD_TOP_MEMORY_ADDRESS'], 0)\r
536 except:\r
537 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
538\r
539 if self._LoadFixAddress < 0:\r
540 EdkLogger.error("build", PARAMETER_INVALID, "FIX_LOAD_TOP_MEMORY_ADDRESS is set to the invalid negative value 0x%x" % (self._LoadFixAddress))\r
541 if self._LoadFixAddress != 0xFFFFFFFFFFFFFFFF and self._LoadFixAddress % 0x1000 != 0:\r
542 EdkLogger.error("build", PARAMETER_INVALID, "FIX_LOAD_TOP_MEMORY_ADDRESS is set to the invalid unaligned 4K value 0x%x" % (self._LoadFixAddress))\r
543\r
544 return self._LoadFixAddress\r
545\r
546 ## Retrieve RFCLanguage filter\r
547 def _GetRFCLanguages(self):\r
548 if self._RFCLanguages == None:\r
549 if self._Header == None:\r
550 self._GetHeaderInfo()\r
551 if self._RFCLanguages == None:\r
552 self._RFCLanguages = []\r
553 return self._RFCLanguages\r
554\r
555 ## Retrieve ISOLanguage filter\r
556 def _GetISOLanguages(self):\r
557 if self._ISOLanguages == None:\r
558 if self._Header == None:\r
559 self._GetHeaderInfo()\r
560 if self._ISOLanguages == None:\r
561 self._ISOLanguages = []\r
562 return self._ISOLanguages\r
563 ## Retrieve the GUID string for VPD tool\r
564 def _GetVpdToolGuid(self):\r
565 if self._VpdToolGuid == None:\r
566 if self._Header == None:\r
567 self._GetHeaderInfo()\r
568 if self._VpdToolGuid == None:\r
569 self._VpdToolGuid = ''\r
570 return self._VpdToolGuid\r
571\r
572 ## Retrieve [SkuIds] section information\r
573 def _GetSkuIds(self):\r
574 if self._SkuIds == None:\r
575 self._SkuIds = sdict()\r
576 RecordList = self._RawData[MODEL_EFI_SKU_ID, self._Arch]\r
577 for Record in RecordList:\r
578 if Record[0] in [None, '']:\r
579 EdkLogger.error('build', FORMAT_INVALID, 'No Sku ID number',\r
580 File=self.MetaFile, Line=Record[-1])\r
581 if Record[1] in [None, '']:\r
582 EdkLogger.error('build', FORMAT_INVALID, 'No Sku ID name',\r
583 File=self.MetaFile, Line=Record[-1])\r
8518bf0b
LG
584 Pattern = re.compile('^[1-9]\d*|0$')\r
585 if Pattern.match(Record[0]) == None:\r
586 EdkLogger.error('build', FORMAT_INVALID, "The format of the Sku ID number is invalid. The correct format is '{(0-9)} {(1-9)(0-9)+}'",\r
587 File=self.MetaFile, Line=Record[-1])\r
588 if not IsValidWord(Record[1]):\r
589 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
590 File=self.MetaFile, Line=Record[-1])\r
2b8a6c44 591 self._SkuIds[Record[1].upper()] = (Record[0], Record[1].upper(), Record[2].upper())\r
ae7b6df8 592 if 'DEFAULT' not in self._SkuIds:\r
8518bf0b 593 self._SkuIds['DEFAULT'] = ("0","DEFAULT","DEFAULT")\r
ae7b6df8 594 if 'COMMON' not in self._SkuIds:\r
8518bf0b 595 self._SkuIds['COMMON'] = ("0","DEFAULT","DEFAULT")\r
ae7b6df8 596 return self._SkuIds\r
8518bf0b
LG
597 def ToInt(self,intstr):\r
598 return int(intstr,16) if intstr.upper().startswith("0X") else int(intstr)\r
599 def _GetDefaultStores(self):\r
600 if self.DefaultStores == None:\r
601 self.DefaultStores = sdict()\r
602 RecordList = self._RawData[MODEL_EFI_DEFAULT_STORES, self._Arch]\r
603 for Record in RecordList:\r
604 if Record[0] in [None, '']:\r
605 EdkLogger.error('build', FORMAT_INVALID, 'No DefaultStores ID number',\r
606 File=self.MetaFile, Line=Record[-1])\r
607 if Record[1] in [None, '']:\r
608 EdkLogger.error('build', FORMAT_INVALID, 'No DefaultStores ID name',\r
609 File=self.MetaFile, Line=Record[-1])\r
2b8a6c44 610 self.DefaultStores[Record[1].upper()] = (self.ToInt(Record[0]),Record[1].upper())\r
8518bf0b
LG
611 if TAB_DEFAULT_STORES_DEFAULT not in self.DefaultStores:\r
612 self.DefaultStores[TAB_DEFAULT_STORES_DEFAULT] = (0,TAB_DEFAULT_STORES_DEFAULT)\r
e651d06c
LG
613 GlobalData.gDefaultStores = self.DefaultStores.keys()\r
614 if GlobalData.gDefaultStores:\r
615 GlobalData.gDefaultStores.sort()\r
8518bf0b 616 return self.DefaultStores\r
ae7b6df8
LG
617\r
618 ## Retrieve [Components] section information\r
619 def _GetModules(self):\r
620 if self._Modules != None:\r
621 return self._Modules\r
622\r
623 self._Modules = sdict()\r
624 RecordList = self._RawData[MODEL_META_DATA_COMPONENT, self._Arch]\r
625 Macros = self._Macros\r
626 Macros["EDK_SOURCE"] = GlobalData.gEcpSource\r
627 for Record in RecordList:\r
628 DuplicatedFile = False\r
629\r
630 ModuleFile = PathClass(NormPath(Record[0], Macros), GlobalData.gWorkspace, Arch=self._Arch)\r
8518bf0b
LG
631 ModuleId = Record[6]\r
632 LineNo = Record[7]\r
ae7b6df8
LG
633\r
634 # check the file validation\r
635 ErrorCode, ErrorInfo = ModuleFile.Validate('.inf')\r
636 if ErrorCode != 0:\r
637 EdkLogger.error('build', ErrorCode, File=self.MetaFile, Line=LineNo,\r
638 ExtraData=ErrorInfo)\r
639 # Check duplication\r
640 # If arch is COMMON, no duplicate module is checked since all modules in all component sections are selected\r
641 if self._Arch != 'COMMON' and ModuleFile in self._Modules:\r
642 DuplicatedFile = True\r
643\r
644 Module = ModuleBuildClassObject()\r
645 Module.MetaFile = ModuleFile\r
646\r
647 # get module private library instance\r
648 RecordList = self._RawData[MODEL_EFI_LIBRARY_CLASS, self._Arch, None, ModuleId]\r
649 for Record in RecordList:\r
650 LibraryClass = Record[0]\r
651 LibraryPath = PathClass(NormPath(Record[1], Macros), GlobalData.gWorkspace, Arch=self._Arch)\r
652 LineNo = Record[-1]\r
653\r
654 # check the file validation\r
655 ErrorCode, ErrorInfo = LibraryPath.Validate('.inf')\r
656 if ErrorCode != 0:\r
657 EdkLogger.error('build', ErrorCode, File=self.MetaFile, Line=LineNo,\r
658 ExtraData=ErrorInfo)\r
659\r
660 if LibraryClass == '' or LibraryClass == 'NULL':\r
661 self._NullLibraryNumber += 1\r
662 LibraryClass = 'NULL%d' % self._NullLibraryNumber\r
663 EdkLogger.verbose("Found forced library for %s\n\t%s [%s]" % (ModuleFile, LibraryPath, LibraryClass))\r
664 Module.LibraryClasses[LibraryClass] = LibraryPath\r
665 if LibraryPath not in self.LibraryInstances:\r
666 self.LibraryInstances.append(LibraryPath)\r
667\r
668 # get module private PCD setting\r
669 for Type in [MODEL_PCD_FIXED_AT_BUILD, MODEL_PCD_PATCHABLE_IN_MODULE, \\r
670 MODEL_PCD_FEATURE_FLAG, MODEL_PCD_DYNAMIC, MODEL_PCD_DYNAMIC_EX]:\r
671 RecordList = self._RawData[Type, self._Arch, None, ModuleId]\r
8518bf0b 672 for TokenSpaceGuid, PcdCName, Setting, Dummy1, Dummy2, Dummy3, Dummy4,Dummy5 in RecordList:\r
ae7b6df8
LG
673 TokenList = GetSplitValueList(Setting)\r
674 DefaultValue = TokenList[0]\r
675 if len(TokenList) > 1:\r
676 MaxDatumSize = TokenList[1]\r
677 else:\r
678 MaxDatumSize = ''\r
679 TypeString = self._PCD_TYPE_STRING_[Type]\r
680 Pcd = PcdClassObject(\r
681 PcdCName,\r
682 TokenSpaceGuid,\r
683 TypeString,\r
684 '',\r
685 DefaultValue,\r
686 '',\r
687 MaxDatumSize,\r
688 {},\r
689 False,\r
690 None\r
691 )\r
692 Module.Pcds[PcdCName, TokenSpaceGuid] = Pcd\r
693\r
694 # get module private build options\r
695 RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch, None, ModuleId]\r
8518bf0b 696 for ToolChainFamily, ToolChain, Option, Dummy1, Dummy2, Dummy3, Dummy4,Dummy5 in RecordList:\r
ae7b6df8
LG
697 if (ToolChainFamily, ToolChain) not in Module.BuildOptions:\r
698 Module.BuildOptions[ToolChainFamily, ToolChain] = Option\r
699 else:\r
700 OptionString = Module.BuildOptions[ToolChainFamily, ToolChain]\r
701 Module.BuildOptions[ToolChainFamily, ToolChain] = OptionString + " " + Option\r
702\r
703 RecordList = self._RawData[MODEL_META_DATA_HEADER, self._Arch, None, ModuleId]\r
704 if DuplicatedFile and not RecordList:\r
705 EdkLogger.error('build', FILE_DUPLICATED, File=self.MetaFile, ExtraData=str(ModuleFile), Line=LineNo)\r
706 if RecordList:\r
707 if len(RecordList) != 1:\r
708 EdkLogger.error('build', OPTION_UNKNOWN, 'Only FILE_GUID can be listed in <Defines> section.',\r
709 File=self.MetaFile, ExtraData=str(ModuleFile), Line=LineNo)\r
710 ModuleFile = ProcessDuplicatedInf(ModuleFile, RecordList[0][2], GlobalData.gWorkspace)\r
711 ModuleFile.Arch = self._Arch\r
712\r
713 self._Modules[ModuleFile] = Module\r
714 return self._Modules\r
715\r
716 ## Retrieve all possible library instances used in this platform\r
717 def _GetLibraryInstances(self):\r
718 if self._LibraryInstances == None:\r
719 self._GetLibraryClasses()\r
720 return self._LibraryInstances\r
721\r
722 ## Retrieve [LibraryClasses] information\r
723 def _GetLibraryClasses(self):\r
724 if self._LibraryClasses == None:\r
725 self._LibraryInstances = []\r
726 #\r
727 # tdict is a special dict kind of type, used for selecting correct\r
728 # library instance for given library class and module type\r
729 #\r
730 LibraryClassDict = tdict(True, 3)\r
731 # track all library class names\r
732 LibraryClassSet = set()\r
733 RecordList = self._RawData[MODEL_EFI_LIBRARY_CLASS, self._Arch, None, -1]\r
734 Macros = self._Macros\r
735 for Record in RecordList:\r
8518bf0b 736 LibraryClass, LibraryInstance, Dummy, Arch, ModuleType, Dummy,Dummy, LineNo = Record\r
ae7b6df8
LG
737 if LibraryClass == '' or LibraryClass == 'NULL':\r
738 self._NullLibraryNumber += 1\r
739 LibraryClass = 'NULL%d' % self._NullLibraryNumber\r
740 EdkLogger.verbose("Found forced library for arch=%s\n\t%s [%s]" % (Arch, LibraryInstance, LibraryClass))\r
741 LibraryClassSet.add(LibraryClass)\r
742 LibraryInstance = PathClass(NormPath(LibraryInstance, Macros), GlobalData.gWorkspace, Arch=self._Arch)\r
743 # check the file validation\r
744 ErrorCode, ErrorInfo = LibraryInstance.Validate('.inf')\r
745 if ErrorCode != 0:\r
746 EdkLogger.error('build', ErrorCode, File=self.MetaFile, Line=LineNo,\r
747 ExtraData=ErrorInfo)\r
748\r
749 if ModuleType != 'COMMON' and ModuleType not in SUP_MODULE_LIST:\r
750 EdkLogger.error('build', OPTION_UNKNOWN, "Unknown module type [%s]" % ModuleType,\r
751 File=self.MetaFile, ExtraData=LibraryInstance, Line=LineNo)\r
752 LibraryClassDict[Arch, ModuleType, LibraryClass] = LibraryInstance\r
753 if LibraryInstance not in self._LibraryInstances:\r
754 self._LibraryInstances.append(LibraryInstance)\r
755\r
756 # resolve the specific library instance for each class and each module type\r
757 self._LibraryClasses = tdict(True)\r
758 for LibraryClass in LibraryClassSet:\r
759 # try all possible module types\r
760 for ModuleType in SUP_MODULE_LIST:\r
761 LibraryInstance = LibraryClassDict[self._Arch, ModuleType, LibraryClass]\r
762 if LibraryInstance == None:\r
763 continue\r
764 self._LibraryClasses[LibraryClass, ModuleType] = LibraryInstance\r
765\r
766 # for Edk style library instances, which are listed in different section\r
767 Macros["EDK_SOURCE"] = GlobalData.gEcpSource\r
768 RecordList = self._RawData[MODEL_EFI_LIBRARY_INSTANCE, self._Arch]\r
769 for Record in RecordList:\r
770 File = PathClass(NormPath(Record[0], Macros), GlobalData.gWorkspace, Arch=self._Arch)\r
771 LineNo = Record[-1]\r
772 # check the file validation\r
773 ErrorCode, ErrorInfo = File.Validate('.inf')\r
774 if ErrorCode != 0:\r
775 EdkLogger.error('build', ErrorCode, File=self.MetaFile, Line=LineNo,\r
776 ExtraData=ErrorInfo)\r
777 if File not in self._LibraryInstances:\r
778 self._LibraryInstances.append(File)\r
779 #\r
780 # we need the module name as the library class name, so we have\r
781 # to parse it here. (self._Bdb[] will trigger a file parse if it\r
782 # hasn't been parsed)\r
783 #\r
784 Library = self._Bdb[File, self._Arch, self._Target, self._Toolchain]\r
785 self._LibraryClasses[Library.BaseName, ':dummy:'] = Library\r
786 return self._LibraryClasses\r
787\r
788 def _ValidatePcd(self, PcdCName, TokenSpaceGuid, Setting, PcdType, LineNo):\r
789 if self._DecPcds == None:\r
2b8a6c44 790\r
ae7b6df8
LG
791 FdfInfList = []\r
792 if GlobalData.gFdfParser:\r
793 FdfInfList = GlobalData.gFdfParser.Profile.InfList\r
794\r
795 PkgSet = set()\r
796 for Inf in FdfInfList:\r
797 ModuleFile = PathClass(NormPath(Inf), GlobalData.gWorkspace, Arch=self._Arch)\r
798 if ModuleFile in self._Modules:\r
799 continue\r
800 ModuleData = self._Bdb[ModuleFile, self._Arch, self._Target, self._Toolchain]\r
801 PkgSet.update(ModuleData.Packages)\r
ae7b6df8 802\r
2b8a6c44
LG
803 self._DecPcds = GetDeclaredPcd(self, self._Bdb, self._Arch, self._Target, self._Toolchain,PkgSet)\r
804\r
805\r
806 if (PcdCName, TokenSpaceGuid) not in self._DecPcds:\r
ae7b6df8
LG
807 EdkLogger.error('build', PARSER_ERROR,\r
808 "Pcd (%s.%s) defined in DSC is not declared in DEC files. Arch: ['%s']" % (TokenSpaceGuid, PcdCName, self._Arch),\r
809 File=self.MetaFile, Line=LineNo)\r
810 ValueList, IsValid, Index = AnalyzeDscPcd(Setting, PcdType, self._DecPcds[PcdCName, TokenSpaceGuid].DatumType)\r
520365de
B
811 if not IsValid:\r
812 if PcdType not in [MODEL_PCD_FEATURE_FLAG, MODEL_PCD_FIXED_AT_BUILD]:\r
813 EdkLogger.error('build', FORMAT_INVALID, "Pcd format incorrect.", File=self.MetaFile, Line=LineNo,\r
814 ExtraData="%s.%s|%s" % (TokenSpaceGuid, PcdCName, Setting))\r
815 else:\r
816 if ValueList[2] == '-1':\r
817 EdkLogger.error('build', FORMAT_INVALID, "Pcd format incorrect.", File=self.MetaFile, Line=LineNo,\r
818 ExtraData="%s.%s|%s" % (TokenSpaceGuid, PcdCName, Setting))\r
ae7b6df8
LG
819 if ValueList[Index] and PcdType not in [MODEL_PCD_FEATURE_FLAG, MODEL_PCD_FIXED_AT_BUILD]:\r
820 try:\r
821 ValueList[Index] = ValueExpression(ValueList[Index], GlobalData.gPlatformPcds)(True)\r
822 except WrnExpression, Value:\r
823 ValueList[Index] = Value.result\r
824 except EvaluationException, Excpt:\r
825 if hasattr(Excpt, 'Pcd'):\r
826 if Excpt.Pcd in GlobalData.gPlatformOtherPcds:\r
827 EdkLogger.error('Parser', FORMAT_INVALID, "Cannot use this PCD (%s) in an expression as"\r
828 " it must be defined in a [PcdsFixedAtBuild] or [PcdsFeatureFlag] section"\r
829 " of the DSC file" % Excpt.Pcd,\r
830 File=self.MetaFile, Line=LineNo)\r
831 else:\r
832 EdkLogger.error('Parser', FORMAT_INVALID, "PCD (%s) is not defined in DSC file" % Excpt.Pcd,\r
833 File=self.MetaFile, Line=LineNo)\r
834 else:\r
835 EdkLogger.error('Parser', FORMAT_INVALID, "Invalid expression: %s" % str(Excpt),\r
836 File=self.MetaFile, Line=LineNo)\r
837 if ValueList[Index] == 'True':\r
838 ValueList[Index] = '1'\r
839 elif ValueList[Index] == 'False':\r
840 ValueList[Index] = '0'\r
841 if ValueList[Index]:\r
842 Valid, ErrStr = CheckPcdDatum(self._DecPcds[PcdCName, TokenSpaceGuid].DatumType, ValueList[Index])\r
843 if not Valid:\r
844 EdkLogger.error('build', FORMAT_INVALID, ErrStr, File=self.MetaFile, Line=LineNo,\r
845 ExtraData="%s.%s" % (TokenSpaceGuid, PcdCName))\r
520365de
B
846 if PcdType in (MODEL_PCD_DYNAMIC_DEFAULT, MODEL_PCD_DYNAMIC_EX_DEFAULT):\r
847 if self._DecPcds[PcdCName, TokenSpaceGuid].DatumType.strip() != ValueList[1].strip():\r
848 EdkLogger.error('build', FORMAT_INVALID, ErrStr , File=self.MetaFile, Line=LineNo,\r
849 ExtraData="%s.%s|%s" % (TokenSpaceGuid, PcdCName, Setting))\r
ae7b6df8
LG
850 return ValueList\r
851\r
8518bf0b
LG
852 def _FilterPcdBySkuUsage(self,Pcds):\r
853 available_sku = self.SkuIdMgr.AvailableSkuIdSet\r
854 sku_usage = self.SkuIdMgr.SkuUsageType\r
855 if sku_usage == SkuClass.SINGLE:\r
856 for pcdname in Pcds:\r
857 pcd = Pcds[pcdname]\r
858 Pcds[pcdname].SkuInfoList = {"DEFAULT":pcd.SkuInfoList[skuid] for skuid in pcd.SkuInfoList if skuid in available_sku}\r
65eff519
LG
859 if type(pcd) is StructurePcd and pcd.SkuOverrideValues:\r
860 Pcds[pcdname].SkuOverrideValues = {"DEFAULT":pcd.SkuOverrideValues[skuid] for skuid in pcd.SkuOverrideValues if skuid in available_sku}\r
8518bf0b
LG
861 else:\r
862 for pcdname in Pcds:\r
863 pcd = Pcds[pcdname]\r
864 Pcds[pcdname].SkuInfoList = {skuid:pcd.SkuInfoList[skuid] for skuid in pcd.SkuInfoList if skuid in available_sku}\r
65eff519
LG
865 if type(pcd) is StructurePcd and pcd.SkuOverrideValues:\r
866 Pcds[pcdname].SkuOverrideValues = {skuid:pcd.SkuOverrideValues[skuid] for skuid in pcd.SkuOverrideValues if skuid in available_sku}\r
8518bf0b 867 return Pcds\r
2b8a6c44
LG
868 def CompleteHiiPcdsDefaultStores(self,Pcds):\r
869 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
870 DefaultStoreMgr = DefaultStore(self.DefaultStores)\r
871 for pcd in HiiPcd:\r
872 for skuid in pcd.SkuInfoList:\r
873 skuobj = pcd.SkuInfoList.get(skuid)\r
874 if "STANDARD" not in skuobj.DefaultStoreDict:\r
875 PcdDefaultStoreSet = set([defaultstorename for defaultstorename in skuobj.DefaultStoreDict])\r
876 mindefaultstorename = DefaultStoreMgr.GetMin(PcdDefaultStoreSet)\r
877 skuobj.DefaultStoreDict['STANDARD'] = copy.deepcopy(skuobj.DefaultStoreDict[mindefaultstorename])\r
878 return Pcds\r
879\r
ae7b6df8
LG
880 ## Retrieve all PCD settings in platform\r
881 def _GetPcds(self):\r
882 if self._Pcds == None:\r
883 self._Pcds = sdict()\r
884 self._Pcds.update(self._GetPcd(MODEL_PCD_FIXED_AT_BUILD))\r
885 self._Pcds.update(self._GetPcd(MODEL_PCD_PATCHABLE_IN_MODULE))\r
886 self._Pcds.update(self._GetPcd(MODEL_PCD_FEATURE_FLAG))\r
887 self._Pcds.update(self._GetDynamicPcd(MODEL_PCD_DYNAMIC_DEFAULT))\r
888 self._Pcds.update(self._GetDynamicHiiPcd(MODEL_PCD_DYNAMIC_HII))\r
889 self._Pcds.update(self._GetDynamicVpdPcd(MODEL_PCD_DYNAMIC_VPD))\r
890 self._Pcds.update(self._GetDynamicPcd(MODEL_PCD_DYNAMIC_EX_DEFAULT))\r
891 self._Pcds.update(self._GetDynamicHiiPcd(MODEL_PCD_DYNAMIC_EX_HII))\r
892 self._Pcds.update(self._GetDynamicVpdPcd(MODEL_PCD_DYNAMIC_EX_VPD))\r
893\r
8518bf0b 894 self._Pcds = self.CompletePcdValues(self._Pcds)\r
ae7b6df8 895 self._Pcds = self.UpdateStructuredPcds(MODEL_PCD_TYPE_LIST, self._Pcds)\r
2b8a6c44 896 self._Pcds = self.CompleteHiiPcdsDefaultStores(self._Pcds)\r
8518bf0b 897 self._Pcds = self._FilterPcdBySkuUsage(self._Pcds)\r
ae7b6df8
LG
898 return self._Pcds\r
899\r
8518bf0b
LG
900 def _dumpPcdInfo(self,Pcds):\r
901 for pcd in Pcds:\r
902 pcdobj = Pcds[pcd]\r
903 if not pcdobj.TokenCName.startswith("Test"):\r
904 continue\r
905 for skuid in pcdobj.SkuInfoList:\r
906 if pcdobj.Type in (self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII],self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]):\r
907 for storename in pcdobj.SkuInfoList[skuid].DefaultStoreDict:\r
908 print "PcdCName: %s, SkuName: %s, StoreName: %s, Value: %s" % (".".join((pcdobj.TokenSpaceGuidCName, pcdobj.TokenCName)), skuid,storename,str(pcdobj.SkuInfoList[skuid].DefaultStoreDict[storename]))\r
909 else:\r
910 print "PcdCName: %s, SkuName: %s, Value: %s" % (".".join((pcdobj.TokenSpaceGuidCName, pcdobj.TokenCName)), skuid,str(pcdobj.SkuInfoList[skuid].DefaultValue))\r
ae7b6df8
LG
911 ## Retrieve [BuildOptions]\r
912 def _GetBuildOptions(self):\r
913 if self._BuildOptions == None:\r
914 self._BuildOptions = sdict()\r
915 #\r
916 # Retrieve build option for EDKII and EDK style module\r
917 #\r
918 for CodeBase in (EDKII_NAME, EDK_NAME):\r
919 RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch, CodeBase]\r
8518bf0b 920 for ToolChainFamily, ToolChain, Option, Dummy1, Dummy2, Dummy3, Dummy4,Dummy5 in RecordList:\r
c05c2c05
LG
921 if Dummy3.upper() != 'COMMON':\r
922 continue\r
ae7b6df8
LG
923 CurKey = (ToolChainFamily, ToolChain, CodeBase)\r
924 #\r
925 # Only flags can be appended\r
926 #\r
927 if CurKey not in self._BuildOptions or not ToolChain.endswith('_FLAGS') or Option.startswith('='):\r
928 self._BuildOptions[CurKey] = Option\r
929 else:\r
c05c2c05
LG
930 if ' ' + Option not in self._BuildOptions[CurKey]:\r
931 self._BuildOptions[CurKey] += ' ' + Option\r
ae7b6df8
LG
932 return self._BuildOptions\r
933\r
934 def GetBuildOptionsByModuleType(self, Edk, ModuleType):\r
935 if self._ModuleTypeOptions == None:\r
936 self._ModuleTypeOptions = sdict()\r
937 if (Edk, ModuleType) not in self._ModuleTypeOptions:\r
938 options = sdict()\r
939 self._ModuleTypeOptions[Edk, ModuleType] = options\r
940 DriverType = '%s.%s' % (Edk, ModuleType)\r
941 CommonDriverType = '%s.%s' % ('COMMON', ModuleType)\r
c05c2c05
LG
942 RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch]\r
943 for ToolChainFamily, ToolChain, Option, Dummy1, Dummy2, Dummy3, Dummy4,Dummy5 in RecordList:\r
944 Type = Dummy2 + '.' + Dummy3\r
945 if Type.upper() == DriverType.upper() or Type.upper() == CommonDriverType.upper():\r
ae7b6df8
LG
946 Key = (ToolChainFamily, ToolChain, Edk)\r
947 if Key not in options or not ToolChain.endswith('_FLAGS') or Option.startswith('='):\r
948 options[Key] = Option\r
949 else:\r
c05c2c05
LG
950 if ' ' + Option not in options[Key]:\r
951 options[Key] += ' ' + Option\r
ae7b6df8
LG
952 return self._ModuleTypeOptions[Edk, ModuleType]\r
953\r
954 def GetStructurePcdInfo(self, PcdSet):\r
955 structure_pcd_data = {}\r
956 for item in PcdSet:\r
8518bf0b
LG
957 if (item[0],item[1]) not in structure_pcd_data:\r
958 structure_pcd_data[(item[0],item[1])] = []\r
959 structure_pcd_data[(item[0],item[1])].append(item)\r
ae7b6df8
LG
960\r
961 return structure_pcd_data\r
962\r
963 def UpdateStructuredPcds(self, TypeList, AllPcds):\r
65eff519
LG
964\r
965 DynamicPcdType = [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_DEFAULT],\r
966 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII],\r
967 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_VPD],\r
968 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_DEFAULT],\r
969 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII],\r
970 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_VPD]]\r
971\r
ae7b6df8 972 Pcds = AllPcds\r
8518bf0b 973 DefaultStoreMgr = DefaultStore(self.DefaultStores)\r
65eff519
LG
974 SkuIds = self.SkuIdMgr.AvailableSkuIdSet\r
975 SkuIds.update({'DEFAULT':0})\r
8518bf0b 976 DefaultStores = set([storename for pcdobj in AllPcds.values() for skuobj in pcdobj.SkuInfoList.values() for storename in skuobj.DefaultStoreDict.keys()])\r
ae7b6df8
LG
977\r
978 S_PcdSet = []\r
979 # Find out all possible PCD candidates for self._Arch\r
980 RecordList = []\r
2b8a6c44 981\r
ae7b6df8
LG
982 for Type in TypeList:\r
983 RecordList.extend(self._RawData[Type, self._Arch])\r
984\r
8518bf0b 985 for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, default_store, Dummy4,Dummy5 in RecordList:\r
2b8a6c44
LG
986 SkuName = SkuName.upper()\r
987 default_store = default_store.upper()\r
988 SkuName = 'DEFAULT' if SkuName == 'COMMON' else SkuName\r
8518bf0b
LG
989 if SkuName not in SkuIds:\r
990 continue\r
2b8a6c44 991\r
8518bf0b
LG
992 if SkuName in SkuIds and "." in TokenSpaceGuid:\r
993 S_PcdSet.append(( TokenSpaceGuid.split(".")[0],TokenSpaceGuid.split(".")[1], PcdCName,SkuName, default_store,Dummy5, AnalyzePcdExpression(Setting)[0]))\r
ae7b6df8
LG
994\r
995 # handle pcd value override\r
996 StrPcdSet = self.GetStructurePcdInfo(S_PcdSet)\r
997 S_pcd_set = {}\r
998 for str_pcd in StrPcdSet:\r
8518bf0b
LG
999 str_pcd_obj = Pcds.get((str_pcd[1], str_pcd[0]), None)\r
1000 str_pcd_dec = self._DecPcds.get((str_pcd[1], str_pcd[0]), None)\r
ae7b6df8
LG
1001 if str_pcd_dec:\r
1002 str_pcd_obj_str = StructurePcd()\r
1003 str_pcd_obj_str.copy(str_pcd_dec)\r
1004 if str_pcd_obj:\r
1005 str_pcd_obj_str.copy(str_pcd_obj)\r
1006 if str_pcd_obj.DefaultValue:\r
1007 str_pcd_obj_str.DefaultFromDSC = str_pcd_obj.DefaultValue\r
1008 for str_pcd_data in StrPcdSet[str_pcd]:\r
8518bf0b
LG
1009 if str_pcd_data[3] in SkuIds:\r
1010 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,LineNo=str_pcd_data[5])\r
1011 S_pcd_set[str_pcd[1], str_pcd[0]] = str_pcd_obj_str\r
2b8a6c44
LG
1012 else:\r
1013 EdkLogger.error('build', PARSER_ERROR,\r
1014 "Pcd (%s.%s) defined in DSC is not declared in DEC files. Arch: ['%s']" % (str_pcd[0], str_pcd[1], self._Arch),\r
1015 File=self.MetaFile,Line = StrPcdSet[str_pcd][0][5])\r
ae7b6df8 1016 # Add the Structure PCD that only defined in DEC, don't have override in DSC file\r
5644e5ce 1017 for Pcd in self.DecPcds:\r
ae7b6df8
LG
1018 if type (self._DecPcds[Pcd]) is StructurePcd:\r
1019 if Pcd not in S_pcd_set:\r
1020 str_pcd_obj_str = StructurePcd()\r
1021 str_pcd_obj_str.copy(self._DecPcds[Pcd])\r
1022 str_pcd_obj = Pcds.get(Pcd, None)\r
1023 if str_pcd_obj:\r
1024 str_pcd_obj_str.copy(str_pcd_obj)\r
1025 if str_pcd_obj.DefaultValue:\r
1026 str_pcd_obj_str.DefaultFromDSC = str_pcd_obj.DefaultValue\r
1027 S_pcd_set[Pcd] = str_pcd_obj_str\r
1028 if S_pcd_set:\r
1029 GlobalData.gStructurePcd[self.Arch] = S_pcd_set\r
8518bf0b 1030 for stru_pcd in S_pcd_set.values():\r
67e63e9a
LG
1031 for skuid in SkuIds:\r
1032 if skuid in stru_pcd.SkuOverrideValues:\r
1033 continue\r
1034 nextskuid = self.SkuIdMgr.GetNextSkuId(skuid)\r
1035 NoDefault = False\r
1036 while nextskuid not in stru_pcd.SkuOverrideValues:\r
1037 if nextskuid == "DEFAULT":\r
1038 NoDefault = True\r
1039 break\r
1040 nextskuid = self.SkuIdMgr.GetNextSkuId(nextskuid)\r
1041 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
8518bf0b
LG
1042 if stru_pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
1043 for skuid in SkuIds:\r
1044 nextskuid = skuid\r
2b8a6c44 1045 NoDefault = False\r
8518bf0b
LG
1046 if skuid not in stru_pcd.SkuOverrideValues:\r
1047 while nextskuid not in stru_pcd.SkuOverrideValues:\r
2b8a6c44
LG
1048 if nextskuid == "DEFAULT":\r
1049 NoDefault = True\r
1050 break\r
8518bf0b 1051 nextskuid = self.SkuIdMgr.GetNextSkuId(nextskuid)\r
2b8a6c44
LG
1052 if NoDefault:\r
1053 continue\r
1054 PcdDefaultStoreSet = set([defaultstorename for defaultstorename in stru_pcd.SkuOverrideValues[nextskuid]])\r
8518bf0b 1055 mindefaultstorename = DefaultStoreMgr.GetMin(PcdDefaultStoreSet)\r
2b8a6c44 1056\r
8518bf0b
LG
1057 for defaultstoreid in DefaultStores:\r
1058 if defaultstoreid not in stru_pcd.SkuOverrideValues[skuid]:\r
2b8a6c44 1059 stru_pcd.SkuOverrideValues[skuid][defaultstoreid] = copy.deepcopy(stru_pcd.SkuOverrideValues[nextskuid][mindefaultstorename])\r
65eff519 1060\r
ae7b6df8
LG
1061 Str_Pcd_Values = self.GenerateByteArrayValue(S_pcd_set)\r
1062 if Str_Pcd_Values:\r
8518bf0b
LG
1063 for (skuname,StoreName,PcdGuid,PcdName,PcdValue) in Str_Pcd_Values:\r
1064 str_pcd_obj = S_pcd_set.get((PcdName, PcdGuid))\r
ae7b6df8 1065 if str_pcd_obj is None:\r
67e63e9a 1066 print PcdName, PcdGuid\r
ae7b6df8
LG
1067 raise\r
1068 if str_pcd_obj.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII],\r
1069 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
8518bf0b
LG
1070 if skuname not in str_pcd_obj.SkuInfoList:\r
1071 str_pcd_obj.SkuInfoList[skuname] = SkuInfoClass(SkuIdName=skuname, SkuId=self.SkuIds[skuname][0], HiiDefaultValue=PcdValue, DefaultStore = {StoreName:PcdValue})\r
ae7b6df8 1072 else:\r
8518bf0b
LG
1073 str_pcd_obj.SkuInfoList[skuname].HiiDefaultValue = PcdValue\r
1074 str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.update({StoreName:PcdValue})\r
ae7b6df8
LG
1075 elif str_pcd_obj.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],\r
1076 self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:\r
8518bf0b
LG
1077 if skuname in (self.SkuIdMgr.SystemSkuId, 'DEFAULT', 'COMMON'):\r
1078 str_pcd_obj.DefaultValue = PcdValue\r
ae7b6df8 1079 else:\r
8518bf0b 1080 if skuname not in str_pcd_obj.SkuInfoList:\r
65eff519
LG
1081 nextskuid = self.SkuIdMgr.GetNextSkuId(skuname)\r
1082 NoDefault = False\r
1083 while nextskuid not in str_pcd_obj.SkuInfoList:\r
1084 if nextskuid == "DEFAULT":\r
1085 NoDefault = True\r
1086 break\r
1087 nextskuid = self.SkuIdMgr.GetNextSkuId(nextskuid)\r
1088 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
1089 str_pcd_obj.SkuInfoList[skuname].SkuId = self.SkuIds[skuname][0]\r
1090 str_pcd_obj.SkuInfoList[skuname].SkuIdName = skuname\r
ae7b6df8 1091 else:\r
8518bf0b
LG
1092 str_pcd_obj.SkuInfoList[skuname].DefaultValue = PcdValue\r
1093 for str_pcd_obj in S_pcd_set.values():\r
1094 if str_pcd_obj.Type not in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII],\r
1095 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
1096 continue\r
1097 PcdDefaultStoreSet = set([defaultstorename for skuobj in str_pcd_obj.SkuInfoList.values() for defaultstorename in skuobj.DefaultStoreDict])\r
1098 DefaultStoreObj = DefaultStore(self._GetDefaultStores())\r
1099 mindefaultstorename = DefaultStoreObj.GetMin(PcdDefaultStoreSet)\r
1100 str_pcd_obj.SkuInfoList[self.SkuIdMgr.SystemSkuId].HiiDefaultValue = str_pcd_obj.SkuInfoList[self.SkuIdMgr.SystemSkuId].DefaultStoreDict[mindefaultstorename]\r
ae7b6df8
LG
1101\r
1102 for str_pcd_obj in S_pcd_set.values():\r
2b8a6c44 1103\r
ae7b6df8
LG
1104 str_pcd_obj.MaxDatumSize = self.GetStructurePcdMaxSize(str_pcd_obj)\r
1105 Pcds[str_pcd_obj.TokenCName, str_pcd_obj.TokenSpaceGuidCName] = str_pcd_obj\r
1106\r
65eff519
LG
1107 for pcdkey in Pcds:\r
1108 pcd = Pcds[pcdkey]\r
1109 if 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys():\r
1110 pcd.SkuInfoList['DEFAULT'] = pcd.SkuInfoList['COMMON']\r
1111 del(pcd.SkuInfoList['COMMON'])\r
1112 elif 'DEFAULT' in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys():\r
1113 del(pcd.SkuInfoList['COMMON'])\r
1114\r
1115 map(self.FilterSkuSettings,[Pcds[pcdkey] for pcdkey in Pcds if Pcds[pcdkey].Type in DynamicPcdType])\r
ae7b6df8
LG
1116 return Pcds\r
1117\r
1118 ## Retrieve non-dynamic PCD settings\r
1119 #\r
1120 # @param Type PCD type\r
1121 #\r
1122 # @retval a dict object contains settings of given PCD type\r
1123 #\r
1124 def _GetPcd(self, Type):\r
1125 Pcds = sdict()\r
1126 #\r
1127 # tdict is a special dict kind of type, used for selecting correct\r
1128 # PCD settings for certain ARCH\r
1129 #\r
2b8a6c44 1130 AvailableSkuIdSet = copy.copy(self.SkuIds)\r
ae7b6df8
LG
1131\r
1132 PcdDict = tdict(True, 3)\r
1133 PcdSet = set()\r
1134 # Find out all possible PCD candidates for self._Arch\r
1135 RecordList = self._RawData[Type, self._Arch]\r
ae7b6df8 1136 PcdValueDict = sdict()\r
8518bf0b 1137 for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, Dummy3, Dummy4,Dummy5 in RecordList:\r
2b8a6c44
LG
1138 SkuName = SkuName.upper()\r
1139 SkuName = 'DEFAULT' if SkuName == 'COMMON' else SkuName\r
1140 if SkuName not in AvailableSkuIdSet:\r
1141 EdkLogger.error('build ', PARAMETER_INVALID, 'Sku %s is not defined in [SkuIds] section' % SkuName,\r
1142 File=self.MetaFile, Line=Dummy5)\r
8518bf0b
LG
1143 if SkuName in (self.SkuIdMgr.SystemSkuId, 'DEFAULT', 'COMMON'):\r
1144 if "." not in TokenSpaceGuid:\r
1145 PcdSet.add((PcdCName, TokenSpaceGuid, SkuName, Dummy4))\r
ae7b6df8 1146 PcdDict[Arch, PcdCName, TokenSpaceGuid, SkuName] = Setting\r
ae7b6df8
LG
1147\r
1148 for PcdCName, TokenSpaceGuid, SkuName, Dummy4 in PcdSet:\r
1149 Setting = PcdDict[self._Arch, PcdCName, TokenSpaceGuid, SkuName]\r
1150 if Setting == None:\r
1151 continue\r
1152 PcdValue, DatumType, MaxDatumSize = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4)\r
1153 if (PcdCName, TokenSpaceGuid) in PcdValueDict:\r
1154 PcdValueDict[PcdCName, TokenSpaceGuid][SkuName] = (PcdValue, DatumType, MaxDatumSize)\r
1155 else:\r
1156 PcdValueDict[PcdCName, TokenSpaceGuid] = {SkuName:(PcdValue, DatumType, MaxDatumSize)}\r
1157\r
1158 PcdsKeys = PcdValueDict.keys()\r
1159 for PcdCName, TokenSpaceGuid in PcdsKeys:\r
1160\r
1161 PcdSetting = PcdValueDict[PcdCName, TokenSpaceGuid]\r
1162 PcdValue = None\r
1163 DatumType = None\r
1164 MaxDatumSize = None\r
1165 if 'COMMON' in PcdSetting:\r
1166 PcdValue, DatumType, MaxDatumSize = PcdSetting['COMMON']\r
1167 if 'DEFAULT' in PcdSetting:\r
1168 PcdValue, DatumType, MaxDatumSize = PcdSetting['DEFAULT']\r
8518bf0b
LG
1169 if self.SkuIdMgr.SystemSkuId in PcdSetting:\r
1170 PcdValue, DatumType, MaxDatumSize = PcdSetting[self.SkuIdMgr.SystemSkuId]\r
ae7b6df8
LG
1171\r
1172 Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject(\r
1173 PcdCName,\r
1174 TokenSpaceGuid,\r
1175 self._PCD_TYPE_STRING_[Type],\r
1176 DatumType,\r
1177 PcdValue,\r
1178 '',\r
1179 MaxDatumSize,\r
1180 {},\r
1181 False,\r
1182 None,\r
1183 IsDsc=True)\r
1184\r
1185\r
1186 return Pcds\r
1187\r
8518bf0b
LG
1188 def __UNICODE2OCTList(self,Value):\r
1189 Value = Value.strip()\r
1190 Value = Value[2:-1]\r
1191 List = []\r
1192 for Item in Value:\r
1193 Temp = '%04X' % ord(Item)\r
1194 List.append('0x' + Temp[2:4])\r
1195 List.append('0x' + Temp[0:2])\r
1196 List.append('0x00')\r
1197 List.append('0x00')\r
1198 return List\r
1199 def __STRING2OCTList(self,Value):\r
1200 OCTList = []\r
1201 Value = Value.strip('"')\r
1202 for char in Value:\r
1203 Temp = '%02X' % ord(char)\r
1204 OCTList.append('0x' + Temp)\r
1205 OCTList.append('0x00')\r
1206 return OCTList\r
1207\r
ae7b6df8
LG
1208 def GetStructurePcdMaxSize(self, str_pcd):\r
1209 pcd_default_value = str_pcd.DefaultValue\r
1210 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
1211 sku_values.append(pcd_default_value)\r
1212\r
1213 def get_length(value):\r
1214 Value = value.strip()\r
a0939593
LG
1215 if len(value) > 1:\r
1216 if Value.startswith('GUID') and Value.endswith(')'):\r
1217 return 16\r
1218 if Value.startswith('L"') and Value.endswith('"'):\r
1219 return len(Value[2:-1])\r
1220 if Value[0] == '"' and Value[-1] == '"':\r
1221 return len(Value) - 2\r
1222 if Value[0] == '{' and Value[-1] == '}':\r
1223 return len(Value.split(","))\r
1224 if Value.startswith("L'") and Value.endswith("'") and len(list(Value[2:-1])) > 1:\r
1225 return len(list(Value[2:-1]))\r
1226 if Value[0] == "'" and Value[-1] == "'" and len(list(Value[1:-1])) > 1:\r
1227 return len(Value) - 2\r
ae7b6df8
LG
1228 return len(Value)\r
1229\r
1230 return str(max([pcd_size for pcd_size in [get_length(item) for item in sku_values]]))\r
1231\r
1232 def IsFieldValueAnArray (self, Value):\r
1233 Value = Value.strip()\r
1234 if Value.startswith('GUID') and Value.endswith(')'):\r
1235 return True\r
1236 if Value.startswith('L"') and Value.endswith('"') and len(list(Value[2:-1])) > 1:\r
1237 return True\r
1238 if Value[0] == '"' and Value[-1] == '"' and len(list(Value[1:-1])) > 1:\r
1239 return True\r
1240 if Value[0] == '{' and Value[-1] == '}':\r
1241 return True\r
1242 if Value.startswith("L'") and Value.endswith("'") and len(list(Value[2:-1])) > 1:\r
1243 print 'foo = ', list(Value[2:-1])\r
1244 return True\r
1245 if Value[0] == "'" and Value[-1] == "'" and len(list(Value[1:-1])) > 1:\r
1246 print 'bar = ', list(Value[1:-1])\r
1247 return True\r
1248 return False\r
1249\r
1250 def ExecuteCommand (self, Command):\r
1251 try:\r
1252 Process = subprocess.Popen(Command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)\r
1253 except:\r
1254 print 'ERROR: Can not execute command:', Command\r
1255 sys.exit(1)\r
1256 Result = Process.communicate()\r
1257 if Process.returncode <> 0:\r
1258 print 'ERROR: Can not collect output from command:', Command\r
1259 return Result[0], Result[1]\r
1260\r
1261 def IntToCString(self, Value, ValueSize):\r
1262 Result = '"'\r
1263 if not isinstance (Value, str):\r
1264 for Index in range(0, ValueSize):\r
1265 Result = Result + '\\x%02x' % (Value & 0xff)\r
1266 Value = Value >> 8\r
1267 Result = Result + '"'\r
1268 return Result\r
1269\r
1270 def GenerateInitializeFunc(self, SkuName, DefaultStoreName, Pcd, InitByteValue, CApp):\r
8518bf0b 1271 OverrideValues = {DefaultStoreName:""}\r
ae7b6df8
LG
1272 if Pcd.SkuOverrideValues:\r
1273 OverrideValues = Pcd.SkuOverrideValues[SkuName]\r
8518bf0b
LG
1274 for DefaultStoreName in OverrideValues.keys():\r
1275 CApp = CApp + 'void\n'\r
1276 CApp = CApp + 'Initialize_%s_%s_%s_%s(\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
1277 CApp = CApp + ' void\n'\r
1278 CApp = CApp + ' )\n'\r
1279 CApp = CApp + '{\n'\r
1280 CApp = CApp + ' UINT32 Size;\n'\r
1281 CApp = CApp + ' UINT32 FieldSize;\n'\r
b2395724 1282 CApp = CApp + ' CHAR8 *Value;\n'\r
8518bf0b
LG
1283 CApp = CApp + ' UINT32 OriginalSize;\n'\r
1284 CApp = CApp + ' VOID *OriginalPcd;\n'\r
1285 CApp = CApp + ' %s *Pcd;\n' % (Pcd.DatumType)\r
1286 CApp = CApp + '\n'\r
47854fd5 1287\r
8518bf0b 1288 Pcd.DefaultValue = Pcd.DefaultValue.strip()\r
47854fd5
LG
1289 PcdDefaultValue = StringToArray(Pcd.DefaultValue)\r
1290\r
8518bf0b 1291 InitByteValue += '%s.%s.%s.%s|%s|%s\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.DatumType, PcdDefaultValue)\r
ae7b6df8 1292\r
8518bf0b
LG
1293 #\r
1294 # Get current PCD value and size\r
1295 #\r
1296 CApp = CApp + ' OriginalPcd = PcdGetPtr (%s, %s, %s, %s, &OriginalSize);\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
ae7b6df8 1297\r
8518bf0b
LG
1298 #\r
1299 # Determine the size of the PCD. For simple structures, sizeof(TYPE) provides\r
1300 # the correct value. For structures with a flexible array member, the flexible\r
1301 # array member is detected, and the size is based on the highest index used with\r
1302 # the flexible array member. The flexible array member must be the last field\r
1303 # in a structure. The size formula for this case is:\r
1304 # OFFSET_OF(FlexbleArrayField) + sizeof(FlexibleArray[0]) * (HighestIndex + 1)\r
1305 #\r
1306 CApp = CApp + ' Size = sizeof(%s);\n' % (Pcd.DatumType)\r
c05c2c05
LG
1307 for skuname in self.SkuIdMgr.SkuOverrideOrder():\r
1308 inherit_OverrideValues = Pcd.SkuOverrideValues[skuname]\r
1309 for FieldList in [Pcd.DefaultValues, inherit_OverrideValues.get(DefaultStoreName)]:\r
1310 if not FieldList:\r
1311 continue\r
1312 for FieldName in FieldList:\r
1313 FieldName = "." + FieldName\r
1314 IsArray = self.IsFieldValueAnArray(FieldList[FieldName.strip(".")][0])\r
1315 if IsArray:\r
1316 Value, ValueSize = ParseFieldValue (FieldList[FieldName.strip(".")][0])\r
1317 CApp = CApp + ' __FLEXIBLE_SIZE(Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s) + ((%d %% __ARRAY_ELEMENT_SIZE(%s, %s)) ? 1 : 0));\n' % (Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."));\r
1318 else:\r
1319 NewFieldName = ''\r
1320 while '[' in FieldName:\r
1321 NewFieldName = NewFieldName + FieldName.split('[', 1)[0] + '[0]'\r
1322 ArrayIndex = int(FieldName.split('[', 1)[1].split(']', 1)[0])\r
1323 FieldName = FieldName.split(']', 1)[1]\r
1324 FieldName = NewFieldName + FieldName\r
1325 while '[' in FieldName:\r
1326 FieldName = FieldName.rsplit('[', 1)[0]\r
1327 CApp = CApp + ' __FLEXIBLE_SIZE(Size, %s, %s, %d);\n' % (Pcd.DatumType, FieldName.strip("."), ArrayIndex + 1)\r
1328 if skuname == SkuName:\r
1329 break\r
ae7b6df8 1330\r
8518bf0b
LG
1331 #\r
1332 # Allocate and zero buffer for the PCD\r
1333 # Must handle cases where current value is smaller, larger, or same size\r
1334 # Always keep that larger one as the current size\r
1335 #\r
1336 CApp = CApp + ' Size = (OriginalSize > Size ? OriginalSize : Size);\n'\r
1337 CApp = CApp + ' Pcd = (%s *)malloc (Size);\n' % (Pcd.DatumType)\r
1338 CApp = CApp + ' memset (Pcd, 0, Size);\n'\r
ae7b6df8 1339\r
8518bf0b
LG
1340 #\r
1341 # Copy current PCD value into allocated buffer.\r
1342 #\r
1343 CApp = CApp + ' memcpy (Pcd, OriginalPcd, OriginalSize);\n'\r
ae7b6df8 1344\r
8518bf0b
LG
1345 #\r
1346 # Assign field values in PCD\r
1347 #\r
c05c2c05
LG
1348 for skuname in self.SkuIdMgr.SkuOverrideOrder():\r
1349 inherit_OverrideValues = Pcd.SkuOverrideValues[skuname]\r
1350 for FieldList in [Pcd.DefaultValues, Pcd.DefaultFromDSC,inherit_OverrideValues.get(DefaultStoreName)]:\r
1351 if not FieldList:\r
1352 continue\r
1353 if Pcd.DefaultFromDSC and FieldList == Pcd.DefaultFromDSC:\r
1354 IsArray = self.IsFieldValueAnArray(FieldList)\r
1355 Value, ValueSize = ParseFieldValue (FieldList)\r
1356 if isinstance(Value, str):\r
1357 CApp = CApp + ' Pcd = %s; // From DSC Default Value %s\n' % (Value, Pcd.DefaultFromDSC)\r
1358 elif IsArray:\r
8518bf0b
LG
1359 #\r
1360 # Use memcpy() to copy value into field\r
1361 #\r
c05c2c05
LG
1362 CApp = CApp + ' Value = %s; // From DSC Default Value %s\n' % (self.IntToCString(Value, ValueSize), Pcd.DefaultFromDSC)\r
1363 CApp = CApp + ' memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
1364 continue\r
ae7b6df8 1365\r
c05c2c05
LG
1366 for FieldName in FieldList:\r
1367 IsArray = self.IsFieldValueAnArray(FieldList[FieldName][0])\r
1368 try:\r
1369 Value, ValueSize = ParseFieldValue (FieldList[FieldName][0])\r
1370 except Exception:\r
1371 print FieldList[FieldName][0]\r
1372 if isinstance(Value, str):\r
1373 CApp = CApp + ' Pcd->%s = %s; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
1374 elif IsArray:\r
8518bf0b
LG
1375 #\r
1376 # Use memcpy() to copy value into field\r
1377 #\r
c05c2c05
LG
1378 CApp = CApp + ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.DatumType, FieldName)\r
1379 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
1380 CApp = CApp + ' memcpy (&Pcd->%s[0], Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)\r
8518bf0b 1381 else:\r
c05c2c05
LG
1382 if ValueSize > 4:\r
1383 CApp = CApp + ' Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
1384 else:\r
1385 CApp = CApp + ' Pcd->%s = %d; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
1386 if skuname == SkuName:\r
1387 break\r
8518bf0b
LG
1388 #\r
1389 # Set new PCD value and size\r
1390 #\r
1391 CApp = CApp + ' PcdSetPtr (%s, %s, %s, %s, Size, (UINT8 *)Pcd);\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
ae7b6df8 1392\r
8518bf0b
LG
1393 #\r
1394 # Free PCD\r
1395 #\r
1396 CApp = CApp + ' free (Pcd);\n'\r
1397 CApp = CApp + '}\n'\r
1398 CApp = CApp + '\n'\r
ae7b6df8
LG
1399 return InitByteValue, CApp\r
1400\r
1401 def GenerateByteArrayValue (self, StructuredPcds):\r
1402 #\r
1403 # Generate/Compile/Run C application to determine if there are any flexible array members\r
1404 #\r
1405 if not StructuredPcds:\r
1406 return\r
1407\r
1408 InitByteValue = ""\r
1409 CApp = PcdMainCHeader\r
1410\r
1411 Includes = {}\r
1412 for PcdName in StructuredPcds:\r
1413 Pcd = StructuredPcds[PcdName]\r
1414 IncludeFile = Pcd.StructuredPcdIncludeFile\r
1415 if IncludeFile not in Includes:\r
1416 Includes[IncludeFile] = True\r
1417 CApp = CApp + '#include <%s>\n' % (IncludeFile)\r
1418 CApp = CApp + '\n'\r
1419\r
1420 for PcdName in StructuredPcds:\r
1421 Pcd = StructuredPcds[PcdName]\r
1422 if not Pcd.SkuOverrideValues:\r
8518bf0b 1423 InitByteValue, CApp = self.GenerateInitializeFunc(self.SkuIdMgr.SystemSkuId, 'STANDARD', Pcd, InitByteValue, CApp)\r
ae7b6df8 1424 else:\r
c05c2c05
LG
1425 for SkuName in self.SkuIdMgr.SkuOverrideOrder():\r
1426 if SkuName not in Pcd.SkuOverrideValues:\r
1427 continue\r
ae7b6df8
LG
1428 for DefaultStoreName in Pcd.DefaultStoreName:\r
1429 Pcd = StructuredPcds[PcdName]\r
1430 InitByteValue, CApp = self.GenerateInitializeFunc(SkuName, DefaultStoreName, Pcd, InitByteValue, CApp)\r
1431\r
1432 CApp = CApp + 'VOID\n'\r
1433 CApp = CApp + 'PcdEntryPoint(\n'\r
1434 CApp = CApp + ' VOID\n'\r
1435 CApp = CApp + ' )\n'\r
1436 CApp = CApp + '{\n'\r
1437 for Pcd in StructuredPcds.values():\r
1438 if not Pcd.SkuOverrideValues:\r
8518bf0b 1439 CApp = CApp + ' Initialize_%s_%s_%s_%s();\n' % (self.SkuIdMgr.SystemSkuId, 'STANDARD', Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
ae7b6df8 1440 else:\r
c05c2c05
LG
1441 for SkuName in self.SkuIdMgr.SkuOverrideOrder():\r
1442 if SkuName not in Pcd.SkuOverrideValues:\r
1443 continue\r
8518bf0b 1444 for DefaultStoreName in Pcd.SkuOverrideValues[SkuName]:\r
ae7b6df8
LG
1445 CApp = CApp + ' Initialize_%s_%s_%s_%s();\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
1446 CApp = CApp + '}\n'\r
1447\r
1448 CApp = CApp + PcdMainCEntry + '\n'\r
1449\r
1450 if not os.path.exists(self.OutputPath):\r
1451 os.makedirs(self.OutputPath)\r
1452 CAppBaseFileName = os.path.join(self.OutputPath, PcdValueInitName)\r
1453 File = open (CAppBaseFileName + '.c', 'w')\r
1454 File.write(CApp)\r
1455 File.close()\r
1456\r
1457 MakeApp = PcdMakefileHeader\r
1458 if sys.platform == "win32":\r
1459 MakeApp = MakeApp + 'ARCH = IA32\nAPPNAME = %s\n' % (PcdValueInitName) + 'OBJECTS = %s\%s.obj\n' % (self.OutputPath, PcdValueInitName) + 'INC = '\r
1460 else:\r
1461 MakeApp = MakeApp + PcdGccMakefile\r
1462 MakeApp = MakeApp + 'APPNAME = %s\n' % (PcdValueInitName) + 'OBJECTS = %s/%s.o\n' % (self.OutputPath, PcdValueInitName) + \\r
68ba919f 1463 'include $(MAKEROOT)/Makefiles/app.makefile\n' + 'INCLUDE +='\r
ae7b6df8
LG
1464\r
1465 PlatformInc = {}\r
1466 for Cache in self._Bdb._CACHE_.values():\r
1467 if Cache.MetaFile.Ext.lower() != '.dec':\r
1468 continue\r
1469 if Cache.Includes:\r
1470 if str(Cache.MetaFile.Path) not in PlatformInc:\r
1471 PlatformInc[str(Cache.MetaFile.Path)] = Cache.Includes\r
1472\r
1473 PcdDependDEC = []\r
1474 for Pcd in StructuredPcds.values():\r
1475 for PackageDec in Pcd.PackageDecs:\r
1476 Package = os.path.normpath(mws.join(GlobalData.gWorkspace, PackageDec))\r
1477 if not os.path.exists(Package):\r
1478 EdkLogger.error('Build', RESOURCE_NOT_AVAILABLE, "The dependent Package %s of PCD %s.%s is not exist." % (PackageDec, Pcd.TokenSpaceGuidCName, Pcd.TokenCName))\r
1479 if Package not in PcdDependDEC:\r
1480 PcdDependDEC.append(Package)\r
1481\r
1482 if PlatformInc and PcdDependDEC:\r
1483 for pkg in PcdDependDEC:\r
1484 if pkg in PlatformInc:\r
1485 for inc in PlatformInc[pkg]:\r
1486 MakeApp += '-I' + str(inc) + ' '\r
1487 MakeApp = MakeApp + '\n'\r
68ba919f
YZ
1488\r
1489 CC_FLAGS = LinuxCFLAGS\r
1490 if sys.platform == "win32":\r
1491 CC_FLAGS = WindowsCFLAGS\r
1492 BuildOptions = {}\r
1493 for Options in self.BuildOptions:\r
1494 if Options[2] != EDKII_NAME:\r
1495 continue\r
1496 Family = Options[0]\r
1497 if Family and Family != self.ToolChainFamily:\r
1498 continue\r
1499 Target, Tag, Arch, Tool, Attr = Options[1].split("_")\r
1500 if Tool != 'CC':\r
1501 continue\r
1502\r
1503 if Target == "*" or Target == self._Target:\r
1504 if Tag == "*" or Tag == self._Toolchain:\r
1505 if Arch == "*" or Arch == self.Arch:\r
1506 if Tool not in BuildOptions:\r
1507 BuildOptions[Tool] = {}\r
1508 if Attr != "FLAGS" or Attr not in BuildOptions[Tool] or self.BuildOptions[Options].startswith('='):\r
1509 BuildOptions[Tool][Attr] = self.BuildOptions[Options]\r
1510 else:\r
1511 # append options for the same tool except PATH\r
1512 if Attr != 'PATH':\r
1513 BuildOptions[Tool][Attr] += " " + self.BuildOptions[Options]\r
1514 else:\r
1515 BuildOptions[Tool][Attr] = self.BuildOptions[Options]\r
1516 if BuildOptions:\r
1517 for Tool in BuildOptions:\r
1518 for Attr in BuildOptions[Tool]:\r
1519 if Attr == "FLAGS":\r
1520 Value = BuildOptions[Tool][Attr]\r
1521 ValueList = Value.split()\r
1522 if ValueList:\r
1523 for Id, Item in enumerate(ValueList):\r
1524 if Item == '-D' or Item == '/D':\r
1525 CC_FLAGS += ' ' + Item\r
1526 if Id + 1 < len(ValueList):\r
1527 CC_FLAGS += ' ' + ValueList[Id + 1]\r
1528 elif Item.startswith('/D') or Item.startswith('-D'):\r
1529 CC_FLAGS += ' ' + Item\r
1530 MakeApp += CC_FLAGS\r
1531\r
ae7b6df8
LG
1532 if sys.platform == "win32":\r
1533 MakeApp = MakeApp + PcdMakefileEnd\r
1534 MakeFileName = os.path.join(self.OutputPath, 'Makefile')\r
1535 File = open (MakeFileName, 'w')\r
1536 File.write(MakeApp)\r
1537 File.close()\r
1538\r
1539 InputValueFile = os.path.join(self.OutputPath, 'Input.txt')\r
1540 OutputValueFile = os.path.join(self.OutputPath, 'Output.txt')\r
1541 File = open (InputValueFile, 'w')\r
1542 File.write(InitByteValue)\r
1543 File.close()\r
1544\r
b2395724 1545 Messages = ''\r
ae7b6df8
LG
1546 if sys.platform == "win32":\r
1547 StdOut, StdErr = self.ExecuteCommand ('nmake clean & nmake -f %s' % (MakeFileName))\r
b2395724 1548 Messages = StdOut\r
ae7b6df8
LG
1549 else:\r
1550 StdOut, StdErr = self.ExecuteCommand ('make clean & make -f %s' % (MakeFileName))\r
b2395724
LG
1551 Messages = StdErr\r
1552 Messages = Messages.split('\n')\r
1553 for Message in Messages:\r
1554 if " error" in Message:\r
1555 FileInfo = Message.strip().split('(')\r
1556 if len (FileInfo) > 1:\r
1557 FileName = FileInfo [0]\r
1558 FileLine = FileInfo [1].split (')')[0]\r
1559 else:\r
1560 FileInfo = Message.strip().split(':')\r
1561 FileName = FileInfo [0]\r
1562 FileLine = FileInfo [1]\r
1563\r
1564 File = open (FileName, 'r')\r
1565 FileData = File.readlines()\r
1566 File.close()\r
1567 error_line = FileData[int (FileLine) - 1]\r
1568 if r"//" in error_line:\r
1569 c_line,dsc_line = error_line.split(r"//")\r
1570 else:\r
1571 dsc_line = error_line\r
1572\r
1573 message_itmes = Message.split(":")\r
1574 Index = 0\r
1575 for item in message_itmes:\r
1576 if "PcdValueInit.c" in item:\r
1577 Index = message_itmes.index(item)\r
1578 message_itmes[Index] = dsc_line.strip()\r
1579 break\r
1580\r
1581 EdkLogger.error("build", PCD_STRUCTURE_PCD_ERROR, ":".join(message_itmes[Index:]))\r
ae7b6df8
LG
1582\r
1583 PcdValueInitExe = PcdValueInitName\r
1584 if not sys.platform == "win32":\r
1585 PcdValueInitExe = os.path.join(os.getenv("EDK_TOOLS_PATH"), 'Source', 'C', 'bin', PcdValueInitName)\r
1586\r
1587 StdOut, StdErr = self.ExecuteCommand (PcdValueInitExe + ' -i %s -o %s' % (InputValueFile, OutputValueFile))\r
1588 File = open (OutputValueFile, 'r')\r
1589 FileBuffer = File.readlines()\r
1590 File.close()\r
1591\r
1592 StructurePcdSet = []\r
1593 for Pcd in FileBuffer:\r
1594 PcdValue = Pcd.split ('|')\r
1595 PcdInfo = PcdValue[0].split ('.')\r
8518bf0b 1596 StructurePcdSet.append((PcdInfo[0],PcdInfo[1], PcdInfo[2], PcdInfo[3], PcdValue[2].strip()))\r
ae7b6df8
LG
1597 return StructurePcdSet\r
1598\r
1599 ## Retrieve dynamic PCD settings\r
1600 #\r
1601 # @param Type PCD type\r
1602 #\r
1603 # @retval a dict object contains settings of given PCD type\r
1604 #\r
1605 def _GetDynamicPcd(self, Type):\r
1606\r
ae7b6df8
LG
1607\r
1608 Pcds = sdict()\r
1609 #\r
1610 # tdict is a special dict kind of type, used for selecting correct\r
1611 # PCD settings for certain ARCH and SKU\r
1612 #\r
1613 PcdDict = tdict(True, 4)\r
1614 PcdList = []\r
1615 # Find out all possible PCD candidates for self._Arch\r
1616 RecordList = self._RawData[Type, self._Arch]\r
8518bf0b 1617 AvailableSkuIdSet = copy.copy(self.SkuIds)\r
ae7b6df8 1618\r
ae7b6df8 1619\r
8518bf0b 1620 for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, Dummy3, Dummy4,Dummy5 in RecordList:\r
2b8a6c44
LG
1621 SkuName = SkuName.upper()\r
1622 SkuName = 'DEFAULT' if SkuName == 'COMMON' else SkuName\r
ae7b6df8 1623 if SkuName not in AvailableSkuIdSet:\r
2b8a6c44
LG
1624 EdkLogger.error('build', PARAMETER_INVALID, 'Sku %s is not defined in [SkuIds] section' % SkuName,\r
1625 File=self.MetaFile, Line=Dummy5)\r
ae7b6df8
LG
1626 if "." not in TokenSpaceGuid:\r
1627 PcdList.append((PcdCName, TokenSpaceGuid, SkuName, Dummy4))\r
1628 PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid] = Setting\r
1629\r
1630 # Remove redundant PCD candidates, per the ARCH and SKU\r
1631 for PcdCName, TokenSpaceGuid, SkuName, Dummy4 in PcdList:\r
1632\r
1633 Setting = PcdDict[self._Arch, SkuName, PcdCName, TokenSpaceGuid]\r
1634 if Setting == None:\r
1635 continue\r
1636\r
1637 PcdValue, DatumType, MaxDatumSize = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4)\r
8518bf0b 1638 SkuInfo = SkuInfoClass(SkuName, self.SkuIds[SkuName][0], '', '', '', '', '', PcdValue)\r
ae7b6df8
LG
1639 if (PcdCName, TokenSpaceGuid) in Pcds.keys():\r
1640 pcdObject = Pcds[PcdCName, TokenSpaceGuid]\r
1641 pcdObject.SkuInfoList[SkuName] = SkuInfo\r
1642 if MaxDatumSize.strip():\r
1643 CurrentMaxSize = int(MaxDatumSize.strip(), 0)\r
1644 else:\r
1645 CurrentMaxSize = 0\r
1646 if pcdObject.MaxDatumSize:\r
1647 PcdMaxSize = int(pcdObject.MaxDatumSize, 0)\r
1648 else:\r
1649 PcdMaxSize = 0\r
1650 if CurrentMaxSize > PcdMaxSize:\r
1651 pcdObject.MaxDatumSize = str(CurrentMaxSize)\r
1652 else:\r
1653 Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject(\r
1654 PcdCName,\r
1655 TokenSpaceGuid,\r
1656 self._PCD_TYPE_STRING_[Type],\r
1657 DatumType,\r
1658 PcdValue,\r
1659 '',\r
1660 MaxDatumSize,\r
1661 {SkuName : SkuInfo},\r
1662 False,\r
1663 None,\r
1664 IsDsc=True)\r
1665\r
1666 for pcd in Pcds.values():\r
1667 pcdDecObject = self._DecPcds[pcd.TokenCName, pcd.TokenSpaceGuidCName]\r
e651d06c
LG
1668 # Only fix the value while no value provided in DSC file.\r
1669 for sku in pcd.SkuInfoList.values():\r
1670 if (sku.DefaultValue == "" or sku.DefaultValue==None):\r
1671 sku.DefaultValue = pcdDecObject.DefaultValue\r
ae7b6df8
LG
1672 if 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' not in pcd.SkuInfoList.keys():\r
1673 valuefromDec = pcdDecObject.DefaultValue\r
1674 SkuInfo = SkuInfoClass('DEFAULT', '0', '', '', '', '', '', valuefromDec)\r
1675 pcd.SkuInfoList['DEFAULT'] = SkuInfo\r
1676 elif 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys():\r
1677 pcd.SkuInfoList['DEFAULT'] = pcd.SkuInfoList['COMMON']\r
1678 del(pcd.SkuInfoList['COMMON'])\r
1679 elif 'DEFAULT' in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys():\r
1680 del(pcd.SkuInfoList['COMMON'])\r
65eff519
LG
1681\r
1682 map(self.FilterSkuSettings,Pcds.values())\r
ae7b6df8
LG
1683\r
1684 return Pcds\r
1685\r
65eff519
LG
1686 def FilterSkuSettings(self, PcdObj):\r
1687\r
1688 if self.SkuIdMgr.SkuUsageType == self.SkuIdMgr.SINGLE:\r
1689 if 'DEFAULT' in PcdObj.SkuInfoList.keys() and self.SkuIdMgr.SystemSkuId not in PcdObj.SkuInfoList.keys():\r
1690 PcdObj.SkuInfoList[self.SkuIdMgr.SystemSkuId] = PcdObj.SkuInfoList['DEFAULT']\r
1691 PcdObj.SkuInfoList = {'DEFAULT':PcdObj.SkuInfoList[self.SkuIdMgr.SystemSkuId]}\r
1692 PcdObj.SkuInfoList['DEFAULT'].SkuIdName = 'DEFAULT'\r
1693 PcdObj.SkuInfoList['DEFAULT'].SkuId = '0'\r
1694\r
1695 elif self.SkuIdMgr.SkuUsageType == self.SkuIdMgr.DEFAULT:\r
1696 PcdObj.SkuInfoList = {'DEFAULT':PcdObj.SkuInfoList['DEFAULT']}\r
1697\r
1698 return PcdObj\r
1699\r
1700\r
ae7b6df8
LG
1701 def CompareVarAttr(self, Attr1, Attr2):\r
1702 if not Attr1 or not Attr2: # for empty string\r
1703 return True\r
1704 Attr1s = [attr.strip() for attr in Attr1.split(",")]\r
1705 Attr1Set = set(Attr1s)\r
1706 Attr2s = [attr.strip() for attr in Attr2.split(",")]\r
1707 Attr2Set = set(Attr2s)\r
1708 if Attr2Set == Attr1Set:\r
1709 return True\r
1710 else:\r
1711 return False\r
8518bf0b
LG
1712 def CompletePcdValues(self,PcdSet):\r
1713 Pcds = {}\r
1714 DefaultStoreObj = DefaultStore(self._GetDefaultStores())\r
2b8a6c44 1715 SkuIds = set([(skuid,skuobj.SkuId) for pcdobj in PcdSet.values() for skuid,skuobj in pcdobj.SkuInfoList.items()])\r
8ac16789 1716 SkuIds = self.SkuIdMgr.AvailableSkuIdSet\r
8518bf0b
LG
1717 DefaultStores = set([storename for pcdobj in PcdSet.values() for skuobj in pcdobj.SkuInfoList.values() for storename in skuobj.DefaultStoreDict.keys()])\r
1718 for PcdCName, TokenSpaceGuid in PcdSet:\r
1719 PcdObj = PcdSet[(PcdCName, TokenSpaceGuid)]\r
1720 if PcdObj.Type not in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_DEFAULT],\r
1721 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII],\r
1722 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_VPD],\r
1723 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_DEFAULT],\r
1724 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII],\r
1725 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_VPD]]:\r
1726 Pcds[PcdCName, TokenSpaceGuid]= PcdObj\r
1727 continue\r
1728 PcdType = PcdObj.Type\r
1729 if PcdType in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
1730 for skuid in PcdObj.SkuInfoList:\r
1731 skuobj = PcdObj.SkuInfoList[skuid]\r
1732 mindefaultstorename = DefaultStoreObj.GetMin(set([defaultstorename for defaultstorename in skuobj.DefaultStoreDict]))\r
1733 for defaultstorename in DefaultStores:\r
1734 if defaultstorename not in skuobj.DefaultStoreDict:\r
2b8a6c44 1735 skuobj.DefaultStoreDict[defaultstorename] = copy.deepcopy(skuobj.DefaultStoreDict[mindefaultstorename])\r
8518bf0b 1736 skuobj.HiiDefaultValue = skuobj.DefaultStoreDict[mindefaultstorename]\r
8ac16789 1737 for skuname,skuid in SkuIds.items():\r
2b8a6c44
LG
1738 if skuname not in PcdObj.SkuInfoList:\r
1739 nextskuid = self.SkuIdMgr.GetNextSkuId(skuname)\r
8518bf0b
LG
1740 while nextskuid not in PcdObj.SkuInfoList:\r
1741 nextskuid = self.SkuIdMgr.GetNextSkuId(nextskuid)\r
2b8a6c44
LG
1742 PcdObj.SkuInfoList[skuname] = copy.deepcopy(PcdObj.SkuInfoList[nextskuid])\r
1743 PcdObj.SkuInfoList[skuname].SkuId = skuid\r
1744 PcdObj.SkuInfoList[skuname].SkuIdName = skuname\r
8518bf0b
LG
1745 if PcdType in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
1746 PcdObj.DefaultValue = PcdObj.SkuInfoList.values()[0].HiiDefaultValue if self.SkuIdMgr.SkuUsageType == self.SkuIdMgr.SINGLE else PcdObj.SkuInfoList["DEFAULT"].HiiDefaultValue\r
1747 Pcds[PcdCName, TokenSpaceGuid]= PcdObj\r
1748 return Pcds\r
ae7b6df8
LG
1749 ## Retrieve dynamic HII PCD settings\r
1750 #\r
1751 # @param Type PCD type\r
1752 #\r
1753 # @retval a dict object contains settings of given PCD type\r
1754 #\r
1755 def _GetDynamicHiiPcd(self, Type):\r
1756\r
ae7b6df8
LG
1757 VariableAttrs = {}\r
1758\r
1759 Pcds = sdict()\r
1760 #\r
1761 # tdict is a special dict kind of type, used for selecting correct\r
1762 # PCD settings for certain ARCH and SKU\r
1763 #\r
8518bf0b 1764 PcdDict = tdict(True, 5)\r
ae7b6df8
LG
1765 PcdSet = set()\r
1766 RecordList = self._RawData[Type, self._Arch]\r
1767 # Find out all possible PCD candidates for self._Arch\r
8518bf0b 1768 AvailableSkuIdSet = copy.copy(self.SkuIds)\r
2b8a6c44 1769 DefaultStoresDefine = self._GetDefaultStores()\r
ae7b6df8 1770\r
8518bf0b 1771 for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, DefaultStore, Dummy4,Dummy5 in RecordList:\r
2b8a6c44
LG
1772 SkuName = SkuName.upper()\r
1773 SkuName = 'DEFAULT' if SkuName == 'COMMON' else SkuName\r
1774 DefaultStore = DefaultStore.upper()\r
8518bf0b
LG
1775 if DefaultStore == "COMMON":\r
1776 DefaultStore = "STANDARD"\r
ae7b6df8 1777 if SkuName not in AvailableSkuIdSet:\r
2b8a6c44
LG
1778 EdkLogger.error('build', PARAMETER_INVALID, 'Sku %s is not defined in [SkuIds] section' % SkuName,\r
1779 File=self.MetaFile, Line=Dummy5)\r
1780 if DefaultStore not in DefaultStoresDefine:\r
1781 EdkLogger.error('build', PARAMETER_INVALID, 'DefaultStores %s is not defined in [DefaultStores] section' % DefaultStore,\r
1782 File=self.MetaFile, Line=Dummy5)\r
ae7b6df8 1783 if "." not in TokenSpaceGuid:\r
8518bf0b
LG
1784 PcdSet.add((PcdCName, TokenSpaceGuid, SkuName,DefaultStore, Dummy4))\r
1785 PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid,DefaultStore] = Setting\r
ae7b6df8
LG
1786\r
1787\r
1788 # Remove redundant PCD candidates, per the ARCH and SKU\r
8518bf0b 1789 for PcdCName, TokenSpaceGuid, SkuName,DefaultStore, Dummy4 in PcdSet:\r
ae7b6df8 1790\r
8518bf0b 1791 Setting = PcdDict[self._Arch, SkuName, PcdCName, TokenSpaceGuid,DefaultStore]\r
ae7b6df8
LG
1792 if Setting == None:\r
1793 continue\r
1794 VariableName, VariableGuid, VariableOffset, DefaultValue, VarAttribute = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4)\r
1795\r
1796 rt, Msg = VariableAttributes.ValidateVarAttributes(VarAttribute)\r
1797 if not rt:\r
1798 EdkLogger.error("build", PCD_VARIABLE_ATTRIBUTES_ERROR, "Variable attributes settings for %s is incorrect.\n %s" % (".".join((TokenSpaceGuid, PcdCName)), Msg),\r
1799 ExtraData="[%s]" % VarAttribute)\r
1800 ExceedMax = False\r
1801 FormatCorrect = True\r
1802 if VariableOffset.isdigit():\r
1803 if int(VariableOffset, 10) > 0xFFFF:\r
1804 ExceedMax = True\r
1805 elif re.match(r'[\t\s]*0[xX][a-fA-F0-9]+$', VariableOffset):\r
1806 if int(VariableOffset, 16) > 0xFFFF:\r
1807 ExceedMax = True\r
1808 # For Offset written in "A.B"\r
1809 elif VariableOffset.find('.') > -1:\r
1810 VariableOffsetList = VariableOffset.split(".")\r
1811 if not (len(VariableOffsetList) == 2\r
1812 and IsValidWord(VariableOffsetList[0])\r
1813 and IsValidWord(VariableOffsetList[1])):\r
1814 FormatCorrect = False\r
1815 else:\r
1816 FormatCorrect = False\r
1817 if not FormatCorrect:\r
1818 EdkLogger.error('Build', FORMAT_INVALID, "Invalid syntax or format of the variable offset value is incorrect for %s." % ".".join((TokenSpaceGuid, PcdCName)))\r
1819\r
1820 if ExceedMax:\r
1821 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
1822 if (VariableName, VariableGuid) not in VariableAttrs:\r
1823 VariableAttrs[(VariableName, VariableGuid)] = VarAttribute\r
1824 else:\r
1825 if not self.CompareVarAttr(VariableAttrs[(VariableName, VariableGuid)], VarAttribute):\r
1826 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
1827\r
ae7b6df8
LG
1828 pcdDecObject = self._DecPcds[PcdCName, TokenSpaceGuid]\r
1829 if (PcdCName, TokenSpaceGuid) in Pcds.keys():\r
1830 pcdObject = Pcds[PcdCName, TokenSpaceGuid]\r
8518bf0b
LG
1831 if SkuName in pcdObject.SkuInfoList:\r
1832 Skuitem = pcdObject.SkuInfoList[SkuName]\r
1833 Skuitem.DefaultStoreDict.update({DefaultStore:DefaultValue})\r
1834 else:\r
1835 SkuInfo = SkuInfoClass(SkuName, self.SkuIds[SkuName][0], VariableName, VariableGuid, VariableOffset, DefaultValue, VariableAttribute=VarAttribute,DefaultStore={DefaultStore:DefaultValue})\r
1836 pcdObject.SkuInfoList[SkuName] = SkuInfo\r
ae7b6df8 1837 else:\r
8518bf0b 1838 SkuInfo = SkuInfoClass(SkuName, self.SkuIds[SkuName][0], VariableName, VariableGuid, VariableOffset, DefaultValue, VariableAttribute=VarAttribute,DefaultStore={DefaultStore:DefaultValue})\r
ae7b6df8
LG
1839 Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject(\r
1840 PcdCName,\r
1841 TokenSpaceGuid,\r
1842 self._PCD_TYPE_STRING_[Type],\r
1843 '',\r
1844 DefaultValue,\r
1845 '',\r
1846 '',\r
1847 {SkuName : SkuInfo},\r
1848 False,\r
1849 None,\r
1850 pcdDecObject.validateranges,\r
1851 pcdDecObject.validlists,\r
1852 pcdDecObject.expressions,\r
1853 IsDsc=True)\r
1854\r
1855\r
1856 for pcd in Pcds.values():\r
1857 SkuInfoObj = pcd.SkuInfoList.values()[0]\r
1858 pcdDecObject = self._DecPcds[pcd.TokenCName, pcd.TokenSpaceGuidCName]\r
1859 # Only fix the value while no value provided in DSC file.\r
1860 for sku in pcd.SkuInfoList.values():\r
1861 if (sku.HiiDefaultValue == "" or sku.HiiDefaultValue == None):\r
1862 sku.HiiDefaultValue = pcdDecObject.DefaultValue\r
1863 if 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' not in pcd.SkuInfoList.keys():\r
1864 valuefromDec = pcdDecObject.DefaultValue\r
2b8a6c44 1865 SkuInfo = SkuInfoClass('DEFAULT', '0', SkuInfoObj.VariableName, SkuInfoObj.VariableGuid, SkuInfoObj.VariableOffset, valuefromDec,VariableAttribute=SkuInfoObj.VariableAttribute,DefaultStore={DefaultStore:valuefromDec})\r
ae7b6df8
LG
1866 pcd.SkuInfoList['DEFAULT'] = SkuInfo\r
1867 elif 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys():\r
1868 pcd.SkuInfoList['DEFAULT'] = pcd.SkuInfoList['COMMON']\r
1869 del(pcd.SkuInfoList['COMMON'])\r
1870 elif 'DEFAULT' in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys():\r
1871 del(pcd.SkuInfoList['COMMON'])\r
1872\r
ae7b6df8
LG
1873 if pcd.MaxDatumSize.strip():\r
1874 MaxSize = int(pcd.MaxDatumSize, 0)\r
1875 else:\r
1876 MaxSize = 0\r
1877 if pcdDecObject.DatumType == 'VOID*':\r
2b8a6c44 1878 for (_, skuobj) in pcd.SkuInfoList.items():\r
ae7b6df8 1879 datalen = 0\r
47854fd5
LG
1880 skuobj.HiiDefaultValue = StringToArray(skuobj.HiiDefaultValue)\r
1881 datalen = len(skuobj.HiiDefaultValue.split(","))\r
ae7b6df8
LG
1882 if datalen > MaxSize:\r
1883 MaxSize = datalen\r
47854fd5
LG
1884 for defaultst in skuobj.DefaultStoreDict:\r
1885 skuobj.DefaultStoreDict[defaultst] = StringToArray(skuobj.DefaultStoreDict[defaultst])\r
1886 pcd.DefaultValue = StringToArray(pcd.DefaultValue)\r
ae7b6df8 1887 pcd.MaxDatumSize = str(MaxSize)\r
2b8a6c44
LG
1888 rt, invalidhii = self.CheckVariableNameAssignment(Pcds)\r
1889 if not rt:\r
1890 invalidpcd = ",".join(invalidhii)\r
1891 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
1892\r
1893 map(self.FilterSkuSettings,Pcds.values())\r
1894\r
ae7b6df8
LG
1895 return Pcds\r
1896\r
2b8a6c44
LG
1897 def CheckVariableNameAssignment(self,Pcds):\r
1898 invalidhii = []\r
1899 for pcdname in Pcds:\r
1900 pcd = Pcds[pcdname]\r
1901 varnameset = set([sku.VariableName for (skuid,sku) in pcd.SkuInfoList.items()])\r
1902 if len(varnameset) > 1:\r
1903 invalidhii.append(".".join((pcdname[1],pcdname[0])))\r
1904 if len(invalidhii):\r
1905 return False,invalidhii\r
1906 else:\r
1907 return True, []\r
ae7b6df8
LG
1908 ## Retrieve dynamic VPD PCD settings\r
1909 #\r
1910 # @param Type PCD type\r
1911 #\r
1912 # @retval a dict object contains settings of given PCD type\r
1913 #\r
1914 def _GetDynamicVpdPcd(self, Type):\r
1915\r
ae7b6df8
LG
1916\r
1917 Pcds = sdict()\r
1918 #\r
1919 # tdict is a special dict kind of type, used for selecting correct\r
1920 # PCD settings for certain ARCH and SKU\r
1921 #\r
1922 PcdDict = tdict(True, 4)\r
1923 PcdList = []\r
1924\r
1925 # Find out all possible PCD candidates for self._Arch\r
1926 RecordList = self._RawData[Type, self._Arch]\r
8518bf0b 1927 AvailableSkuIdSet = copy.copy(self.SkuIds)\r
ae7b6df8 1928\r
8518bf0b 1929 for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, Dummy3, Dummy4,Dummy5 in RecordList:\r
2b8a6c44
LG
1930 SkuName = SkuName.upper()\r
1931 SkuName = 'DEFAULT' if SkuName == 'COMMON' else SkuName\r
ae7b6df8 1932 if SkuName not in AvailableSkuIdSet:\r
2b8a6c44
LG
1933 EdkLogger.error('build', PARAMETER_INVALID, 'Sku %s is not defined in [SkuIds] section' % SkuName,\r
1934 File=self.MetaFile, Line=Dummy5)\r
ae7b6df8
LG
1935 if "." not in TokenSpaceGuid:\r
1936 PcdList.append((PcdCName, TokenSpaceGuid, SkuName, Dummy4))\r
1937 PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid] = Setting\r
1938\r
1939 # Remove redundant PCD candidates, per the ARCH and SKU\r
1940 for PcdCName, TokenSpaceGuid, SkuName, Dummy4 in PcdList:\r
1941 Setting = PcdDict[self._Arch, SkuName, PcdCName, TokenSpaceGuid]\r
1942 if Setting == None:\r
1943 continue\r
1944 #\r
1945 # For the VOID* type, it can have optional data of MaxDatumSize and InitialValue\r
1946 # For the Integer & Boolean type, the optional data can only be InitialValue.\r
1947 # At this point, we put all the data into the PcdClssObject for we don't know the PCD's datumtype\r
1948 # until the DEC parser has been called.\r
1949 #\r
1950 VpdOffset, MaxDatumSize, InitialValue = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4)\r
8518bf0b 1951 SkuInfo = SkuInfoClass(SkuName, self.SkuIds[SkuName][0], '', '', '', '', VpdOffset, InitialValue)\r
ae7b6df8
LG
1952 if (PcdCName, TokenSpaceGuid) in Pcds.keys():\r
1953 pcdObject = Pcds[PcdCName, TokenSpaceGuid]\r
1954 pcdObject.SkuInfoList[SkuName] = SkuInfo\r
1955 if MaxDatumSize.strip():\r
1956 CurrentMaxSize = int(MaxDatumSize.strip(), 0)\r
1957 else:\r
1958 CurrentMaxSize = 0\r
1959 if pcdObject.MaxDatumSize:\r
1960 PcdMaxSize = int(pcdObject.MaxDatumSize, 0)\r
1961 else:\r
1962 PcdMaxSize = 0\r
1963 if CurrentMaxSize > PcdMaxSize:\r
1964 pcdObject.MaxDatumSize = str(CurrentMaxSize)\r
1965 else:\r
1966 Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject(\r
1967 PcdCName,\r
1968 TokenSpaceGuid,\r
1969 self._PCD_TYPE_STRING_[Type],\r
1970 '',\r
1971 InitialValue,\r
1972 '',\r
1973 MaxDatumSize,\r
1974 {SkuName : SkuInfo},\r
1975 False,\r
1976 None,\r
1977 IsDsc=True)\r
1978 for pcd in Pcds.values():\r
1979 SkuInfoObj = pcd.SkuInfoList.values()[0]\r
1980 pcdDecObject = self._DecPcds[pcd.TokenCName, pcd.TokenSpaceGuidCName]\r
e651d06c
LG
1981 # Only fix the value while no value provided in DSC file.\r
1982 for sku in pcd.SkuInfoList.values():\r
1983 if (sku.DefaultValue == "" or sku.DefaultValue==None):\r
1984 sku.DefaultValue = pcdDecObject.DefaultValue\r
ae7b6df8
LG
1985 if 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' not in pcd.SkuInfoList.keys():\r
1986 valuefromDec = pcdDecObject.DefaultValue\r
1987 SkuInfo = SkuInfoClass('DEFAULT', '0', '', '', '', '', SkuInfoObj.VpdOffset, valuefromDec)\r
1988 pcd.SkuInfoList['DEFAULT'] = SkuInfo\r
1989 elif 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys():\r
1990 pcd.SkuInfoList['DEFAULT'] = pcd.SkuInfoList['COMMON']\r
1991 del(pcd.SkuInfoList['COMMON'])\r
1992 elif 'DEFAULT' in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys():\r
1993 del(pcd.SkuInfoList['COMMON'])\r
ae7b6df8 1994\r
65eff519
LG
1995\r
1996 map(self.FilterSkuSettings,Pcds.values())\r
ae7b6df8
LG
1997 return Pcds\r
1998\r
1999 ## Add external modules\r
2000 #\r
2001 # The external modules are mostly those listed in FDF file, which don't\r
2002 # need "build".\r
2003 #\r
2004 # @param FilePath The path of module description file\r
2005 #\r
2006 def AddModule(self, FilePath):\r
2007 FilePath = NormPath(FilePath)\r
2008 if FilePath not in self.Modules:\r
2009 Module = ModuleBuildClassObject()\r
2010 Module.MetaFile = FilePath\r
2011 self.Modules.append(Module)\r
2012\r
68ba919f
YZ
2013 def _GetToolChainFamily(self):\r
2014 self._ToolChainFamily = "MSFT"\r
2015 BuildConfigurationFile = os.path.normpath(os.path.join(GlobalData.gConfDirectory, "target.txt"))\r
2016 if os.path.isfile(BuildConfigurationFile) == True:\r
2017 TargetTxt = TargetTxtClassObject()\r
2018 TargetTxt.LoadTargetTxtFile(BuildConfigurationFile)\r
2019 ToolDefinitionFile = TargetTxt.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_TOOL_CHAIN_CONF]\r
2020 if ToolDefinitionFile == '':\r
2021 ToolDefinitionFile = "tools_def.txt"\r
2022 ToolDefinitionFile = os.path.normpath(mws.join(self.WorkspaceDir, 'Conf', ToolDefinitionFile))\r
2023 if os.path.isfile(ToolDefinitionFile) == True:\r
2024 ToolDef = ToolDefClassObject()\r
2025 ToolDef.LoadToolDefFile(ToolDefinitionFile)\r
2026 ToolDefinition = ToolDef.ToolsDefTxtDatabase\r
2027 if TAB_TOD_DEFINES_FAMILY not in ToolDefinition \\r
2028 or self._Toolchain not in ToolDefinition[TAB_TOD_DEFINES_FAMILY] \\r
2029 or not ToolDefinition[TAB_TOD_DEFINES_FAMILY][self._Toolchain]:\r
2030 self._ToolChainFamily = "MSFT"\r
2031 else:\r
2032 self._ToolChainFamily = ToolDefinition[TAB_TOD_DEFINES_FAMILY][self._Toolchain]\r
2033 return self._ToolChainFamily\r
2034\r
ae7b6df8
LG
2035 ## Add external PCDs\r
2036 #\r
2037 # The external PCDs are mostly those listed in FDF file to specify address\r
2038 # or offset information.\r
2039 #\r
2040 # @param Name Name of the PCD\r
2041 # @param Guid Token space guid of the PCD\r
2042 # @param Value Value of the PCD\r
2043 #\r
2044 def AddPcd(self, Name, Guid, Value):\r
2045 if (Name, Guid) not in self.Pcds:\r
2046 self.Pcds[Name, Guid] = PcdClassObject(Name, Guid, '', '', '', '', '', {}, False, None)\r
2047 self.Pcds[Name, Guid].DefaultValue = Value\r
5644e5ce
FB
2048 @property\r
2049 def DecPcds(self):\r
2050 if self._DecPcds == None:\r
2051 FdfInfList = []\r
2052 if GlobalData.gFdfParser:\r
2053 FdfInfList = GlobalData.gFdfParser.Profile.InfList\r
2054 PkgSet = set()\r
2055 for Inf in FdfInfList:\r
2056 ModuleFile = PathClass(NormPath(Inf), GlobalData.gWorkspace, Arch=self._Arch)\r
2057 if ModuleFile in self._Modules:\r
2058 continue\r
2059 ModuleData = self._Bdb[ModuleFile, self._Arch, self._Target, self._Toolchain]\r
2060 PkgSet.update(ModuleData.Packages)\r
2061 self._DecPcds = GetDeclaredPcd(self, self._Bdb, self._Arch, self._Target, self._Toolchain,PkgSet)\r
2062 return self._DecPcds\r
ae7b6df8
LG
2063 _Macros = property(_GetMacros)\r
2064 Arch = property(_GetArch, _SetArch)\r
2065 Platform = property(_GetPlatformName)\r
2066 PlatformName = property(_GetPlatformName)\r
2067 Guid = property(_GetFileGuid)\r
2068 Version = property(_GetVersion)\r
2069 DscSpecification = property(_GetDscSpec)\r
2070 OutputDirectory = property(_GetOutpuDir)\r
2071 SupArchList = property(_GetSupArch)\r
2072 BuildTargets = property(_GetBuildTarget)\r
2073 SkuName = property(_GetSkuName, _SetSkuName)\r
ae7b6df8
LG
2074 PcdInfoFlag = property(_GetPcdInfoFlag)\r
2075 VarCheckFlag = property(_GetVarCheckFlag)\r
2076 FlashDefinition = property(_GetFdfFile)\r
2077 Prebuild = property(_GetPrebuild)\r
2078 Postbuild = property(_GetPostbuild)\r
2079 BuildNumber = property(_GetBuildNumber)\r
2080 MakefileName = property(_GetMakefileName)\r
2081 BsBaseAddress = property(_GetBsBaseAddress)\r
2082 RtBaseAddress = property(_GetRtBaseAddress)\r
2083 LoadFixAddress = property(_GetLoadFixAddress)\r
2084 RFCLanguages = property(_GetRFCLanguages)\r
2085 ISOLanguages = property(_GetISOLanguages)\r
2086 VpdToolGuid = property(_GetVpdToolGuid)\r
2087 SkuIds = property(_GetSkuIds)\r
2088 Modules = property(_GetModules)\r
2089 LibraryInstances = property(_GetLibraryInstances)\r
2090 LibraryClasses = property(_GetLibraryClasses)\r
2091 Pcds = property(_GetPcds)\r
2092 BuildOptions = property(_GetBuildOptions)\r
68ba919f 2093 ToolChainFamily = property(_GetToolChainFamily)\r