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