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