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