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