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