]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/Workspace/DscBuildData.py
BaseTools: update SKUID value to support both integer and Hex number
[mirror_edk2.git] / BaseTools / Source / Python / Workspace / DscBuildData.py
CommitLineData
ae7b6df8
LG
1## @file\r
2# This file is used to create a database used by build tool\r
3#\r
e6b10112 4# Copyright (c) 2008 - 2018, Intel Corporation. All rights reserved.<BR>\r
ae7b6df8
LG
5# (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>\r
6# This program and the accompanying materials\r
7# are licensed and made available under the terms and conditions of the BSD License\r
8# which accompanies this distribution. The full text of the license may be found at\r
9# http://opensource.org/licenses/bsd-license.php\r
10#\r
11# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13#\r
14\r
15## Platform build information from DSC file\r
16#\r
17# This class is used to retrieve information stored in database and convert them\r
18# into PlatformBuildClassObject form for easier use for AutoGen.\r
19#\r
20from Common.String import *\r
21from Common.DataType import *\r
22from Common.Misc import *\r
23from types import *\r
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 584 Pattern = re.compile('^[1-9]\d*|0$')\r
e6b10112
YZ
585 HexPattern = re.compile(r'0[xX][0-9a-fA-F]+$')\r
586 if Pattern.match(Record[0]) == None and HexPattern.match(Record[0]) == None:\r
587 EdkLogger.error('build', FORMAT_INVALID, "The format of the Sku ID number is invalid. It only support Integer and HexNumber",\r
8518bf0b
LG
588 File=self.MetaFile, Line=Record[-1])\r
589 if not IsValidWord(Record[1]):\r
590 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
591 File=self.MetaFile, Line=Record[-1])\r
e6b10112 592 self._SkuIds[Record[1].upper()] = (str(self.ToInt(Record[0])), Record[1].upper(), Record[2].upper())\r
ae7b6df8 593 if 'DEFAULT' not in self._SkuIds:\r
8518bf0b 594 self._SkuIds['DEFAULT'] = ("0","DEFAULT","DEFAULT")\r
ae7b6df8 595 if 'COMMON' not in self._SkuIds:\r
8518bf0b 596 self._SkuIds['COMMON'] = ("0","DEFAULT","DEFAULT")\r
ae7b6df8 597 return self._SkuIds\r
8518bf0b
LG
598 def ToInt(self,intstr):\r
599 return int(intstr,16) if intstr.upper().startswith("0X") else int(intstr)\r
600 def _GetDefaultStores(self):\r
601 if self.DefaultStores == None:\r
602 self.DefaultStores = sdict()\r
603 RecordList = self._RawData[MODEL_EFI_DEFAULT_STORES, self._Arch]\r
604 for Record in RecordList:\r
605 if Record[0] in [None, '']:\r
606 EdkLogger.error('build', FORMAT_INVALID, 'No DefaultStores ID number',\r
607 File=self.MetaFile, Line=Record[-1])\r
608 if Record[1] in [None, '']:\r
609 EdkLogger.error('build', FORMAT_INVALID, 'No DefaultStores ID name',\r
610 File=self.MetaFile, Line=Record[-1])\r
2b8a6c44 611 self.DefaultStores[Record[1].upper()] = (self.ToInt(Record[0]),Record[1].upper())\r
8518bf0b
LG
612 if TAB_DEFAULT_STORES_DEFAULT not in self.DefaultStores:\r
613 self.DefaultStores[TAB_DEFAULT_STORES_DEFAULT] = (0,TAB_DEFAULT_STORES_DEFAULT)\r
e651d06c
LG
614 GlobalData.gDefaultStores = self.DefaultStores.keys()\r
615 if GlobalData.gDefaultStores:\r
616 GlobalData.gDefaultStores.sort()\r
8518bf0b 617 return self.DefaultStores\r
ae7b6df8
LG
618\r
619 ## Retrieve [Components] section information\r
620 def _GetModules(self):\r
621 if self._Modules != None:\r
622 return self._Modules\r
623\r
624 self._Modules = sdict()\r
625 RecordList = self._RawData[MODEL_META_DATA_COMPONENT, self._Arch]\r
626 Macros = self._Macros\r
627 Macros["EDK_SOURCE"] = GlobalData.gEcpSource\r
628 for Record in RecordList:\r
629 DuplicatedFile = False\r
630\r
631 ModuleFile = PathClass(NormPath(Record[0], Macros), GlobalData.gWorkspace, Arch=self._Arch)\r
8518bf0b
LG
632 ModuleId = Record[6]\r
633 LineNo = Record[7]\r
ae7b6df8
LG
634\r
635 # check the file validation\r
636 ErrorCode, ErrorInfo = ModuleFile.Validate('.inf')\r
637 if ErrorCode != 0:\r
638 EdkLogger.error('build', ErrorCode, File=self.MetaFile, Line=LineNo,\r
639 ExtraData=ErrorInfo)\r
640 # Check duplication\r
641 # If arch is COMMON, no duplicate module is checked since all modules in all component sections are selected\r
642 if self._Arch != 'COMMON' and ModuleFile in self._Modules:\r
643 DuplicatedFile = True\r
644\r
645 Module = ModuleBuildClassObject()\r
646 Module.MetaFile = ModuleFile\r
647\r
648 # get module private library instance\r
649 RecordList = self._RawData[MODEL_EFI_LIBRARY_CLASS, self._Arch, None, ModuleId]\r
650 for Record in RecordList:\r
651 LibraryClass = Record[0]\r
652 LibraryPath = PathClass(NormPath(Record[1], Macros), GlobalData.gWorkspace, Arch=self._Arch)\r
653 LineNo = Record[-1]\r
654\r
655 # check the file validation\r
656 ErrorCode, ErrorInfo = LibraryPath.Validate('.inf')\r
657 if ErrorCode != 0:\r
658 EdkLogger.error('build', ErrorCode, File=self.MetaFile, Line=LineNo,\r
659 ExtraData=ErrorInfo)\r
660\r
661 if LibraryClass == '' or LibraryClass == 'NULL':\r
662 self._NullLibraryNumber += 1\r
663 LibraryClass = 'NULL%d' % self._NullLibraryNumber\r
664 EdkLogger.verbose("Found forced library for %s\n\t%s [%s]" % (ModuleFile, LibraryPath, LibraryClass))\r
665 Module.LibraryClasses[LibraryClass] = LibraryPath\r
666 if LibraryPath not in self.LibraryInstances:\r
667 self.LibraryInstances.append(LibraryPath)\r
668\r
669 # get module private PCD setting\r
670 for Type in [MODEL_PCD_FIXED_AT_BUILD, MODEL_PCD_PATCHABLE_IN_MODULE, \\r
671 MODEL_PCD_FEATURE_FLAG, MODEL_PCD_DYNAMIC, MODEL_PCD_DYNAMIC_EX]:\r
672 RecordList = self._RawData[Type, self._Arch, None, ModuleId]\r
8518bf0b 673 for TokenSpaceGuid, PcdCName, Setting, Dummy1, Dummy2, Dummy3, Dummy4,Dummy5 in RecordList:\r
ae7b6df8
LG
674 TokenList = GetSplitValueList(Setting)\r
675 DefaultValue = TokenList[0]\r
676 if len(TokenList) > 1:\r
677 MaxDatumSize = TokenList[1]\r
678 else:\r
679 MaxDatumSize = ''\r
680 TypeString = self._PCD_TYPE_STRING_[Type]\r
681 Pcd = PcdClassObject(\r
682 PcdCName,\r
683 TokenSpaceGuid,\r
684 TypeString,\r
685 '',\r
686 DefaultValue,\r
687 '',\r
688 MaxDatumSize,\r
689 {},\r
690 False,\r
691 None\r
692 )\r
693 Module.Pcds[PcdCName, TokenSpaceGuid] = Pcd\r
694\r
695 # get module private build options\r
696 RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch, None, ModuleId]\r
8518bf0b 697 for ToolChainFamily, ToolChain, Option, Dummy1, Dummy2, Dummy3, Dummy4,Dummy5 in RecordList:\r
ae7b6df8
LG
698 if (ToolChainFamily, ToolChain) not in Module.BuildOptions:\r
699 Module.BuildOptions[ToolChainFamily, ToolChain] = Option\r
700 else:\r
701 OptionString = Module.BuildOptions[ToolChainFamily, ToolChain]\r
702 Module.BuildOptions[ToolChainFamily, ToolChain] = OptionString + " " + Option\r
703\r
704 RecordList = self._RawData[MODEL_META_DATA_HEADER, self._Arch, None, ModuleId]\r
705 if DuplicatedFile and not RecordList:\r
706 EdkLogger.error('build', FILE_DUPLICATED, File=self.MetaFile, ExtraData=str(ModuleFile), Line=LineNo)\r
707 if RecordList:\r
708 if len(RecordList) != 1:\r
709 EdkLogger.error('build', OPTION_UNKNOWN, 'Only FILE_GUID can be listed in <Defines> section.',\r
710 File=self.MetaFile, ExtraData=str(ModuleFile), Line=LineNo)\r
711 ModuleFile = ProcessDuplicatedInf(ModuleFile, RecordList[0][2], GlobalData.gWorkspace)\r
712 ModuleFile.Arch = self._Arch\r
713\r
714 self._Modules[ModuleFile] = Module\r
715 return self._Modules\r
716\r
717 ## Retrieve all possible library instances used in this platform\r
718 def _GetLibraryInstances(self):\r
719 if self._LibraryInstances == None:\r
720 self._GetLibraryClasses()\r
721 return self._LibraryInstances\r
722\r
723 ## Retrieve [LibraryClasses] information\r
724 def _GetLibraryClasses(self):\r
725 if self._LibraryClasses == None:\r
726 self._LibraryInstances = []\r
727 #\r
728 # tdict is a special dict kind of type, used for selecting correct\r
729 # library instance for given library class and module type\r
730 #\r
731 LibraryClassDict = tdict(True, 3)\r
732 # track all library class names\r
733 LibraryClassSet = set()\r
734 RecordList = self._RawData[MODEL_EFI_LIBRARY_CLASS, self._Arch, None, -1]\r
735 Macros = self._Macros\r
736 for Record in RecordList:\r
8518bf0b 737 LibraryClass, LibraryInstance, Dummy, Arch, ModuleType, Dummy,Dummy, LineNo = Record\r
ae7b6df8
LG
738 if LibraryClass == '' or LibraryClass == 'NULL':\r
739 self._NullLibraryNumber += 1\r
740 LibraryClass = 'NULL%d' % self._NullLibraryNumber\r
741 EdkLogger.verbose("Found forced library for arch=%s\n\t%s [%s]" % (Arch, LibraryInstance, LibraryClass))\r
742 LibraryClassSet.add(LibraryClass)\r
743 LibraryInstance = PathClass(NormPath(LibraryInstance, Macros), GlobalData.gWorkspace, Arch=self._Arch)\r
744 # check the file validation\r
745 ErrorCode, ErrorInfo = LibraryInstance.Validate('.inf')\r
746 if ErrorCode != 0:\r
747 EdkLogger.error('build', ErrorCode, File=self.MetaFile, Line=LineNo,\r
748 ExtraData=ErrorInfo)\r
749\r
750 if ModuleType != 'COMMON' and ModuleType not in SUP_MODULE_LIST:\r
751 EdkLogger.error('build', OPTION_UNKNOWN, "Unknown module type [%s]" % ModuleType,\r
752 File=self.MetaFile, ExtraData=LibraryInstance, Line=LineNo)\r
753 LibraryClassDict[Arch, ModuleType, LibraryClass] = LibraryInstance\r
754 if LibraryInstance not in self._LibraryInstances:\r
755 self._LibraryInstances.append(LibraryInstance)\r
756\r
757 # resolve the specific library instance for each class and each module type\r
758 self._LibraryClasses = tdict(True)\r
759 for LibraryClass in LibraryClassSet:\r
760 # try all possible module types\r
761 for ModuleType in SUP_MODULE_LIST:\r
762 LibraryInstance = LibraryClassDict[self._Arch, ModuleType, LibraryClass]\r
763 if LibraryInstance == None:\r
764 continue\r
765 self._LibraryClasses[LibraryClass, ModuleType] = LibraryInstance\r
766\r
767 # for Edk style library instances, which are listed in different section\r
768 Macros["EDK_SOURCE"] = GlobalData.gEcpSource\r
769 RecordList = self._RawData[MODEL_EFI_LIBRARY_INSTANCE, self._Arch]\r
770 for Record in RecordList:\r
771 File = PathClass(NormPath(Record[0], Macros), GlobalData.gWorkspace, Arch=self._Arch)\r
772 LineNo = Record[-1]\r
773 # check the file validation\r
774 ErrorCode, ErrorInfo = File.Validate('.inf')\r
775 if ErrorCode != 0:\r
776 EdkLogger.error('build', ErrorCode, File=self.MetaFile, Line=LineNo,\r
777 ExtraData=ErrorInfo)\r
778 if File not in self._LibraryInstances:\r
779 self._LibraryInstances.append(File)\r
780 #\r
781 # we need the module name as the library class name, so we have\r
782 # to parse it here. (self._Bdb[] will trigger a file parse if it\r
783 # hasn't been parsed)\r
784 #\r
785 Library = self._Bdb[File, self._Arch, self._Target, self._Toolchain]\r
786 self._LibraryClasses[Library.BaseName, ':dummy:'] = Library\r
787 return self._LibraryClasses\r
788\r
789 def _ValidatePcd(self, PcdCName, TokenSpaceGuid, Setting, PcdType, LineNo):\r
790 if self._DecPcds == None:\r
2b8a6c44 791\r
ae7b6df8
LG
792 FdfInfList = []\r
793 if GlobalData.gFdfParser:\r
794 FdfInfList = GlobalData.gFdfParser.Profile.InfList\r
795\r
796 PkgSet = set()\r
797 for Inf in FdfInfList:\r
798 ModuleFile = PathClass(NormPath(Inf), GlobalData.gWorkspace, Arch=self._Arch)\r
799 if ModuleFile in self._Modules:\r
800 continue\r
801 ModuleData = self._Bdb[ModuleFile, self._Arch, self._Target, self._Toolchain]\r
802 PkgSet.update(ModuleData.Packages)\r
ae7b6df8 803\r
726c501c 804 self._DecPcds, self._GuidDict = GetDeclaredPcd(self, self._Bdb, self._Arch, self._Target, self._Toolchain,PkgSet)\r
2b8a6c44
LG
805\r
806\r
807 if (PcdCName, TokenSpaceGuid) not in self._DecPcds:\r
ae7b6df8
LG
808 EdkLogger.error('build', PARSER_ERROR,\r
809 "Pcd (%s.%s) defined in DSC is not declared in DEC files. Arch: ['%s']" % (TokenSpaceGuid, PcdCName, self._Arch),\r
810 File=self.MetaFile, Line=LineNo)\r
811 ValueList, IsValid, Index = AnalyzeDscPcd(Setting, PcdType, self._DecPcds[PcdCName, TokenSpaceGuid].DatumType)\r
520365de
B
812 if not IsValid:\r
813 if PcdType not in [MODEL_PCD_FEATURE_FLAG, MODEL_PCD_FIXED_AT_BUILD]:\r
814 EdkLogger.error('build', FORMAT_INVALID, "Pcd format incorrect.", File=self.MetaFile, Line=LineNo,\r
815 ExtraData="%s.%s|%s" % (TokenSpaceGuid, PcdCName, Setting))\r
816 else:\r
817 if ValueList[2] == '-1':\r
818 EdkLogger.error('build', FORMAT_INVALID, "Pcd format incorrect.", File=self.MetaFile, Line=LineNo,\r
819 ExtraData="%s.%s|%s" % (TokenSpaceGuid, PcdCName, Setting))\r
ae7b6df8
LG
820 if ValueList[Index] and PcdType not in [MODEL_PCD_FEATURE_FLAG, MODEL_PCD_FIXED_AT_BUILD]:\r
821 try:\r
822 ValueList[Index] = ValueExpression(ValueList[Index], GlobalData.gPlatformPcds)(True)\r
823 except WrnExpression, Value:\r
824 ValueList[Index] = Value.result\r
726c501c
YZ
825 except BadExpression, Value:\r
826 EdkLogger.error('Parser', FORMAT_INVALID, Value, File=self.MetaFile, Line=self._LineIndex + 1)\r
ae7b6df8
LG
827 except EvaluationException, Excpt:\r
828 if hasattr(Excpt, 'Pcd'):\r
829 if Excpt.Pcd in GlobalData.gPlatformOtherPcds:\r
830 EdkLogger.error('Parser', FORMAT_INVALID, "Cannot use this PCD (%s) in an expression as"\r
831 " it must be defined in a [PcdsFixedAtBuild] or [PcdsFeatureFlag] section"\r
832 " of the DSC file" % Excpt.Pcd,\r
833 File=self.MetaFile, Line=LineNo)\r
834 else:\r
835 EdkLogger.error('Parser', FORMAT_INVALID, "PCD (%s) is not defined in DSC file" % Excpt.Pcd,\r
836 File=self.MetaFile, Line=LineNo)\r
837 else:\r
838 EdkLogger.error('Parser', FORMAT_INVALID, "Invalid expression: %s" % str(Excpt),\r
839 File=self.MetaFile, Line=LineNo)\r
ae7b6df8 840 if ValueList[Index]:\r
726c501c
YZ
841 DatumType = self._DecPcds[PcdCName, TokenSpaceGuid].DatumType\r
842 try:\r
843 ValueList[Index] = ValueExpressionEx(ValueList[Index], DatumType, self._GuidDict)(True)\r
844 except BadExpression, Value:\r
845 EdkLogger.error('Parser', FORMAT_INVALID, Value, File=self.MetaFile, Line=LineNo,\r
846 ExtraData="PCD [%s.%s] Value \"%s\" " % (TokenSpaceGuid, PcdCName, ValueList[Index]))\r
ae7b6df8
LG
847 Valid, ErrStr = CheckPcdDatum(self._DecPcds[PcdCName, TokenSpaceGuid].DatumType, ValueList[Index])\r
848 if not Valid:\r
849 EdkLogger.error('build', FORMAT_INVALID, ErrStr, File=self.MetaFile, Line=LineNo,\r
850 ExtraData="%s.%s" % (TokenSpaceGuid, PcdCName))\r
520365de
B
851 if PcdType in (MODEL_PCD_DYNAMIC_DEFAULT, MODEL_PCD_DYNAMIC_EX_DEFAULT):\r
852 if self._DecPcds[PcdCName, TokenSpaceGuid].DatumType.strip() != ValueList[1].strip():\r
853 EdkLogger.error('build', FORMAT_INVALID, ErrStr , File=self.MetaFile, Line=LineNo,\r
854 ExtraData="%s.%s|%s" % (TokenSpaceGuid, PcdCName, Setting))\r
ae7b6df8
LG
855 return ValueList\r
856\r
8518bf0b
LG
857 def _FilterPcdBySkuUsage(self,Pcds):\r
858 available_sku = self.SkuIdMgr.AvailableSkuIdSet\r
859 sku_usage = self.SkuIdMgr.SkuUsageType\r
860 if sku_usage == SkuClass.SINGLE:\r
861 for pcdname in Pcds:\r
862 pcd = Pcds[pcdname]\r
863 Pcds[pcdname].SkuInfoList = {"DEFAULT":pcd.SkuInfoList[skuid] for skuid in pcd.SkuInfoList if skuid in available_sku}\r
65eff519
LG
864 if type(pcd) is StructurePcd and pcd.SkuOverrideValues:\r
865 Pcds[pcdname].SkuOverrideValues = {"DEFAULT":pcd.SkuOverrideValues[skuid] for skuid in pcd.SkuOverrideValues if skuid in available_sku}\r
8518bf0b
LG
866 else:\r
867 for pcdname in Pcds:\r
868 pcd = Pcds[pcdname]\r
869 Pcds[pcdname].SkuInfoList = {skuid:pcd.SkuInfoList[skuid] for skuid in pcd.SkuInfoList if skuid in available_sku}\r
65eff519
LG
870 if type(pcd) is StructurePcd and pcd.SkuOverrideValues:\r
871 Pcds[pcdname].SkuOverrideValues = {skuid:pcd.SkuOverrideValues[skuid] for skuid in pcd.SkuOverrideValues if skuid in available_sku}\r
8518bf0b 872 return Pcds\r
2b8a6c44
LG
873 def CompleteHiiPcdsDefaultStores(self,Pcds):\r
874 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
875 DefaultStoreMgr = DefaultStore(self.DefaultStores)\r
876 for pcd in HiiPcd:\r
877 for skuid in pcd.SkuInfoList:\r
878 skuobj = pcd.SkuInfoList.get(skuid)\r
879 if "STANDARD" not in skuobj.DefaultStoreDict:\r
880 PcdDefaultStoreSet = set([defaultstorename for defaultstorename in skuobj.DefaultStoreDict])\r
881 mindefaultstorename = DefaultStoreMgr.GetMin(PcdDefaultStoreSet)\r
882 skuobj.DefaultStoreDict['STANDARD'] = copy.deepcopy(skuobj.DefaultStoreDict[mindefaultstorename])\r
883 return Pcds\r
884\r
ae7b6df8
LG
885 ## Retrieve all PCD settings in platform\r
886 def _GetPcds(self):\r
887 if self._Pcds == None:\r
888 self._Pcds = sdict()\r
889 self._Pcds.update(self._GetPcd(MODEL_PCD_FIXED_AT_BUILD))\r
890 self._Pcds.update(self._GetPcd(MODEL_PCD_PATCHABLE_IN_MODULE))\r
891 self._Pcds.update(self._GetPcd(MODEL_PCD_FEATURE_FLAG))\r
892 self._Pcds.update(self._GetDynamicPcd(MODEL_PCD_DYNAMIC_DEFAULT))\r
893 self._Pcds.update(self._GetDynamicHiiPcd(MODEL_PCD_DYNAMIC_HII))\r
894 self._Pcds.update(self._GetDynamicVpdPcd(MODEL_PCD_DYNAMIC_VPD))\r
895 self._Pcds.update(self._GetDynamicPcd(MODEL_PCD_DYNAMIC_EX_DEFAULT))\r
896 self._Pcds.update(self._GetDynamicHiiPcd(MODEL_PCD_DYNAMIC_EX_HII))\r
897 self._Pcds.update(self._GetDynamicVpdPcd(MODEL_PCD_DYNAMIC_EX_VPD))\r
898\r
8518bf0b 899 self._Pcds = self.CompletePcdValues(self._Pcds)\r
ae7b6df8 900 self._Pcds = self.UpdateStructuredPcds(MODEL_PCD_TYPE_LIST, self._Pcds)\r
2b8a6c44 901 self._Pcds = self.CompleteHiiPcdsDefaultStores(self._Pcds)\r
8518bf0b 902 self._Pcds = self._FilterPcdBySkuUsage(self._Pcds)\r
ae7b6df8
LG
903 return self._Pcds\r
904\r
8518bf0b
LG
905 def _dumpPcdInfo(self,Pcds):\r
906 for pcd in Pcds:\r
907 pcdobj = Pcds[pcd]\r
908 if not pcdobj.TokenCName.startswith("Test"):\r
909 continue\r
910 for skuid in pcdobj.SkuInfoList:\r
911 if pcdobj.Type in (self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII],self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]):\r
912 for storename in pcdobj.SkuInfoList[skuid].DefaultStoreDict:\r
913 print "PcdCName: %s, SkuName: %s, StoreName: %s, Value: %s" % (".".join((pcdobj.TokenSpaceGuidCName, pcdobj.TokenCName)), skuid,storename,str(pcdobj.SkuInfoList[skuid].DefaultStoreDict[storename]))\r
914 else:\r
915 print "PcdCName: %s, SkuName: %s, Value: %s" % (".".join((pcdobj.TokenSpaceGuidCName, pcdobj.TokenCName)), skuid,str(pcdobj.SkuInfoList[skuid].DefaultValue))\r
ae7b6df8
LG
916 ## Retrieve [BuildOptions]\r
917 def _GetBuildOptions(self):\r
918 if self._BuildOptions == None:\r
919 self._BuildOptions = sdict()\r
920 #\r
921 # Retrieve build option for EDKII and EDK style module\r
922 #\r
923 for CodeBase in (EDKII_NAME, EDK_NAME):\r
924 RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch, CodeBase]\r
8518bf0b 925 for ToolChainFamily, ToolChain, Option, Dummy1, Dummy2, Dummy3, Dummy4,Dummy5 in RecordList:\r
c05c2c05
LG
926 if Dummy3.upper() != 'COMMON':\r
927 continue\r
ae7b6df8
LG
928 CurKey = (ToolChainFamily, ToolChain, CodeBase)\r
929 #\r
930 # Only flags can be appended\r
931 #\r
932 if CurKey not in self._BuildOptions or not ToolChain.endswith('_FLAGS') or Option.startswith('='):\r
933 self._BuildOptions[CurKey] = Option\r
934 else:\r
c05c2c05
LG
935 if ' ' + Option not in self._BuildOptions[CurKey]:\r
936 self._BuildOptions[CurKey] += ' ' + Option\r
ae7b6df8
LG
937 return self._BuildOptions\r
938\r
939 def GetBuildOptionsByModuleType(self, Edk, ModuleType):\r
940 if self._ModuleTypeOptions == None:\r
941 self._ModuleTypeOptions = sdict()\r
942 if (Edk, ModuleType) not in self._ModuleTypeOptions:\r
943 options = sdict()\r
944 self._ModuleTypeOptions[Edk, ModuleType] = options\r
945 DriverType = '%s.%s' % (Edk, ModuleType)\r
946 CommonDriverType = '%s.%s' % ('COMMON', ModuleType)\r
c05c2c05
LG
947 RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch]\r
948 for ToolChainFamily, ToolChain, Option, Dummy1, Dummy2, Dummy3, Dummy4,Dummy5 in RecordList:\r
949 Type = Dummy2 + '.' + Dummy3\r
950 if Type.upper() == DriverType.upper() or Type.upper() == CommonDriverType.upper():\r
ae7b6df8
LG
951 Key = (ToolChainFamily, ToolChain, Edk)\r
952 if Key not in options or not ToolChain.endswith('_FLAGS') or Option.startswith('='):\r
953 options[Key] = Option\r
954 else:\r
c05c2c05
LG
955 if ' ' + Option not in options[Key]:\r
956 options[Key] += ' ' + Option\r
ae7b6df8
LG
957 return self._ModuleTypeOptions[Edk, ModuleType]\r
958\r
959 def GetStructurePcdInfo(self, PcdSet):\r
960 structure_pcd_data = {}\r
961 for item in PcdSet:\r
8518bf0b
LG
962 if (item[0],item[1]) not in structure_pcd_data:\r
963 structure_pcd_data[(item[0],item[1])] = []\r
964 structure_pcd_data[(item[0],item[1])].append(item)\r
ae7b6df8
LG
965\r
966 return structure_pcd_data\r
967\r
968 def UpdateStructuredPcds(self, TypeList, AllPcds):\r
65eff519
LG
969\r
970 DynamicPcdType = [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_DEFAULT],\r
971 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII],\r
972 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_VPD],\r
973 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_DEFAULT],\r
974 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII],\r
975 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_VPD]]\r
976\r
ae7b6df8 977 Pcds = AllPcds\r
8518bf0b 978 DefaultStoreMgr = DefaultStore(self.DefaultStores)\r
65eff519
LG
979 SkuIds = self.SkuIdMgr.AvailableSkuIdSet\r
980 SkuIds.update({'DEFAULT':0})\r
8518bf0b 981 DefaultStores = set([storename for pcdobj in AllPcds.values() for skuobj in pcdobj.SkuInfoList.values() for storename in skuobj.DefaultStoreDict.keys()])\r
ae7b6df8
LG
982\r
983 S_PcdSet = []\r
984 # Find out all possible PCD candidates for self._Arch\r
985 RecordList = []\r
2b8a6c44 986\r
ae7b6df8
LG
987 for Type in TypeList:\r
988 RecordList.extend(self._RawData[Type, self._Arch])\r
989\r
8518bf0b 990 for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, default_store, Dummy4,Dummy5 in RecordList:\r
2b8a6c44
LG
991 SkuName = SkuName.upper()\r
992 default_store = default_store.upper()\r
993 SkuName = 'DEFAULT' if SkuName == 'COMMON' else SkuName\r
8518bf0b
LG
994 if SkuName not in SkuIds:\r
995 continue\r
2b8a6c44 996\r
8518bf0b
LG
997 if SkuName in SkuIds and "." in TokenSpaceGuid:\r
998 S_PcdSet.append(( TokenSpaceGuid.split(".")[0],TokenSpaceGuid.split(".")[1], PcdCName,SkuName, default_store,Dummy5, AnalyzePcdExpression(Setting)[0]))\r
ae7b6df8
LG
999\r
1000 # handle pcd value override\r
1001 StrPcdSet = self.GetStructurePcdInfo(S_PcdSet)\r
1002 S_pcd_set = {}\r
1003 for str_pcd in StrPcdSet:\r
8518bf0b
LG
1004 str_pcd_obj = Pcds.get((str_pcd[1], str_pcd[0]), None)\r
1005 str_pcd_dec = self._DecPcds.get((str_pcd[1], str_pcd[0]), None)\r
ae7b6df8
LG
1006 if str_pcd_dec:\r
1007 str_pcd_obj_str = StructurePcd()\r
1008 str_pcd_obj_str.copy(str_pcd_dec)\r
1009 if str_pcd_obj:\r
1010 str_pcd_obj_str.copy(str_pcd_obj)\r
1011 if str_pcd_obj.DefaultValue:\r
1012 str_pcd_obj_str.DefaultFromDSC = str_pcd_obj.DefaultValue\r
1013 for str_pcd_data in StrPcdSet[str_pcd]:\r
8518bf0b
LG
1014 if str_pcd_data[3] in SkuIds:\r
1015 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
1016 S_pcd_set[str_pcd[1], str_pcd[0]] = str_pcd_obj_str\r
2b8a6c44
LG
1017 else:\r
1018 EdkLogger.error('build', PARSER_ERROR,\r
1019 "Pcd (%s.%s) defined in DSC is not declared in DEC files. Arch: ['%s']" % (str_pcd[0], str_pcd[1], self._Arch),\r
1020 File=self.MetaFile,Line = StrPcdSet[str_pcd][0][5])\r
ae7b6df8 1021 # Add the Structure PCD that only defined in DEC, don't have override in DSC file\r
5644e5ce 1022 for Pcd in self.DecPcds:\r
ae7b6df8
LG
1023 if type (self._DecPcds[Pcd]) is StructurePcd:\r
1024 if Pcd not in S_pcd_set:\r
1025 str_pcd_obj_str = StructurePcd()\r
1026 str_pcd_obj_str.copy(self._DecPcds[Pcd])\r
1027 str_pcd_obj = Pcds.get(Pcd, None)\r
1028 if str_pcd_obj:\r
1029 str_pcd_obj_str.copy(str_pcd_obj)\r
1030 if str_pcd_obj.DefaultValue:\r
1031 str_pcd_obj_str.DefaultFromDSC = str_pcd_obj.DefaultValue\r
1032 S_pcd_set[Pcd] = str_pcd_obj_str\r
1033 if S_pcd_set:\r
1034 GlobalData.gStructurePcd[self.Arch] = S_pcd_set\r
8518bf0b 1035 for stru_pcd in S_pcd_set.values():\r
67e63e9a
LG
1036 for skuid in SkuIds:\r
1037 if skuid in stru_pcd.SkuOverrideValues:\r
1038 continue\r
1039 nextskuid = self.SkuIdMgr.GetNextSkuId(skuid)\r
1040 NoDefault = False\r
1041 while nextskuid not in stru_pcd.SkuOverrideValues:\r
1042 if nextskuid == "DEFAULT":\r
1043 NoDefault = True\r
1044 break\r
1045 nextskuid = self.SkuIdMgr.GetNextSkuId(nextskuid)\r
1046 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
1047 if stru_pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
1048 for skuid in SkuIds:\r
1049 nextskuid = skuid\r
2b8a6c44 1050 NoDefault = False\r
8518bf0b
LG
1051 if skuid not in stru_pcd.SkuOverrideValues:\r
1052 while nextskuid not in stru_pcd.SkuOverrideValues:\r
2b8a6c44
LG
1053 if nextskuid == "DEFAULT":\r
1054 NoDefault = True\r
1055 break\r
8518bf0b 1056 nextskuid = self.SkuIdMgr.GetNextSkuId(nextskuid)\r
2b8a6c44
LG
1057 if NoDefault:\r
1058 continue\r
1059 PcdDefaultStoreSet = set([defaultstorename for defaultstorename in stru_pcd.SkuOverrideValues[nextskuid]])\r
8518bf0b 1060 mindefaultstorename = DefaultStoreMgr.GetMin(PcdDefaultStoreSet)\r
2b8a6c44 1061\r
8518bf0b
LG
1062 for defaultstoreid in DefaultStores:\r
1063 if defaultstoreid not in stru_pcd.SkuOverrideValues[skuid]:\r
2b8a6c44 1064 stru_pcd.SkuOverrideValues[skuid][defaultstoreid] = copy.deepcopy(stru_pcd.SkuOverrideValues[nextskuid][mindefaultstorename])\r
65eff519 1065\r
ae7b6df8
LG
1066 Str_Pcd_Values = self.GenerateByteArrayValue(S_pcd_set)\r
1067 if Str_Pcd_Values:\r
8518bf0b
LG
1068 for (skuname,StoreName,PcdGuid,PcdName,PcdValue) in Str_Pcd_Values:\r
1069 str_pcd_obj = S_pcd_set.get((PcdName, PcdGuid))\r
ae7b6df8 1070 if str_pcd_obj is None:\r
67e63e9a 1071 print PcdName, PcdGuid\r
ae7b6df8
LG
1072 raise\r
1073 if str_pcd_obj.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII],\r
1074 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
8518bf0b
LG
1075 if skuname not in str_pcd_obj.SkuInfoList:\r
1076 str_pcd_obj.SkuInfoList[skuname] = SkuInfoClass(SkuIdName=skuname, SkuId=self.SkuIds[skuname][0], HiiDefaultValue=PcdValue, DefaultStore = {StoreName:PcdValue})\r
ae7b6df8 1077 else:\r
8518bf0b
LG
1078 str_pcd_obj.SkuInfoList[skuname].HiiDefaultValue = PcdValue\r
1079 str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.update({StoreName:PcdValue})\r
ae7b6df8
LG
1080 elif str_pcd_obj.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],\r
1081 self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:\r
8518bf0b
LG
1082 if skuname in (self.SkuIdMgr.SystemSkuId, 'DEFAULT', 'COMMON'):\r
1083 str_pcd_obj.DefaultValue = PcdValue\r
ae7b6df8 1084 else:\r
8518bf0b 1085 if skuname not in str_pcd_obj.SkuInfoList:\r
65eff519
LG
1086 nextskuid = self.SkuIdMgr.GetNextSkuId(skuname)\r
1087 NoDefault = False\r
1088 while nextskuid not in str_pcd_obj.SkuInfoList:\r
1089 if nextskuid == "DEFAULT":\r
1090 NoDefault = True\r
1091 break\r
1092 nextskuid = self.SkuIdMgr.GetNextSkuId(nextskuid)\r
1093 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
1094 str_pcd_obj.SkuInfoList[skuname].SkuId = self.SkuIds[skuname][0]\r
1095 str_pcd_obj.SkuInfoList[skuname].SkuIdName = skuname\r
ae7b6df8 1096 else:\r
8518bf0b
LG
1097 str_pcd_obj.SkuInfoList[skuname].DefaultValue = PcdValue\r
1098 for str_pcd_obj in S_pcd_set.values():\r
1099 if str_pcd_obj.Type not in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII],\r
1100 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
1101 continue\r
1102 PcdDefaultStoreSet = set([defaultstorename for skuobj in str_pcd_obj.SkuInfoList.values() for defaultstorename in skuobj.DefaultStoreDict])\r
1103 DefaultStoreObj = DefaultStore(self._GetDefaultStores())\r
1104 mindefaultstorename = DefaultStoreObj.GetMin(PcdDefaultStoreSet)\r
1105 str_pcd_obj.SkuInfoList[self.SkuIdMgr.SystemSkuId].HiiDefaultValue = str_pcd_obj.SkuInfoList[self.SkuIdMgr.SystemSkuId].DefaultStoreDict[mindefaultstorename]\r
ae7b6df8
LG
1106\r
1107 for str_pcd_obj in S_pcd_set.values():\r
2b8a6c44 1108\r
ae7b6df8
LG
1109 str_pcd_obj.MaxDatumSize = self.GetStructurePcdMaxSize(str_pcd_obj)\r
1110 Pcds[str_pcd_obj.TokenCName, str_pcd_obj.TokenSpaceGuidCName] = str_pcd_obj\r
1111\r
65eff519
LG
1112 for pcdkey in Pcds:\r
1113 pcd = Pcds[pcdkey]\r
1114 if 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys():\r
1115 pcd.SkuInfoList['DEFAULT'] = pcd.SkuInfoList['COMMON']\r
1116 del(pcd.SkuInfoList['COMMON'])\r
1117 elif 'DEFAULT' in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys():\r
1118 del(pcd.SkuInfoList['COMMON'])\r
1119\r
1120 map(self.FilterSkuSettings,[Pcds[pcdkey] for pcdkey in Pcds if Pcds[pcdkey].Type in DynamicPcdType])\r
ae7b6df8
LG
1121 return Pcds\r
1122\r
1123 ## Retrieve non-dynamic PCD settings\r
1124 #\r
1125 # @param Type PCD type\r
1126 #\r
1127 # @retval a dict object contains settings of given PCD type\r
1128 #\r
1129 def _GetPcd(self, Type):\r
1130 Pcds = sdict()\r
1131 #\r
1132 # tdict is a special dict kind of type, used for selecting correct\r
1133 # PCD settings for certain ARCH\r
1134 #\r
2b8a6c44 1135 AvailableSkuIdSet = copy.copy(self.SkuIds)\r
ae7b6df8
LG
1136\r
1137 PcdDict = tdict(True, 3)\r
1138 PcdSet = set()\r
1139 # Find out all possible PCD candidates for self._Arch\r
1140 RecordList = self._RawData[Type, self._Arch]\r
ae7b6df8 1141 PcdValueDict = sdict()\r
8518bf0b 1142 for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, Dummy3, Dummy4,Dummy5 in RecordList:\r
2b8a6c44
LG
1143 SkuName = SkuName.upper()\r
1144 SkuName = 'DEFAULT' if SkuName == 'COMMON' else SkuName\r
1145 if SkuName not in AvailableSkuIdSet:\r
1146 EdkLogger.error('build ', PARAMETER_INVALID, 'Sku %s is not defined in [SkuIds] section' % SkuName,\r
1147 File=self.MetaFile, Line=Dummy5)\r
8518bf0b
LG
1148 if SkuName in (self.SkuIdMgr.SystemSkuId, 'DEFAULT', 'COMMON'):\r
1149 if "." not in TokenSpaceGuid:\r
1150 PcdSet.add((PcdCName, TokenSpaceGuid, SkuName, Dummy4))\r
ae7b6df8 1151 PcdDict[Arch, PcdCName, TokenSpaceGuid, SkuName] = Setting\r
ae7b6df8
LG
1152\r
1153 for PcdCName, TokenSpaceGuid, SkuName, Dummy4 in PcdSet:\r
1154 Setting = PcdDict[self._Arch, PcdCName, TokenSpaceGuid, SkuName]\r
1155 if Setting == None:\r
1156 continue\r
1157 PcdValue, DatumType, MaxDatumSize = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4)\r
1158 if (PcdCName, TokenSpaceGuid) in PcdValueDict:\r
1159 PcdValueDict[PcdCName, TokenSpaceGuid][SkuName] = (PcdValue, DatumType, MaxDatumSize)\r
1160 else:\r
1161 PcdValueDict[PcdCName, TokenSpaceGuid] = {SkuName:(PcdValue, DatumType, MaxDatumSize)}\r
1162\r
1163 PcdsKeys = PcdValueDict.keys()\r
1164 for PcdCName, TokenSpaceGuid in PcdsKeys:\r
1165\r
1166 PcdSetting = PcdValueDict[PcdCName, TokenSpaceGuid]\r
1167 PcdValue = None\r
1168 DatumType = None\r
1169 MaxDatumSize = None\r
1170 if 'COMMON' in PcdSetting:\r
1171 PcdValue, DatumType, MaxDatumSize = PcdSetting['COMMON']\r
1172 if 'DEFAULT' in PcdSetting:\r
1173 PcdValue, DatumType, MaxDatumSize = PcdSetting['DEFAULT']\r
8518bf0b
LG
1174 if self.SkuIdMgr.SystemSkuId in PcdSetting:\r
1175 PcdValue, DatumType, MaxDatumSize = PcdSetting[self.SkuIdMgr.SystemSkuId]\r
ae7b6df8
LG
1176\r
1177 Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject(\r
1178 PcdCName,\r
1179 TokenSpaceGuid,\r
1180 self._PCD_TYPE_STRING_[Type],\r
1181 DatumType,\r
1182 PcdValue,\r
1183 '',\r
1184 MaxDatumSize,\r
1185 {},\r
1186 False,\r
1187 None,\r
1188 IsDsc=True)\r
1189\r
1190\r
1191 return Pcds\r
1192\r
8518bf0b
LG
1193 def __UNICODE2OCTList(self,Value):\r
1194 Value = Value.strip()\r
1195 Value = Value[2:-1]\r
1196 List = []\r
1197 for Item in Value:\r
1198 Temp = '%04X' % ord(Item)\r
1199 List.append('0x' + Temp[2:4])\r
1200 List.append('0x' + Temp[0:2])\r
1201 List.append('0x00')\r
1202 List.append('0x00')\r
1203 return List\r
1204 def __STRING2OCTList(self,Value):\r
1205 OCTList = []\r
1206 Value = Value.strip('"')\r
1207 for char in Value:\r
1208 Temp = '%02X' % ord(char)\r
1209 OCTList.append('0x' + Temp)\r
1210 OCTList.append('0x00')\r
1211 return OCTList\r
1212\r
ae7b6df8
LG
1213 def GetStructurePcdMaxSize(self, str_pcd):\r
1214 pcd_default_value = str_pcd.DefaultValue\r
1215 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
1216 sku_values.append(pcd_default_value)\r
1217\r
1218 def get_length(value):\r
1219 Value = value.strip()\r
a0939593
LG
1220 if len(value) > 1:\r
1221 if Value.startswith('GUID') and Value.endswith(')'):\r
1222 return 16\r
1223 if Value.startswith('L"') and Value.endswith('"'):\r
1224 return len(Value[2:-1])\r
1225 if Value[0] == '"' and Value[-1] == '"':\r
1226 return len(Value) - 2\r
1227 if Value[0] == '{' and Value[-1] == '}':\r
1228 return len(Value.split(","))\r
1229 if Value.startswith("L'") and Value.endswith("'") and len(list(Value[2:-1])) > 1:\r
1230 return len(list(Value[2:-1]))\r
1231 if Value[0] == "'" and Value[-1] == "'" and len(list(Value[1:-1])) > 1:\r
1232 return len(Value) - 2\r
ae7b6df8
LG
1233 return len(Value)\r
1234\r
1235 return str(max([pcd_size for pcd_size in [get_length(item) for item in sku_values]]))\r
1236\r
1237 def IsFieldValueAnArray (self, Value):\r
1238 Value = Value.strip()\r
1239 if Value.startswith('GUID') and Value.endswith(')'):\r
1240 return True\r
1241 if Value.startswith('L"') and Value.endswith('"') and len(list(Value[2:-1])) > 1:\r
1242 return True\r
1243 if Value[0] == '"' and Value[-1] == '"' and len(list(Value[1:-1])) > 1:\r
1244 return True\r
1245 if Value[0] == '{' and Value[-1] == '}':\r
1246 return True\r
1247 if Value.startswith("L'") and Value.endswith("'") and len(list(Value[2:-1])) > 1:\r
1248 print 'foo = ', list(Value[2:-1])\r
1249 return True\r
1250 if Value[0] == "'" and Value[-1] == "'" and len(list(Value[1:-1])) > 1:\r
1251 print 'bar = ', list(Value[1:-1])\r
1252 return True\r
1253 return False\r
1254\r
1255 def ExecuteCommand (self, Command):\r
1256 try:\r
1257 Process = subprocess.Popen(Command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)\r
1258 except:\r
1259 print 'ERROR: Can not execute command:', Command\r
1260 sys.exit(1)\r
1261 Result = Process.communicate()\r
1262 if Process.returncode <> 0:\r
1263 print 'ERROR: Can not collect output from command:', Command\r
1264 return Result[0], Result[1]\r
1265\r
1266 def IntToCString(self, Value, ValueSize):\r
1267 Result = '"'\r
1268 if not isinstance (Value, str):\r
1269 for Index in range(0, ValueSize):\r
1270 Result = Result + '\\x%02x' % (Value & 0xff)\r
1271 Value = Value >> 8\r
1272 Result = Result + '"'\r
1273 return Result\r
1274\r
1275 def GenerateInitializeFunc(self, SkuName, DefaultStoreName, Pcd, InitByteValue, CApp):\r
8518bf0b 1276 OverrideValues = {DefaultStoreName:""}\r
ae7b6df8
LG
1277 if Pcd.SkuOverrideValues:\r
1278 OverrideValues = Pcd.SkuOverrideValues[SkuName]\r
8518bf0b
LG
1279 for DefaultStoreName in OverrideValues.keys():\r
1280 CApp = CApp + 'void\n'\r
1281 CApp = CApp + 'Initialize_%s_%s_%s_%s(\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
1282 CApp = CApp + ' void\n'\r
1283 CApp = CApp + ' )\n'\r
1284 CApp = CApp + '{\n'\r
1285 CApp = CApp + ' UINT32 Size;\n'\r
1286 CApp = CApp + ' UINT32 FieldSize;\n'\r
b2395724 1287 CApp = CApp + ' CHAR8 *Value;\n'\r
8518bf0b
LG
1288 CApp = CApp + ' UINT32 OriginalSize;\n'\r
1289 CApp = CApp + ' VOID *OriginalPcd;\n'\r
1290 CApp = CApp + ' %s *Pcd;\n' % (Pcd.DatumType)\r
1291 CApp = CApp + '\n'\r
47854fd5 1292\r
8518bf0b 1293 Pcd.DefaultValue = Pcd.DefaultValue.strip()\r
47854fd5
LG
1294 PcdDefaultValue = StringToArray(Pcd.DefaultValue)\r
1295\r
8518bf0b 1296 InitByteValue += '%s.%s.%s.%s|%s|%s\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.DatumType, PcdDefaultValue)\r
ae7b6df8 1297\r
8518bf0b
LG
1298 #\r
1299 # Get current PCD value and size\r
1300 #\r
1301 CApp = CApp + ' OriginalPcd = PcdGetPtr (%s, %s, %s, %s, &OriginalSize);\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
ae7b6df8 1302\r
8518bf0b
LG
1303 #\r
1304 # Determine the size of the PCD. For simple structures, sizeof(TYPE) provides\r
1305 # the correct value. For structures with a flexible array member, the flexible\r
1306 # array member is detected, and the size is based on the highest index used with\r
1307 # the flexible array member. The flexible array member must be the last field\r
1308 # in a structure. The size formula for this case is:\r
1309 # OFFSET_OF(FlexbleArrayField) + sizeof(FlexibleArray[0]) * (HighestIndex + 1)\r
1310 #\r
1311 CApp = CApp + ' Size = sizeof(%s);\n' % (Pcd.DatumType)\r
4cc82428
FB
1312 for FieldList in [Pcd.DefaultValues]:\r
1313 if not FieldList:\r
1314 continue\r
1315 for FieldName in FieldList:\r
1316 FieldName = "." + FieldName\r
1317 IsArray = self.IsFieldValueAnArray(FieldList[FieldName.strip(".")][0])\r
1318 if IsArray:\r
1319 Value, ValueSize = ParseFieldValue (FieldList[FieldName.strip(".")][0])\r
1320 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
1321 else:\r
1322 NewFieldName = ''\r
1323 while '[' in FieldName:\r
1324 NewFieldName = NewFieldName + FieldName.split('[', 1)[0] + '[0]'\r
1325 ArrayIndex = int(FieldName.split('[', 1)[1].split(']', 1)[0])\r
1326 FieldName = FieldName.split(']', 1)[1]\r
1327 FieldName = NewFieldName + FieldName\r
1328 while '[' in FieldName:\r
1329 FieldName = FieldName.rsplit('[', 1)[0]\r
1330 CApp = CApp + ' __FLEXIBLE_SIZE(Size, %s, %s, %d);\n' % (Pcd.DatumType, FieldName.strip("."), ArrayIndex + 1)\r
09c80b07 1331 for skuname in self.SkuIdMgr.GetSkuChain(SkuName):\r
c05c2c05 1332 inherit_OverrideValues = Pcd.SkuOverrideValues[skuname]\r
4cc82428 1333 for FieldList in [inherit_OverrideValues.get(DefaultStoreName)]:\r
c05c2c05
LG
1334 if not FieldList:\r
1335 continue\r
1336 for FieldName in FieldList:\r
1337 FieldName = "." + FieldName\r
1338 IsArray = self.IsFieldValueAnArray(FieldList[FieldName.strip(".")][0])\r
1339 if IsArray:\r
1340 Value, ValueSize = ParseFieldValue (FieldList[FieldName.strip(".")][0])\r
1341 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
1342 else:\r
1343 NewFieldName = ''\r
1344 while '[' in FieldName:\r
1345 NewFieldName = NewFieldName + FieldName.split('[', 1)[0] + '[0]'\r
1346 ArrayIndex = int(FieldName.split('[', 1)[1].split(']', 1)[0])\r
1347 FieldName = FieldName.split(']', 1)[1]\r
1348 FieldName = NewFieldName + FieldName\r
1349 while '[' in FieldName:\r
1350 FieldName = FieldName.rsplit('[', 1)[0]\r
1351 CApp = CApp + ' __FLEXIBLE_SIZE(Size, %s, %s, %d);\n' % (Pcd.DatumType, FieldName.strip("."), ArrayIndex + 1)\r
1352 if skuname == SkuName:\r
1353 break\r
ae7b6df8 1354\r
8518bf0b
LG
1355 #\r
1356 # Allocate and zero buffer for the PCD\r
1357 # Must handle cases where current value is smaller, larger, or same size\r
1358 # Always keep that larger one as the current size\r
1359 #\r
1360 CApp = CApp + ' Size = (OriginalSize > Size ? OriginalSize : Size);\n'\r
1361 CApp = CApp + ' Pcd = (%s *)malloc (Size);\n' % (Pcd.DatumType)\r
1362 CApp = CApp + ' memset (Pcd, 0, Size);\n'\r
ae7b6df8 1363\r
8518bf0b
LG
1364 #\r
1365 # Copy current PCD value into allocated buffer.\r
1366 #\r
1367 CApp = CApp + ' memcpy (Pcd, OriginalPcd, OriginalSize);\n'\r
ae7b6df8 1368\r
8518bf0b
LG
1369 #\r
1370 # Assign field values in PCD\r
1371 #\r
4cc82428
FB
1372 for FieldList in [Pcd.DefaultValues]:\r
1373 if not FieldList:\r
1374 continue\r
1375 for FieldName in FieldList:\r
1376 IsArray = self.IsFieldValueAnArray(FieldList[FieldName][0])\r
1377 try:\r
1378 Value, ValueSize = ParseFieldValue (FieldList[FieldName][0])\r
1379 except Exception:\r
1380 print FieldList[FieldName][0]\r
1381 if isinstance(Value, str):\r
1382 CApp = CApp + ' Pcd->%s = %s; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
1383 elif IsArray:\r
1384 #\r
1385 # Use memcpy() to copy value into field\r
1386 #\r
1387 CApp = CApp + ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.DatumType, FieldName)\r
1388 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
1389 CApp = CApp + ' memcpy (&Pcd->%s[0], Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)\r
1390 else:\r
1391 if ValueSize > 4:\r
1392 CApp = CApp + ' Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
1393 else:\r
1394 CApp = CApp + ' Pcd->%s = %d; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
09c80b07 1395 for skuname in self.SkuIdMgr.GetSkuChain(SkuName):\r
c05c2c05 1396 inherit_OverrideValues = Pcd.SkuOverrideValues[skuname]\r
4cc82428 1397 for FieldList in [Pcd.DefaultFromDSC,inherit_OverrideValues.get(DefaultStoreName)]:\r
c05c2c05
LG
1398 if not FieldList:\r
1399 continue\r
1400 if Pcd.DefaultFromDSC and FieldList == Pcd.DefaultFromDSC:\r
1401 IsArray = self.IsFieldValueAnArray(FieldList)\r
1402 Value, ValueSize = ParseFieldValue (FieldList)\r
1403 if isinstance(Value, str):\r
1404 CApp = CApp + ' Pcd = %s; // From DSC Default Value %s\n' % (Value, Pcd.DefaultFromDSC)\r
1405 elif IsArray:\r
8518bf0b
LG
1406 #\r
1407 # Use memcpy() to copy value into field\r
1408 #\r
c05c2c05
LG
1409 CApp = CApp + ' Value = %s; // From DSC Default Value %s\n' % (self.IntToCString(Value, ValueSize), Pcd.DefaultFromDSC)\r
1410 CApp = CApp + ' memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
1411 continue\r
ae7b6df8 1412\r
c05c2c05
LG
1413 for FieldName in FieldList:\r
1414 IsArray = self.IsFieldValueAnArray(FieldList[FieldName][0])\r
1415 try:\r
1416 Value, ValueSize = ParseFieldValue (FieldList[FieldName][0])\r
1417 except Exception:\r
1418 print FieldList[FieldName][0]\r
1419 if isinstance(Value, str):\r
1420 CApp = CApp + ' Pcd->%s = %s; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
1421 elif IsArray:\r
8518bf0b
LG
1422 #\r
1423 # Use memcpy() to copy value into field\r
1424 #\r
c05c2c05
LG
1425 CApp = CApp + ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.DatumType, FieldName)\r
1426 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
1427 CApp = CApp + ' memcpy (&Pcd->%s[0], Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)\r
8518bf0b 1428 else:\r
c05c2c05
LG
1429 if ValueSize > 4:\r
1430 CApp = CApp + ' Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
1431 else:\r
1432 CApp = CApp + ' Pcd->%s = %d; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
1433 if skuname == SkuName:\r
1434 break\r
8518bf0b
LG
1435 #\r
1436 # Set new PCD value and size\r
1437 #\r
1438 CApp = CApp + ' PcdSetPtr (%s, %s, %s, %s, Size, (UINT8 *)Pcd);\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
ae7b6df8 1439\r
8518bf0b
LG
1440 #\r
1441 # Free PCD\r
1442 #\r
1443 CApp = CApp + ' free (Pcd);\n'\r
1444 CApp = CApp + '}\n'\r
1445 CApp = CApp + '\n'\r
ae7b6df8
LG
1446 return InitByteValue, CApp\r
1447\r
1448 def GenerateByteArrayValue (self, StructuredPcds):\r
1449 #\r
1450 # Generate/Compile/Run C application to determine if there are any flexible array members\r
1451 #\r
1452 if not StructuredPcds:\r
1453 return\r
1454\r
1455 InitByteValue = ""\r
1456 CApp = PcdMainCHeader\r
1457\r
1458 Includes = {}\r
1459 for PcdName in StructuredPcds:\r
1460 Pcd = StructuredPcds[PcdName]\r
1461 IncludeFile = Pcd.StructuredPcdIncludeFile\r
1462 if IncludeFile not in Includes:\r
1463 Includes[IncludeFile] = True\r
1464 CApp = CApp + '#include <%s>\n' % (IncludeFile)\r
1465 CApp = CApp + '\n'\r
1466\r
1467 for PcdName in StructuredPcds:\r
1468 Pcd = StructuredPcds[PcdName]\r
1469 if not Pcd.SkuOverrideValues:\r
8518bf0b 1470 InitByteValue, CApp = self.GenerateInitializeFunc(self.SkuIdMgr.SystemSkuId, 'STANDARD', Pcd, InitByteValue, CApp)\r
ae7b6df8 1471 else:\r
c05c2c05
LG
1472 for SkuName in self.SkuIdMgr.SkuOverrideOrder():\r
1473 if SkuName not in Pcd.SkuOverrideValues:\r
1474 continue\r
ae7b6df8
LG
1475 for DefaultStoreName in Pcd.DefaultStoreName:\r
1476 Pcd = StructuredPcds[PcdName]\r
1477 InitByteValue, CApp = self.GenerateInitializeFunc(SkuName, DefaultStoreName, Pcd, InitByteValue, CApp)\r
1478\r
1479 CApp = CApp + 'VOID\n'\r
1480 CApp = CApp + 'PcdEntryPoint(\n'\r
1481 CApp = CApp + ' VOID\n'\r
1482 CApp = CApp + ' )\n'\r
1483 CApp = CApp + '{\n'\r
1484 for Pcd in StructuredPcds.values():\r
1485 if not Pcd.SkuOverrideValues:\r
8518bf0b 1486 CApp = CApp + ' Initialize_%s_%s_%s_%s();\n' % (self.SkuIdMgr.SystemSkuId, 'STANDARD', Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
ae7b6df8 1487 else:\r
c05c2c05
LG
1488 for SkuName in self.SkuIdMgr.SkuOverrideOrder():\r
1489 if SkuName not in Pcd.SkuOverrideValues:\r
1490 continue\r
8518bf0b 1491 for DefaultStoreName in Pcd.SkuOverrideValues[SkuName]:\r
ae7b6df8
LG
1492 CApp = CApp + ' Initialize_%s_%s_%s_%s();\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
1493 CApp = CApp + '}\n'\r
1494\r
1495 CApp = CApp + PcdMainCEntry + '\n'\r
1496\r
1497 if not os.path.exists(self.OutputPath):\r
1498 os.makedirs(self.OutputPath)\r
1499 CAppBaseFileName = os.path.join(self.OutputPath, PcdValueInitName)\r
1500 File = open (CAppBaseFileName + '.c', 'w')\r
1501 File.write(CApp)\r
1502 File.close()\r
1503\r
1504 MakeApp = PcdMakefileHeader\r
1505 if sys.platform == "win32":\r
1506 MakeApp = MakeApp + 'ARCH = IA32\nAPPNAME = %s\n' % (PcdValueInitName) + 'OBJECTS = %s\%s.obj\n' % (self.OutputPath, PcdValueInitName) + 'INC = '\r
1507 else:\r
1508 MakeApp = MakeApp + PcdGccMakefile\r
1509 MakeApp = MakeApp + 'APPNAME = %s\n' % (PcdValueInitName) + 'OBJECTS = %s/%s.o\n' % (self.OutputPath, PcdValueInitName) + \\r
68ba919f 1510 'include $(MAKEROOT)/Makefiles/app.makefile\n' + 'INCLUDE +='\r
ae7b6df8
LG
1511\r
1512 PlatformInc = {}\r
1513 for Cache in self._Bdb._CACHE_.values():\r
1514 if Cache.MetaFile.Ext.lower() != '.dec':\r
1515 continue\r
1516 if Cache.Includes:\r
1517 if str(Cache.MetaFile.Path) not in PlatformInc:\r
1518 PlatformInc[str(Cache.MetaFile.Path)] = Cache.Includes\r
1519\r
1520 PcdDependDEC = []\r
1521 for Pcd in StructuredPcds.values():\r
1522 for PackageDec in Pcd.PackageDecs:\r
1523 Package = os.path.normpath(mws.join(GlobalData.gWorkspace, PackageDec))\r
1524 if not os.path.exists(Package):\r
1525 EdkLogger.error('Build', RESOURCE_NOT_AVAILABLE, "The dependent Package %s of PCD %s.%s is not exist." % (PackageDec, Pcd.TokenSpaceGuidCName, Pcd.TokenCName))\r
1526 if Package not in PcdDependDEC:\r
1527 PcdDependDEC.append(Package)\r
1528\r
1529 if PlatformInc and PcdDependDEC:\r
1530 for pkg in PcdDependDEC:\r
1531 if pkg in PlatformInc:\r
1532 for inc in PlatformInc[pkg]:\r
1533 MakeApp += '-I' + str(inc) + ' '\r
1534 MakeApp = MakeApp + '\n'\r
68ba919f
YZ
1535\r
1536 CC_FLAGS = LinuxCFLAGS\r
1537 if sys.platform == "win32":\r
1538 CC_FLAGS = WindowsCFLAGS\r
1539 BuildOptions = {}\r
1540 for Options in self.BuildOptions:\r
1541 if Options[2] != EDKII_NAME:\r
1542 continue\r
1543 Family = Options[0]\r
1544 if Family and Family != self.ToolChainFamily:\r
1545 continue\r
1546 Target, Tag, Arch, Tool, Attr = Options[1].split("_")\r
1547 if Tool != 'CC':\r
1548 continue\r
1549\r
1550 if Target == "*" or Target == self._Target:\r
1551 if Tag == "*" or Tag == self._Toolchain:\r
1552 if Arch == "*" or Arch == self.Arch:\r
1553 if Tool not in BuildOptions:\r
1554 BuildOptions[Tool] = {}\r
1555 if Attr != "FLAGS" or Attr not in BuildOptions[Tool] or self.BuildOptions[Options].startswith('='):\r
1556 BuildOptions[Tool][Attr] = self.BuildOptions[Options]\r
1557 else:\r
1558 # append options for the same tool except PATH\r
1559 if Attr != 'PATH':\r
1560 BuildOptions[Tool][Attr] += " " + self.BuildOptions[Options]\r
1561 else:\r
1562 BuildOptions[Tool][Attr] = self.BuildOptions[Options]\r
1563 if BuildOptions:\r
1564 for Tool in BuildOptions:\r
1565 for Attr in BuildOptions[Tool]:\r
1566 if Attr == "FLAGS":\r
1567 Value = BuildOptions[Tool][Attr]\r
1568 ValueList = Value.split()\r
1569 if ValueList:\r
1570 for Id, Item in enumerate(ValueList):\r
1571 if Item == '-D' or Item == '/D':\r
1572 CC_FLAGS += ' ' + Item\r
1573 if Id + 1 < len(ValueList):\r
1574 CC_FLAGS += ' ' + ValueList[Id + 1]\r
1575 elif Item.startswith('/D') or Item.startswith('-D'):\r
1576 CC_FLAGS += ' ' + Item\r
1577 MakeApp += CC_FLAGS\r
1578\r
ae7b6df8
LG
1579 if sys.platform == "win32":\r
1580 MakeApp = MakeApp + PcdMakefileEnd\r
1581 MakeFileName = os.path.join(self.OutputPath, 'Makefile')\r
1582 File = open (MakeFileName, 'w')\r
1583 File.write(MakeApp)\r
1584 File.close()\r
1585\r
1586 InputValueFile = os.path.join(self.OutputPath, 'Input.txt')\r
1587 OutputValueFile = os.path.join(self.OutputPath, 'Output.txt')\r
1588 File = open (InputValueFile, 'w')\r
1589 File.write(InitByteValue)\r
1590 File.close()\r
1591\r
b2395724 1592 Messages = ''\r
ae7b6df8
LG
1593 if sys.platform == "win32":\r
1594 StdOut, StdErr = self.ExecuteCommand ('nmake clean & nmake -f %s' % (MakeFileName))\r
b2395724 1595 Messages = StdOut\r
ae7b6df8
LG
1596 else:\r
1597 StdOut, StdErr = self.ExecuteCommand ('make clean & make -f %s' % (MakeFileName))\r
b2395724
LG
1598 Messages = StdErr\r
1599 Messages = Messages.split('\n')\r
1600 for Message in Messages:\r
1601 if " error" in Message:\r
1602 FileInfo = Message.strip().split('(')\r
1603 if len (FileInfo) > 1:\r
1604 FileName = FileInfo [0]\r
1605 FileLine = FileInfo [1].split (')')[0]\r
1606 else:\r
1607 FileInfo = Message.strip().split(':')\r
1608 FileName = FileInfo [0]\r
1609 FileLine = FileInfo [1]\r
1610\r
1611 File = open (FileName, 'r')\r
1612 FileData = File.readlines()\r
1613 File.close()\r
1614 error_line = FileData[int (FileLine) - 1]\r
1615 if r"//" in error_line:\r
1616 c_line,dsc_line = error_line.split(r"//")\r
1617 else:\r
1618 dsc_line = error_line\r
1619\r
1620 message_itmes = Message.split(":")\r
1621 Index = 0\r
1622 for item in message_itmes:\r
1623 if "PcdValueInit.c" in item:\r
1624 Index = message_itmes.index(item)\r
1625 message_itmes[Index] = dsc_line.strip()\r
1626 break\r
1627\r
1628 EdkLogger.error("build", PCD_STRUCTURE_PCD_ERROR, ":".join(message_itmes[Index:]))\r
ae7b6df8
LG
1629\r
1630 PcdValueInitExe = PcdValueInitName\r
1631 if not sys.platform == "win32":\r
1632 PcdValueInitExe = os.path.join(os.getenv("EDK_TOOLS_PATH"), 'Source', 'C', 'bin', PcdValueInitName)\r
1633\r
1634 StdOut, StdErr = self.ExecuteCommand (PcdValueInitExe + ' -i %s -o %s' % (InputValueFile, OutputValueFile))\r
1635 File = open (OutputValueFile, 'r')\r
1636 FileBuffer = File.readlines()\r
1637 File.close()\r
1638\r
1639 StructurePcdSet = []\r
1640 for Pcd in FileBuffer:\r
1641 PcdValue = Pcd.split ('|')\r
1642 PcdInfo = PcdValue[0].split ('.')\r
8518bf0b 1643 StructurePcdSet.append((PcdInfo[0],PcdInfo[1], PcdInfo[2], PcdInfo[3], PcdValue[2].strip()))\r
ae7b6df8
LG
1644 return StructurePcdSet\r
1645\r
1646 ## Retrieve dynamic PCD settings\r
1647 #\r
1648 # @param Type PCD type\r
1649 #\r
1650 # @retval a dict object contains settings of given PCD type\r
1651 #\r
1652 def _GetDynamicPcd(self, Type):\r
1653\r
ae7b6df8
LG
1654\r
1655 Pcds = sdict()\r
1656 #\r
1657 # tdict is a special dict kind of type, used for selecting correct\r
1658 # PCD settings for certain ARCH and SKU\r
1659 #\r
1660 PcdDict = tdict(True, 4)\r
1661 PcdList = []\r
1662 # Find out all possible PCD candidates for self._Arch\r
1663 RecordList = self._RawData[Type, self._Arch]\r
8518bf0b 1664 AvailableSkuIdSet = copy.copy(self.SkuIds)\r
ae7b6df8 1665\r
ae7b6df8 1666\r
8518bf0b 1667 for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, Dummy3, Dummy4,Dummy5 in RecordList:\r
2b8a6c44
LG
1668 SkuName = SkuName.upper()\r
1669 SkuName = 'DEFAULT' if SkuName == 'COMMON' else SkuName\r
ae7b6df8 1670 if SkuName not in AvailableSkuIdSet:\r
2b8a6c44
LG
1671 EdkLogger.error('build', PARAMETER_INVALID, 'Sku %s is not defined in [SkuIds] section' % SkuName,\r
1672 File=self.MetaFile, Line=Dummy5)\r
ae7b6df8
LG
1673 if "." not in TokenSpaceGuid:\r
1674 PcdList.append((PcdCName, TokenSpaceGuid, SkuName, Dummy4))\r
1675 PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid] = Setting\r
1676\r
1677 # Remove redundant PCD candidates, per the ARCH and SKU\r
1678 for PcdCName, TokenSpaceGuid, SkuName, Dummy4 in PcdList:\r
1679\r
1680 Setting = PcdDict[self._Arch, SkuName, PcdCName, TokenSpaceGuid]\r
1681 if Setting == None:\r
1682 continue\r
1683\r
1684 PcdValue, DatumType, MaxDatumSize = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4)\r
8518bf0b 1685 SkuInfo = SkuInfoClass(SkuName, self.SkuIds[SkuName][0], '', '', '', '', '', PcdValue)\r
ae7b6df8
LG
1686 if (PcdCName, TokenSpaceGuid) in Pcds.keys():\r
1687 pcdObject = Pcds[PcdCName, TokenSpaceGuid]\r
1688 pcdObject.SkuInfoList[SkuName] = SkuInfo\r
1689 if MaxDatumSize.strip():\r
1690 CurrentMaxSize = int(MaxDatumSize.strip(), 0)\r
1691 else:\r
1692 CurrentMaxSize = 0\r
1693 if pcdObject.MaxDatumSize:\r
1694 PcdMaxSize = int(pcdObject.MaxDatumSize, 0)\r
1695 else:\r
1696 PcdMaxSize = 0\r
1697 if CurrentMaxSize > PcdMaxSize:\r
1698 pcdObject.MaxDatumSize = str(CurrentMaxSize)\r
1699 else:\r
1700 Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject(\r
1701 PcdCName,\r
1702 TokenSpaceGuid,\r
1703 self._PCD_TYPE_STRING_[Type],\r
1704 DatumType,\r
1705 PcdValue,\r
1706 '',\r
1707 MaxDatumSize,\r
1708 {SkuName : SkuInfo},\r
1709 False,\r
1710 None,\r
1711 IsDsc=True)\r
1712\r
1713 for pcd in Pcds.values():\r
1714 pcdDecObject = self._DecPcds[pcd.TokenCName, pcd.TokenSpaceGuidCName]\r
e651d06c
LG
1715 # Only fix the value while no value provided in DSC file.\r
1716 for sku in pcd.SkuInfoList.values():\r
1717 if (sku.DefaultValue == "" or sku.DefaultValue==None):\r
1718 sku.DefaultValue = pcdDecObject.DefaultValue\r
ae7b6df8
LG
1719 if 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' not in pcd.SkuInfoList.keys():\r
1720 valuefromDec = pcdDecObject.DefaultValue\r
1721 SkuInfo = SkuInfoClass('DEFAULT', '0', '', '', '', '', '', valuefromDec)\r
1722 pcd.SkuInfoList['DEFAULT'] = SkuInfo\r
1723 elif 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys():\r
1724 pcd.SkuInfoList['DEFAULT'] = pcd.SkuInfoList['COMMON']\r
1725 del(pcd.SkuInfoList['COMMON'])\r
1726 elif 'DEFAULT' in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys():\r
1727 del(pcd.SkuInfoList['COMMON'])\r
65eff519
LG
1728\r
1729 map(self.FilterSkuSettings,Pcds.values())\r
ae7b6df8
LG
1730\r
1731 return Pcds\r
1732\r
65eff519
LG
1733 def FilterSkuSettings(self, PcdObj):\r
1734\r
1735 if self.SkuIdMgr.SkuUsageType == self.SkuIdMgr.SINGLE:\r
1736 if 'DEFAULT' in PcdObj.SkuInfoList.keys() and self.SkuIdMgr.SystemSkuId not in PcdObj.SkuInfoList.keys():\r
1737 PcdObj.SkuInfoList[self.SkuIdMgr.SystemSkuId] = PcdObj.SkuInfoList['DEFAULT']\r
1738 PcdObj.SkuInfoList = {'DEFAULT':PcdObj.SkuInfoList[self.SkuIdMgr.SystemSkuId]}\r
1739 PcdObj.SkuInfoList['DEFAULT'].SkuIdName = 'DEFAULT'\r
1740 PcdObj.SkuInfoList['DEFAULT'].SkuId = '0'\r
1741\r
1742 elif self.SkuIdMgr.SkuUsageType == self.SkuIdMgr.DEFAULT:\r
1743 PcdObj.SkuInfoList = {'DEFAULT':PcdObj.SkuInfoList['DEFAULT']}\r
1744\r
1745 return PcdObj\r
1746\r
1747\r
ae7b6df8
LG
1748 def CompareVarAttr(self, Attr1, Attr2):\r
1749 if not Attr1 or not Attr2: # for empty string\r
1750 return True\r
1751 Attr1s = [attr.strip() for attr in Attr1.split(",")]\r
1752 Attr1Set = set(Attr1s)\r
1753 Attr2s = [attr.strip() for attr in Attr2.split(",")]\r
1754 Attr2Set = set(Attr2s)\r
1755 if Attr2Set == Attr1Set:\r
1756 return True\r
1757 else:\r
1758 return False\r
8518bf0b
LG
1759 def CompletePcdValues(self,PcdSet):\r
1760 Pcds = {}\r
1761 DefaultStoreObj = DefaultStore(self._GetDefaultStores())\r
98eb1364 1762 SkuIds = {skuname:skuid for skuname,skuid in self.SkuIdMgr.AvailableSkuIdSet.items() if skuname !='COMMON'}\r
8518bf0b
LG
1763 DefaultStores = set([storename for pcdobj in PcdSet.values() for skuobj in pcdobj.SkuInfoList.values() for storename in skuobj.DefaultStoreDict.keys()])\r
1764 for PcdCName, TokenSpaceGuid in PcdSet:\r
1765 PcdObj = PcdSet[(PcdCName, TokenSpaceGuid)]\r
1766 if PcdObj.Type not in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_DEFAULT],\r
1767 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII],\r
1768 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_VPD],\r
1769 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_DEFAULT],\r
1770 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII],\r
1771 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_VPD]]:\r
1772 Pcds[PcdCName, TokenSpaceGuid]= PcdObj\r
1773 continue\r
1774 PcdType = PcdObj.Type\r
1775 if PcdType in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
1776 for skuid in PcdObj.SkuInfoList:\r
1777 skuobj = PcdObj.SkuInfoList[skuid]\r
1778 mindefaultstorename = DefaultStoreObj.GetMin(set([defaultstorename for defaultstorename in skuobj.DefaultStoreDict]))\r
1779 for defaultstorename in DefaultStores:\r
1780 if defaultstorename not in skuobj.DefaultStoreDict:\r
2b8a6c44 1781 skuobj.DefaultStoreDict[defaultstorename] = copy.deepcopy(skuobj.DefaultStoreDict[mindefaultstorename])\r
8518bf0b 1782 skuobj.HiiDefaultValue = skuobj.DefaultStoreDict[mindefaultstorename]\r
8ac16789 1783 for skuname,skuid in SkuIds.items():\r
2b8a6c44
LG
1784 if skuname not in PcdObj.SkuInfoList:\r
1785 nextskuid = self.SkuIdMgr.GetNextSkuId(skuname)\r
8518bf0b
LG
1786 while nextskuid not in PcdObj.SkuInfoList:\r
1787 nextskuid = self.SkuIdMgr.GetNextSkuId(nextskuid)\r
2b8a6c44
LG
1788 PcdObj.SkuInfoList[skuname] = copy.deepcopy(PcdObj.SkuInfoList[nextskuid])\r
1789 PcdObj.SkuInfoList[skuname].SkuId = skuid\r
1790 PcdObj.SkuInfoList[skuname].SkuIdName = skuname\r
8518bf0b
LG
1791 if PcdType in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
1792 PcdObj.DefaultValue = PcdObj.SkuInfoList.values()[0].HiiDefaultValue if self.SkuIdMgr.SkuUsageType == self.SkuIdMgr.SINGLE else PcdObj.SkuInfoList["DEFAULT"].HiiDefaultValue\r
1793 Pcds[PcdCName, TokenSpaceGuid]= PcdObj\r
1794 return Pcds\r
ae7b6df8
LG
1795 ## Retrieve dynamic HII PCD settings\r
1796 #\r
1797 # @param Type PCD type\r
1798 #\r
1799 # @retval a dict object contains settings of given PCD type\r
1800 #\r
1801 def _GetDynamicHiiPcd(self, Type):\r
1802\r
ae7b6df8
LG
1803 VariableAttrs = {}\r
1804\r
1805 Pcds = sdict()\r
1806 #\r
1807 # tdict is a special dict kind of type, used for selecting correct\r
1808 # PCD settings for certain ARCH and SKU\r
1809 #\r
8518bf0b 1810 PcdDict = tdict(True, 5)\r
ae7b6df8
LG
1811 PcdSet = set()\r
1812 RecordList = self._RawData[Type, self._Arch]\r
1813 # Find out all possible PCD candidates for self._Arch\r
8518bf0b 1814 AvailableSkuIdSet = copy.copy(self.SkuIds)\r
2b8a6c44 1815 DefaultStoresDefine = self._GetDefaultStores()\r
ae7b6df8 1816\r
8518bf0b 1817 for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, DefaultStore, Dummy4,Dummy5 in RecordList:\r
2b8a6c44
LG
1818 SkuName = SkuName.upper()\r
1819 SkuName = 'DEFAULT' if SkuName == 'COMMON' else SkuName\r
1820 DefaultStore = DefaultStore.upper()\r
8518bf0b
LG
1821 if DefaultStore == "COMMON":\r
1822 DefaultStore = "STANDARD"\r
ae7b6df8 1823 if SkuName not in AvailableSkuIdSet:\r
2b8a6c44
LG
1824 EdkLogger.error('build', PARAMETER_INVALID, 'Sku %s is not defined in [SkuIds] section' % SkuName,\r
1825 File=self.MetaFile, Line=Dummy5)\r
1826 if DefaultStore not in DefaultStoresDefine:\r
1827 EdkLogger.error('build', PARAMETER_INVALID, 'DefaultStores %s is not defined in [DefaultStores] section' % DefaultStore,\r
1828 File=self.MetaFile, Line=Dummy5)\r
ae7b6df8 1829 if "." not in TokenSpaceGuid:\r
8518bf0b
LG
1830 PcdSet.add((PcdCName, TokenSpaceGuid, SkuName,DefaultStore, Dummy4))\r
1831 PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid,DefaultStore] = Setting\r
ae7b6df8
LG
1832\r
1833\r
1834 # Remove redundant PCD candidates, per the ARCH and SKU\r
8518bf0b 1835 for PcdCName, TokenSpaceGuid, SkuName,DefaultStore, Dummy4 in PcdSet:\r
ae7b6df8 1836\r
8518bf0b 1837 Setting = PcdDict[self._Arch, SkuName, PcdCName, TokenSpaceGuid,DefaultStore]\r
ae7b6df8
LG
1838 if Setting == None:\r
1839 continue\r
1840 VariableName, VariableGuid, VariableOffset, DefaultValue, VarAttribute = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4)\r
1841\r
1842 rt, Msg = VariableAttributes.ValidateVarAttributes(VarAttribute)\r
1843 if not rt:\r
1844 EdkLogger.error("build", PCD_VARIABLE_ATTRIBUTES_ERROR, "Variable attributes settings for %s is incorrect.\n %s" % (".".join((TokenSpaceGuid, PcdCName)), Msg),\r
1845 ExtraData="[%s]" % VarAttribute)\r
1846 ExceedMax = False\r
1847 FormatCorrect = True\r
1848 if VariableOffset.isdigit():\r
1849 if int(VariableOffset, 10) > 0xFFFF:\r
1850 ExceedMax = True\r
1851 elif re.match(r'[\t\s]*0[xX][a-fA-F0-9]+$', VariableOffset):\r
1852 if int(VariableOffset, 16) > 0xFFFF:\r
1853 ExceedMax = True\r
1854 # For Offset written in "A.B"\r
1855 elif VariableOffset.find('.') > -1:\r
1856 VariableOffsetList = VariableOffset.split(".")\r
1857 if not (len(VariableOffsetList) == 2\r
1858 and IsValidWord(VariableOffsetList[0])\r
1859 and IsValidWord(VariableOffsetList[1])):\r
1860 FormatCorrect = False\r
1861 else:\r
1862 FormatCorrect = False\r
1863 if not FormatCorrect:\r
1864 EdkLogger.error('Build', FORMAT_INVALID, "Invalid syntax or format of the variable offset value is incorrect for %s." % ".".join((TokenSpaceGuid, PcdCName)))\r
1865\r
1866 if ExceedMax:\r
1867 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
1868 if (VariableName, VariableGuid) not in VariableAttrs:\r
1869 VariableAttrs[(VariableName, VariableGuid)] = VarAttribute\r
1870 else:\r
1871 if not self.CompareVarAttr(VariableAttrs[(VariableName, VariableGuid)], VarAttribute):\r
1872 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
1873\r
ae7b6df8
LG
1874 pcdDecObject = self._DecPcds[PcdCName, TokenSpaceGuid]\r
1875 if (PcdCName, TokenSpaceGuid) in Pcds.keys():\r
1876 pcdObject = Pcds[PcdCName, TokenSpaceGuid]\r
8518bf0b
LG
1877 if SkuName in pcdObject.SkuInfoList:\r
1878 Skuitem = pcdObject.SkuInfoList[SkuName]\r
1879 Skuitem.DefaultStoreDict.update({DefaultStore:DefaultValue})\r
1880 else:\r
1881 SkuInfo = SkuInfoClass(SkuName, self.SkuIds[SkuName][0], VariableName, VariableGuid, VariableOffset, DefaultValue, VariableAttribute=VarAttribute,DefaultStore={DefaultStore:DefaultValue})\r
1882 pcdObject.SkuInfoList[SkuName] = SkuInfo\r
ae7b6df8 1883 else:\r
8518bf0b 1884 SkuInfo = SkuInfoClass(SkuName, self.SkuIds[SkuName][0], VariableName, VariableGuid, VariableOffset, DefaultValue, VariableAttribute=VarAttribute,DefaultStore={DefaultStore:DefaultValue})\r
ae7b6df8
LG
1885 Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject(\r
1886 PcdCName,\r
1887 TokenSpaceGuid,\r
1888 self._PCD_TYPE_STRING_[Type],\r
1889 '',\r
1890 DefaultValue,\r
1891 '',\r
1892 '',\r
1893 {SkuName : SkuInfo},\r
1894 False,\r
1895 None,\r
1896 pcdDecObject.validateranges,\r
1897 pcdDecObject.validlists,\r
1898 pcdDecObject.expressions,\r
1899 IsDsc=True)\r
1900\r
1901\r
1902 for pcd in Pcds.values():\r
1903 SkuInfoObj = pcd.SkuInfoList.values()[0]\r
1904 pcdDecObject = self._DecPcds[pcd.TokenCName, pcd.TokenSpaceGuidCName]\r
1905 # Only fix the value while no value provided in DSC file.\r
1906 for sku in pcd.SkuInfoList.values():\r
1907 if (sku.HiiDefaultValue == "" or sku.HiiDefaultValue == None):\r
1908 sku.HiiDefaultValue = pcdDecObject.DefaultValue\r
1909 if 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' not in pcd.SkuInfoList.keys():\r
1910 valuefromDec = pcdDecObject.DefaultValue\r
2b8a6c44 1911 SkuInfo = SkuInfoClass('DEFAULT', '0', SkuInfoObj.VariableName, SkuInfoObj.VariableGuid, SkuInfoObj.VariableOffset, valuefromDec,VariableAttribute=SkuInfoObj.VariableAttribute,DefaultStore={DefaultStore:valuefromDec})\r
ae7b6df8
LG
1912 pcd.SkuInfoList['DEFAULT'] = SkuInfo\r
1913 elif 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys():\r
1914 pcd.SkuInfoList['DEFAULT'] = pcd.SkuInfoList['COMMON']\r
1915 del(pcd.SkuInfoList['COMMON'])\r
1916 elif 'DEFAULT' in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys():\r
1917 del(pcd.SkuInfoList['COMMON'])\r
1918\r
ae7b6df8
LG
1919 if pcd.MaxDatumSize.strip():\r
1920 MaxSize = int(pcd.MaxDatumSize, 0)\r
1921 else:\r
1922 MaxSize = 0\r
1923 if pcdDecObject.DatumType == 'VOID*':\r
2b8a6c44 1924 for (_, skuobj) in pcd.SkuInfoList.items():\r
ae7b6df8 1925 datalen = 0\r
47854fd5
LG
1926 skuobj.HiiDefaultValue = StringToArray(skuobj.HiiDefaultValue)\r
1927 datalen = len(skuobj.HiiDefaultValue.split(","))\r
ae7b6df8
LG
1928 if datalen > MaxSize:\r
1929 MaxSize = datalen\r
47854fd5
LG
1930 for defaultst in skuobj.DefaultStoreDict:\r
1931 skuobj.DefaultStoreDict[defaultst] = StringToArray(skuobj.DefaultStoreDict[defaultst])\r
1932 pcd.DefaultValue = StringToArray(pcd.DefaultValue)\r
ae7b6df8 1933 pcd.MaxDatumSize = str(MaxSize)\r
2b8a6c44
LG
1934 rt, invalidhii = self.CheckVariableNameAssignment(Pcds)\r
1935 if not rt:\r
1936 invalidpcd = ",".join(invalidhii)\r
1937 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
1938\r
1939 map(self.FilterSkuSettings,Pcds.values())\r
1940\r
ae7b6df8
LG
1941 return Pcds\r
1942\r
2b8a6c44
LG
1943 def CheckVariableNameAssignment(self,Pcds):\r
1944 invalidhii = []\r
1945 for pcdname in Pcds:\r
1946 pcd = Pcds[pcdname]\r
1947 varnameset = set([sku.VariableName for (skuid,sku) in pcd.SkuInfoList.items()])\r
1948 if len(varnameset) > 1:\r
1949 invalidhii.append(".".join((pcdname[1],pcdname[0])))\r
1950 if len(invalidhii):\r
1951 return False,invalidhii\r
1952 else:\r
1953 return True, []\r
ae7b6df8
LG
1954 ## Retrieve dynamic VPD PCD settings\r
1955 #\r
1956 # @param Type PCD type\r
1957 #\r
1958 # @retval a dict object contains settings of given PCD type\r
1959 #\r
1960 def _GetDynamicVpdPcd(self, Type):\r
1961\r
ae7b6df8
LG
1962\r
1963 Pcds = sdict()\r
1964 #\r
1965 # tdict is a special dict kind of type, used for selecting correct\r
1966 # PCD settings for certain ARCH and SKU\r
1967 #\r
1968 PcdDict = tdict(True, 4)\r
1969 PcdList = []\r
1970\r
1971 # Find out all possible PCD candidates for self._Arch\r
1972 RecordList = self._RawData[Type, self._Arch]\r
8518bf0b 1973 AvailableSkuIdSet = copy.copy(self.SkuIds)\r
ae7b6df8 1974\r
8518bf0b 1975 for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, Dummy3, Dummy4,Dummy5 in RecordList:\r
2b8a6c44
LG
1976 SkuName = SkuName.upper()\r
1977 SkuName = 'DEFAULT' if SkuName == 'COMMON' else SkuName\r
ae7b6df8 1978 if SkuName not in AvailableSkuIdSet:\r
2b8a6c44
LG
1979 EdkLogger.error('build', PARAMETER_INVALID, 'Sku %s is not defined in [SkuIds] section' % SkuName,\r
1980 File=self.MetaFile, Line=Dummy5)\r
ae7b6df8
LG
1981 if "." not in TokenSpaceGuid:\r
1982 PcdList.append((PcdCName, TokenSpaceGuid, SkuName, Dummy4))\r
1983 PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid] = Setting\r
1984\r
1985 # Remove redundant PCD candidates, per the ARCH and SKU\r
1986 for PcdCName, TokenSpaceGuid, SkuName, Dummy4 in PcdList:\r
1987 Setting = PcdDict[self._Arch, SkuName, PcdCName, TokenSpaceGuid]\r
1988 if Setting == None:\r
1989 continue\r
1990 #\r
1991 # For the VOID* type, it can have optional data of MaxDatumSize and InitialValue\r
1992 # For the Integer & Boolean type, the optional data can only be InitialValue.\r
1993 # At this point, we put all the data into the PcdClssObject for we don't know the PCD's datumtype\r
1994 # until the DEC parser has been called.\r
1995 #\r
1996 VpdOffset, MaxDatumSize, InitialValue = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4)\r
8518bf0b 1997 SkuInfo = SkuInfoClass(SkuName, self.SkuIds[SkuName][0], '', '', '', '', VpdOffset, InitialValue)\r
ae7b6df8
LG
1998 if (PcdCName, TokenSpaceGuid) in Pcds.keys():\r
1999 pcdObject = Pcds[PcdCName, TokenSpaceGuid]\r
2000 pcdObject.SkuInfoList[SkuName] = SkuInfo\r
2001 if MaxDatumSize.strip():\r
2002 CurrentMaxSize = int(MaxDatumSize.strip(), 0)\r
2003 else:\r
2004 CurrentMaxSize = 0\r
2005 if pcdObject.MaxDatumSize:\r
2006 PcdMaxSize = int(pcdObject.MaxDatumSize, 0)\r
2007 else:\r
2008 PcdMaxSize = 0\r
2009 if CurrentMaxSize > PcdMaxSize:\r
2010 pcdObject.MaxDatumSize = str(CurrentMaxSize)\r
2011 else:\r
2012 Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject(\r
2013 PcdCName,\r
2014 TokenSpaceGuid,\r
2015 self._PCD_TYPE_STRING_[Type],\r
2016 '',\r
2017 InitialValue,\r
2018 '',\r
2019 MaxDatumSize,\r
2020 {SkuName : SkuInfo},\r
2021 False,\r
2022 None,\r
2023 IsDsc=True)\r
2024 for pcd in Pcds.values():\r
2025 SkuInfoObj = pcd.SkuInfoList.values()[0]\r
2026 pcdDecObject = self._DecPcds[pcd.TokenCName, pcd.TokenSpaceGuidCName]\r
e651d06c
LG
2027 # Only fix the value while no value provided in DSC file.\r
2028 for sku in pcd.SkuInfoList.values():\r
2029 if (sku.DefaultValue == "" or sku.DefaultValue==None):\r
2030 sku.DefaultValue = pcdDecObject.DefaultValue\r
ae7b6df8
LG
2031 if 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' not in pcd.SkuInfoList.keys():\r
2032 valuefromDec = pcdDecObject.DefaultValue\r
2033 SkuInfo = SkuInfoClass('DEFAULT', '0', '', '', '', '', SkuInfoObj.VpdOffset, valuefromDec)\r
2034 pcd.SkuInfoList['DEFAULT'] = SkuInfo\r
2035 elif 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys():\r
2036 pcd.SkuInfoList['DEFAULT'] = pcd.SkuInfoList['COMMON']\r
2037 del(pcd.SkuInfoList['COMMON'])\r
2038 elif 'DEFAULT' in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys():\r
2039 del(pcd.SkuInfoList['COMMON'])\r
ae7b6df8 2040\r
65eff519
LG
2041\r
2042 map(self.FilterSkuSettings,Pcds.values())\r
ae7b6df8
LG
2043 return Pcds\r
2044\r
2045 ## Add external modules\r
2046 #\r
2047 # The external modules are mostly those listed in FDF file, which don't\r
2048 # need "build".\r
2049 #\r
2050 # @param FilePath The path of module description file\r
2051 #\r
2052 def AddModule(self, FilePath):\r
2053 FilePath = NormPath(FilePath)\r
2054 if FilePath not in self.Modules:\r
2055 Module = ModuleBuildClassObject()\r
2056 Module.MetaFile = FilePath\r
2057 self.Modules.append(Module)\r
2058\r
68ba919f
YZ
2059 def _GetToolChainFamily(self):\r
2060 self._ToolChainFamily = "MSFT"\r
2061 BuildConfigurationFile = os.path.normpath(os.path.join(GlobalData.gConfDirectory, "target.txt"))\r
2062 if os.path.isfile(BuildConfigurationFile) == True:\r
2063 TargetTxt = TargetTxtClassObject()\r
2064 TargetTxt.LoadTargetTxtFile(BuildConfigurationFile)\r
2065 ToolDefinitionFile = TargetTxt.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_TOOL_CHAIN_CONF]\r
2066 if ToolDefinitionFile == '':\r
2067 ToolDefinitionFile = "tools_def.txt"\r
2068 ToolDefinitionFile = os.path.normpath(mws.join(self.WorkspaceDir, 'Conf', ToolDefinitionFile))\r
2069 if os.path.isfile(ToolDefinitionFile) == True:\r
2070 ToolDef = ToolDefClassObject()\r
2071 ToolDef.LoadToolDefFile(ToolDefinitionFile)\r
2072 ToolDefinition = ToolDef.ToolsDefTxtDatabase\r
2073 if TAB_TOD_DEFINES_FAMILY not in ToolDefinition \\r
2074 or self._Toolchain not in ToolDefinition[TAB_TOD_DEFINES_FAMILY] \\r
2075 or not ToolDefinition[TAB_TOD_DEFINES_FAMILY][self._Toolchain]:\r
2076 self._ToolChainFamily = "MSFT"\r
2077 else:\r
2078 self._ToolChainFamily = ToolDefinition[TAB_TOD_DEFINES_FAMILY][self._Toolchain]\r
2079 return self._ToolChainFamily\r
2080\r
ae7b6df8
LG
2081 ## Add external PCDs\r
2082 #\r
2083 # The external PCDs are mostly those listed in FDF file to specify address\r
2084 # or offset information.\r
2085 #\r
2086 # @param Name Name of the PCD\r
2087 # @param Guid Token space guid of the PCD\r
2088 # @param Value Value of the PCD\r
2089 #\r
2090 def AddPcd(self, Name, Guid, Value):\r
2091 if (Name, Guid) not in self.Pcds:\r
2092 self.Pcds[Name, Guid] = PcdClassObject(Name, Guid, '', '', '', '', '', {}, False, None)\r
2093 self.Pcds[Name, Guid].DefaultValue = Value\r
5644e5ce
FB
2094 @property\r
2095 def DecPcds(self):\r
2096 if self._DecPcds == None:\r
2097 FdfInfList = []\r
2098 if GlobalData.gFdfParser:\r
2099 FdfInfList = GlobalData.gFdfParser.Profile.InfList\r
2100 PkgSet = set()\r
2101 for Inf in FdfInfList:\r
2102 ModuleFile = PathClass(NormPath(Inf), GlobalData.gWorkspace, Arch=self._Arch)\r
2103 if ModuleFile in self._Modules:\r
2104 continue\r
2105 ModuleData = self._Bdb[ModuleFile, self._Arch, self._Target, self._Toolchain]\r
2106 PkgSet.update(ModuleData.Packages)\r
726c501c 2107 self._DecPcds, self._GuidDict = GetDeclaredPcd(self, self._Bdb, self._Arch, self._Target, self._Toolchain,PkgSet)\r
5644e5ce 2108 return self._DecPcds\r
ae7b6df8
LG
2109 _Macros = property(_GetMacros)\r
2110 Arch = property(_GetArch, _SetArch)\r
2111 Platform = property(_GetPlatformName)\r
2112 PlatformName = property(_GetPlatformName)\r
2113 Guid = property(_GetFileGuid)\r
2114 Version = property(_GetVersion)\r
2115 DscSpecification = property(_GetDscSpec)\r
2116 OutputDirectory = property(_GetOutpuDir)\r
2117 SupArchList = property(_GetSupArch)\r
2118 BuildTargets = property(_GetBuildTarget)\r
2119 SkuName = property(_GetSkuName, _SetSkuName)\r
ae7b6df8
LG
2120 PcdInfoFlag = property(_GetPcdInfoFlag)\r
2121 VarCheckFlag = property(_GetVarCheckFlag)\r
2122 FlashDefinition = property(_GetFdfFile)\r
2123 Prebuild = property(_GetPrebuild)\r
2124 Postbuild = property(_GetPostbuild)\r
2125 BuildNumber = property(_GetBuildNumber)\r
2126 MakefileName = property(_GetMakefileName)\r
2127 BsBaseAddress = property(_GetBsBaseAddress)\r
2128 RtBaseAddress = property(_GetRtBaseAddress)\r
2129 LoadFixAddress = property(_GetLoadFixAddress)\r
2130 RFCLanguages = property(_GetRFCLanguages)\r
2131 ISOLanguages = property(_GetISOLanguages)\r
2132 VpdToolGuid = property(_GetVpdToolGuid)\r
2133 SkuIds = property(_GetSkuIds)\r
2134 Modules = property(_GetModules)\r
2135 LibraryInstances = property(_GetLibraryInstances)\r
2136 LibraryClasses = property(_GetLibraryClasses)\r
2137 Pcds = property(_GetPcds)\r
2138 BuildOptions = property(_GetBuildOptions)\r
68ba919f 2139 ToolChainFamily = property(_GetToolChainFamily)\r