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