]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/Workspace/DscBuildData.py
BaseTools: Structure Pcd value override incorrect.
[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
65eff519 1337 SkuIds = self.SkuIdMgr.AvailableSkuIdSet\r
55c84777 1338 SkuIds.update({TAB_DEFAULT:0})\r
b491aa95 1339 DefaultStores = {storename for pcdobj in AllPcds.values() for skuobj in pcdobj.SkuInfoList.values() for storename in skuobj.DefaultStoreDict}\r
ae7b6df8
LG
1340\r
1341 S_PcdSet = []\r
1342 # Find out all possible PCD candidates for self._Arch\r
1343 RecordList = []\r
2b8a6c44 1344\r
ae7b6df8
LG
1345 for Type in TypeList:\r
1346 RecordList.extend(self._RawData[Type, self._Arch])\r
1347\r
ccaa7754 1348 for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, default_store, Dummy4, Dummy5 in RecordList:\r
2b8a6c44
LG
1349 SkuName = SkuName.upper()\r
1350 default_store = default_store.upper()\r
55c84777 1351 SkuName = TAB_DEFAULT if SkuName == TAB_COMMON else SkuName\r
8518bf0b
LG
1352 if SkuName not in SkuIds:\r
1353 continue\r
2b8a6c44 1354\r
8518bf0b 1355 if SkuName in SkuIds and "." in TokenSpaceGuid:\r
ccaa7754 1356 S_PcdSet.append([ TokenSpaceGuid.split(".")[0], TokenSpaceGuid.split(".")[1], PcdCName, SkuName, default_store, Dummy5, AnalyzePcdExpression(Setting)[0]])\r
ae7b6df8
LG
1357\r
1358 # handle pcd value override\r
9759febd 1359 StrPcdSet = DscBuildData.GetStructurePcdInfo(S_PcdSet)\r
79820e32 1360 S_pcd_set = OrderedDict()\r
ae7b6df8 1361 for str_pcd in StrPcdSet:\r
8518bf0b
LG
1362 str_pcd_obj = Pcds.get((str_pcd[1], str_pcd[0]), None)\r
1363 str_pcd_dec = self._DecPcds.get((str_pcd[1], str_pcd[0]), None)\r
5db9414c
B
1364 if not isinstance (str_pcd_dec, StructurePcd):\r
1365 EdkLogger.error('build', PARSER_ERROR,\r
1366 "Pcd (%s.%s) is not declared as Structure PCD in DEC files. Arch: ['%s']" % (str_pcd[0], str_pcd[1], self._Arch),\r
ccaa7754 1367 File=self.MetaFile, Line = StrPcdSet[str_pcd][0][5])\r
ae7b6df8
LG
1368 if str_pcd_dec:\r
1369 str_pcd_obj_str = StructurePcd()\r
1370 str_pcd_obj_str.copy(str_pcd_dec)\r
1371 if str_pcd_obj:\r
1372 str_pcd_obj_str.copy(str_pcd_obj)\r
f832bb34
FB
1373 if str_pcd_obj.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
1374 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
1375 else:\r
1376 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 1377 for str_pcd_data in StrPcdSet[str_pcd]:\r
8518bf0b 1378 if str_pcd_data[3] in SkuIds:\r
ccaa7754 1379 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 1380 S_pcd_set[str_pcd[1], str_pcd[0]] = str_pcd_obj_str\r
2b8a6c44
LG
1381 else:\r
1382 EdkLogger.error('build', PARSER_ERROR,\r
1383 "Pcd (%s.%s) defined in DSC is not declared in DEC files. Arch: ['%s']" % (str_pcd[0], str_pcd[1], self._Arch),\r
ccaa7754 1384 File=self.MetaFile, Line = StrPcdSet[str_pcd][0][5])\r
ae7b6df8 1385 # Add the Structure PCD that only defined in DEC, don't have override in DSC file\r
5644e5ce 1386 for Pcd in self.DecPcds:\r
0d1f5b2b 1387 if isinstance(self._DecPcds[Pcd], StructurePcd):\r
ae7b6df8
LG
1388 if Pcd not in S_pcd_set:\r
1389 str_pcd_obj_str = StructurePcd()\r
1390 str_pcd_obj_str.copy(self._DecPcds[Pcd])\r
1391 str_pcd_obj = Pcds.get(Pcd, None)\r
1392 if str_pcd_obj:\r
1393 str_pcd_obj_str.copy(str_pcd_obj)\r
77204d60
FB
1394 if str_pcd_obj.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
1395 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
1396 else:\r
1397 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
1398 S_pcd_set[Pcd] = str_pcd_obj_str\r
1399 if S_pcd_set:\r
1400 GlobalData.gStructurePcd[self.Arch] = S_pcd_set\r
8518bf0b 1401 for stru_pcd in S_pcd_set.values():\r
67e63e9a
LG
1402 for skuid in SkuIds:\r
1403 if skuid in stru_pcd.SkuOverrideValues:\r
1404 continue\r
1405 nextskuid = self.SkuIdMgr.GetNextSkuId(skuid)\r
1406 NoDefault = False\r
f3b31433
FB
1407 if skuid not in stru_pcd.SkuOverrideValues:\r
1408 while nextskuid not in stru_pcd.SkuOverrideValues:\r
55c84777 1409 if nextskuid == TAB_DEFAULT:\r
f3b31433
FB
1410 NoDefault = True\r
1411 break\r
1412 nextskuid = self.SkuIdMgr.GetNextSkuId(nextskuid)\r
71127ce8 1413 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 1414 if not NoDefault:\r
ccaa7754 1415 stru_pcd.ValueChain.add((skuid, ''))\r
8518bf0b
LG
1416 if stru_pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
1417 for skuid in SkuIds:\r
1418 nextskuid = skuid\r
2b8a6c44 1419 NoDefault = False\r
8518bf0b
LG
1420 if skuid not in stru_pcd.SkuOverrideValues:\r
1421 while nextskuid not in stru_pcd.SkuOverrideValues:\r
55c84777 1422 if nextskuid == TAB_DEFAULT:\r
2b8a6c44
LG
1423 NoDefault = True\r
1424 break\r
8518bf0b 1425 nextskuid = self.SkuIdMgr.GetNextSkuId(nextskuid)\r
2b8a6c44
LG
1426 if NoDefault:\r
1427 continue\r
c5c7e68a 1428 PcdDefaultStoreSet = set(defaultstorename for defaultstorename in stru_pcd.SkuOverrideValues[nextskuid])\r
8518bf0b 1429 mindefaultstorename = DefaultStoreMgr.GetMin(PcdDefaultStoreSet)\r
2b8a6c44 1430\r
8518bf0b
LG
1431 for defaultstoreid in DefaultStores:\r
1432 if defaultstoreid not in stru_pcd.SkuOverrideValues[skuid]:\r
2b8a6c44 1433 stru_pcd.SkuOverrideValues[skuid][defaultstoreid] = copy.deepcopy(stru_pcd.SkuOverrideValues[nextskuid][mindefaultstorename])\r
ccaa7754 1434 stru_pcd.ValueChain.add((skuid, defaultstoreid))\r
543f5ac3
B
1435 S_pcd_set = DscBuildData.OverrideByFdf(S_pcd_set,self.WorkspaceDir)\r
1436 S_pcd_set = DscBuildData.OverrideByComm(S_pcd_set)\r
ae7b6df8
LG
1437 Str_Pcd_Values = self.GenerateByteArrayValue(S_pcd_set)\r
1438 if Str_Pcd_Values:\r
ccaa7754 1439 for (skuname, StoreName, PcdGuid, PcdName, PcdValue) in Str_Pcd_Values:\r
8518bf0b 1440 str_pcd_obj = S_pcd_set.get((PcdName, PcdGuid))\r
ae7b6df8 1441 if str_pcd_obj is None:\r
72443dd2 1442 print(PcdName, PcdGuid)\r
ae7b6df8
LG
1443 raise\r
1444 if str_pcd_obj.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII],\r
1445 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
8518bf0b
LG
1446 if skuname not in str_pcd_obj.SkuInfoList:\r
1447 str_pcd_obj.SkuInfoList[skuname] = SkuInfoClass(SkuIdName=skuname, SkuId=self.SkuIds[skuname][0], HiiDefaultValue=PcdValue, DefaultStore = {StoreName:PcdValue})\r
ae7b6df8 1448 else:\r
8518bf0b
LG
1449 str_pcd_obj.SkuInfoList[skuname].HiiDefaultValue = PcdValue\r
1450 str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.update({StoreName:PcdValue})\r
ae7b6df8
LG
1451 elif str_pcd_obj.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],\r
1452 self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:\r
55c84777 1453 if skuname in (self.SkuIdMgr.SystemSkuId, TAB_DEFAULT, TAB_COMMON):\r
8518bf0b 1454 str_pcd_obj.DefaultValue = PcdValue\r
ae7b6df8 1455 else:\r
8518bf0b 1456 if skuname not in str_pcd_obj.SkuInfoList:\r
65eff519
LG
1457 nextskuid = self.SkuIdMgr.GetNextSkuId(skuname)\r
1458 NoDefault = False\r
1459 while nextskuid not in str_pcd_obj.SkuInfoList:\r
55c84777 1460 if nextskuid == TAB_DEFAULT:\r
65eff519
LG
1461 NoDefault = True\r
1462 break\r
1463 nextskuid = self.SkuIdMgr.GetNextSkuId(nextskuid)\r
1464 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
1465 str_pcd_obj.SkuInfoList[skuname].SkuId = self.SkuIds[skuname][0]\r
1466 str_pcd_obj.SkuInfoList[skuname].SkuIdName = skuname\r
ae7b6df8 1467 else:\r
8518bf0b
LG
1468 str_pcd_obj.SkuInfoList[skuname].DefaultValue = PcdValue\r
1469 for str_pcd_obj in S_pcd_set.values():\r
1470 if str_pcd_obj.Type not in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII],\r
1471 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
1472 continue\r
c5c7e68a 1473 PcdDefaultStoreSet = set(defaultstorename for skuobj in str_pcd_obj.SkuInfoList.values() for defaultstorename in skuobj.DefaultStoreDict)\r
8518bf0b
LG
1474 DefaultStoreObj = DefaultStore(self._GetDefaultStores())\r
1475 mindefaultstorename = DefaultStoreObj.GetMin(PcdDefaultStoreSet)\r
1476 str_pcd_obj.SkuInfoList[self.SkuIdMgr.SystemSkuId].HiiDefaultValue = str_pcd_obj.SkuInfoList[self.SkuIdMgr.SystemSkuId].DefaultStoreDict[mindefaultstorename]\r
ae7b6df8
LG
1477\r
1478 for str_pcd_obj in S_pcd_set.values():\r
2b8a6c44 1479\r
ae7b6df8
LG
1480 str_pcd_obj.MaxDatumSize = self.GetStructurePcdMaxSize(str_pcd_obj)\r
1481 Pcds[str_pcd_obj.TokenCName, str_pcd_obj.TokenSpaceGuidCName] = str_pcd_obj\r
1482\r
65eff519
LG
1483 for pcdkey in Pcds:\r
1484 pcd = Pcds[pcdkey]\r
55c84777
CJ
1485 if TAB_DEFAULT not in pcd.SkuInfoList and TAB_COMMON in pcd.SkuInfoList:\r
1486 pcd.SkuInfoList[TAB_DEFAULT] = pcd.SkuInfoList[TAB_COMMON]\r
1487 del pcd.SkuInfoList[TAB_COMMON]\r
1488 elif TAB_DEFAULT in pcd.SkuInfoList and TAB_COMMON in pcd.SkuInfoList:\r
1489 del pcd.SkuInfoList[TAB_COMMON]\r
65eff519 1490\r
ccaa7754 1491 map(self.FilterSkuSettings, [Pcds[pcdkey] for pcdkey in Pcds if Pcds[pcdkey].Type in DynamicPcdType])\r
ae7b6df8
LG
1492 return Pcds\r
1493\r
1494 ## Retrieve non-dynamic PCD settings\r
1495 #\r
1496 # @param Type PCD type\r
1497 #\r
1498 # @retval a dict object contains settings of given PCD type\r
1499 #\r
1500 def _GetPcd(self, Type):\r
a0767bae 1501 Pcds = OrderedDict()\r
ae7b6df8
LG
1502 #\r
1503 # tdict is a special dict kind of type, used for selecting correct\r
1504 # PCD settings for certain ARCH\r
1505 #\r
2b8a6c44 1506 AvailableSkuIdSet = copy.copy(self.SkuIds)\r
ae7b6df8
LG
1507\r
1508 PcdDict = tdict(True, 3)\r
1509 PcdSet = set()\r
1510 # Find out all possible PCD candidates for self._Arch\r
1511 RecordList = self._RawData[Type, self._Arch]\r
a0767bae 1512 PcdValueDict = OrderedDict()\r
ccaa7754 1513 for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, Dummy3, Dummy4, Dummy5 in RecordList:\r
2b8a6c44 1514 SkuName = SkuName.upper()\r
55c84777 1515 SkuName = TAB_DEFAULT if SkuName == TAB_COMMON else SkuName\r
2b8a6c44
LG
1516 if SkuName not in AvailableSkuIdSet:\r
1517 EdkLogger.error('build ', PARAMETER_INVALID, 'Sku %s is not defined in [SkuIds] section' % SkuName,\r
1518 File=self.MetaFile, Line=Dummy5)\r
55c84777 1519 if SkuName in (self.SkuIdMgr.SystemSkuId, TAB_DEFAULT, TAB_COMMON):\r
8518bf0b 1520 if "." not in TokenSpaceGuid:\r
5db9414c 1521 PcdSet.add((PcdCName, TokenSpaceGuid, SkuName, Dummy5))\r
ae7b6df8 1522 PcdDict[Arch, PcdCName, TokenSpaceGuid, SkuName] = Setting\r
ae7b6df8
LG
1523\r
1524 for PcdCName, TokenSpaceGuid, SkuName, Dummy4 in PcdSet:\r
1525 Setting = PcdDict[self._Arch, PcdCName, TokenSpaceGuid, SkuName]\r
4231a819 1526 if Setting is None:\r
ae7b6df8
LG
1527 continue\r
1528 PcdValue, DatumType, MaxDatumSize = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4)\r
f843a328
YZ
1529 if MaxDatumSize:\r
1530 if int(MaxDatumSize, 0) > 0xFFFF:\r
1531 EdkLogger.error('build', FORMAT_INVALID, "The size value must not exceed the maximum value of 0xFFFF (UINT16) for %s." % ".".join((TokenSpaceGuid, PcdCName)),\r
1532 File=self.MetaFile, Line=Dummy4)\r
1533 if int(MaxDatumSize, 0) < 0:\r
1534 EdkLogger.error('build', FORMAT_INVALID, "The size value can't be set to negative value for %s." % ".".join((TokenSpaceGuid, PcdCName)),\r
1535 File=self.MetaFile, Line=Dummy4)\r
ae7b6df8
LG
1536 if (PcdCName, TokenSpaceGuid) in PcdValueDict:\r
1537 PcdValueDict[PcdCName, TokenSpaceGuid][SkuName] = (PcdValue, DatumType, MaxDatumSize)\r
1538 else:\r
1539 PcdValueDict[PcdCName, TokenSpaceGuid] = {SkuName:(PcdValue, DatumType, MaxDatumSize)}\r
1540\r
ccaa7754 1541 for ((PcdCName, TokenSpaceGuid), PcdSetting) in PcdValueDict.iteritems():\r
8518bf0b
LG
1542 if self.SkuIdMgr.SystemSkuId in PcdSetting:\r
1543 PcdValue, DatumType, MaxDatumSize = PcdSetting[self.SkuIdMgr.SystemSkuId]\r
a77e5bca
CJ
1544 elif TAB_DEFAULT in PcdSetting:\r
1545 PcdValue, DatumType, MaxDatumSize = PcdSetting[TAB_DEFAULT]\r
1546 elif TAB_COMMON in PcdSetting:\r
1547 PcdValue, DatumType, MaxDatumSize = PcdSetting[TAB_COMMON]\r
1548 else:\r
1549 PcdValue = None\r
1550 DatumType = None\r
1551 MaxDatumSize = None\r
ae7b6df8
LG
1552\r
1553 Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject(\r
1554 PcdCName,\r
1555 TokenSpaceGuid,\r
1556 self._PCD_TYPE_STRING_[Type],\r
1557 DatumType,\r
1558 PcdValue,\r
1559 '',\r
1560 MaxDatumSize,\r
1561 {},\r
1562 False,\r
1563 None,\r
1564 IsDsc=True)\r
1565\r
71127ce8
FB
1566 if self.SkuIdMgr.SystemSkuId not in Pcds[PcdCName, TokenSpaceGuid].DscRawValue:\r
1567 Pcds[PcdCName, TokenSpaceGuid].DscRawValue[self.SkuIdMgr.SystemSkuId] = {}\r
1568 Pcds[PcdCName, TokenSpaceGuid].DscRawValue[self.SkuIdMgr.SystemSkuId][TAB_DEFAULT_STORES_DEFAULT] = PcdValue\r
ae7b6df8
LG
1569 return Pcds\r
1570\r
1571 def GetStructurePcdMaxSize(self, str_pcd):\r
1572 pcd_default_value = str_pcd.DefaultValue\r
1573 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
1574 sku_values.append(pcd_default_value)\r
1575\r
1576 def get_length(value):\r
1577 Value = value.strip()\r
a0939593 1578 if len(value) > 1:\r
91fa33ee 1579 if Value.startswith(TAB_GUID) and Value.endswith(')'):\r
a0939593
LG
1580 return 16\r
1581 if Value.startswith('L"') and Value.endswith('"'):\r
1582 return len(Value[2:-1])\r
1583 if Value[0] == '"' and Value[-1] == '"':\r
1584 return len(Value) - 2\r
1585 if Value[0] == '{' and Value[-1] == '}':\r
1586 return len(Value.split(","))\r
1587 if Value.startswith("L'") and Value.endswith("'") and len(list(Value[2:-1])) > 1:\r
1588 return len(list(Value[2:-1]))\r
1589 if Value[0] == "'" and Value[-1] == "'" and len(list(Value[1:-1])) > 1:\r
1590 return len(Value) - 2\r
ae7b6df8
LG
1591 return len(Value)\r
1592\r
8252e6bf 1593 return str(max(get_length(item) for item in sku_values))\r
ae7b6df8 1594\r
9e508f3a
CJ
1595 @staticmethod\r
1596 def ExecuteCommand (Command):\r
ae7b6df8
LG
1597 try:\r
1598 Process = subprocess.Popen(Command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)\r
1599 except:\r
5db9414c 1600 EdkLogger.error('Build', COMMAND_FAILURE, 'Can not execute command: %s' % Command)\r
ae7b6df8 1601 Result = Process.communicate()\r
5db9414c 1602 return Process.returncode, Result[0], Result[1]\r
ae7b6df8 1603\r
9e508f3a
CJ
1604 @staticmethod\r
1605 def IntToCString(Value, ValueSize):\r
ae7b6df8
LG
1606 Result = '"'\r
1607 if not isinstance (Value, str):\r
1608 for Index in range(0, ValueSize):\r
1609 Result = Result + '\\x%02x' % (Value & 0xff)\r
1610 Value = Value >> 8\r
1611 Result = Result + '"'\r
1612 return Result\r
1613\r
ccaa7754 1614 def GenerateSizeFunction(self, Pcd):\r
79820e32
B
1615 CApp = "// Default Value in Dec \n"\r
1616 CApp = CApp + "void Cal_%s_%s_Size(UINT32 *Size){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
1617 for FieldList in [Pcd.DefaultValues]:\r
1618 if not FieldList:\r
1619 continue\r
1620 for FieldName in FieldList:\r
1621 FieldName = "." + FieldName\r
8565b582 1622 IsArray = IsFieldValueAnArray(FieldList[FieldName.strip(".")][0])\r
79820e32
B
1623 if IsArray and not (FieldList[FieldName.strip(".")][0].startswith('{GUID') and FieldList[FieldName.strip(".")][0].endswith('}')):\r
1624 try:\r
656d2539 1625 Value = ValueExpressionEx(FieldList[FieldName.strip(".")][0], TAB_VOID, self._GuidDict)(True)\r
79820e32
B
1626 except BadExpression:\r
1627 EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
1628 (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName.strip('.'))), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2]))\r
1629 Value, ValueSize = ParseFieldValue(Value)\r
1630 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
1631 else:\r
1632 NewFieldName = ''\r
1633 FieldName_ori = FieldName.strip('.')\r
1634 while '[' in FieldName:\r
1635 NewFieldName = NewFieldName + FieldName.split('[', 1)[0] + '[0]'\r
1636 ArrayIndex = int(FieldName.split('[', 1)[1].split(']', 1)[0])\r
1637 FieldName = FieldName.split(']', 1)[1]\r
1638 FieldName = NewFieldName + FieldName\r
1639 while '[' in FieldName:\r
1640 FieldName = FieldName.rsplit('[', 1)[0]\r
1641 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
1642 for skuname in Pcd.SkuOverrideValues:\r
55c84777 1643 if skuname == TAB_COMMON:\r
79820e32
B
1644 continue\r
1645 for defaultstorenameitem in Pcd.SkuOverrideValues[skuname]:\r
1646 CApp = CApp + "// SkuName: %s, DefaultStoreName: %s \n" % (skuname, defaultstorenameitem)\r
1647 for FieldList in [Pcd.SkuOverrideValues[skuname].get(defaultstorenameitem)]:\r
1648 if not FieldList:\r
1649 continue\r
1650 for FieldName in FieldList:\r
1651 FieldName = "." + FieldName\r
8565b582 1652 IsArray = IsFieldValueAnArray(FieldList[FieldName.strip(".")][0])\r
79820e32
B
1653 if IsArray and not (FieldList[FieldName.strip(".")][0].startswith('{GUID') and FieldList[FieldName.strip(".")][0].endswith('}')):\r
1654 try:\r
656d2539 1655 Value = ValueExpressionEx(FieldList[FieldName.strip(".")][0], TAB_VOID, self._GuidDict)(True)\r
79820e32
B
1656 except BadExpression:\r
1657 EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
1658 (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName.strip('.'))), FieldList[FieldName.strip(".")][1], FieldList[FieldName.strip(".")][2]))\r
1659 Value, ValueSize = ParseFieldValue(Value)\r
1660 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
1661 else:\r
1662 NewFieldName = ''\r
1663 FieldName_ori = FieldName.strip('.')\r
1664 while '[' in FieldName:\r
1665 NewFieldName = NewFieldName + FieldName.split('[', 1)[0] + '[0]'\r
1666 ArrayIndex = int(FieldName.split('[', 1)[1].split(']', 1)[0])\r
1667 FieldName = FieldName.split(']', 1)[1]\r
1668 FieldName = NewFieldName + FieldName\r
1669 while '[' in FieldName:\r
1670 FieldName = FieldName.rsplit('[', 1)[0]\r
1671 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
1672 if Pcd.PcdFieldValueFromFdf:\r
1673 CApp = CApp + "// From fdf \n"\r
1674 for FieldName in Pcd.PcdFieldValueFromFdf:\r
1675 FieldName = "." + FieldName\r
1676 IsArray = IsFieldValueAnArray(Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][0])\r
1677 if IsArray and not (Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][0].startswith('{GUID') and Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][0].endswith('}')):\r
1678 try:\r
1679 Value = ValueExpressionEx(Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][0], TAB_VOID, self._GuidDict)(True)\r
1680 except BadExpression:\r
1681 EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
1682 (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName.strip('.'))), Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][1], Pcd.PcdFieldValueFromFdf[FieldName.strip(".")][2]))\r
1683 Value, ValueSize = ParseFieldValue(Value)\r
1684 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
1685 else:\r
1686 NewFieldName = ''\r
1687 FieldName_ori = FieldName.strip('.')\r
1688 while '[' in FieldName:\r
1689 NewFieldName = NewFieldName + FieldName.split('[', 1)[0] + '[0]'\r
1690 ArrayIndex = int(FieldName.split('[', 1)[1].split(']', 1)[0])\r
1691 FieldName = FieldName.split(']', 1)[1]\r
1692 FieldName = NewFieldName + FieldName\r
1693 while '[' in FieldName:\r
1694 FieldName = FieldName.rsplit('[', 1)[0]\r
1695 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
1696 if Pcd.PcdFieldValueFromComm:\r
1697 CApp = CApp + "// From Command Line \n"\r
1698 for FieldName in Pcd.PcdFieldValueFromComm:\r
1699 FieldName = "." + FieldName\r
8565b582 1700 IsArray = IsFieldValueAnArray(Pcd.PcdFieldValueFromComm[FieldName.strip(".")][0])\r
1667eec6 1701 if IsArray and not (Pcd.PcdFieldValueFromComm[FieldName.strip(".")][0].startswith('{GUID') and Pcd.PcdFieldValueFromComm[FieldName.strip(".")][0].endswith('}')):\r
b854e2bf 1702 try:\r
656d2539 1703 Value = ValueExpressionEx(Pcd.PcdFieldValueFromComm[FieldName.strip(".")][0], TAB_VOID, self._GuidDict)(True)\r
b854e2bf
B
1704 except BadExpression:\r
1705 EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
1667eec6 1706 (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName.strip('.'))), Pcd.PcdFieldValueFromComm[FieldName.strip(".")][1], Pcd.PcdFieldValueFromComm[FieldName.strip(".")][2]))\r
b854e2bf 1707 Value, ValueSize = ParseFieldValue(Value)\r
1667eec6 1708 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
1709 else:\r
1710 NewFieldName = ''\r
1711 FieldName_ori = FieldName.strip('.')\r
1712 while '[' in FieldName:\r
1713 NewFieldName = NewFieldName + FieldName.split('[', 1)[0] + '[0]'\r
1714 ArrayIndex = int(FieldName.split('[', 1)[1].split(']', 1)[0])\r
1715 FieldName = FieldName.split(']', 1)[1]\r
1716 FieldName = NewFieldName + FieldName\r
1717 while '[' in FieldName:\r
1718 FieldName = FieldName.rsplit('[', 1)[0]\r
1667eec6 1719 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 1720 CApp = CApp + " *Size = (%d > *Size ? %d : *Size); // The Pcd maxsize is %d \n" % (Pcd.GetPcdMaxSize(), Pcd.GetPcdMaxSize(), Pcd.GetPcdMaxSize())\r
79820e32
B
1721 CApp = CApp + "}\n"\r
1722 return CApp\r
9e508f3a
CJ
1723\r
1724 @staticmethod\r
1725 def GenerateSizeStatments(Pcd):\r
79820e32
B
1726 CApp = ' Size = sizeof(%s);\n' % (Pcd.DatumType)\r
1727 CApp = CApp + ' Cal_%s_%s_Size(&Size);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
1728 return CApp\r
9e508f3a 1729\r
ccaa7754 1730 def GenerateDefaultValueAssignFunction(self, Pcd):\r
79820e32 1731 CApp = "// Default value in Dec \n"\r
ccaa7754 1732 CApp = CApp + "void Assign_%s_%s_Default_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.DatumType)\r
79820e32
B
1733 CApp = CApp + ' UINT32 FieldSize;\n'\r
1734 CApp = CApp + ' CHAR8 *Value;\n'\r
1735 DefaultValueFromDec = Pcd.DefaultValueFromDec\r
8565b582 1736 IsArray = IsFieldValueAnArray(Pcd.DefaultValueFromDec)\r
79820e32
B
1737 if IsArray:\r
1738 try:\r
656d2539 1739 DefaultValueFromDec = ValueExpressionEx(Pcd.DefaultValueFromDec, TAB_VOID)(True)\r
79820e32
B
1740 except BadExpression:\r
1741 EdkLogger.error("Build", FORMAT_INVALID, "Invalid value format for %s.%s, from DEC: %s" %\r
1742 (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, DefaultValueFromDec))\r
0f228f19 1743 DefaultValueFromDec = StringToArray(DefaultValueFromDec)\r
79820e32
B
1744 Value, ValueSize = ParseFieldValue (DefaultValueFromDec)\r
1745 if isinstance(Value, str):\r
1746 CApp = CApp + ' Pcd = %s; // From DEC Default Value %s\n' % (Value, Pcd.DefaultValueFromDec)\r
1747 elif IsArray:\r
1748 #\r
1749 # Use memcpy() to copy value into field\r
1750 #\r
9e508f3a 1751 CApp = CApp + ' Value = %s; // From DEC Default Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.DefaultValueFromDec)\r
79820e32
B
1752 CApp = CApp + ' memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
1753 for FieldList in [Pcd.DefaultValues]:\r
1754 if not FieldList:\r
1755 continue\r
1756 for FieldName in FieldList:\r
8565b582 1757 IsArray = IsFieldValueAnArray(FieldList[FieldName][0])\r
79820e32
B
1758 if IsArray:\r
1759 try:\r
656d2539 1760 FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], TAB_VOID, self._GuidDict)(True)\r
79820e32
B
1761 except BadExpression:\r
1762 EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
ccaa7754 1763 (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName)), FieldList[FieldName][1], FieldList[FieldName][2]))\r
79820e32
B
1764\r
1765 try:\r
1766 Value, ValueSize = ParseFieldValue (FieldList[FieldName][0])\r
1767 except Exception:\r
ccaa7754 1768 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
1769 if isinstance(Value, str):\r
1770 CApp = CApp + ' Pcd->%s = %s; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
1771 elif IsArray:\r
1772 #\r
1773 # Use memcpy() to copy value into field\r
1774 #\r
1775 CApp = CApp + ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.DatumType, FieldName)\r
9e508f3a 1776 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
1777 CApp = CApp + ' memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)\r
1778 else:\r
1779 if ValueSize > 4:\r
1780 CApp = CApp + ' Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
1781 else:\r
1782 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
1783 CApp = CApp + "}\n"\r
1784 return CApp\r
9e508f3a
CJ
1785\r
1786 @staticmethod\r
1787 def GenerateDefaultValueAssignStatement(Pcd):\r
f3b31433
FB
1788 CApp = ' Assign_%s_%s_Default_Value(Pcd);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
1789 return CApp\r
9e508f3a 1790\r
ccaa7754
GL
1791 def GenerateInitValueFunction(self, Pcd, SkuName, DefaultStoreName):\r
1792 CApp = "// Value in Dsc for Sku: %s, DefaultStore %s\n" % (SkuName, DefaultStoreName)\r
1793 CApp = CApp + "void Assign_%s_%s_%s_%s_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, SkuName, DefaultStoreName, Pcd.DatumType)\r
f3b31433
FB
1794 CApp = CApp + ' UINT32 FieldSize;\n'\r
1795 CApp = CApp + ' CHAR8 *Value;\n'\r
1796\r
55c84777 1797 CApp = CApp + "// SkuName: %s, DefaultStoreName: %s \n" % (TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT)\r
f3b31433 1798 inherit_OverrideValues = Pcd.SkuOverrideValues[SkuName]\r
ccaa7754 1799 if (SkuName, DefaultStoreName) == (TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT):\r
71127ce8 1800 pcddefaultvalue = Pcd.DefaultFromDSC.get(TAB_DEFAULT, {}).get(TAB_DEFAULT_STORES_DEFAULT) if Pcd.DefaultFromDSC else None\r
f3b31433 1801 else:\r
ccaa7754
GL
1802 pcddefaultvalue = Pcd.DscRawValue.get(SkuName, {}).get(DefaultStoreName)\r
1803 for FieldList in [pcddefaultvalue, inherit_OverrideValues.get(DefaultStoreName)]:\r
79820e32
B
1804 if not FieldList:\r
1805 continue\r
1806 if pcddefaultvalue and FieldList == pcddefaultvalue:\r
8565b582 1807 IsArray = IsFieldValueAnArray(FieldList)\r
79820e32
B
1808 if IsArray:\r
1809 try:\r
656d2539 1810 FieldList = ValueExpressionEx(FieldList, TAB_VOID)(True)\r
79820e32
B
1811 except BadExpression:\r
1812 EdkLogger.error("Build", FORMAT_INVALID, "Invalid value format for %s.%s, from DSC: %s" %\r
1813 (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldList))\r
1814 Value, ValueSize = ParseFieldValue (FieldList)\r
f3b31433 1815\r
ccaa7754 1816 if (SkuName, DefaultStoreName) == (TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT):\r
f3b31433 1817 if isinstance(Value, str):\r
ccaa7754 1818 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
1819 elif IsArray:\r
1820 #\r
1821 # Use memcpy() to copy value into field\r
1822 #\r
ccaa7754 1823 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
1824 CApp = CApp + ' memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
1825 else:\r
1826 if isinstance(Value, str):\r
ccaa7754 1827 CApp = CApp + ' Pcd = %s; // From DSC Default Value %s\n' % (Value, Pcd.DscRawValue.get(SkuName, {}).get(DefaultStoreName))\r
f3b31433
FB
1828 elif IsArray:\r
1829 #\r
1830 # Use memcpy() to copy value into field\r
1831 #\r
ccaa7754 1832 CApp = CApp + ' Value = %s; // From DSC Default Value %s\n' % (DscBuildData.IntToCString(Value, ValueSize), Pcd.DscRawValue.get(SkuName, {}).get(DefaultStoreName))\r
f3b31433 1833 CApp = CApp + ' memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
79820e32 1834 continue\r
ccaa7754 1835 if (SkuName, DefaultStoreName) == (TAB_DEFAULT, TAB_DEFAULT_STORES_DEFAULT) or (( (SkuName, '') not in Pcd.ValueChain) and ( (SkuName, DefaultStoreName) not in Pcd.ValueChain )):\r
f3b31433 1836 for FieldName in FieldList:\r
8565b582 1837 IsArray = IsFieldValueAnArray(FieldList[FieldName][0])\r
f3b31433
FB
1838 if IsArray:\r
1839 try:\r
656d2539 1840 FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], TAB_VOID, self._GuidDict)(True)\r
f3b31433
FB
1841 except BadExpression:\r
1842 EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
1843 (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName)), FieldList[FieldName][1], FieldList[FieldName][2]))\r
79820e32 1844 try:\r
f3b31433
FB
1845 Value, ValueSize = ParseFieldValue (FieldList[FieldName][0])\r
1846 except Exception:\r
ccaa7754 1847 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
1848 if isinstance(Value, str):\r
1849 CApp = CApp + ' Pcd->%s = %s; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
1850 elif IsArray:\r
1851 #\r
1852 # Use memcpy() to copy value into field\r
1853 #\r
1854 CApp = CApp + ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.DatumType, FieldName)\r
9e508f3a 1855 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 1856 CApp = CApp + ' memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)\r
79820e32 1857 else:\r
f3b31433
FB
1858 if ValueSize > 4:\r
1859 CApp = CApp + ' Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
1860 else:\r
1861 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
1862 CApp = CApp + "}\n"\r
1863 return CApp\r
9e508f3a
CJ
1864\r
1865 @staticmethod\r
ccaa7754
GL
1866 def GenerateInitValueStatement(Pcd, SkuName, DefaultStoreName):\r
1867 CApp = ' Assign_%s_%s_%s_%s_Value(Pcd);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, SkuName, DefaultStoreName)\r
79820e32 1868 return CApp\r
9e508f3a 1869\r
ccaa7754 1870 def GenerateCommandLineValue(self, Pcd):\r
b854e2bf 1871 CApp = "// Value in CommandLine\n"\r
ccaa7754 1872 CApp = CApp + "void Assign_%s_%s_CommandLine_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.DatumType)\r
b854e2bf
B
1873 CApp = CApp + ' UINT32 FieldSize;\n'\r
1874 CApp = CApp + ' CHAR8 *Value;\n'\r
1875\r
1876 pcddefaultvalue = Pcd.PcdValueFromComm\r
ccaa7754 1877 for FieldList in [pcddefaultvalue, Pcd.PcdFieldValueFromComm]:\r
b854e2bf
B
1878 if not FieldList:\r
1879 continue\r
1880 if pcddefaultvalue and FieldList == pcddefaultvalue:\r
8565b582 1881 IsArray = IsFieldValueAnArray(FieldList)\r
b854e2bf
B
1882 if IsArray:\r
1883 try:\r
656d2539 1884 FieldList = ValueExpressionEx(FieldList, TAB_VOID)(True)\r
b854e2bf 1885 except BadExpression:\r
0f228f19 1886 EdkLogger.error("Build", FORMAT_INVALID, "Invalid value format for %s.%s, from Command: %s" %\r
b854e2bf
B
1887 (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldList))\r
1888 Value, ValueSize = ParseFieldValue (FieldList)\r
1889\r
1890 if isinstance(Value, str):\r
1891 CApp = CApp + ' Pcd = %s; // From Command Line \n' % (Value)\r
1892 elif IsArray:\r
1893 #\r
1894 # Use memcpy() to copy value into field\r
1895 #\r
9e508f3a 1896 CApp = CApp + ' Value = %s; // From Command Line.\n' % (DscBuildData.IntToCString(Value, ValueSize))\r
b854e2bf
B
1897 CApp = CApp + ' memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
1898 continue\r
1899 for FieldName in FieldList:\r
8565b582 1900 IsArray = IsFieldValueAnArray(FieldList[FieldName][0])\r
b854e2bf
B
1901 if IsArray:\r
1902 try:\r
656d2539 1903 FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], TAB_VOID, self._GuidDict)(True)\r
b854e2bf
B
1904 except BadExpression:\r
1905 EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
1906 (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName)), FieldList[FieldName][1], FieldList[FieldName][2]))\r
1907 except:\r
72443dd2 1908 print("error")\r
b854e2bf
B
1909 try:\r
1910 Value, ValueSize = ParseFieldValue (FieldList[FieldName][0])\r
1911 except Exception:\r
ccaa7754 1912 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
1913 if isinstance(Value, str):\r
1914 CApp = CApp + ' Pcd->%s = %s; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
1915 elif IsArray:\r
1916 #\r
1917 # Use memcpy() to copy value into field\r
1918 #\r
1919 CApp = CApp + ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.DatumType, FieldName)\r
9e508f3a 1920 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
1921 CApp = CApp + ' memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)\r
1922 else:\r
1923 if ValueSize > 4:\r
1924 CApp = CApp + ' Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
1925 else:\r
1926 CApp = CApp + ' Pcd->%s = %d; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
1927 CApp = CApp + "}\n"\r
1928 return CApp\r
9e508f3a
CJ
1929\r
1930 @staticmethod\r
1931 def GenerateCommandLineValueStatement(Pcd):\r
b854e2bf
B
1932 CApp = ' Assign_%s_%s_CommandLine_Value(Pcd);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
1933 return CApp\r
543f5ac3
B
1934 def GenerateFdfValue(self,Pcd):\r
1935 CApp = "// Value in Fdf\n"\r
1936 CApp = CApp + "void Assign_%s_%s_Fdf_Value(%s *Pcd){\n" % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName,Pcd.DatumType)\r
1937 CApp = CApp + ' UINT32 FieldSize;\n'\r
1938 CApp = CApp + ' CHAR8 *Value;\n'\r
1939\r
1940 pcddefaultvalue = Pcd.PcdValueFromFdf\r
1941 for FieldList in [pcddefaultvalue,Pcd.PcdFieldValueFromFdf]:\r
1942 if not FieldList:\r
1943 continue\r
1944 if pcddefaultvalue and FieldList == pcddefaultvalue:\r
1945 IsArray = IsFieldValueAnArray(FieldList)\r
1946 if IsArray:\r
1947 try:\r
1948 FieldList = ValueExpressionEx(FieldList, TAB_VOID)(True)\r
1949 except BadExpression:\r
1950 EdkLogger.error("Build", FORMAT_INVALID, "Invalid value format for %s.%s, from Fdf: %s" %\r
1951 (Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldList))\r
1952 Value, ValueSize = ParseFieldValue (FieldList)\r
1953\r
1954 if isinstance(Value, str):\r
1955 CApp = CApp + ' Pcd = %s; // From Fdf \n' % (Value)\r
1956 elif IsArray:\r
1957 #\r
1958 # Use memcpy() to copy value into field\r
1959 #\r
1960 CApp = CApp + ' Value = %s; // From Fdf .\n' % (DscBuildData.IntToCString(Value, ValueSize))\r
1961 CApp = CApp + ' memcpy (Pcd, Value, %d);\n' % (ValueSize)\r
1962 continue\r
1963 for FieldName in FieldList:\r
1964 IsArray = IsFieldValueAnArray(FieldList[FieldName][0])\r
1965 if IsArray:\r
1966 try:\r
1967 FieldList[FieldName][0] = ValueExpressionEx(FieldList[FieldName][0], TAB_VOID, self._GuidDict)(True)\r
1968 except BadExpression:\r
1969 EdkLogger.error('Build', FORMAT_INVALID, "Invalid value format for %s. From %s Line %d " %\r
1970 (".".join((Pcd.TokenSpaceGuidCName, Pcd.TokenCName, FieldName)), FieldList[FieldName][1], FieldList[FieldName][2]))\r
1971 except:\r
1972 print("error")\r
1973 try:\r
1974 Value, ValueSize = ParseFieldValue (FieldList[FieldName][0])\r
1975 except Exception:\r
1976 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
1977 if isinstance(Value, str):\r
1978 CApp = CApp + ' Pcd->%s = %s; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
1979 elif IsArray:\r
1980 #\r
1981 # Use memcpy() to copy value into field\r
1982 #\r
1983 CApp = CApp + ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.DatumType, FieldName)\r
1984 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
1985 CApp = CApp + ' memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)\r
1986 else:\r
1987 if ValueSize > 4:\r
1988 CApp = CApp + ' Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
1989 else:\r
1990 CApp = CApp + ' Pcd->%s = %d; // From %s Line %s Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])\r
1991 CApp = CApp + "}\n"\r
1992 return CApp\r
1993\r
1994 @staticmethod\r
1995 def GenerateFdfValueStatement(Pcd):\r
1996 CApp = ' Assign_%s_%s_Fdf_Value(Pcd);\n' % (Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
1997 return CApp\r
9e508f3a 1998\r
f3b31433
FB
1999 def GenerateInitializeFunc(self, SkuName, DefaultStore, Pcd, InitByteValue, CApp):\r
2000 OverrideValues = {DefaultStore:""}\r
ae7b6df8
LG
2001 if Pcd.SkuOverrideValues:\r
2002 OverrideValues = Pcd.SkuOverrideValues[SkuName]\r
71127ce8
FB
2003 if not OverrideValues:\r
2004 OverrideValues = {TAB_DEFAULT_STORES_DEFAULT:Pcd.DefaultValues}\r
5a693b89 2005 for DefaultStoreName in OverrideValues:\r
8518bf0b
LG
2006 CApp = CApp + 'void\n'\r
2007 CApp = CApp + 'Initialize_%s_%s_%s_%s(\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
2008 CApp = CApp + ' void\n'\r
2009 CApp = CApp + ' )\n'\r
2010 CApp = CApp + '{\n'\r
2011 CApp = CApp + ' UINT32 Size;\n'\r
2012 CApp = CApp + ' UINT32 FieldSize;\n'\r
b2395724 2013 CApp = CApp + ' CHAR8 *Value;\n'\r
8518bf0b
LG
2014 CApp = CApp + ' UINT32 OriginalSize;\n'\r
2015 CApp = CApp + ' VOID *OriginalPcd;\n'\r
6a103440 2016 CApp = CApp + ' %s *Pcd; // From %s Line %d \n' % (Pcd.DatumType, Pcd.PkgPath, Pcd.PcdDefineLineNo)\r
8518bf0b 2017 CApp = CApp + '\n'\r
47854fd5 2018\r
8e011d83 2019 if SkuName in Pcd.SkuInfoList:\r
ccaa7754 2020 DefaultValue = Pcd.SkuInfoList[SkuName].DefaultStoreDict.get(DefaultStoreName, Pcd.SkuInfoList[SkuName].HiiDefaultValue if Pcd.SkuInfoList[SkuName].HiiDefaultValue else Pcd.SkuInfoList[SkuName].DefaultValue)\r
8e011d83
FB
2021 else:\r
2022 DefaultValue = Pcd.DefaultValue\r
2023 PcdDefaultValue = StringToArray(DefaultValue.strip())\r
47854fd5 2024\r
8518bf0b 2025 InitByteValue += '%s.%s.%s.%s|%s|%s\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.DatumType, PcdDefaultValue)\r
ae7b6df8 2026\r
8518bf0b
LG
2027 #\r
2028 # Get current PCD value and size\r
2029 #\r
2030 CApp = CApp + ' OriginalPcd = PcdGetPtr (%s, %s, %s, %s, &OriginalSize);\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
ae7b6df8 2031\r
8518bf0b
LG
2032 #\r
2033 # Determine the size of the PCD. For simple structures, sizeof(TYPE) provides\r
2034 # the correct value. For structures with a flexible array member, the flexible\r
2035 # array member is detected, and the size is based on the highest index used with\r
2036 # the flexible array member. The flexible array member must be the last field\r
2037 # in a structure. The size formula for this case is:\r
2038 # OFFSET_OF(FlexbleArrayField) + sizeof(FlexibleArray[0]) * (HighestIndex + 1)\r
2039 #\r
9e508f3a 2040 CApp = CApp + DscBuildData.GenerateSizeStatments(Pcd)\r
ae7b6df8 2041\r
8518bf0b
LG
2042 #\r
2043 # Allocate and zero buffer for the PCD\r
2044 # Must handle cases where current value is smaller, larger, or same size\r
2045 # Always keep that larger one as the current size\r
2046 #\r
2047 CApp = CApp + ' Size = (OriginalSize > Size ? OriginalSize : Size);\n'\r
2048 CApp = CApp + ' Pcd = (%s *)malloc (Size);\n' % (Pcd.DatumType)\r
2049 CApp = CApp + ' memset (Pcd, 0, Size);\n'\r
ae7b6df8 2050\r
8518bf0b
LG
2051 #\r
2052 # Copy current PCD value into allocated buffer.\r
2053 #\r
2054 CApp = CApp + ' memcpy (Pcd, OriginalPcd, OriginalSize);\n'\r
ae7b6df8 2055\r
8518bf0b
LG
2056 #\r
2057 # Assign field values in PCD\r
2058 #\r
9e508f3a 2059 CApp = CApp + DscBuildData.GenerateDefaultValueAssignStatement(Pcd)\r
f3b31433
FB
2060 if Pcd.Type not in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],\r
2061 self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:\r
2062 for skuname in self.SkuIdMgr.GetSkuChain(SkuName):\r
4d3b9389 2063 storeset = [DefaultStoreName] if DefaultStoreName == TAB_DEFAULT_STORES_DEFAULT else [TAB_DEFAULT_STORES_DEFAULT, DefaultStoreName]\r
f3b31433
FB
2064 for defaultstorenameitem in storeset:\r
2065 CApp = CApp + "// SkuName: %s, DefaultStoreName: %s \n" % (skuname, defaultstorenameitem)\r
ccaa7754 2066 CApp = CApp + DscBuildData.GenerateInitValueStatement(Pcd, skuname, defaultstorenameitem)\r
f3b31433
FB
2067 if skuname == SkuName:\r
2068 break\r
2069 else:\r
f832bb34 2070 CApp = CApp + "// SkuName: %s, DefaultStoreName: STANDARD \n" % self.SkuIdMgr.SystemSkuId\r
ccaa7754 2071 CApp = CApp + DscBuildData.GenerateInitValueStatement(Pcd, self.SkuIdMgr.SystemSkuId, TAB_DEFAULT_STORES_DEFAULT)\r
543f5ac3 2072 CApp = CApp + DscBuildData.GenerateFdfValueStatement(Pcd)\r
9e508f3a 2073 CApp = CApp + DscBuildData.GenerateCommandLineValueStatement(Pcd)\r
8518bf0b
LG
2074 #\r
2075 # Set new PCD value and size\r
2076 #\r
2077 CApp = CApp + ' PcdSetPtr (%s, %s, %s, %s, Size, (UINT8 *)Pcd);\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
ae7b6df8 2078\r
8518bf0b
LG
2079 #\r
2080 # Free PCD\r
2081 #\r
2082 CApp = CApp + ' free (Pcd);\n'\r
2083 CApp = CApp + '}\n'\r
2084 CApp = CApp + '\n'\r
ae7b6df8 2085 return InitByteValue, CApp\r
71127ce8
FB
2086 def SkuOverrideValuesEmpty(self,OverrideValues):\r
2087 if not OverrideValues:\r
2088 return True\r
2089 for key in OverrideValues:\r
2090 if OverrideValues[key]:\r
2091 return False\r
2092 return True\r
ae7b6df8
LG
2093\r
2094 def GenerateByteArrayValue (self, StructuredPcds):\r
2095 #\r
2096 # Generate/Compile/Run C application to determine if there are any flexible array members\r
2097 #\r
2098 if not StructuredPcds:\r
2099 return\r
2100\r
2101 InitByteValue = ""\r
2102 CApp = PcdMainCHeader\r
2103\r
34d808ad 2104 IncludeFiles = set()\r
ae7b6df8
LG
2105 for PcdName in StructuredPcds:\r
2106 Pcd = StructuredPcds[PcdName]\r
81add864 2107 for IncludeFile in Pcd.StructuredPcdIncludeFile:\r
1d5fde83 2108 if IncludeFile not in IncludeFiles:\r
34d808ad 2109 IncludeFiles.add(IncludeFile)\r
81add864 2110 CApp = CApp + '#include <%s>\n' % (IncludeFile)\r
ae7b6df8 2111 CApp = CApp + '\n'\r
ae7b6df8
LG
2112 for PcdName in StructuredPcds:\r
2113 Pcd = StructuredPcds[PcdName]\r
79820e32
B
2114 CApp = CApp + self.GenerateSizeFunction(Pcd)\r
2115 CApp = CApp + self.GenerateDefaultValueAssignFunction(Pcd)\r
543f5ac3 2116 CApp = CApp + self.GenerateFdfValue(Pcd)\r
b854e2bf 2117 CApp = CApp + self.GenerateCommandLineValue(Pcd)\r
71127ce8 2118 if self.SkuOverrideValuesEmpty(Pcd.SkuOverrideValues) or Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],\r
f3b31433 2119 self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:\r
ccaa7754 2120 CApp = CApp + self.GenerateInitValueFunction(Pcd, self.SkuIdMgr.SystemSkuId, TAB_DEFAULT_STORES_DEFAULT)\r
f3b31433
FB
2121 else:\r
2122 for SkuName in self.SkuIdMgr.SkuOverrideOrder():\r
2123 if SkuName not in Pcd.SkuOverrideValues:\r
2124 continue\r
2125 for DefaultStoreName in Pcd.SkuOverrideValues[SkuName]:\r
ccaa7754 2126 CApp = CApp + self.GenerateInitValueFunction(Pcd, SkuName, DefaultStoreName)\r
71127ce8 2127 if self.SkuOverrideValuesEmpty(Pcd.SkuOverrideValues) or Pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],\r
0a57a978 2128 self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:\r
4d3b9389 2129 InitByteValue, CApp = self.GenerateInitializeFunc(self.SkuIdMgr.SystemSkuId, TAB_DEFAULT_STORES_DEFAULT, Pcd, InitByteValue, CApp)\r
ae7b6df8 2130 else:\r
c05c2c05
LG
2131 for SkuName in self.SkuIdMgr.SkuOverrideOrder():\r
2132 if SkuName not in Pcd.SkuOverrideValues:\r
2133 continue\r
ae7b6df8
LG
2134 for DefaultStoreName in Pcd.DefaultStoreName:\r
2135 Pcd = StructuredPcds[PcdName]\r
2136 InitByteValue, CApp = self.GenerateInitializeFunc(SkuName, DefaultStoreName, Pcd, InitByteValue, CApp)\r
2137\r
2138 CApp = CApp + 'VOID\n'\r
2139 CApp = CApp + 'PcdEntryPoint(\n'\r
2140 CApp = CApp + ' VOID\n'\r
2141 CApp = CApp + ' )\n'\r
2142 CApp = CApp + '{\n'\r
2143 for Pcd in StructuredPcds.values():\r
71127ce8 2144 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 2145 CApp = CApp + ' Initialize_%s_%s_%s_%s();\n' % (self.SkuIdMgr.SystemSkuId, TAB_DEFAULT_STORES_DEFAULT, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
ae7b6df8 2146 else:\r
c05c2c05
LG
2147 for SkuName in self.SkuIdMgr.SkuOverrideOrder():\r
2148 if SkuName not in Pcd.SkuOverrideValues:\r
2149 continue\r
8518bf0b 2150 for DefaultStoreName in Pcd.SkuOverrideValues[SkuName]:\r
ae7b6df8
LG
2151 CApp = CApp + ' Initialize_%s_%s_%s_%s();\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)\r
2152 CApp = CApp + '}\n'\r
2153\r
2154 CApp = CApp + PcdMainCEntry + '\n'\r
2155\r
2156 if not os.path.exists(self.OutputPath):\r
2157 os.makedirs(self.OutputPath)\r
2158 CAppBaseFileName = os.path.join(self.OutputPath, PcdValueInitName)\r
0a57a978 2159 SaveFileOnChange(CAppBaseFileName + '.c', CApp, False)\r
ae7b6df8
LG
2160\r
2161 MakeApp = PcdMakefileHeader\r
2162 if sys.platform == "win32":\r
0a57a978 2163 MakeApp = MakeApp + 'APPNAME = %s\n' % (PcdValueInitName) + 'OBJECTS = %s\%s.obj\n' % (self.OutputPath, PcdValueInitName) + 'INC = '\r
ae7b6df8
LG
2164 else:\r
2165 MakeApp = MakeApp + PcdGccMakefile\r
2166 MakeApp = MakeApp + 'APPNAME = %s\n' % (PcdValueInitName) + 'OBJECTS = %s/%s.o\n' % (self.OutputPath, PcdValueInitName) + \\r
68ba919f 2167 'include $(MAKEROOT)/Makefiles/app.makefile\n' + 'INCLUDE +='\r
ae7b6df8 2168\r
34d808ad 2169 IncSearchList = []\r
ae7b6df8
LG
2170 PlatformInc = {}\r
2171 for Cache in self._Bdb._CACHE_.values():\r
2172 if Cache.MetaFile.Ext.lower() != '.dec':\r
2173 continue\r
2174 if Cache.Includes:\r
2175 if str(Cache.MetaFile.Path) not in PlatformInc:\r
b005802a
LG
2176 PlatformInc[str(Cache.MetaFile.Path)] = []\r
2177 PlatformInc[str(Cache.MetaFile.Path)].append (os.path.dirname(Cache.MetaFile.Path))\r
2178 PlatformInc[str(Cache.MetaFile.Path)].extend (Cache.CommonIncludes)\r
ae7b6df8
LG
2179\r
2180 PcdDependDEC = []\r
2181 for Pcd in StructuredPcds.values():\r
2182 for PackageDec in Pcd.PackageDecs:\r
2183 Package = os.path.normpath(mws.join(GlobalData.gWorkspace, PackageDec))\r
2184 if not os.path.exists(Package):\r
2185 EdkLogger.error('Build', RESOURCE_NOT_AVAILABLE, "The dependent Package %s of PCD %s.%s is not exist." % (PackageDec, Pcd.TokenSpaceGuidCName, Pcd.TokenCName))\r
2186 if Package not in PcdDependDEC:\r
2187 PcdDependDEC.append(Package)\r
2188\r
2189 if PlatformInc and PcdDependDEC:\r
2190 for pkg in PcdDependDEC:\r
2191 if pkg in PlatformInc:\r
2192 for inc in PlatformInc[pkg]:\r
2193 MakeApp += '-I' + str(inc) + ' '\r
34d808ad 2194 IncSearchList.append(inc)\r
ae7b6df8 2195 MakeApp = MakeApp + '\n'\r
68ba919f
YZ
2196\r
2197 CC_FLAGS = LinuxCFLAGS\r
2198 if sys.platform == "win32":\r
2199 CC_FLAGS = WindowsCFLAGS\r
2200 BuildOptions = {}\r
2201 for Options in self.BuildOptions:\r
2202 if Options[2] != EDKII_NAME:\r
2203 continue\r
2204 Family = Options[0]\r
2205 if Family and Family != self.ToolChainFamily:\r
2206 continue\r
2207 Target, Tag, Arch, Tool, Attr = Options[1].split("_")\r
2208 if Tool != 'CC':\r
2209 continue\r
2210\r
2211 if Target == "*" or Target == self._Target:\r
2212 if Tag == "*" or Tag == self._Toolchain:\r
2213 if Arch == "*" or Arch == self.Arch:\r
2214 if Tool not in BuildOptions:\r
2215 BuildOptions[Tool] = {}\r
2216 if Attr != "FLAGS" or Attr not in BuildOptions[Tool] or self.BuildOptions[Options].startswith('='):\r
2217 BuildOptions[Tool][Attr] = self.BuildOptions[Options]\r
2218 else:\r
2219 # append options for the same tool except PATH\r
2220 if Attr != 'PATH':\r
2221 BuildOptions[Tool][Attr] += " " + self.BuildOptions[Options]\r
2222 else:\r
2223 BuildOptions[Tool][Attr] = self.BuildOptions[Options]\r
2224 if BuildOptions:\r
2225 for Tool in BuildOptions:\r
2226 for Attr in BuildOptions[Tool]:\r
2227 if Attr == "FLAGS":\r
2228 Value = BuildOptions[Tool][Attr]\r
2229 ValueList = Value.split()\r
2230 if ValueList:\r
2231 for Id, Item in enumerate(ValueList):\r
5d9af6a5 2232 if Item in ['-D', '/D', '-U', '/U']:\r
68ba919f
YZ
2233 CC_FLAGS += ' ' + Item\r
2234 if Id + 1 < len(ValueList):\r
2235 CC_FLAGS += ' ' + ValueList[Id + 1]\r
5d9af6a5 2236 elif Item.startswith(('-D', '/D', '-U', '/U')):\r
68ba919f
YZ
2237 CC_FLAGS += ' ' + Item\r
2238 MakeApp += CC_FLAGS\r
2239\r
ae7b6df8
LG
2240 if sys.platform == "win32":\r
2241 MakeApp = MakeApp + PcdMakefileEnd\r
34d808ad
B
2242 MakeApp = MakeApp + '\n'\r
2243 IncludeFileFullPaths = []\r
2244 for includefile in IncludeFiles:\r
2245 for includepath in IncSearchList:\r
ccaa7754 2246 includefullpath = os.path.join(str(includepath), includefile)\r
34d808ad
B
2247 if os.path.exists(includefullpath):\r
2248 IncludeFileFullPaths.append(os.path.normpath(includefullpath))\r
2249 break\r
2250 SearchPathList = []\r
2251 SearchPathList.append(os.path.normpath(mws.join(GlobalData.gWorkspace, "BaseTools/Source/C/Include")))\r
2252 SearchPathList.append(os.path.normpath(mws.join(GlobalData.gWorkspace, "BaseTools/Source/C/Common")))\r
8252e6bf 2253 SearchPathList.extend(str(item) for item in IncSearchList)\r
ccaa7754 2254 IncFileList = GetDependencyList(IncludeFileFullPaths, SearchPathList)\r
34d808ad
B
2255 for include_file in IncFileList:\r
2256 MakeApp += "$(OBJECTS) : %s\n" % include_file\r
ae7b6df8 2257 MakeFileName = os.path.join(self.OutputPath, 'Makefile')\r
34d808ad 2258 MakeApp += "$(OBJECTS) : %s\n" % MakeFileName\r
0a57a978 2259 SaveFileOnChange(MakeFileName, MakeApp, False)\r
ae7b6df8
LG
2260\r
2261 InputValueFile = os.path.join(self.OutputPath, 'Input.txt')\r
2262 OutputValueFile = os.path.join(self.OutputPath, 'Output.txt')\r
0a57a978 2263 SaveFileOnChange(InputValueFile, InitByteValue, False)\r
ae7b6df8
LG
2264\r
2265 PcdValueInitExe = PcdValueInitName\r
2266 if not sys.platform == "win32":\r
2267 PcdValueInitExe = os.path.join(os.getenv("EDK_TOOLS_PATH"), 'Source', 'C', 'bin', PcdValueInitName)\r
5db9414c 2268 else:\r
0a57a978 2269 PcdValueInitExe = os.path.join(os.getenv("EDK_TOOLS_PATH"), 'Bin', 'Win32', PcdValueInitName) +".exe"\r
34d808ad
B
2270\r
2271 Messages = ''\r
2272 if sys.platform == "win32":\r
2273 MakeCommand = 'nmake -f %s' % (MakeFileName)\r
9e508f3a 2274 returncode, StdOut, StdErr = DscBuildData.ExecuteCommand (MakeCommand)\r
34d808ad
B
2275 Messages = StdOut\r
2276 else:\r
2277 MakeCommand = 'make -f %s' % (MakeFileName)\r
9e508f3a 2278 returncode, StdOut, StdErr = DscBuildData.ExecuteCommand (MakeCommand)\r
34d808ad
B
2279 Messages = StdErr\r
2280 Messages = Messages.split('\n')\r
2281 MessageGroup = []\r
9fb2cbda 2282 if returncode != 0:\r
34d808ad
B
2283 CAppBaseFileName = os.path.join(self.OutputPath, PcdValueInitName)\r
2284 File = open (CAppBaseFileName + '.c', 'r')\r
2285 FileData = File.readlines()\r
2286 File.close()\r
2287 for Message in Messages:\r
2288 if " error" in Message or "warning" in Message:\r
2289 FileInfo = Message.strip().split('(')\r
2290 if len (FileInfo) > 1:\r
2291 FileName = FileInfo [0]\r
2292 FileLine = FileInfo [1].split (')')[0]\r
2293 else:\r
2294 FileInfo = Message.strip().split(':')\r
2295 FileName = FileInfo [0]\r
2296 FileLine = FileInfo [1]\r
2297 if FileLine.isdigit():\r
2298 error_line = FileData[int (FileLine) - 1]\r
2299 if r"//" in error_line:\r
ccaa7754 2300 c_line, dsc_line = error_line.split(r"//")\r
0a57a978 2301 else:\r
34d808ad
B
2302 dsc_line = error_line\r
2303 message_itmes = Message.split(":")\r
2304 Index = 0\r
2305 if "PcdValueInit.c" not in Message:\r
2306 if not MessageGroup:\r
2307 MessageGroup.append(Message)\r
2308 break\r
0a57a978 2309 else:\r
34d808ad
B
2310 for item in message_itmes:\r
2311 if "PcdValueInit.c" in item:\r
2312 Index = message_itmes.index(item)\r
2313 message_itmes[Index] = dsc_line.strip()\r
2314 break\r
2315 MessageGroup.append(":".join(message_itmes[Index:]).strip())\r
2316 continue\r
2317 else:\r
2318 MessageGroup.append(Message)\r
2319 if MessageGroup:\r
2320 EdkLogger.error("build", PCD_STRUCTURE_PCD_ERROR, "\n".join(MessageGroup) )\r
2321 else:\r
2322 EdkLogger.error('Build', COMMAND_FAILURE, 'Can not execute command: %s' % MakeCommand)\r
2323\r
ccaa7754 2324 if DscBuildData.NeedUpdateOutput(OutputValueFile, PcdValueInitExe, InputValueFile):\r
0a57a978 2325 Command = PcdValueInitExe + ' -i %s -o %s' % (InputValueFile, OutputValueFile)\r
9e508f3a 2326 returncode, StdOut, StdErr = DscBuildData.ExecuteCommand (Command)\r
87d2afd0 2327 if returncode != 0:\r
0a57a978
FB
2328 EdkLogger.warn('Build', COMMAND_FAILURE, 'Can not collect output from command: %s' % Command)\r
2329\r
2330 File = open (OutputValueFile, 'r')\r
2331 FileBuffer = File.readlines()\r
2332 File.close()\r
ae7b6df8
LG
2333\r
2334 StructurePcdSet = []\r
2335 for Pcd in FileBuffer:\r
2336 PcdValue = Pcd.split ('|')\r
2337 PcdInfo = PcdValue[0].split ('.')\r
ccaa7754 2338 StructurePcdSet.append((PcdInfo[0], PcdInfo[1], PcdInfo[2], PcdInfo[3], PcdValue[2].strip()))\r
ae7b6df8
LG
2339 return StructurePcdSet\r
2340\r
9e508f3a
CJ
2341 @staticmethod\r
2342 def NeedUpdateOutput(OutputFile, ValueCFile, StructureInput):\r
0a57a978
FB
2343 if not os.path.exists(OutputFile):\r
2344 return True\r
2345 if os.stat(OutputFile).st_mtime <= os.stat(ValueCFile).st_mtime:\r
2346 return True\r
0a57a978
FB
2347 if os.stat(OutputFile).st_mtime <= os.stat(StructureInput).st_mtime:\r
2348 return True\r
2349 return False\r
2350\r
ae7b6df8
LG
2351 ## Retrieve dynamic PCD settings\r
2352 #\r
2353 # @param Type PCD type\r
2354 #\r
2355 # @retval a dict object contains settings of given PCD type\r
2356 #\r
2357 def _GetDynamicPcd(self, Type):\r
2358\r
ae7b6df8 2359\r
a0767bae 2360 Pcds = OrderedDict()\r
ae7b6df8
LG
2361 #\r
2362 # tdict is a special dict kind of type, used for selecting correct\r
2363 # PCD settings for certain ARCH and SKU\r
2364 #\r
2365 PcdDict = tdict(True, 4)\r
2366 PcdList = []\r
2367 # Find out all possible PCD candidates for self._Arch\r
2368 RecordList = self._RawData[Type, self._Arch]\r
8518bf0b 2369 AvailableSkuIdSet = copy.copy(self.SkuIds)\r
ae7b6df8 2370\r
ae7b6df8 2371\r
ccaa7754 2372 for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, Dummy3, Dummy4, Dummy5 in RecordList:\r
2b8a6c44 2373 SkuName = SkuName.upper()\r
55c84777 2374 SkuName = TAB_DEFAULT if SkuName == TAB_COMMON else SkuName\r
ae7b6df8 2375 if SkuName not in AvailableSkuIdSet:\r
2b8a6c44
LG
2376 EdkLogger.error('build', PARAMETER_INVALID, 'Sku %s is not defined in [SkuIds] section' % SkuName,\r
2377 File=self.MetaFile, Line=Dummy5)\r
ae7b6df8 2378 if "." not in TokenSpaceGuid:\r
5db9414c 2379 PcdList.append((PcdCName, TokenSpaceGuid, SkuName, Dummy5))\r
ae7b6df8
LG
2380 PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid] = Setting\r
2381\r
2382 # Remove redundant PCD candidates, per the ARCH and SKU\r
2383 for PcdCName, TokenSpaceGuid, SkuName, Dummy4 in PcdList:\r
2384\r
2385 Setting = PcdDict[self._Arch, SkuName, PcdCName, TokenSpaceGuid]\r
4231a819 2386 if Setting is None:\r
ae7b6df8
LG
2387 continue\r
2388\r
2389 PcdValue, DatumType, MaxDatumSize = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4)\r
f843a328
YZ
2390 if MaxDatumSize:\r
2391 if int(MaxDatumSize, 0) > 0xFFFF:\r
2392 EdkLogger.error('build', FORMAT_INVALID, "The size value must not exceed the maximum value of 0xFFFF (UINT16) for %s." % ".".join((TokenSpaceGuid, PcdCName)),\r
2393 File=self.MetaFile, Line=Dummy4)\r
2394 if int(MaxDatumSize, 0) < 0:\r
2395 EdkLogger.error('build', FORMAT_INVALID, "The size value can't be set to negative value for %s." % ".".join((TokenSpaceGuid, PcdCName)),\r
2396 File=self.MetaFile, Line=Dummy4)\r
8518bf0b 2397 SkuInfo = SkuInfoClass(SkuName, self.SkuIds[SkuName][0], '', '', '', '', '', PcdValue)\r
5a693b89 2398 if (PcdCName, TokenSpaceGuid) in Pcds:\r
ae7b6df8
LG
2399 pcdObject = Pcds[PcdCName, TokenSpaceGuid]\r
2400 pcdObject.SkuInfoList[SkuName] = SkuInfo\r
2401 if MaxDatumSize.strip():\r
2402 CurrentMaxSize = int(MaxDatumSize.strip(), 0)\r
2403 else:\r
2404 CurrentMaxSize = 0\r
2405 if pcdObject.MaxDatumSize:\r
2406 PcdMaxSize = int(pcdObject.MaxDatumSize, 0)\r
2407 else:\r
2408 PcdMaxSize = 0\r
2409 if CurrentMaxSize > PcdMaxSize:\r
2410 pcdObject.MaxDatumSize = str(CurrentMaxSize)\r
2411 else:\r
2412 Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject(\r
2413 PcdCName,\r
2414 TokenSpaceGuid,\r
2415 self._PCD_TYPE_STRING_[Type],\r
2416 DatumType,\r
2417 PcdValue,\r
2418 '',\r
2419 MaxDatumSize,\r
2420 {SkuName : SkuInfo},\r
2421 False,\r
2422 None,\r
2423 IsDsc=True)\r
2424\r
71127ce8
FB
2425 if SkuName not in Pcds[PcdCName, TokenSpaceGuid].DscRawValue:\r
2426 Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName] = {}\r
2427 Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName][TAB_DEFAULT_STORES_DEFAULT] = PcdValue\r
2428\r
ae7b6df8
LG
2429 for pcd in Pcds.values():\r
2430 pcdDecObject = self._DecPcds[pcd.TokenCName, pcd.TokenSpaceGuidCName]\r
e651d06c
LG
2431 # Only fix the value while no value provided in DSC file.\r
2432 for sku in pcd.SkuInfoList.values():\r
128d435f 2433 if not sku.DefaultValue:\r
e651d06c 2434 sku.DefaultValue = pcdDecObject.DefaultValue\r
55c84777 2435 if TAB_DEFAULT not in pcd.SkuInfoList and TAB_COMMON not in pcd.SkuInfoList:\r
ae7b6df8 2436 valuefromDec = pcdDecObject.DefaultValue\r
55c84777
CJ
2437 SkuInfo = SkuInfoClass(TAB_DEFAULT, '0', '', '', '', '', '', valuefromDec)\r
2438 pcd.SkuInfoList[TAB_DEFAULT] = SkuInfo\r
2439 elif TAB_DEFAULT not in pcd.SkuInfoList and TAB_COMMON in pcd.SkuInfoList:\r
2440 pcd.SkuInfoList[TAB_DEFAULT] = pcd.SkuInfoList[TAB_COMMON]\r
2441 del pcd.SkuInfoList[TAB_COMMON]\r
2442 elif TAB_DEFAULT in pcd.SkuInfoList and TAB_COMMON in pcd.SkuInfoList:\r
2443 del pcd.SkuInfoList[TAB_COMMON]\r
65eff519 2444\r
ccaa7754 2445 map(self.FilterSkuSettings, Pcds.values())\r
ae7b6df8
LG
2446\r
2447 return Pcds\r
2448\r
65eff519
LG
2449 def FilterSkuSettings(self, PcdObj):\r
2450\r
2451 if self.SkuIdMgr.SkuUsageType == self.SkuIdMgr.SINGLE:\r
55c84777
CJ
2452 if TAB_DEFAULT in PcdObj.SkuInfoList and self.SkuIdMgr.SystemSkuId not in PcdObj.SkuInfoList:\r
2453 PcdObj.SkuInfoList[self.SkuIdMgr.SystemSkuId] = PcdObj.SkuInfoList[TAB_DEFAULT]\r
2454 PcdObj.SkuInfoList = {TAB_DEFAULT:PcdObj.SkuInfoList[self.SkuIdMgr.SystemSkuId]}\r
2455 PcdObj.SkuInfoList[TAB_DEFAULT].SkuIdName = TAB_DEFAULT\r
2456 PcdObj.SkuInfoList[TAB_DEFAULT].SkuId = '0'\r
65eff519
LG
2457\r
2458 elif self.SkuIdMgr.SkuUsageType == self.SkuIdMgr.DEFAULT:\r
55c84777 2459 PcdObj.SkuInfoList = {TAB_DEFAULT:PcdObj.SkuInfoList[TAB_DEFAULT]}\r
65eff519
LG
2460\r
2461 return PcdObj\r
2462\r
9e508f3a
CJ
2463 @staticmethod\r
2464 def CompareVarAttr(Attr1, Attr2):\r
ae7b6df8
LG
2465 if not Attr1 or not Attr2: # for empty string\r
2466 return True\r
2467 Attr1s = [attr.strip() for attr in Attr1.split(",")]\r
2468 Attr1Set = set(Attr1s)\r
2469 Attr2s = [attr.strip() for attr in Attr2.split(",")]\r
2470 Attr2Set = set(Attr2s)\r
2471 if Attr2Set == Attr1Set:\r
2472 return True\r
2473 else:\r
2474 return False\r
9e508f3a 2475\r
ccaa7754 2476 def CompletePcdValues(self, PcdSet):\r
8518bf0b
LG
2477 Pcds = {}\r
2478 DefaultStoreObj = DefaultStore(self._GetDefaultStores())\r
ccaa7754 2479 SkuIds = {skuname:skuid for skuname, skuid in self.SkuIdMgr.AvailableSkuIdSet.items() if skuname != TAB_COMMON}\r
c5c7e68a 2480 DefaultStores = set(storename for pcdobj in PcdSet.values() for skuobj in pcdobj.SkuInfoList.values() for storename in skuobj.DefaultStoreDict)\r
8518bf0b
LG
2481 for PcdCName, TokenSpaceGuid in PcdSet:\r
2482 PcdObj = PcdSet[(PcdCName, TokenSpaceGuid)]\r
71127ce8 2483\r
8518bf0b
LG
2484 if PcdObj.Type not in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_DEFAULT],\r
2485 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII],\r
2486 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_VPD],\r
2487 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_DEFAULT],\r
2488 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII],\r
2489 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_VPD]]:\r
2490 Pcds[PcdCName, TokenSpaceGuid]= PcdObj\r
2491 continue\r
2492 PcdType = PcdObj.Type\r
2493 if PcdType in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
2494 for skuid in PcdObj.SkuInfoList:\r
2495 skuobj = PcdObj.SkuInfoList[skuid]\r
8252e6bf 2496 mindefaultstorename = DefaultStoreObj.GetMin(set(defaultstorename for defaultstorename in skuobj.DefaultStoreDict))\r
8518bf0b
LG
2497 for defaultstorename in DefaultStores:\r
2498 if defaultstorename not in skuobj.DefaultStoreDict:\r
2b8a6c44 2499 skuobj.DefaultStoreDict[defaultstorename] = copy.deepcopy(skuobj.DefaultStoreDict[mindefaultstorename])\r
8518bf0b 2500 skuobj.HiiDefaultValue = skuobj.DefaultStoreDict[mindefaultstorename]\r
ccaa7754 2501 for skuname, skuid in SkuIds.items():\r
2b8a6c44
LG
2502 if skuname not in PcdObj.SkuInfoList:\r
2503 nextskuid = self.SkuIdMgr.GetNextSkuId(skuname)\r
8518bf0b
LG
2504 while nextskuid not in PcdObj.SkuInfoList:\r
2505 nextskuid = self.SkuIdMgr.GetNextSkuId(nextskuid)\r
2b8a6c44
LG
2506 PcdObj.SkuInfoList[skuname] = copy.deepcopy(PcdObj.SkuInfoList[nextskuid])\r
2507 PcdObj.SkuInfoList[skuname].SkuId = skuid\r
2508 PcdObj.SkuInfoList[skuname].SkuIdName = skuname\r
8518bf0b 2509 if PcdType in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:\r
55c84777 2510 PcdObj.DefaultValue = PcdObj.SkuInfoList.values()[0].HiiDefaultValue if self.SkuIdMgr.SkuUsageType == self.SkuIdMgr.SINGLE else PcdObj.SkuInfoList[TAB_DEFAULT].HiiDefaultValue\r
8518bf0b
LG
2511 Pcds[PcdCName, TokenSpaceGuid]= PcdObj\r
2512 return Pcds\r
ae7b6df8
LG
2513 ## Retrieve dynamic HII PCD settings\r
2514 #\r
2515 # @param Type PCD type\r
2516 #\r
2517 # @retval a dict object contains settings of given PCD type\r
2518 #\r
2519 def _GetDynamicHiiPcd(self, Type):\r
2520\r
ae7b6df8
LG
2521 VariableAttrs = {}\r
2522\r
a0767bae 2523 Pcds = OrderedDict()\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
ae7b6df8 2541 if SkuName not in AvailableSkuIdSet:\r
2b8a6c44
LG
2542 EdkLogger.error('build', PARAMETER_INVALID, 'Sku %s is not defined in [SkuIds] section' % SkuName,\r
2543 File=self.MetaFile, Line=Dummy5)\r
2544 if DefaultStore not in DefaultStoresDefine:\r
2545 EdkLogger.error('build', PARAMETER_INVALID, 'DefaultStores %s is not defined in [DefaultStores] section' % DefaultStore,\r
2546 File=self.MetaFile, Line=Dummy5)\r
ae7b6df8 2547 if "." not in TokenSpaceGuid:\r
ccaa7754
GL
2548 PcdSet.add((PcdCName, TokenSpaceGuid, SkuName, DefaultStore, Dummy5))\r
2549 PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid, DefaultStore] = Setting\r
ae7b6df8
LG
2550\r
2551\r
2552 # Remove redundant PCD candidates, per the ARCH and SKU\r
ccaa7754 2553 for PcdCName, TokenSpaceGuid, SkuName, DefaultStore, Dummy4 in PcdSet:\r
ae7b6df8 2554\r
ccaa7754 2555 Setting = PcdDict[self._Arch, SkuName, PcdCName, TokenSpaceGuid, DefaultStore]\r
4231a819 2556 if Setting is None:\r
ae7b6df8
LG
2557 continue\r
2558 VariableName, VariableGuid, VariableOffset, DefaultValue, VarAttribute = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4)\r
2559\r
2560 rt, Msg = VariableAttributes.ValidateVarAttributes(VarAttribute)\r
2561 if not rt:\r
2562 EdkLogger.error("build", PCD_VARIABLE_ATTRIBUTES_ERROR, "Variable attributes settings for %s is incorrect.\n %s" % (".".join((TokenSpaceGuid, PcdCName)), Msg),\r
2563 ExtraData="[%s]" % VarAttribute)\r
2564 ExceedMax = False\r
2565 FormatCorrect = True\r
2566 if VariableOffset.isdigit():\r
2567 if int(VariableOffset, 10) > 0xFFFF:\r
2568 ExceedMax = True\r
3e4faa26 2569 elif variablePattern.match(VariableOffset):\r
ae7b6df8
LG
2570 if int(VariableOffset, 16) > 0xFFFF:\r
2571 ExceedMax = True\r
2572 # For Offset written in "A.B"\r
2573 elif VariableOffset.find('.') > -1:\r
2574 VariableOffsetList = VariableOffset.split(".")\r
2575 if not (len(VariableOffsetList) == 2\r
2576 and IsValidWord(VariableOffsetList[0])\r
2577 and IsValidWord(VariableOffsetList[1])):\r
2578 FormatCorrect = False\r
2579 else:\r
2580 FormatCorrect = False\r
2581 if not FormatCorrect:\r
2582 EdkLogger.error('Build', FORMAT_INVALID, "Invalid syntax or format of the variable offset value is incorrect for %s." % ".".join((TokenSpaceGuid, PcdCName)))\r
2583\r
2584 if ExceedMax:\r
2585 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
2586 if (VariableName, VariableGuid) not in VariableAttrs:\r
2587 VariableAttrs[(VariableName, VariableGuid)] = VarAttribute\r
2588 else:\r
9e508f3a 2589 if not DscBuildData.CompareVarAttr(VariableAttrs[(VariableName, VariableGuid)], VarAttribute):\r
ae7b6df8
LG
2590 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
2591\r
ae7b6df8 2592 pcdDecObject = self._DecPcds[PcdCName, TokenSpaceGuid]\r
5a693b89 2593 if (PcdCName, TokenSpaceGuid) in Pcds:\r
ae7b6df8 2594 pcdObject = Pcds[PcdCName, TokenSpaceGuid]\r
8518bf0b
LG
2595 if SkuName in pcdObject.SkuInfoList:\r
2596 Skuitem = pcdObject.SkuInfoList[SkuName]\r
2597 Skuitem.DefaultStoreDict.update({DefaultStore:DefaultValue})\r
2598 else:\r
ccaa7754 2599 SkuInfo = SkuInfoClass(SkuName, self.SkuIds[SkuName][0], VariableName, VariableGuid, VariableOffset, DefaultValue, VariableAttribute=VarAttribute, DefaultStore={DefaultStore:DefaultValue})\r
8518bf0b 2600 pcdObject.SkuInfoList[SkuName] = SkuInfo\r
ae7b6df8 2601 else:\r
ccaa7754 2602 SkuInfo = SkuInfoClass(SkuName, self.SkuIds[SkuName][0], VariableName, VariableGuid, VariableOffset, DefaultValue, VariableAttribute=VarAttribute, DefaultStore={DefaultStore:DefaultValue})\r
ae7b6df8
LG
2603 Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject(\r
2604 PcdCName,\r
2605 TokenSpaceGuid,\r
2606 self._PCD_TYPE_STRING_[Type],\r
2607 '',\r
2608 DefaultValue,\r
2609 '',\r
2610 '',\r
2611 {SkuName : SkuInfo},\r
2612 False,\r
2613 None,\r
2614 pcdDecObject.validateranges,\r
2615 pcdDecObject.validlists,\r
2616 pcdDecObject.expressions,\r
2617 IsDsc=True)\r
2618\r
71127ce8
FB
2619 if SkuName not in Pcds[PcdCName, TokenSpaceGuid].DscRawValue:\r
2620 Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName] = {}\r
2621 Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName][DefaultStore] = DefaultValue\r
ae7b6df8
LG
2622 for pcd in Pcds.values():\r
2623 SkuInfoObj = pcd.SkuInfoList.values()[0]\r
2624 pcdDecObject = self._DecPcds[pcd.TokenCName, pcd.TokenSpaceGuidCName]\r
e1511113 2625 pcd.DatumType = pcdDecObject.DatumType\r
ae7b6df8
LG
2626 # Only fix the value while no value provided in DSC file.\r
2627 for sku in pcd.SkuInfoList.values():\r
4231a819 2628 if (sku.HiiDefaultValue == "" or sku.HiiDefaultValue is None):\r
ae7b6df8 2629 sku.HiiDefaultValue = pcdDecObject.DefaultValue\r
e1511113
B
2630 for default_store in sku.DefaultStoreDict:\r
2631 sku.DefaultStoreDict[default_store]=pcdDecObject.DefaultValue\r
2632 pcd.DefaultValue = pcdDecObject.DefaultValue\r
55c84777 2633 if TAB_DEFAULT not in pcd.SkuInfoList and TAB_COMMON not in pcd.SkuInfoList:\r
ae7b6df8 2634 valuefromDec = pcdDecObject.DefaultValue\r
ccaa7754 2635 SkuInfo = SkuInfoClass(TAB_DEFAULT, '0', SkuInfoObj.VariableName, SkuInfoObj.VariableGuid, SkuInfoObj.VariableOffset, valuefromDec, VariableAttribute=SkuInfoObj.VariableAttribute, DefaultStore={DefaultStore:valuefromDec})\r
55c84777
CJ
2636 pcd.SkuInfoList[TAB_DEFAULT] = SkuInfo\r
2637 elif TAB_DEFAULT not in pcd.SkuInfoList and TAB_COMMON in pcd.SkuInfoList:\r
2638 pcd.SkuInfoList[TAB_DEFAULT] = pcd.SkuInfoList[TAB_COMMON]\r
2639 del pcd.SkuInfoList[TAB_COMMON]\r
2640 elif TAB_DEFAULT in pcd.SkuInfoList and TAB_COMMON in pcd.SkuInfoList:\r
2641 del pcd.SkuInfoList[TAB_COMMON]\r
ae7b6df8 2642\r
ae7b6df8
LG
2643 if pcd.MaxDatumSize.strip():\r
2644 MaxSize = int(pcd.MaxDatumSize, 0)\r
2645 else:\r
2646 MaxSize = 0\r
656d2539 2647 if pcd.DatumType not in TAB_PCD_NUMERIC_TYPES:\r
2b8a6c44 2648 for (_, skuobj) in pcd.SkuInfoList.items():\r
ae7b6df8 2649 datalen = 0\r
47854fd5
LG
2650 skuobj.HiiDefaultValue = StringToArray(skuobj.HiiDefaultValue)\r
2651 datalen = len(skuobj.HiiDefaultValue.split(","))\r
ae7b6df8
LG
2652 if datalen > MaxSize:\r
2653 MaxSize = datalen\r
47854fd5
LG
2654 for defaultst in skuobj.DefaultStoreDict:\r
2655 skuobj.DefaultStoreDict[defaultst] = StringToArray(skuobj.DefaultStoreDict[defaultst])\r
2656 pcd.DefaultValue = StringToArray(pcd.DefaultValue)\r
ae7b6df8 2657 pcd.MaxDatumSize = str(MaxSize)\r
9e508f3a 2658 rt, invalidhii = DscBuildData.CheckVariableNameAssignment(Pcds)\r
2b8a6c44
LG
2659 if not rt:\r
2660 invalidpcd = ",".join(invalidhii)\r
2661 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 2662\r
ccaa7754 2663 map(self.FilterSkuSettings, Pcds.values())\r
65eff519 2664\r
ae7b6df8
LG
2665 return Pcds\r
2666\r
9e508f3a
CJ
2667 @staticmethod\r
2668 def CheckVariableNameAssignment(Pcds):\r
2b8a6c44
LG
2669 invalidhii = []\r
2670 for pcdname in Pcds:\r
2671 pcd = Pcds[pcdname]\r
ccaa7754 2672 varnameset = set(sku.VariableName for (skuid, sku) in pcd.SkuInfoList.items())\r
2b8a6c44 2673 if len(varnameset) > 1:\r
ccaa7754 2674 invalidhii.append(".".join((pcdname[1], pcdname[0])))\r
2b8a6c44 2675 if len(invalidhii):\r
ccaa7754 2676 return False, invalidhii\r
2b8a6c44
LG
2677 else:\r
2678 return True, []\r
ae7b6df8
LG
2679 ## Retrieve dynamic VPD PCD settings\r
2680 #\r
2681 # @param Type PCD type\r
2682 #\r
2683 # @retval a dict object contains settings of given PCD type\r
2684 #\r
2685 def _GetDynamicVpdPcd(self, Type):\r
2686\r
ae7b6df8 2687\r
a0767bae 2688 Pcds = OrderedDict()\r
ae7b6df8
LG
2689 #\r
2690 # tdict is a special dict kind of type, used for selecting correct\r
2691 # PCD settings for certain ARCH and SKU\r
2692 #\r
2693 PcdDict = tdict(True, 4)\r
2694 PcdList = []\r
2695\r
2696 # Find out all possible PCD candidates for self._Arch\r
2697 RecordList = self._RawData[Type, self._Arch]\r
8518bf0b 2698 AvailableSkuIdSet = copy.copy(self.SkuIds)\r
ae7b6df8 2699\r
ccaa7754 2700 for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, Dummy3, Dummy4, Dummy5 in RecordList:\r
2b8a6c44 2701 SkuName = SkuName.upper()\r
55c84777 2702 SkuName = TAB_DEFAULT if SkuName == TAB_COMMON else SkuName\r
ae7b6df8 2703 if SkuName not in AvailableSkuIdSet:\r
2b8a6c44
LG
2704 EdkLogger.error('build', PARAMETER_INVALID, 'Sku %s is not defined in [SkuIds] section' % SkuName,\r
2705 File=self.MetaFile, Line=Dummy5)\r
ae7b6df8 2706 if "." not in TokenSpaceGuid:\r
5db9414c 2707 PcdList.append((PcdCName, TokenSpaceGuid, SkuName, Dummy5))\r
ae7b6df8
LG
2708 PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid] = Setting\r
2709\r
2710 # Remove redundant PCD candidates, per the ARCH and SKU\r
2711 for PcdCName, TokenSpaceGuid, SkuName, Dummy4 in PcdList:\r
2712 Setting = PcdDict[self._Arch, SkuName, PcdCName, TokenSpaceGuid]\r
4231a819 2713 if Setting is None:\r
ae7b6df8
LG
2714 continue\r
2715 #\r
2716 # For the VOID* type, it can have optional data of MaxDatumSize and InitialValue\r
2717 # For the Integer & Boolean type, the optional data can only be InitialValue.\r
2718 # At this point, we put all the data into the PcdClssObject for we don't know the PCD's datumtype\r
2719 # until the DEC parser has been called.\r
2720 #\r
2721 VpdOffset, MaxDatumSize, InitialValue = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4)\r
f843a328
YZ
2722 if MaxDatumSize:\r
2723 if int(MaxDatumSize, 0) > 0xFFFF:\r
2724 EdkLogger.error('build', FORMAT_INVALID, "The size value must not exceed the maximum value of 0xFFFF (UINT16) for %s." % ".".join((TokenSpaceGuid, PcdCName)),\r
2725 File=self.MetaFile, Line=Dummy4)\r
2726 if int(MaxDatumSize, 0) < 0:\r
2727 EdkLogger.error('build', FORMAT_INVALID, "The size value can't be set to negative value for %s." % ".".join((TokenSpaceGuid, PcdCName)),\r
2728 File=self.MetaFile, Line=Dummy4)\r
8518bf0b 2729 SkuInfo = SkuInfoClass(SkuName, self.SkuIds[SkuName][0], '', '', '', '', VpdOffset, InitialValue)\r
5a693b89 2730 if (PcdCName, TokenSpaceGuid) in Pcds:\r
ae7b6df8
LG
2731 pcdObject = Pcds[PcdCName, TokenSpaceGuid]\r
2732 pcdObject.SkuInfoList[SkuName] = SkuInfo\r
2733 if MaxDatumSize.strip():\r
2734 CurrentMaxSize = int(MaxDatumSize.strip(), 0)\r
2735 else:\r
2736 CurrentMaxSize = 0\r
2737 if pcdObject.MaxDatumSize:\r
2738 PcdMaxSize = int(pcdObject.MaxDatumSize, 0)\r
2739 else:\r
2740 PcdMaxSize = 0\r
2741 if CurrentMaxSize > PcdMaxSize:\r
2742 pcdObject.MaxDatumSize = str(CurrentMaxSize)\r
2743 else:\r
2744 Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject(\r
2745 PcdCName,\r
2746 TokenSpaceGuid,\r
2747 self._PCD_TYPE_STRING_[Type],\r
2748 '',\r
2749 InitialValue,\r
2750 '',\r
2751 MaxDatumSize,\r
2752 {SkuName : SkuInfo},\r
2753 False,\r
2754 None,\r
2755 IsDsc=True)\r
71127ce8
FB
2756\r
2757 if SkuName not in Pcds[PcdCName, TokenSpaceGuid].DscRawValue:\r
2758 Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName] = {}\r
2759 Pcds[PcdCName, TokenSpaceGuid].DscRawValue[SkuName][TAB_DEFAULT_STORES_DEFAULT] = InitialValue\r
ae7b6df8
LG
2760 for pcd in Pcds.values():\r
2761 SkuInfoObj = pcd.SkuInfoList.values()[0]\r
2762 pcdDecObject = self._DecPcds[pcd.TokenCName, pcd.TokenSpaceGuidCName]\r
8aa4db4b 2763 pcd.DatumType = pcdDecObject.DatumType\r
e651d06c
LG
2764 # Only fix the value while no value provided in DSC file.\r
2765 for sku in pcd.SkuInfoList.values():\r
128d435f 2766 if not sku.DefaultValue:\r
e651d06c 2767 sku.DefaultValue = pcdDecObject.DefaultValue\r
55c84777 2768 if TAB_DEFAULT not in pcd.SkuInfoList and TAB_COMMON not in pcd.SkuInfoList:\r
ae7b6df8 2769 valuefromDec = pcdDecObject.DefaultValue\r
55c84777
CJ
2770 SkuInfo = SkuInfoClass(TAB_DEFAULT, '0', '', '', '', '', SkuInfoObj.VpdOffset, valuefromDec)\r
2771 pcd.SkuInfoList[TAB_DEFAULT] = SkuInfo\r
2772 elif TAB_DEFAULT not in pcd.SkuInfoList and TAB_COMMON in pcd.SkuInfoList:\r
2773 pcd.SkuInfoList[TAB_DEFAULT] = pcd.SkuInfoList[TAB_COMMON]\r
2774 del pcd.SkuInfoList[TAB_COMMON]\r
2775 elif TAB_DEFAULT in pcd.SkuInfoList and TAB_COMMON in pcd.SkuInfoList:\r
2776 del pcd.SkuInfoList[TAB_COMMON]\r
ae7b6df8 2777\r
65eff519 2778\r
ccaa7754 2779 map(self.FilterSkuSettings, Pcds.values())\r
ae7b6df8
LG
2780 return Pcds\r
2781\r
2782 ## Add external modules\r
2783 #\r
2784 # The external modules are mostly those listed in FDF file, which don't\r
2785 # need "build".\r
2786 #\r
2787 # @param FilePath The path of module description file\r
2788 #\r
2789 def AddModule(self, FilePath):\r
2790 FilePath = NormPath(FilePath)\r
2791 if FilePath not in self.Modules:\r
2792 Module = ModuleBuildClassObject()\r
2793 Module.MetaFile = FilePath\r
2794 self.Modules.append(Module)\r
2795\r
68ba919f 2796 def _GetToolChainFamily(self):\r
94c04559 2797 self._ToolChainFamily = TAB_COMPILER_MSFT\r
68ba919f
YZ
2798 BuildConfigurationFile = os.path.normpath(os.path.join(GlobalData.gConfDirectory, "target.txt"))\r
2799 if os.path.isfile(BuildConfigurationFile) == True:\r
2800 TargetTxt = TargetTxtClassObject()\r
2801 TargetTxt.LoadTargetTxtFile(BuildConfigurationFile)\r
2802 ToolDefinitionFile = TargetTxt.TargetTxtDictionary[DataType.TAB_TAT_DEFINES_TOOL_CHAIN_CONF]\r
2803 if ToolDefinitionFile == '':\r
2804 ToolDefinitionFile = "tools_def.txt"\r
2805 ToolDefinitionFile = os.path.normpath(mws.join(self.WorkspaceDir, 'Conf', ToolDefinitionFile))\r
2806 if os.path.isfile(ToolDefinitionFile) == True:\r
2807 ToolDef = ToolDefClassObject()\r
2808 ToolDef.LoadToolDefFile(ToolDefinitionFile)\r
2809 ToolDefinition = ToolDef.ToolsDefTxtDatabase\r
2810 if TAB_TOD_DEFINES_FAMILY not in ToolDefinition \\r
2811 or self._Toolchain not in ToolDefinition[TAB_TOD_DEFINES_FAMILY] \\r
2812 or not ToolDefinition[TAB_TOD_DEFINES_FAMILY][self._Toolchain]:\r
94c04559 2813 self._ToolChainFamily = TAB_COMPILER_MSFT\r
68ba919f
YZ
2814 else:\r
2815 self._ToolChainFamily = ToolDefinition[TAB_TOD_DEFINES_FAMILY][self._Toolchain]\r
2816 return self._ToolChainFamily\r
2817\r
ae7b6df8
LG
2818 ## Add external PCDs\r
2819 #\r
2820 # The external PCDs are mostly those listed in FDF file to specify address\r
2821 # or offset information.\r
2822 #\r
2823 # @param Name Name of the PCD\r
2824 # @param Guid Token space guid of the PCD\r
2825 # @param Value Value of the PCD\r
2826 #\r
2827 def AddPcd(self, Name, Guid, Value):\r
2828 if (Name, Guid) not in self.Pcds:\r
2829 self.Pcds[Name, Guid] = PcdClassObject(Name, Guid, '', '', '', '', '', {}, False, None)\r
2830 self.Pcds[Name, Guid].DefaultValue = Value\r
5644e5ce
FB
2831 @property\r
2832 def DecPcds(self):\r
4231a819 2833 if self._DecPcds is None:\r
5644e5ce
FB
2834 FdfInfList = []\r
2835 if GlobalData.gFdfParser:\r
2836 FdfInfList = GlobalData.gFdfParser.Profile.InfList\r
2837 PkgSet = set()\r
2838 for Inf in FdfInfList:\r
2839 ModuleFile = PathClass(NormPath(Inf), GlobalData.gWorkspace, Arch=self._Arch)\r
2840 if ModuleFile in self._Modules:\r
2841 continue\r
2842 ModuleData = self._Bdb[ModuleFile, self._Arch, self._Target, self._Toolchain]\r
2843 PkgSet.update(ModuleData.Packages)\r
ccaa7754 2844 self._DecPcds, self._GuidDict = GetDeclaredPcd(self, self._Bdb, self._Arch, self._Target, self._Toolchain, PkgSet)\r
5644e5ce 2845 return self._DecPcds\r
ae7b6df8 2846 _Macros = property(_GetMacros)\r
43fe4c40 2847 Arch = property(_GetArch)\r
ae7b6df8
LG
2848 Platform = property(_GetPlatformName)\r
2849 PlatformName = property(_GetPlatformName)\r
2850 Guid = property(_GetFileGuid)\r
2851 Version = property(_GetVersion)\r
2852 DscSpecification = property(_GetDscSpec)\r
2853 OutputDirectory = property(_GetOutpuDir)\r
2854 SupArchList = property(_GetSupArch)\r
2855 BuildTargets = property(_GetBuildTarget)\r
2856 SkuName = property(_GetSkuName, _SetSkuName)\r
ae7b6df8
LG
2857 PcdInfoFlag = property(_GetPcdInfoFlag)\r
2858 VarCheckFlag = property(_GetVarCheckFlag)\r
2859 FlashDefinition = property(_GetFdfFile)\r
2860 Prebuild = property(_GetPrebuild)\r
2861 Postbuild = property(_GetPostbuild)\r
2862 BuildNumber = property(_GetBuildNumber)\r
2863 MakefileName = property(_GetMakefileName)\r
2864 BsBaseAddress = property(_GetBsBaseAddress)\r
2865 RtBaseAddress = property(_GetRtBaseAddress)\r
2866 LoadFixAddress = property(_GetLoadFixAddress)\r
2867 RFCLanguages = property(_GetRFCLanguages)\r
2868 ISOLanguages = property(_GetISOLanguages)\r
2869 VpdToolGuid = property(_GetVpdToolGuid)\r
2870 SkuIds = property(_GetSkuIds)\r
2871 Modules = property(_GetModules)\r
2872 LibraryInstances = property(_GetLibraryInstances)\r
2873 LibraryClasses = property(_GetLibraryClasses)\r
2874 Pcds = property(_GetPcds)\r
2875 BuildOptions = property(_GetBuildOptions)\r
68ba919f 2876 ToolChainFamily = property(_GetToolChainFamily)\r