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