]> git.proxmox.com Git - mirror_edk2.git/blob - BaseTools/Source/Python/Workspace/DscBuildData.py
a5fceb9e2b614ee681f6de590451d058acd6df27
[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) 2017, Intel Corporation. All rights reserved.<BR>
5 # (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>
6 # This program and the accompanying materials
7 # are licensed and made available under the terms and conditions of the BSD License
8 # which accompanies this distribution. The full text of the license may be found at
9 # http://opensource.org/licenses/bsd-license.php
10 #
11 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13 #
14
15 ## Platform build information from DSC file
16 #
17 # This class is used to retrieve information stored in database and convert them
18 # into PlatformBuildClassObject form for easier use for AutoGen.
19 #
20 from Common.String import *
21 from Common.DataType import *
22 from Common.Misc import *
23 from types import *
24
25 from CommonDataClass.CommonClass import SkuInfoClass
26
27 from MetaDataTable import *
28 from MetaFileTable import *
29 from MetaFileParser import *
30
31 from WorkspaceCommon import GetDeclaredPcd
32 from Common.Misc import AnalyzeDscPcd
33 from Common.Misc import ProcessDuplicatedInf
34 import re
35 from Common.Parsing import IsValidWord
36 from Common.VariableAttributes import VariableAttributes
37 import Common.GlobalData as GlobalData
38 import subprocess
39 from Workspace.BuildClassObject import PlatformBuildClassObject, StructurePcd, PcdClassObject, ModuleBuildClassObject
40
41 #
42 # Treat CHAR16 as a synonym for UINT16. CHAR16 support is required for VFR C structs
43 #
44 PcdValueInitName = 'PcdValueInit'
45 PcdSupportedBaseTypes = ['BOOLEAN', 'UINT8', 'UINT16', 'UINT32', 'UINT64', 'CHAR16']
46 PcdSupportedBaseTypeWidth = {'BOOLEAN':8, 'UINT8':8, 'UINT16':16, 'UINT32':32, 'UINT64':64}
47 PcdUnsupportedBaseTypes = ['INT8', 'INT16', 'INT32', 'INT64', 'CHAR8', 'UINTN', 'INTN', 'VOID']
48
49 PcdMainCHeader = '''
50 /**
51 DO NOT EDIT
52 FILE auto-generated
53 **/
54
55 #include <stdio.h>
56 #include <stdlib.h>
57 #include <string.h>
58 #include <PcdValueCommon.h>
59 '''
60
61 PcdMainCEntry = '''
62 int
63 main (
64 int argc,
65 char *argv[]
66 )
67 {
68 return PcdValueMain (argc, argv);
69 }
70 '''
71
72 PcdMakefileHeader = '''
73 #
74 # DO NOT EDIT
75 # This file is auto-generated by build utility
76 #
77
78 '''
79
80 PcdMakefileEnd = '''
81 !INCLUDE $(BASE_TOOLS_PATH)\Source\C\Makefiles\ms.common
82
83 CFLAGS = $(CFLAGS) /wd4200 /wd4034 /wd4101
84
85 LIBS = $(LIB_PATH)\Common.lib
86
87 !INCLUDE $(BASE_TOOLS_PATH)\Source\C\Makefiles\ms.app
88 '''
89
90 PcdGccMakefile = '''
91 ARCH ?= IA32
92 MAKEROOT ?= $(EDK_TOOLS_PATH)/Source/C
93 LIBS = -lCommon
94 '''
95
96 class DscBuildData(PlatformBuildClassObject):
97 # dict used to convert PCD type in database to string used by build tool
98 _PCD_TYPE_STRING_ = {
99 MODEL_PCD_FIXED_AT_BUILD : "FixedAtBuild",
100 MODEL_PCD_PATCHABLE_IN_MODULE : "PatchableInModule",
101 MODEL_PCD_FEATURE_FLAG : "FeatureFlag",
102 MODEL_PCD_DYNAMIC : "Dynamic",
103 MODEL_PCD_DYNAMIC_DEFAULT : "Dynamic",
104 MODEL_PCD_DYNAMIC_HII : "DynamicHii",
105 MODEL_PCD_DYNAMIC_VPD : "DynamicVpd",
106 MODEL_PCD_DYNAMIC_EX : "DynamicEx",
107 MODEL_PCD_DYNAMIC_EX_DEFAULT : "DynamicEx",
108 MODEL_PCD_DYNAMIC_EX_HII : "DynamicExHii",
109 MODEL_PCD_DYNAMIC_EX_VPD : "DynamicExVpd",
110 }
111
112 # dict used to convert part of [Defines] to members of DscBuildData directly
113 _PROPERTY_ = {
114 #
115 # Required Fields
116 #
117 TAB_DSC_DEFINES_PLATFORM_NAME : "_PlatformName",
118 TAB_DSC_DEFINES_PLATFORM_GUID : "_Guid",
119 TAB_DSC_DEFINES_PLATFORM_VERSION : "_Version",
120 TAB_DSC_DEFINES_DSC_SPECIFICATION : "_DscSpecification",
121 # TAB_DSC_DEFINES_OUTPUT_DIRECTORY : "_OutputDirectory",
122 # TAB_DSC_DEFINES_SUPPORTED_ARCHITECTURES : "_SupArchList",
123 # TAB_DSC_DEFINES_BUILD_TARGETS : "_BuildTargets",
124 TAB_DSC_DEFINES_SKUID_IDENTIFIER : "_SkuName",
125 # TAB_DSC_DEFINES_FLASH_DEFINITION : "_FlashDefinition",
126 TAB_DSC_DEFINES_BUILD_NUMBER : "_BuildNumber",
127 TAB_DSC_DEFINES_MAKEFILE_NAME : "_MakefileName",
128 TAB_DSC_DEFINES_BS_BASE_ADDRESS : "_BsBaseAddress",
129 TAB_DSC_DEFINES_RT_BASE_ADDRESS : "_RtBaseAddress",
130 # TAB_DSC_DEFINES_RFC_LANGUAGES : "_RFCLanguages",
131 # TAB_DSC_DEFINES_ISO_LANGUAGES : "_ISOLanguages",
132 }
133
134 # used to compose dummy library class name for those forced library instances
135 _NullLibraryNumber = 0
136
137 ## Constructor of DscBuildData
138 #
139 # Initialize object of DscBuildData
140 #
141 # @param FilePath The path of platform description file
142 # @param RawData The raw data of DSC file
143 # @param BuildDataBase Database used to retrieve module/package information
144 # @param Arch The target architecture
145 # @param Platform (not used for DscBuildData)
146 # @param Macros Macros used for replacement in DSC file
147 #
148 def __init__(self, FilePath, RawData, BuildDataBase, Arch='COMMON', Target=None, Toolchain=None):
149 self.MetaFile = FilePath
150 self._RawData = RawData
151 self._Bdb = BuildDataBase
152 self._Arch = Arch
153 self._Target = Target
154 self._Toolchain = Toolchain
155 self._Clear()
156 self._HandleOverridePath()
157 if os.getenv("WORKSPACE"):
158 self.OutputPath = os.path.join(os.getenv("WORKSPACE"), 'Build', PcdValueInitName)
159 else:
160 self.OutputPath = os.path.dirname(self.DscFile)
161 self.DefaultStores = None
162 self.SkuIdMgr = SkuClass(self.SkuName, self.SkuIds)
163 arraystr = self.SkuIdMgr.DumpSkuIdArrary()
164
165 ## XXX[key] = value
166 def __setitem__(self, key, value):
167 self.__dict__[self._PROPERTY_[key]] = value
168
169 ## value = XXX[key]
170 def __getitem__(self, key):
171 return self.__dict__[self._PROPERTY_[key]]
172
173 ## "in" test support
174 def __contains__(self, key):
175 return key in self._PROPERTY_
176
177 ## Set all internal used members of DscBuildData to None
178 def _Clear(self):
179 self._Header = None
180 self._PlatformName = None
181 self._Guid = None
182 self._Version = None
183 self._DscSpecification = None
184 self._OutputDirectory = None
185 self._SupArchList = None
186 self._BuildTargets = None
187 self._SkuName = None
188 self._PcdInfoFlag = None
189 self._VarCheckFlag = None
190 self._FlashDefinition = None
191 self._Prebuild = None
192 self._Postbuild = None
193 self._BuildNumber = None
194 self._MakefileName = None
195 self._BsBaseAddress = None
196 self._RtBaseAddress = None
197 self._SkuIds = None
198 self._Modules = None
199 self._LibraryInstances = None
200 self._LibraryClasses = None
201 self._Pcds = None
202 self._DecPcds = None
203 self._BuildOptions = None
204 self._ModuleTypeOptions = None
205 self._LoadFixAddress = None
206 self._RFCLanguages = None
207 self._ISOLanguages = None
208 self._VpdToolGuid = None
209 self.__Macros = None
210 self.DefaultStores = None
211
212
213 ## handle Override Path of Module
214 def _HandleOverridePath(self):
215 RecordList = self._RawData[MODEL_META_DATA_COMPONENT, self._Arch]
216 Macros = self._Macros
217 Macros["EDK_SOURCE"] = GlobalData.gEcpSource
218 for Record in RecordList:
219 ModuleId = Record[6]
220 LineNo = Record[7]
221 ModuleFile = PathClass(NormPath(Record[0]), GlobalData.gWorkspace, Arch=self._Arch)
222 RecordList = self._RawData[MODEL_META_DATA_COMPONENT_SOURCE_OVERRIDE_PATH, self._Arch, None, ModuleId]
223 if RecordList != []:
224 SourceOverridePath = mws.join(GlobalData.gWorkspace, NormPath(RecordList[0][0]))
225
226 # Check if the source override path exists
227 if not os.path.isdir(SourceOverridePath):
228 EdkLogger.error('build', FILE_NOT_FOUND, Message='Source override path does not exist:', File=self.MetaFile, ExtraData=SourceOverridePath, Line=LineNo)
229
230 # Add to GlobalData Variables
231 GlobalData.gOverrideDir[ModuleFile.Key] = SourceOverridePath
232
233 ## Get current effective macros
234 def _GetMacros(self):
235 if self.__Macros == None:
236 self.__Macros = {}
237 self.__Macros.update(GlobalData.gPlatformDefines)
238 self.__Macros.update(GlobalData.gGlobalDefines)
239 self.__Macros.update(GlobalData.gCommandLineDefines)
240 return self.__Macros
241
242 ## Get architecture
243 def _GetArch(self):
244 return self._Arch
245
246 ## Set architecture
247 #
248 # Changing the default ARCH to another may affect all other information
249 # because all information in a platform may be ARCH-related. That's
250 # why we need to clear all internal used members, in order to cause all
251 # information to be re-retrieved.
252 #
253 # @param Value The value of ARCH
254 #
255 def _SetArch(self, Value):
256 if self._Arch == Value:
257 return
258 self._Arch = Value
259 self._Clear()
260
261 ## Retrieve all information in [Defines] section
262 #
263 # (Retriving all [Defines] information in one-shot is just to save time.)
264 #
265 def _GetHeaderInfo(self):
266 RecordList = self._RawData[MODEL_META_DATA_HEADER, self._Arch]
267 for Record in RecordList:
268 Name = Record[1]
269 # items defined _PROPERTY_ don't need additional processing
270
271 # some special items in [Defines] section need special treatment
272 if Name == TAB_DSC_DEFINES_OUTPUT_DIRECTORY:
273 self._OutputDirectory = NormPath(Record[2], self._Macros)
274 if ' ' in self._OutputDirectory:
275 EdkLogger.error("build", FORMAT_NOT_SUPPORTED, "No space is allowed in OUTPUT_DIRECTORY",
276 File=self.MetaFile, Line=Record[-1],
277 ExtraData=self._OutputDirectory)
278 elif Name == TAB_DSC_DEFINES_FLASH_DEFINITION:
279 self._FlashDefinition = PathClass(NormPath(Record[2], self._Macros), GlobalData.gWorkspace)
280 ErrorCode, ErrorInfo = self._FlashDefinition.Validate('.fdf')
281 if ErrorCode != 0:
282 EdkLogger.error('build', ErrorCode, File=self.MetaFile, Line=Record[-1],
283 ExtraData=ErrorInfo)
284 elif Name == TAB_DSC_PREBUILD:
285 PrebuildValue = Record[2]
286 if Record[2][0] == '"':
287 if Record[2][-1] != '"':
288 EdkLogger.error('build', FORMAT_INVALID, 'Missing double quotes in the end of %s statement.' % TAB_DSC_PREBUILD,
289 File=self.MetaFile, Line=Record[-1])
290 PrebuildValue = Record[2][1:-1]
291 self._Prebuild = PrebuildValue
292 elif Name == TAB_DSC_POSTBUILD:
293 PostbuildValue = Record[2]
294 if Record[2][0] == '"':
295 if Record[2][-1] != '"':
296 EdkLogger.error('build', FORMAT_INVALID, 'Missing double quotes in the end of %s statement.' % TAB_DSC_POSTBUILD,
297 File=self.MetaFile, Line=Record[-1])
298 PostbuildValue = Record[2][1:-1]
299 self._Postbuild = PostbuildValue
300 elif Name == TAB_DSC_DEFINES_SUPPORTED_ARCHITECTURES:
301 self._SupArchList = GetSplitValueList(Record[2], TAB_VALUE_SPLIT)
302 elif Name == TAB_DSC_DEFINES_BUILD_TARGETS:
303 self._BuildTargets = GetSplitValueList(Record[2])
304 elif Name == TAB_DSC_DEFINES_SKUID_IDENTIFIER:
305 if self._SkuName == None:
306 self._SkuName = Record[2]
307 if GlobalData.gSKUID_CMD:
308 self._SkuName = GlobalData.gSKUID_CMD
309 elif Name == TAB_DSC_DEFINES_PCD_INFO_GENERATION:
310 self._PcdInfoFlag = Record[2]
311 elif Name == TAB_DSC_DEFINES_PCD_VAR_CHECK_GENERATION:
312 self._VarCheckFlag = Record[2]
313 elif Name == TAB_FIX_LOAD_TOP_MEMORY_ADDRESS:
314 try:
315 self._LoadFixAddress = int (Record[2], 0)
316 except:
317 EdkLogger.error("build", PARAMETER_INVALID, "FIX_LOAD_TOP_MEMORY_ADDRESS %s is not valid dec or hex string" % (Record[2]))
318 elif Name == TAB_DSC_DEFINES_RFC_LANGUAGES:
319 if not Record[2] or Record[2][0] != '"' or Record[2][-1] != '"' or len(Record[2]) == 1:
320 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"',
321 File=self.MetaFile, Line=Record[-1])
322 LanguageCodes = Record[2][1:-1]
323 if not LanguageCodes:
324 EdkLogger.error('build', FORMAT_NOT_SUPPORTED, 'one or more RFC4646 format language code must be provided for RFC_LANGUAGES statement',
325 File=self.MetaFile, Line=Record[-1])
326 LanguageList = GetSplitValueList(LanguageCodes, TAB_SEMI_COLON_SPLIT)
327 # check whether there is empty entries in the list
328 if None in LanguageList:
329 EdkLogger.error('build', FORMAT_NOT_SUPPORTED, 'one or more empty language code is in RFC_LANGUAGES statement',
330 File=self.MetaFile, Line=Record[-1])
331 self._RFCLanguages = LanguageList
332 elif Name == TAB_DSC_DEFINES_ISO_LANGUAGES:
333 if not Record[2] or Record[2][0] != '"' or Record[2][-1] != '"' or len(Record[2]) == 1:
334 EdkLogger.error('build', FORMAT_NOT_SUPPORTED, 'language code for ISO_LANGUAGES must have double quotes around it, for example: ISO_LANGUAGES = "engchn"',
335 File=self.MetaFile, Line=Record[-1])
336 LanguageCodes = Record[2][1:-1]
337 if not LanguageCodes:
338 EdkLogger.error('build', FORMAT_NOT_SUPPORTED, 'one or more ISO639-2 format language code must be provided for ISO_LANGUAGES statement',
339 File=self.MetaFile, Line=Record[-1])
340 if len(LanguageCodes) % 3:
341 EdkLogger.error('build', FORMAT_NOT_SUPPORTED, 'bad ISO639-2 format for ISO_LANGUAGES',
342 File=self.MetaFile, Line=Record[-1])
343 LanguageList = []
344 for i in range(0, len(LanguageCodes), 3):
345 LanguageList.append(LanguageCodes[i:i + 3])
346 self._ISOLanguages = LanguageList
347 elif Name == TAB_DSC_DEFINES_VPD_TOOL_GUID:
348 #
349 # try to convert GUID to a real UUID value to see whether the GUID is format
350 # for VPD_TOOL_GUID is correct.
351 #
352 try:
353 uuid.UUID(Record[2])
354 except:
355 EdkLogger.error("build", FORMAT_INVALID, "Invalid GUID format for VPD_TOOL_GUID", File=self.MetaFile)
356 self._VpdToolGuid = Record[2]
357 elif Name in self:
358 self[Name] = Record[2]
359 # set _Header to non-None in order to avoid database re-querying
360 self._Header = 'DUMMY'
361
362 ## Retrieve platform name
363 def _GetPlatformName(self):
364 if self._PlatformName == None:
365 if self._Header == None:
366 self._GetHeaderInfo()
367 if self._PlatformName == None:
368 EdkLogger.error('build', ATTRIBUTE_NOT_AVAILABLE, "No PLATFORM_NAME", File=self.MetaFile)
369 return self._PlatformName
370
371 ## Retrieve file guid
372 def _GetFileGuid(self):
373 if self._Guid == None:
374 if self._Header == None:
375 self._GetHeaderInfo()
376 if self._Guid == None:
377 EdkLogger.error('build', ATTRIBUTE_NOT_AVAILABLE, "No PLATFORM_GUID", File=self.MetaFile)
378 return self._Guid
379
380 ## Retrieve platform version
381 def _GetVersion(self):
382 if self._Version == None:
383 if self._Header == None:
384 self._GetHeaderInfo()
385 if self._Version == None:
386 EdkLogger.error('build', ATTRIBUTE_NOT_AVAILABLE, "No PLATFORM_VERSION", File=self.MetaFile)
387 return self._Version
388
389 ## Retrieve platform description file version
390 def _GetDscSpec(self):
391 if self._DscSpecification == None:
392 if self._Header == None:
393 self._GetHeaderInfo()
394 if self._DscSpecification == None:
395 EdkLogger.error('build', ATTRIBUTE_NOT_AVAILABLE, "No DSC_SPECIFICATION", File=self.MetaFile)
396 return self._DscSpecification
397
398 ## Retrieve OUTPUT_DIRECTORY
399 def _GetOutpuDir(self):
400 if self._OutputDirectory == None:
401 if self._Header == None:
402 self._GetHeaderInfo()
403 if self._OutputDirectory == None:
404 self._OutputDirectory = os.path.join("Build", self._PlatformName)
405 return self._OutputDirectory
406
407 ## Retrieve SUPPORTED_ARCHITECTURES
408 def _GetSupArch(self):
409 if self._SupArchList == None:
410 if self._Header == None:
411 self._GetHeaderInfo()
412 if self._SupArchList == None:
413 EdkLogger.error('build', ATTRIBUTE_NOT_AVAILABLE, "No SUPPORTED_ARCHITECTURES", File=self.MetaFile)
414 return self._SupArchList
415
416 ## Retrieve BUILD_TARGETS
417 def _GetBuildTarget(self):
418 if self._BuildTargets == None:
419 if self._Header == None:
420 self._GetHeaderInfo()
421 if self._BuildTargets == None:
422 EdkLogger.error('build', ATTRIBUTE_NOT_AVAILABLE, "No BUILD_TARGETS", File=self.MetaFile)
423 return self._BuildTargets
424
425 def _GetPcdInfoFlag(self):
426 if self._PcdInfoFlag == None or self._PcdInfoFlag.upper() == 'FALSE':
427 return False
428 elif self._PcdInfoFlag.upper() == 'TRUE':
429 return True
430 else:
431 return False
432 def _GetVarCheckFlag(self):
433 if self._VarCheckFlag == None or self._VarCheckFlag.upper() == 'FALSE':
434 return False
435 elif self._VarCheckFlag.upper() == 'TRUE':
436 return True
437 else:
438 return False
439
440 # # Retrieve SKUID_IDENTIFIER
441 def _GetSkuName(self):
442 if self._SkuName == None:
443 if self._Header == None:
444 self._GetHeaderInfo()
445 if self._SkuName == None:
446 self._SkuName = 'DEFAULT'
447 return self._SkuName
448
449 ## Override SKUID_IDENTIFIER
450 def _SetSkuName(self, Value):
451 self._SkuName = Value
452 self._Pcds = None
453
454 def _GetFdfFile(self):
455 if self._FlashDefinition == None:
456 if self._Header == None:
457 self._GetHeaderInfo()
458 if self._FlashDefinition == None:
459 self._FlashDefinition = ''
460 return self._FlashDefinition
461
462 def _GetPrebuild(self):
463 if self._Prebuild == None:
464 if self._Header == None:
465 self._GetHeaderInfo()
466 if self._Prebuild == None:
467 self._Prebuild = ''
468 return self._Prebuild
469
470 def _GetPostbuild(self):
471 if self._Postbuild == None:
472 if self._Header == None:
473 self._GetHeaderInfo()
474 if self._Postbuild == None:
475 self._Postbuild = ''
476 return self._Postbuild
477
478 ## Retrieve FLASH_DEFINITION
479 def _GetBuildNumber(self):
480 if self._BuildNumber == None:
481 if self._Header == None:
482 self._GetHeaderInfo()
483 if self._BuildNumber == None:
484 self._BuildNumber = ''
485 return self._BuildNumber
486
487 ## Retrieve MAKEFILE_NAME
488 def _GetMakefileName(self):
489 if self._MakefileName == None:
490 if self._Header == None:
491 self._GetHeaderInfo()
492 if self._MakefileName == None:
493 self._MakefileName = ''
494 return self._MakefileName
495
496 ## Retrieve BsBaseAddress
497 def _GetBsBaseAddress(self):
498 if self._BsBaseAddress == None:
499 if self._Header == None:
500 self._GetHeaderInfo()
501 if self._BsBaseAddress == None:
502 self._BsBaseAddress = ''
503 return self._BsBaseAddress
504
505 ## Retrieve RtBaseAddress
506 def _GetRtBaseAddress(self):
507 if self._RtBaseAddress == None:
508 if self._Header == None:
509 self._GetHeaderInfo()
510 if self._RtBaseAddress == None:
511 self._RtBaseAddress = ''
512 return self._RtBaseAddress
513
514 ## Retrieve the top address for the load fix address
515 def _GetLoadFixAddress(self):
516 if self._LoadFixAddress == None:
517 if self._Header == None:
518 self._GetHeaderInfo()
519
520 if self._LoadFixAddress == None:
521 self._LoadFixAddress = self._Macros.get(TAB_FIX_LOAD_TOP_MEMORY_ADDRESS, '0')
522
523 try:
524 self._LoadFixAddress = int (self._LoadFixAddress, 0)
525 except:
526 EdkLogger.error("build", PARAMETER_INVALID, "FIX_LOAD_TOP_MEMORY_ADDRESS %s is not valid dec or hex string" % (self._LoadFixAddress))
527
528 #
529 # If command line defined, should override the value in DSC file.
530 #
531 if 'FIX_LOAD_TOP_MEMORY_ADDRESS' in GlobalData.gCommandLineDefines.keys():
532 try:
533 self._LoadFixAddress = int(GlobalData.gCommandLineDefines['FIX_LOAD_TOP_MEMORY_ADDRESS'], 0)
534 except:
535 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']))
536
537 if self._LoadFixAddress < 0:
538 EdkLogger.error("build", PARAMETER_INVALID, "FIX_LOAD_TOP_MEMORY_ADDRESS is set to the invalid negative value 0x%x" % (self._LoadFixAddress))
539 if self._LoadFixAddress != 0xFFFFFFFFFFFFFFFF and self._LoadFixAddress % 0x1000 != 0:
540 EdkLogger.error("build", PARAMETER_INVALID, "FIX_LOAD_TOP_MEMORY_ADDRESS is set to the invalid unaligned 4K value 0x%x" % (self._LoadFixAddress))
541
542 return self._LoadFixAddress
543
544 ## Retrieve RFCLanguage filter
545 def _GetRFCLanguages(self):
546 if self._RFCLanguages == None:
547 if self._Header == None:
548 self._GetHeaderInfo()
549 if self._RFCLanguages == None:
550 self._RFCLanguages = []
551 return self._RFCLanguages
552
553 ## Retrieve ISOLanguage filter
554 def _GetISOLanguages(self):
555 if self._ISOLanguages == None:
556 if self._Header == None:
557 self._GetHeaderInfo()
558 if self._ISOLanguages == None:
559 self._ISOLanguages = []
560 return self._ISOLanguages
561 ## Retrieve the GUID string for VPD tool
562 def _GetVpdToolGuid(self):
563 if self._VpdToolGuid == None:
564 if self._Header == None:
565 self._GetHeaderInfo()
566 if self._VpdToolGuid == None:
567 self._VpdToolGuid = ''
568 return self._VpdToolGuid
569
570 ## Retrieve [SkuIds] section information
571 def _GetSkuIds(self):
572 if self._SkuIds == None:
573 self._SkuIds = sdict()
574 RecordList = self._RawData[MODEL_EFI_SKU_ID, self._Arch]
575 for Record in RecordList:
576 if Record[0] in [None, '']:
577 EdkLogger.error('build', FORMAT_INVALID, 'No Sku ID number',
578 File=self.MetaFile, Line=Record[-1])
579 if Record[1] in [None, '']:
580 EdkLogger.error('build', FORMAT_INVALID, 'No Sku ID name',
581 File=self.MetaFile, Line=Record[-1])
582 Pattern = re.compile('^[1-9]\d*|0$')
583 if Pattern.match(Record[0]) == None:
584 EdkLogger.error('build', FORMAT_INVALID, "The format of the Sku ID number is invalid. The correct format is '{(0-9)} {(1-9)(0-9)+}'",
585 File=self.MetaFile, Line=Record[-1])
586 if not IsValidWord(Record[1]):
587 EdkLogger.error('build', FORMAT_INVALID, "The format of the Sku ID name is invalid. The correct format is '(a-zA-Z0-9_)(a-zA-Z0-9_-.)*'",
588 File=self.MetaFile, Line=Record[-1])
589 self._SkuIds[Record[1].upper()] = (Record[0], Record[1].upper(), Record[2].upper())
590 if 'DEFAULT' not in self._SkuIds:
591 self._SkuIds['DEFAULT'] = ("0","DEFAULT","DEFAULT")
592 if 'COMMON' not in self._SkuIds:
593 self._SkuIds['COMMON'] = ("0","DEFAULT","DEFAULT")
594 return self._SkuIds
595 def ToInt(self,intstr):
596 return int(intstr,16) if intstr.upper().startswith("0X") else int(intstr)
597 def _GetDefaultStores(self):
598 if self.DefaultStores == None:
599 self.DefaultStores = sdict()
600 RecordList = self._RawData[MODEL_EFI_DEFAULT_STORES, self._Arch]
601 for Record in RecordList:
602 if Record[0] in [None, '']:
603 EdkLogger.error('build', FORMAT_INVALID, 'No DefaultStores ID number',
604 File=self.MetaFile, Line=Record[-1])
605 if Record[1] in [None, '']:
606 EdkLogger.error('build', FORMAT_INVALID, 'No DefaultStores ID name',
607 File=self.MetaFile, Line=Record[-1])
608 self.DefaultStores[Record[1].upper()] = (self.ToInt(Record[0]),Record[1].upper())
609 if TAB_DEFAULT_STORES_DEFAULT not in self.DefaultStores:
610 self.DefaultStores[TAB_DEFAULT_STORES_DEFAULT] = (0,TAB_DEFAULT_STORES_DEFAULT)
611 GlobalData.gDefaultStores = self.DefaultStores.keys()
612 if GlobalData.gDefaultStores:
613 GlobalData.gDefaultStores.sort()
614 return self.DefaultStores
615
616 ## Retrieve [Components] section information
617 def _GetModules(self):
618 if self._Modules != None:
619 return self._Modules
620
621 self._Modules = sdict()
622 RecordList = self._RawData[MODEL_META_DATA_COMPONENT, self._Arch]
623 Macros = self._Macros
624 Macros["EDK_SOURCE"] = GlobalData.gEcpSource
625 for Record in RecordList:
626 DuplicatedFile = False
627
628 ModuleFile = PathClass(NormPath(Record[0], Macros), GlobalData.gWorkspace, Arch=self._Arch)
629 ModuleId = Record[6]
630 LineNo = Record[7]
631
632 # check the file validation
633 ErrorCode, ErrorInfo = ModuleFile.Validate('.inf')
634 if ErrorCode != 0:
635 EdkLogger.error('build', ErrorCode, File=self.MetaFile, Line=LineNo,
636 ExtraData=ErrorInfo)
637 # Check duplication
638 # If arch is COMMON, no duplicate module is checked since all modules in all component sections are selected
639 if self._Arch != 'COMMON' and ModuleFile in self._Modules:
640 DuplicatedFile = True
641
642 Module = ModuleBuildClassObject()
643 Module.MetaFile = ModuleFile
644
645 # get module private library instance
646 RecordList = self._RawData[MODEL_EFI_LIBRARY_CLASS, self._Arch, None, ModuleId]
647 for Record in RecordList:
648 LibraryClass = Record[0]
649 LibraryPath = PathClass(NormPath(Record[1], Macros), GlobalData.gWorkspace, Arch=self._Arch)
650 LineNo = Record[-1]
651
652 # check the file validation
653 ErrorCode, ErrorInfo = LibraryPath.Validate('.inf')
654 if ErrorCode != 0:
655 EdkLogger.error('build', ErrorCode, File=self.MetaFile, Line=LineNo,
656 ExtraData=ErrorInfo)
657
658 if LibraryClass == '' or LibraryClass == 'NULL':
659 self._NullLibraryNumber += 1
660 LibraryClass = 'NULL%d' % self._NullLibraryNumber
661 EdkLogger.verbose("Found forced library for %s\n\t%s [%s]" % (ModuleFile, LibraryPath, LibraryClass))
662 Module.LibraryClasses[LibraryClass] = LibraryPath
663 if LibraryPath not in self.LibraryInstances:
664 self.LibraryInstances.append(LibraryPath)
665
666 # get module private PCD setting
667 for Type in [MODEL_PCD_FIXED_AT_BUILD, MODEL_PCD_PATCHABLE_IN_MODULE, \
668 MODEL_PCD_FEATURE_FLAG, MODEL_PCD_DYNAMIC, MODEL_PCD_DYNAMIC_EX]:
669 RecordList = self._RawData[Type, self._Arch, None, ModuleId]
670 for TokenSpaceGuid, PcdCName, Setting, Dummy1, Dummy2, Dummy3, Dummy4,Dummy5 in RecordList:
671 TokenList = GetSplitValueList(Setting)
672 DefaultValue = TokenList[0]
673 if len(TokenList) > 1:
674 MaxDatumSize = TokenList[1]
675 else:
676 MaxDatumSize = ''
677 TypeString = self._PCD_TYPE_STRING_[Type]
678 Pcd = PcdClassObject(
679 PcdCName,
680 TokenSpaceGuid,
681 TypeString,
682 '',
683 DefaultValue,
684 '',
685 MaxDatumSize,
686 {},
687 False,
688 None
689 )
690 Module.Pcds[PcdCName, TokenSpaceGuid] = Pcd
691
692 # get module private build options
693 RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch, None, ModuleId]
694 for ToolChainFamily, ToolChain, Option, Dummy1, Dummy2, Dummy3, Dummy4,Dummy5 in RecordList:
695 if (ToolChainFamily, ToolChain) not in Module.BuildOptions:
696 Module.BuildOptions[ToolChainFamily, ToolChain] = Option
697 else:
698 OptionString = Module.BuildOptions[ToolChainFamily, ToolChain]
699 Module.BuildOptions[ToolChainFamily, ToolChain] = OptionString + " " + Option
700
701 RecordList = self._RawData[MODEL_META_DATA_HEADER, self._Arch, None, ModuleId]
702 if DuplicatedFile and not RecordList:
703 EdkLogger.error('build', FILE_DUPLICATED, File=self.MetaFile, ExtraData=str(ModuleFile), Line=LineNo)
704 if RecordList:
705 if len(RecordList) != 1:
706 EdkLogger.error('build', OPTION_UNKNOWN, 'Only FILE_GUID can be listed in <Defines> section.',
707 File=self.MetaFile, ExtraData=str(ModuleFile), Line=LineNo)
708 ModuleFile = ProcessDuplicatedInf(ModuleFile, RecordList[0][2], GlobalData.gWorkspace)
709 ModuleFile.Arch = self._Arch
710
711 self._Modules[ModuleFile] = Module
712 return self._Modules
713
714 ## Retrieve all possible library instances used in this platform
715 def _GetLibraryInstances(self):
716 if self._LibraryInstances == None:
717 self._GetLibraryClasses()
718 return self._LibraryInstances
719
720 ## Retrieve [LibraryClasses] information
721 def _GetLibraryClasses(self):
722 if self._LibraryClasses == None:
723 self._LibraryInstances = []
724 #
725 # tdict is a special dict kind of type, used for selecting correct
726 # library instance for given library class and module type
727 #
728 LibraryClassDict = tdict(True, 3)
729 # track all library class names
730 LibraryClassSet = set()
731 RecordList = self._RawData[MODEL_EFI_LIBRARY_CLASS, self._Arch, None, -1]
732 Macros = self._Macros
733 for Record in RecordList:
734 LibraryClass, LibraryInstance, Dummy, Arch, ModuleType, Dummy,Dummy, LineNo = Record
735 if LibraryClass == '' or LibraryClass == 'NULL':
736 self._NullLibraryNumber += 1
737 LibraryClass = 'NULL%d' % self._NullLibraryNumber
738 EdkLogger.verbose("Found forced library for arch=%s\n\t%s [%s]" % (Arch, LibraryInstance, LibraryClass))
739 LibraryClassSet.add(LibraryClass)
740 LibraryInstance = PathClass(NormPath(LibraryInstance, Macros), GlobalData.gWorkspace, Arch=self._Arch)
741 # check the file validation
742 ErrorCode, ErrorInfo = LibraryInstance.Validate('.inf')
743 if ErrorCode != 0:
744 EdkLogger.error('build', ErrorCode, File=self.MetaFile, Line=LineNo,
745 ExtraData=ErrorInfo)
746
747 if ModuleType != 'COMMON' and ModuleType not in SUP_MODULE_LIST:
748 EdkLogger.error('build', OPTION_UNKNOWN, "Unknown module type [%s]" % ModuleType,
749 File=self.MetaFile, ExtraData=LibraryInstance, Line=LineNo)
750 LibraryClassDict[Arch, ModuleType, LibraryClass] = LibraryInstance
751 if LibraryInstance not in self._LibraryInstances:
752 self._LibraryInstances.append(LibraryInstance)
753
754 # resolve the specific library instance for each class and each module type
755 self._LibraryClasses = tdict(True)
756 for LibraryClass in LibraryClassSet:
757 # try all possible module types
758 for ModuleType in SUP_MODULE_LIST:
759 LibraryInstance = LibraryClassDict[self._Arch, ModuleType, LibraryClass]
760 if LibraryInstance == None:
761 continue
762 self._LibraryClasses[LibraryClass, ModuleType] = LibraryInstance
763
764 # for Edk style library instances, which are listed in different section
765 Macros["EDK_SOURCE"] = GlobalData.gEcpSource
766 RecordList = self._RawData[MODEL_EFI_LIBRARY_INSTANCE, self._Arch]
767 for Record in RecordList:
768 File = PathClass(NormPath(Record[0], Macros), GlobalData.gWorkspace, Arch=self._Arch)
769 LineNo = Record[-1]
770 # check the file validation
771 ErrorCode, ErrorInfo = File.Validate('.inf')
772 if ErrorCode != 0:
773 EdkLogger.error('build', ErrorCode, File=self.MetaFile, Line=LineNo,
774 ExtraData=ErrorInfo)
775 if File not in self._LibraryInstances:
776 self._LibraryInstances.append(File)
777 #
778 # we need the module name as the library class name, so we have
779 # to parse it here. (self._Bdb[] will trigger a file parse if it
780 # hasn't been parsed)
781 #
782 Library = self._Bdb[File, self._Arch, self._Target, self._Toolchain]
783 self._LibraryClasses[Library.BaseName, ':dummy:'] = Library
784 return self._LibraryClasses
785
786 def _ValidatePcd(self, PcdCName, TokenSpaceGuid, Setting, PcdType, LineNo):
787 if self._DecPcds == None:
788
789 FdfInfList = []
790 if GlobalData.gFdfParser:
791 FdfInfList = GlobalData.gFdfParser.Profile.InfList
792
793 PkgSet = set()
794 for Inf in FdfInfList:
795 ModuleFile = PathClass(NormPath(Inf), GlobalData.gWorkspace, Arch=self._Arch)
796 if ModuleFile in self._Modules:
797 continue
798 ModuleData = self._Bdb[ModuleFile, self._Arch, self._Target, self._Toolchain]
799 PkgSet.update(ModuleData.Packages)
800
801 self._DecPcds = GetDeclaredPcd(self, self._Bdb, self._Arch, self._Target, self._Toolchain,PkgSet)
802
803
804 if (PcdCName, TokenSpaceGuid) not in self._DecPcds:
805 EdkLogger.error('build', PARSER_ERROR,
806 "Pcd (%s.%s) defined in DSC is not declared in DEC files. Arch: ['%s']" % (TokenSpaceGuid, PcdCName, self._Arch),
807 File=self.MetaFile, Line=LineNo)
808 ValueList, IsValid, Index = AnalyzeDscPcd(Setting, PcdType, self._DecPcds[PcdCName, TokenSpaceGuid].DatumType)
809 if not IsValid and PcdType not in [MODEL_PCD_FEATURE_FLAG, MODEL_PCD_FIXED_AT_BUILD]:
810 EdkLogger.error('build', FORMAT_INVALID, "Pcd format incorrect.", File=self.MetaFile, Line=LineNo,
811 ExtraData="%s.%s|%s" % (TokenSpaceGuid, PcdCName, Setting))
812 if ValueList[Index] and PcdType not in [MODEL_PCD_FEATURE_FLAG, MODEL_PCD_FIXED_AT_BUILD]:
813 try:
814 ValueList[Index] = ValueExpression(ValueList[Index], GlobalData.gPlatformPcds)(True)
815 except WrnExpression, Value:
816 ValueList[Index] = Value.result
817 except EvaluationException, Excpt:
818 if hasattr(Excpt, 'Pcd'):
819 if Excpt.Pcd in GlobalData.gPlatformOtherPcds:
820 EdkLogger.error('Parser', FORMAT_INVALID, "Cannot use this PCD (%s) in an expression as"
821 " it must be defined in a [PcdsFixedAtBuild] or [PcdsFeatureFlag] section"
822 " of the DSC file" % Excpt.Pcd,
823 File=self.MetaFile, Line=LineNo)
824 else:
825 EdkLogger.error('Parser', FORMAT_INVALID, "PCD (%s) is not defined in DSC file" % Excpt.Pcd,
826 File=self.MetaFile, Line=LineNo)
827 else:
828 EdkLogger.error('Parser', FORMAT_INVALID, "Invalid expression: %s" % str(Excpt),
829 File=self.MetaFile, Line=LineNo)
830 if ValueList[Index] == 'True':
831 ValueList[Index] = '1'
832 elif ValueList[Index] == 'False':
833 ValueList[Index] = '0'
834 if ValueList[Index]:
835 Valid, ErrStr = CheckPcdDatum(self._DecPcds[PcdCName, TokenSpaceGuid].DatumType, ValueList[Index])
836 if not Valid:
837 EdkLogger.error('build', FORMAT_INVALID, ErrStr, File=self.MetaFile, Line=LineNo,
838 ExtraData="%s.%s" % (TokenSpaceGuid, PcdCName))
839 return ValueList
840
841 def _FilterPcdBySkuUsage(self,Pcds):
842 available_sku = self.SkuIdMgr.AvailableSkuIdSet
843 sku_usage = self.SkuIdMgr.SkuUsageType
844 if sku_usage == SkuClass.SINGLE:
845 for pcdname in Pcds:
846 pcd = Pcds[pcdname]
847 Pcds[pcdname].SkuInfoList = {"DEFAULT":pcd.SkuInfoList[skuid] for skuid in pcd.SkuInfoList if skuid in available_sku}
848 if type(pcd) is StructurePcd and pcd.OverrideValues:
849 Pcds[pcdname].OverrideValues = {"DEFAULT":pcd.OverrideValues[skuid] for skuid in pcd.OverrideValues if skuid in available_sku}
850 else:
851 for pcdname in Pcds:
852 pcd = Pcds[pcdname]
853 Pcds[pcdname].SkuInfoList = {skuid:pcd.SkuInfoList[skuid] for skuid in pcd.SkuInfoList if skuid in available_sku}
854 if type(pcd) is StructurePcd and pcd.OverrideValues:
855 Pcds[pcdname].OverrideValues = {skuid:pcd.OverrideValues[skuid] for skuid in pcd.OverrideValues if skuid in available_sku}
856 return Pcds
857 def CompleteHiiPcdsDefaultStores(self,Pcds):
858 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]]]
859 DefaultStoreMgr = DefaultStore(self.DefaultStores)
860 for pcd in HiiPcd:
861 for skuid in pcd.SkuInfoList:
862 skuobj = pcd.SkuInfoList.get(skuid)
863 if "STANDARD" not in skuobj.DefaultStoreDict:
864 PcdDefaultStoreSet = set([defaultstorename for defaultstorename in skuobj.DefaultStoreDict])
865 mindefaultstorename = DefaultStoreMgr.GetMin(PcdDefaultStoreSet)
866 skuobj.DefaultStoreDict['STANDARD'] = copy.deepcopy(skuobj.DefaultStoreDict[mindefaultstorename])
867 return Pcds
868
869 ## Retrieve all PCD settings in platform
870 def _GetPcds(self):
871 if self._Pcds == None:
872 self._Pcds = sdict()
873 self._Pcds.update(self._GetPcd(MODEL_PCD_FIXED_AT_BUILD))
874 self._Pcds.update(self._GetPcd(MODEL_PCD_PATCHABLE_IN_MODULE))
875 self._Pcds.update(self._GetPcd(MODEL_PCD_FEATURE_FLAG))
876 self._Pcds.update(self._GetDynamicPcd(MODEL_PCD_DYNAMIC_DEFAULT))
877 self._Pcds.update(self._GetDynamicHiiPcd(MODEL_PCD_DYNAMIC_HII))
878 self._Pcds.update(self._GetDynamicVpdPcd(MODEL_PCD_DYNAMIC_VPD))
879 self._Pcds.update(self._GetDynamicPcd(MODEL_PCD_DYNAMIC_EX_DEFAULT))
880 self._Pcds.update(self._GetDynamicHiiPcd(MODEL_PCD_DYNAMIC_EX_HII))
881 self._Pcds.update(self._GetDynamicVpdPcd(MODEL_PCD_DYNAMIC_EX_VPD))
882
883 self._Pcds = self.CompletePcdValues(self._Pcds)
884 self._Pcds = self.UpdateStructuredPcds(MODEL_PCD_TYPE_LIST, self._Pcds)
885 self._Pcds = self.CompleteHiiPcdsDefaultStores(self._Pcds)
886 self._Pcds = self._FilterPcdBySkuUsage(self._Pcds)
887 return self._Pcds
888
889 def _dumpPcdInfo(self,Pcds):
890 for pcd in Pcds:
891 pcdobj = Pcds[pcd]
892 if not pcdobj.TokenCName.startswith("Test"):
893 continue
894 for skuid in pcdobj.SkuInfoList:
895 if pcdobj.Type in (self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII],self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]):
896 for storename in pcdobj.SkuInfoList[skuid].DefaultStoreDict:
897 print "PcdCName: %s, SkuName: %s, StoreName: %s, Value: %s" % (".".join((pcdobj.TokenSpaceGuidCName, pcdobj.TokenCName)), skuid,storename,str(pcdobj.SkuInfoList[skuid].DefaultStoreDict[storename]))
898 else:
899 print "PcdCName: %s, SkuName: %s, Value: %s" % (".".join((pcdobj.TokenSpaceGuidCName, pcdobj.TokenCName)), skuid,str(pcdobj.SkuInfoList[skuid].DefaultValue))
900 ## Retrieve [BuildOptions]
901 def _GetBuildOptions(self):
902 if self._BuildOptions == None:
903 self._BuildOptions = sdict()
904 #
905 # Retrieve build option for EDKII and EDK style module
906 #
907 for CodeBase in (EDKII_NAME, EDK_NAME):
908 RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch, CodeBase]
909 for ToolChainFamily, ToolChain, Option, Dummy1, Dummy2, Dummy3, Dummy4,Dummy5 in RecordList:
910 CurKey = (ToolChainFamily, ToolChain, CodeBase)
911 #
912 # Only flags can be appended
913 #
914 if CurKey not in self._BuildOptions or not ToolChain.endswith('_FLAGS') or Option.startswith('='):
915 self._BuildOptions[CurKey] = Option
916 else:
917 self._BuildOptions[CurKey] += ' ' + Option
918 return self._BuildOptions
919
920 def GetBuildOptionsByModuleType(self, Edk, ModuleType):
921 if self._ModuleTypeOptions == None:
922 self._ModuleTypeOptions = sdict()
923 if (Edk, ModuleType) not in self._ModuleTypeOptions:
924 options = sdict()
925 self._ModuleTypeOptions[Edk, ModuleType] = options
926 DriverType = '%s.%s' % (Edk, ModuleType)
927 CommonDriverType = '%s.%s' % ('COMMON', ModuleType)
928 RecordList = self._RawData[MODEL_META_DATA_BUILD_OPTION, self._Arch, DriverType]
929 for ToolChainFamily, ToolChain, Option, Arch, Type, Dummy3, Dummy4,Dummy5 in RecordList:
930 if Type == DriverType or Type == CommonDriverType:
931 Key = (ToolChainFamily, ToolChain, Edk)
932 if Key not in options or not ToolChain.endswith('_FLAGS') or Option.startswith('='):
933 options[Key] = Option
934 else:
935 options[Key] += ' ' + Option
936 return self._ModuleTypeOptions[Edk, ModuleType]
937
938 def GetStructurePcdInfo(self, PcdSet):
939 structure_pcd_data = {}
940 for item in PcdSet:
941 if (item[0],item[1]) not in structure_pcd_data:
942 structure_pcd_data[(item[0],item[1])] = []
943 structure_pcd_data[(item[0],item[1])].append(item)
944
945 return structure_pcd_data
946
947 def UpdateStructuredPcds(self, TypeList, AllPcds):
948 Pcds = AllPcds
949 DefaultStoreMgr = DefaultStore(self.DefaultStores)
950 SkuIds = set([skuid for pcdobj in AllPcds.values() for skuid in pcdobj.SkuInfoList.keys()])
951 DefaultStores = set([storename for pcdobj in AllPcds.values() for skuobj in pcdobj.SkuInfoList.values() for storename in skuobj.DefaultStoreDict.keys()])
952
953 S_PcdSet = []
954 # Find out all possible PCD candidates for self._Arch
955 RecordList = []
956
957 for Type in TypeList:
958 RecordList.extend(self._RawData[Type, self._Arch])
959
960 for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, default_store, Dummy4,Dummy5 in RecordList:
961 SkuName = SkuName.upper()
962 default_store = default_store.upper()
963 SkuName = 'DEFAULT' if SkuName == 'COMMON' else SkuName
964 if SkuName not in SkuIds:
965 continue
966
967 if SkuName in SkuIds and "." in TokenSpaceGuid:
968 S_PcdSet.append(( TokenSpaceGuid.split(".")[0],TokenSpaceGuid.split(".")[1], PcdCName,SkuName, default_store,Dummy5, AnalyzePcdExpression(Setting)[0]))
969
970 # handle pcd value override
971 StrPcdSet = self.GetStructurePcdInfo(S_PcdSet)
972 S_pcd_set = {}
973 for str_pcd in StrPcdSet:
974 str_pcd_obj = Pcds.get((str_pcd[1], str_pcd[0]), None)
975 str_pcd_dec = self._DecPcds.get((str_pcd[1], str_pcd[0]), None)
976 if str_pcd_dec:
977 str_pcd_obj_str = StructurePcd()
978 str_pcd_obj_str.copy(str_pcd_dec)
979 if str_pcd_obj:
980 str_pcd_obj_str.copy(str_pcd_obj)
981 if str_pcd_obj.DefaultValue:
982 str_pcd_obj_str.DefaultFromDSC = str_pcd_obj.DefaultValue
983 for str_pcd_data in StrPcdSet[str_pcd]:
984 if str_pcd_data[3] in SkuIds:
985 str_pcd_obj_str.AddOverrideValue(str_pcd_data[2], str(str_pcd_data[6]), 'DEFAULT' if str_pcd_data[3] == 'COMMON' else str_pcd_data[3],'STANDARD' if str_pcd_data[4] == 'COMMON' else str_pcd_data[4], self.MetaFile.File,LineNo=str_pcd_data[5])
986 S_pcd_set[str_pcd[1], str_pcd[0]] = str_pcd_obj_str
987 else:
988 EdkLogger.error('build', PARSER_ERROR,
989 "Pcd (%s.%s) defined in DSC is not declared in DEC files. Arch: ['%s']" % (str_pcd[0], str_pcd[1], self._Arch),
990 File=self.MetaFile,Line = StrPcdSet[str_pcd][0][5])
991 # Add the Structure PCD that only defined in DEC, don't have override in DSC file
992 for Pcd in self._DecPcds:
993 if type (self._DecPcds[Pcd]) is StructurePcd:
994 if Pcd not in S_pcd_set:
995 str_pcd_obj_str = StructurePcd()
996 str_pcd_obj_str.copy(self._DecPcds[Pcd])
997 str_pcd_obj = Pcds.get(Pcd, None)
998 if str_pcd_obj:
999 str_pcd_obj_str.copy(str_pcd_obj)
1000 if str_pcd_obj.DefaultValue:
1001 str_pcd_obj_str.DefaultFromDSC = str_pcd_obj.DefaultValue
1002 S_pcd_set[Pcd] = str_pcd_obj_str
1003 if S_pcd_set:
1004 GlobalData.gStructurePcd[self.Arch] = S_pcd_set
1005 for stru_pcd in S_pcd_set.values():
1006 if stru_pcd.Type not in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_DEFAULT],
1007 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII],
1008 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_VPD],
1009 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_DEFAULT],
1010 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII],
1011 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_VPD]]:
1012 continue
1013 if stru_pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:
1014 for skuid in SkuIds:
1015 nextskuid = skuid
1016 NoDefault = False
1017 if skuid not in stru_pcd.SkuOverrideValues:
1018 while nextskuid not in stru_pcd.SkuOverrideValues:
1019 if nextskuid == "DEFAULT":
1020 NoDefault = True
1021 break
1022 nextskuid = self.SkuIdMgr.GetNextSkuId(nextskuid)
1023 stru_pcd.SkuOverrideValues[skuid] = {}
1024 if NoDefault:
1025 continue
1026 PcdDefaultStoreSet = set([defaultstorename for defaultstorename in stru_pcd.SkuOverrideValues[nextskuid]])
1027 mindefaultstorename = DefaultStoreMgr.GetMin(PcdDefaultStoreSet)
1028
1029 for defaultstoreid in DefaultStores:
1030 if defaultstoreid not in stru_pcd.SkuOverrideValues[skuid]:
1031 stru_pcd.SkuOverrideValues[skuid][defaultstoreid] = copy.deepcopy(stru_pcd.SkuOverrideValues[nextskuid][mindefaultstorename])
1032 for skuid in SkuIds:
1033 if skuid in stru_pcd.SkuOverrideValues:
1034 continue
1035 nextskuid = self.SkuIdMgr.GetNextSkuId(skuid)
1036 NoDefault = False
1037 while nextskuid not in stru_pcd.SkuOverrideValues:
1038 if nextskuid == "DEFAULT":
1039 NoDefault = True
1040 break
1041 nextskuid = self.SkuIdMgr.GetNextSkuId(nextskuid)
1042 stru_pcd.SkuOverrideValues[skuid] = copy.deepcopy(stru_pcd.SkuOverrideValues[nextskuid]) if not NoDefault else copy.deepcopy({defaultstorename: stru_pcd.DefaultValues for defaultstorename in DefaultStores})
1043 Str_Pcd_Values = self.GenerateByteArrayValue(S_pcd_set)
1044 if Str_Pcd_Values:
1045 for (skuname,StoreName,PcdGuid,PcdName,PcdValue) in Str_Pcd_Values:
1046 str_pcd_obj = S_pcd_set.get((PcdName, PcdGuid))
1047 if str_pcd_obj is None:
1048 raise
1049 if str_pcd_obj.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII],
1050 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:
1051 if skuname not in str_pcd_obj.SkuInfoList:
1052 str_pcd_obj.SkuInfoList[skuname] = SkuInfoClass(SkuIdName=skuname, SkuId=self.SkuIds[skuname][0], HiiDefaultValue=PcdValue, DefaultStore = {StoreName:PcdValue})
1053 else:
1054 str_pcd_obj.SkuInfoList[skuname].HiiDefaultValue = PcdValue
1055 str_pcd_obj.SkuInfoList[skuname].DefaultStoreDict.update({StoreName:PcdValue})
1056 elif str_pcd_obj.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_FIXED_AT_BUILD],
1057 self._PCD_TYPE_STRING_[MODEL_PCD_PATCHABLE_IN_MODULE]]:
1058 if skuname in (self.SkuIdMgr.SystemSkuId, 'DEFAULT', 'COMMON'):
1059 str_pcd_obj.DefaultValue = PcdValue
1060 else:
1061 if skuname not in str_pcd_obj.SkuInfoList:
1062 str_pcd_obj.SkuInfoList[skuname] = SkuInfoClass(SkuIdName=skuname, SkuId=self.SkuIds[skuname][0], DefaultValue=PcdValue)
1063 else:
1064 str_pcd_obj.SkuInfoList[skuname].DefaultValue = PcdValue
1065 for str_pcd_obj in S_pcd_set.values():
1066 if str_pcd_obj.Type not in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII],
1067 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:
1068 continue
1069 PcdDefaultStoreSet = set([defaultstorename for skuobj in str_pcd_obj.SkuInfoList.values() for defaultstorename in skuobj.DefaultStoreDict])
1070 DefaultStoreObj = DefaultStore(self._GetDefaultStores())
1071 mindefaultstorename = DefaultStoreObj.GetMin(PcdDefaultStoreSet)
1072 str_pcd_obj.SkuInfoList[self.SkuIdMgr.SystemSkuId].HiiDefaultValue = str_pcd_obj.SkuInfoList[self.SkuIdMgr.SystemSkuId].DefaultStoreDict[mindefaultstorename]
1073
1074 for str_pcd_obj in S_pcd_set.values():
1075
1076 str_pcd_obj.MaxDatumSize = self.GetStructurePcdMaxSize(str_pcd_obj)
1077 Pcds[str_pcd_obj.TokenCName, str_pcd_obj.TokenSpaceGuidCName] = str_pcd_obj
1078
1079 return Pcds
1080
1081 ## Retrieve non-dynamic PCD settings
1082 #
1083 # @param Type PCD type
1084 #
1085 # @retval a dict object contains settings of given PCD type
1086 #
1087 def _GetPcd(self, Type):
1088 Pcds = sdict()
1089 #
1090 # tdict is a special dict kind of type, used for selecting correct
1091 # PCD settings for certain ARCH
1092 #
1093 AvailableSkuIdSet = copy.copy(self.SkuIds)
1094
1095 PcdDict = tdict(True, 3)
1096 PcdSet = set()
1097 # Find out all possible PCD candidates for self._Arch
1098 RecordList = self._RawData[Type, self._Arch]
1099 PcdValueDict = sdict()
1100 for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, Dummy3, Dummy4,Dummy5 in RecordList:
1101 SkuName = SkuName.upper()
1102 SkuName = 'DEFAULT' if SkuName == 'COMMON' else SkuName
1103 if SkuName not in AvailableSkuIdSet:
1104 EdkLogger.error('build ', PARAMETER_INVALID, 'Sku %s is not defined in [SkuIds] section' % SkuName,
1105 File=self.MetaFile, Line=Dummy5)
1106 if SkuName in (self.SkuIdMgr.SystemSkuId, 'DEFAULT', 'COMMON'):
1107 if "." not in TokenSpaceGuid:
1108 PcdSet.add((PcdCName, TokenSpaceGuid, SkuName, Dummy4))
1109 PcdDict[Arch, PcdCName, TokenSpaceGuid, SkuName] = Setting
1110
1111 for PcdCName, TokenSpaceGuid, SkuName, Dummy4 in PcdSet:
1112 Setting = PcdDict[self._Arch, PcdCName, TokenSpaceGuid, SkuName]
1113 if Setting == None:
1114 continue
1115 PcdValue, DatumType, MaxDatumSize = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4)
1116 if (PcdCName, TokenSpaceGuid) in PcdValueDict:
1117 PcdValueDict[PcdCName, TokenSpaceGuid][SkuName] = (PcdValue, DatumType, MaxDatumSize)
1118 else:
1119 PcdValueDict[PcdCName, TokenSpaceGuid] = {SkuName:(PcdValue, DatumType, MaxDatumSize)}
1120
1121 PcdsKeys = PcdValueDict.keys()
1122 for PcdCName, TokenSpaceGuid in PcdsKeys:
1123
1124 PcdSetting = PcdValueDict[PcdCName, TokenSpaceGuid]
1125 PcdValue = None
1126 DatumType = None
1127 MaxDatumSize = None
1128 if 'COMMON' in PcdSetting:
1129 PcdValue, DatumType, MaxDatumSize = PcdSetting['COMMON']
1130 if 'DEFAULT' in PcdSetting:
1131 PcdValue, DatumType, MaxDatumSize = PcdSetting['DEFAULT']
1132 if self.SkuIdMgr.SystemSkuId in PcdSetting:
1133 PcdValue, DatumType, MaxDatumSize = PcdSetting[self.SkuIdMgr.SystemSkuId]
1134
1135 Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject(
1136 PcdCName,
1137 TokenSpaceGuid,
1138 self._PCD_TYPE_STRING_[Type],
1139 DatumType,
1140 PcdValue,
1141 '',
1142 MaxDatumSize,
1143 {},
1144 False,
1145 None,
1146 IsDsc=True)
1147
1148
1149 return Pcds
1150
1151 def __UNICODE2OCTList(self,Value):
1152 Value = Value.strip()
1153 Value = Value[2:-1]
1154 List = []
1155 for Item in Value:
1156 Temp = '%04X' % ord(Item)
1157 List.append('0x' + Temp[2:4])
1158 List.append('0x' + Temp[0:2])
1159 List.append('0x00')
1160 List.append('0x00')
1161 return List
1162 def __STRING2OCTList(self,Value):
1163 OCTList = []
1164 Value = Value.strip('"')
1165 for char in Value:
1166 Temp = '%02X' % ord(char)
1167 OCTList.append('0x' + Temp)
1168 OCTList.append('0x00')
1169 return OCTList
1170
1171 def GetStructurePcdMaxSize(self, str_pcd):
1172 pcd_default_value = str_pcd.DefaultValue
1173 sku_values = [skuobj.HiiDefaultValue if str_pcd.Type in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]] else skuobj.DefaultValue for skuobj in str_pcd.SkuInfoList.values()]
1174 sku_values.append(pcd_default_value)
1175
1176 def get_length(value):
1177 Value = value.strip()
1178 if Value.startswith('GUID') and Value.endswith(')'):
1179 return 16
1180 if Value.startswith('L"') and Value.endswith('"'):
1181 return len(Value[2:-1])
1182 if Value[0] == '"' and Value[-1] == '"':
1183 return len(Value) - 2
1184 if Value[0] == '{' and Value[-1] == '}':
1185 return len(Value.split(","))
1186 if Value.startswith("L'") and Value.endswith("'") and len(list(Value[2:-1])) > 1:
1187 return len(list(Value[2:-1]))
1188 if Value[0] == "'" and Value[-1] == "'" and len(list(Value[1:-1])) > 1:
1189 return len(Value) - 2
1190 return len(Value)
1191
1192 return str(max([pcd_size for pcd_size in [get_length(item) for item in sku_values]]))
1193
1194 def IsFieldValueAnArray (self, Value):
1195 Value = Value.strip()
1196 if Value.startswith('GUID') and Value.endswith(')'):
1197 return True
1198 if Value.startswith('L"') and Value.endswith('"') and len(list(Value[2:-1])) > 1:
1199 return True
1200 if Value[0] == '"' and Value[-1] == '"' and len(list(Value[1:-1])) > 1:
1201 return True
1202 if Value[0] == '{' and Value[-1] == '}':
1203 return True
1204 if Value.startswith("L'") and Value.endswith("'") and len(list(Value[2:-1])) > 1:
1205 print 'foo = ', list(Value[2:-1])
1206 return True
1207 if Value[0] == "'" and Value[-1] == "'" and len(list(Value[1:-1])) > 1:
1208 print 'bar = ', list(Value[1:-1])
1209 return True
1210 return False
1211
1212 def ExecuteCommand (self, Command):
1213 try:
1214 Process = subprocess.Popen(Command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
1215 except:
1216 print 'ERROR: Can not execute command:', Command
1217 sys.exit(1)
1218 Result = Process.communicate()
1219 if Process.returncode <> 0:
1220 print 'ERROR: Can not collect output from command:', Command
1221 return Result[0], Result[1]
1222
1223 def IntToCString(self, Value, ValueSize):
1224 Result = '"'
1225 if not isinstance (Value, str):
1226 for Index in range(0, ValueSize):
1227 Result = Result + '\\x%02x' % (Value & 0xff)
1228 Value = Value >> 8
1229 Result = Result + '"'
1230 return Result
1231
1232 def GenerateInitializeFunc(self, SkuName, DefaultStoreName, Pcd, InitByteValue, CApp):
1233 OverrideValues = {DefaultStoreName:""}
1234 if Pcd.SkuOverrideValues:
1235 OverrideValues = Pcd.SkuOverrideValues[SkuName]
1236 for DefaultStoreName in OverrideValues.keys():
1237 CApp = CApp + 'void\n'
1238 CApp = CApp + 'Initialize_%s_%s_%s_%s(\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)
1239 CApp = CApp + ' void\n'
1240 CApp = CApp + ' )\n'
1241 CApp = CApp + '{\n'
1242 CApp = CApp + ' UINT32 Size;\n'
1243 CApp = CApp + ' UINT32 FieldSize;\n'
1244 CApp = CApp + ' UINT8 *Value;\n'
1245 CApp = CApp + ' UINT32 OriginalSize;\n'
1246 CApp = CApp + ' VOID *OriginalPcd;\n'
1247 CApp = CApp + ' %s *Pcd;\n' % (Pcd.DatumType)
1248 CApp = CApp + '\n'
1249
1250 Pcd.DefaultValue = Pcd.DefaultValue.strip()
1251 PcdDefaultValue = StringToArray(Pcd.DefaultValue)
1252
1253 InitByteValue += '%s.%s.%s.%s|%s|%s\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName, Pcd.DatumType, PcdDefaultValue)
1254
1255 #
1256 # Get current PCD value and size
1257 #
1258 CApp = CApp + ' OriginalPcd = PcdGetPtr (%s, %s, %s, %s, &OriginalSize);\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)
1259
1260 #
1261 # Determine the size of the PCD. For simple structures, sizeof(TYPE) provides
1262 # the correct value. For structures with a flexible array member, the flexible
1263 # array member is detected, and the size is based on the highest index used with
1264 # the flexible array member. The flexible array member must be the last field
1265 # in a structure. The size formula for this case is:
1266 # OFFSET_OF(FlexbleArrayField) + sizeof(FlexibleArray[0]) * (HighestIndex + 1)
1267 #
1268 CApp = CApp + ' Size = sizeof(%s);\n' % (Pcd.DatumType)
1269 for FieldList in [Pcd.DefaultValues, OverrideValues.get(DefaultStoreName)]:
1270 if not FieldList:
1271 continue
1272 for FieldName in FieldList:
1273 FieldName = "." + FieldName
1274 IsArray = self.IsFieldValueAnArray(FieldList[FieldName.strip(".")][0])
1275 if IsArray:
1276 Value, ValueSize = ParseFieldValue (FieldList[FieldName.strip(".")][0])
1277 CApp = CApp + ' __FLEXIBLE_SIZE(Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s));\n' % (Pcd.DatumType, FieldName.strip("."), ValueSize, Pcd.DatumType, FieldName.strip("."));
1278 else:
1279 NewFieldName = ''
1280 while '[' in FieldName:
1281 NewFieldName = NewFieldName + FieldName.split('[', 1)[0] + '[0]'
1282 ArrayIndex = int(FieldName.split('[', 1)[1].split(']', 1)[0])
1283 FieldName = FieldName.split(']', 1)[1]
1284 FieldName = NewFieldName + FieldName
1285 while '[' in FieldName:
1286 FieldName = FieldName.rsplit('[', 1)[0]
1287 CApp = CApp + ' __FLEXIBLE_SIZE(Size, %s, %s, %d);\n' % (Pcd.DatumType, FieldName.strip("."), ArrayIndex + 1)
1288
1289 #
1290 # Allocate and zero buffer for the PCD
1291 # Must handle cases where current value is smaller, larger, or same size
1292 # Always keep that larger one as the current size
1293 #
1294 CApp = CApp + ' Size = (OriginalSize > Size ? OriginalSize : Size);\n'
1295 CApp = CApp + ' Pcd = (%s *)malloc (Size);\n' % (Pcd.DatumType)
1296 CApp = CApp + ' memset (Pcd, 0, Size);\n'
1297
1298 #
1299 # Copy current PCD value into allocated buffer.
1300 #
1301 CApp = CApp + ' memcpy (Pcd, OriginalPcd, OriginalSize);\n'
1302
1303 #
1304 # Assign field values in PCD
1305 #
1306 for FieldList in [Pcd.DefaultValues, Pcd.DefaultFromDSC,OverrideValues.get(DefaultStoreName)]:
1307 if not FieldList:
1308 continue
1309 if Pcd.DefaultFromDSC and FieldList == Pcd.DefaultFromDSC:
1310 IsArray = self.IsFieldValueAnArray(FieldList)
1311 Value, ValueSize = ParseFieldValue (FieldList)
1312 if isinstance(Value, str):
1313 CApp = CApp + ' Pcd = %s; // From DSC Default Value %s\n' % (Value, Pcd.DefaultFromDSC)
1314 elif IsArray:
1315 #
1316 # Use memcpy() to copy value into field
1317 #
1318 CApp = CApp + ' Value = %s; // From DSC Default Value %s\n' % (self.IntToCString(Value, ValueSize), Pcd.DefaultFromDSC)
1319 CApp = CApp + ' memcpy (Pcd, Value, %d);\n' % (ValueSize)
1320 continue
1321
1322 for FieldName in FieldList:
1323 IsArray = self.IsFieldValueAnArray(FieldList[FieldName][0])
1324 try:
1325 Value, ValueSize = ParseFieldValue (FieldList[FieldName][0])
1326 except Exception:
1327 print FieldList[FieldName][0]
1328 if isinstance(Value, str):
1329 CApp = CApp + ' Pcd->%s = %s; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])
1330 elif IsArray:
1331 #
1332 # Use memcpy() to copy value into field
1333 #
1334 CApp = CApp + ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd.DatumType, FieldName)
1335 CApp = CApp + ' Value = %s; // From %s Line %d Value %s\n' % (self.IntToCString(Value, ValueSize), FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])
1336 CApp = CApp + ' memcpy (&Pcd->%s[0], Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName, ValueSize, ValueSize)
1337 else:
1338 if ValueSize > 4:
1339 CApp = CApp + ' Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])
1340 else:
1341 CApp = CApp + ' Pcd->%s = %d; // From %s Line %d Value %s\n' % (FieldName, Value, FieldList[FieldName][1], FieldList[FieldName][2], FieldList[FieldName][0])
1342
1343 #
1344 # Set new PCD value and size
1345 #
1346 CApp = CApp + ' PcdSetPtr (%s, %s, %s, %s, Size, (UINT8 *)Pcd);\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)
1347
1348 #
1349 # Free PCD
1350 #
1351 CApp = CApp + ' free (Pcd);\n'
1352 CApp = CApp + '}\n'
1353 CApp = CApp + '\n'
1354 return InitByteValue, CApp
1355
1356 def GenerateByteArrayValue (self, StructuredPcds):
1357 #
1358 # Generate/Compile/Run C application to determine if there are any flexible array members
1359 #
1360 if not StructuredPcds:
1361 return
1362
1363 InitByteValue = ""
1364 CApp = PcdMainCHeader
1365
1366 Includes = {}
1367 for PcdName in StructuredPcds:
1368 Pcd = StructuredPcds[PcdName]
1369 IncludeFile = Pcd.StructuredPcdIncludeFile
1370 if IncludeFile not in Includes:
1371 Includes[IncludeFile] = True
1372 CApp = CApp + '#include <%s>\n' % (IncludeFile)
1373 CApp = CApp + '\n'
1374
1375 for PcdName in StructuredPcds:
1376 Pcd = StructuredPcds[PcdName]
1377 if not Pcd.SkuOverrideValues:
1378 InitByteValue, CApp = self.GenerateInitializeFunc(self.SkuIdMgr.SystemSkuId, 'STANDARD', Pcd, InitByteValue, CApp)
1379 else:
1380 for SkuName in Pcd.SkuOverrideValues:
1381 for DefaultStoreName in Pcd.DefaultStoreName:
1382 Pcd = StructuredPcds[PcdName]
1383 InitByteValue, CApp = self.GenerateInitializeFunc(SkuName, DefaultStoreName, Pcd, InitByteValue, CApp)
1384
1385 CApp = CApp + 'VOID\n'
1386 CApp = CApp + 'PcdEntryPoint(\n'
1387 CApp = CApp + ' VOID\n'
1388 CApp = CApp + ' )\n'
1389 CApp = CApp + '{\n'
1390 for Pcd in StructuredPcds.values():
1391 if not Pcd.SkuOverrideValues:
1392 CApp = CApp + ' Initialize_%s_%s_%s_%s();\n' % (self.SkuIdMgr.SystemSkuId, 'STANDARD', Pcd.TokenSpaceGuidCName, Pcd.TokenCName)
1393 else:
1394 for SkuName in Pcd.SkuOverrideValues:
1395 for DefaultStoreName in Pcd.SkuOverrideValues[SkuName]:
1396 CApp = CApp + ' Initialize_%s_%s_%s_%s();\n' % (SkuName, DefaultStoreName, Pcd.TokenSpaceGuidCName, Pcd.TokenCName)
1397 CApp = CApp + '}\n'
1398
1399 CApp = CApp + PcdMainCEntry + '\n'
1400
1401 if not os.path.exists(self.OutputPath):
1402 os.makedirs(self.OutputPath)
1403 CAppBaseFileName = os.path.join(self.OutputPath, PcdValueInitName)
1404 File = open (CAppBaseFileName + '.c', 'w')
1405 File.write(CApp)
1406 File.close()
1407
1408 MakeApp = PcdMakefileHeader
1409 if sys.platform == "win32":
1410 MakeApp = MakeApp + 'ARCH = IA32\nAPPNAME = %s\n' % (PcdValueInitName) + 'OBJECTS = %s\%s.obj\n' % (self.OutputPath, PcdValueInitName) + 'INC = '
1411 else:
1412 MakeApp = MakeApp + PcdGccMakefile
1413 MakeApp = MakeApp + 'APPNAME = %s\n' % (PcdValueInitName) + 'OBJECTS = %s/%s.o\n' % (self.OutputPath, PcdValueInitName) + \
1414 'include $(MAKEROOT)/Makefiles/app.makefile\n' + 'BUILD_CFLAGS += -Wno-error\n' + 'INCLUDE +='
1415
1416 PlatformInc = {}
1417 for Cache in self._Bdb._CACHE_.values():
1418 if Cache.MetaFile.Ext.lower() != '.dec':
1419 continue
1420 if Cache.Includes:
1421 if str(Cache.MetaFile.Path) not in PlatformInc:
1422 PlatformInc[str(Cache.MetaFile.Path)] = Cache.Includes
1423
1424 PcdDependDEC = []
1425 for Pcd in StructuredPcds.values():
1426 for PackageDec in Pcd.PackageDecs:
1427 Package = os.path.normpath(mws.join(GlobalData.gWorkspace, PackageDec))
1428 if not os.path.exists(Package):
1429 EdkLogger.error('Build', RESOURCE_NOT_AVAILABLE, "The dependent Package %s of PCD %s.%s is not exist." % (PackageDec, Pcd.TokenSpaceGuidCName, Pcd.TokenCName))
1430 if Package not in PcdDependDEC:
1431 PcdDependDEC.append(Package)
1432
1433 if PlatformInc and PcdDependDEC:
1434 for pkg in PcdDependDEC:
1435 if pkg in PlatformInc:
1436 for inc in PlatformInc[pkg]:
1437 MakeApp += '-I' + str(inc) + ' '
1438 MakeApp = MakeApp + '\n'
1439 if sys.platform == "win32":
1440 MakeApp = MakeApp + PcdMakefileEnd
1441 MakeFileName = os.path.join(self.OutputPath, 'Makefile')
1442 File = open (MakeFileName, 'w')
1443 File.write(MakeApp)
1444 File.close()
1445
1446 InputValueFile = os.path.join(self.OutputPath, 'Input.txt')
1447 OutputValueFile = os.path.join(self.OutputPath, 'Output.txt')
1448 File = open (InputValueFile, 'w')
1449 File.write(InitByteValue)
1450 File.close()
1451
1452 if sys.platform == "win32":
1453 StdOut, StdErr = self.ExecuteCommand ('nmake clean & nmake -f %s' % (MakeFileName))
1454 else:
1455 StdOut, StdErr = self.ExecuteCommand ('make clean & make -f %s' % (MakeFileName))
1456 Messages = StdOut.split('\r')
1457
1458 PcdValueInitExe = PcdValueInitName
1459 if not sys.platform == "win32":
1460 PcdValueInitExe = os.path.join(os.getenv("EDK_TOOLS_PATH"), 'Source', 'C', 'bin', PcdValueInitName)
1461
1462 StdOut, StdErr = self.ExecuteCommand (PcdValueInitExe + ' -i %s -o %s' % (InputValueFile, OutputValueFile))
1463 File = open (OutputValueFile, 'r')
1464 FileBuffer = File.readlines()
1465 File.close()
1466
1467 StructurePcdSet = []
1468 for Pcd in FileBuffer:
1469 PcdValue = Pcd.split ('|')
1470 PcdInfo = PcdValue[0].split ('.')
1471 StructurePcdSet.append((PcdInfo[0],PcdInfo[1], PcdInfo[2], PcdInfo[3], PcdValue[2].strip()))
1472 return StructurePcdSet
1473
1474 ## Retrieve dynamic PCD settings
1475 #
1476 # @param Type PCD type
1477 #
1478 # @retval a dict object contains settings of given PCD type
1479 #
1480 def _GetDynamicPcd(self, Type):
1481
1482
1483 Pcds = sdict()
1484 #
1485 # tdict is a special dict kind of type, used for selecting correct
1486 # PCD settings for certain ARCH and SKU
1487 #
1488 PcdDict = tdict(True, 4)
1489 PcdList = []
1490 # Find out all possible PCD candidates for self._Arch
1491 RecordList = self._RawData[Type, self._Arch]
1492 AvailableSkuIdSet = copy.copy(self.SkuIds)
1493
1494
1495 for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, Dummy3, Dummy4,Dummy5 in RecordList:
1496 SkuName = SkuName.upper()
1497 SkuName = 'DEFAULT' if SkuName == 'COMMON' else SkuName
1498 if SkuName not in AvailableSkuIdSet:
1499 EdkLogger.error('build', PARAMETER_INVALID, 'Sku %s is not defined in [SkuIds] section' % SkuName,
1500 File=self.MetaFile, Line=Dummy5)
1501 if "." not in TokenSpaceGuid:
1502 PcdList.append((PcdCName, TokenSpaceGuid, SkuName, Dummy4))
1503 PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid] = Setting
1504
1505 # Remove redundant PCD candidates, per the ARCH and SKU
1506 for PcdCName, TokenSpaceGuid, SkuName, Dummy4 in PcdList:
1507
1508 Setting = PcdDict[self._Arch, SkuName, PcdCName, TokenSpaceGuid]
1509 if Setting == None:
1510 continue
1511
1512 PcdValue, DatumType, MaxDatumSize = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4)
1513 SkuInfo = SkuInfoClass(SkuName, self.SkuIds[SkuName][0], '', '', '', '', '', PcdValue)
1514 if (PcdCName, TokenSpaceGuid) in Pcds.keys():
1515 pcdObject = Pcds[PcdCName, TokenSpaceGuid]
1516 pcdObject.SkuInfoList[SkuName] = SkuInfo
1517 if MaxDatumSize.strip():
1518 CurrentMaxSize = int(MaxDatumSize.strip(), 0)
1519 else:
1520 CurrentMaxSize = 0
1521 if pcdObject.MaxDatumSize:
1522 PcdMaxSize = int(pcdObject.MaxDatumSize, 0)
1523 else:
1524 PcdMaxSize = 0
1525 if CurrentMaxSize > PcdMaxSize:
1526 pcdObject.MaxDatumSize = str(CurrentMaxSize)
1527 else:
1528 Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject(
1529 PcdCName,
1530 TokenSpaceGuid,
1531 self._PCD_TYPE_STRING_[Type],
1532 DatumType,
1533 PcdValue,
1534 '',
1535 MaxDatumSize,
1536 {SkuName : SkuInfo},
1537 False,
1538 None,
1539 IsDsc=True)
1540
1541 for pcd in Pcds.values():
1542 pcdDecObject = self._DecPcds[pcd.TokenCName, pcd.TokenSpaceGuidCName]
1543 # Only fix the value while no value provided in DSC file.
1544 for sku in pcd.SkuInfoList.values():
1545 if (sku.DefaultValue == "" or sku.DefaultValue==None):
1546 sku.DefaultValue = pcdDecObject.DefaultValue
1547 if 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' not in pcd.SkuInfoList.keys():
1548 valuefromDec = pcdDecObject.DefaultValue
1549 SkuInfo = SkuInfoClass('DEFAULT', '0', '', '', '', '', '', valuefromDec)
1550 pcd.SkuInfoList['DEFAULT'] = SkuInfo
1551 elif 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys():
1552 pcd.SkuInfoList['DEFAULT'] = pcd.SkuInfoList['COMMON']
1553 del(pcd.SkuInfoList['COMMON'])
1554 elif 'DEFAULT' in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys():
1555 del(pcd.SkuInfoList['COMMON'])
1556 if self.SkuIdMgr.SkuUsageType == self.SkuIdMgr.SINGLE:
1557 if 'DEFAULT' in pcd.SkuInfoList.keys() and self.SkuIdMgr.SystemSkuId not in pcd.SkuInfoList.keys():
1558 pcd.SkuInfoList[self.SkuIdMgr.SystemSkuId] = pcd.SkuInfoList['DEFAULT']
1559 del(pcd.SkuInfoList['DEFAULT'])
1560
1561 return Pcds
1562
1563 def CompareVarAttr(self, Attr1, Attr2):
1564 if not Attr1 or not Attr2: # for empty string
1565 return True
1566 Attr1s = [attr.strip() for attr in Attr1.split(",")]
1567 Attr1Set = set(Attr1s)
1568 Attr2s = [attr.strip() for attr in Attr2.split(",")]
1569 Attr2Set = set(Attr2s)
1570 if Attr2Set == Attr1Set:
1571 return True
1572 else:
1573 return False
1574 def CompletePcdValues(self,PcdSet):
1575 Pcds = {}
1576 DefaultStoreObj = DefaultStore(self._GetDefaultStores())
1577 SkuIds = set([(skuid,skuobj.SkuId) for pcdobj in PcdSet.values() for skuid,skuobj in pcdobj.SkuInfoList.items()])
1578 DefaultStores = set([storename for pcdobj in PcdSet.values() for skuobj in pcdobj.SkuInfoList.values() for storename in skuobj.DefaultStoreDict.keys()])
1579 for PcdCName, TokenSpaceGuid in PcdSet:
1580 PcdObj = PcdSet[(PcdCName, TokenSpaceGuid)]
1581 if PcdObj.Type not in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_DEFAULT],
1582 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII],
1583 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_VPD],
1584 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_DEFAULT],
1585 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII],
1586 self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_VPD]]:
1587 Pcds[PcdCName, TokenSpaceGuid]= PcdObj
1588 continue
1589 PcdType = PcdObj.Type
1590 if PcdType in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:
1591 for skuid in PcdObj.SkuInfoList:
1592 skuobj = PcdObj.SkuInfoList[skuid]
1593 mindefaultstorename = DefaultStoreObj.GetMin(set([defaultstorename for defaultstorename in skuobj.DefaultStoreDict]))
1594 for defaultstorename in DefaultStores:
1595 if defaultstorename not in skuobj.DefaultStoreDict:
1596 skuobj.DefaultStoreDict[defaultstorename] = copy.deepcopy(skuobj.DefaultStoreDict[mindefaultstorename])
1597 skuobj.HiiDefaultValue = skuobj.DefaultStoreDict[mindefaultstorename]
1598 for skuname,skuid in SkuIds:
1599 if skuname not in PcdObj.SkuInfoList:
1600 nextskuid = self.SkuIdMgr.GetNextSkuId(skuname)
1601 while nextskuid not in PcdObj.SkuInfoList:
1602 nextskuid = self.SkuIdMgr.GetNextSkuId(nextskuid)
1603 PcdObj.SkuInfoList[skuname] = copy.deepcopy(PcdObj.SkuInfoList[nextskuid])
1604 PcdObj.SkuInfoList[skuname].SkuId = skuid
1605 PcdObj.SkuInfoList[skuname].SkuIdName = skuname
1606 if PcdType in [self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_HII], self._PCD_TYPE_STRING_[MODEL_PCD_DYNAMIC_EX_HII]]:
1607 PcdObj.DefaultValue = PcdObj.SkuInfoList.values()[0].HiiDefaultValue if self.SkuIdMgr.SkuUsageType == self.SkuIdMgr.SINGLE else PcdObj.SkuInfoList["DEFAULT"].HiiDefaultValue
1608 Pcds[PcdCName, TokenSpaceGuid]= PcdObj
1609 return Pcds
1610 ## Retrieve dynamic HII PCD settings
1611 #
1612 # @param Type PCD type
1613 #
1614 # @retval a dict object contains settings of given PCD type
1615 #
1616 def _GetDynamicHiiPcd(self, Type):
1617
1618 VariableAttrs = {}
1619
1620 Pcds = sdict()
1621 #
1622 # tdict is a special dict kind of type, used for selecting correct
1623 # PCD settings for certain ARCH and SKU
1624 #
1625 PcdDict = tdict(True, 5)
1626 PcdSet = set()
1627 RecordList = self._RawData[Type, self._Arch]
1628 # Find out all possible PCD candidates for self._Arch
1629 AvailableSkuIdSet = copy.copy(self.SkuIds)
1630 DefaultStoresDefine = self._GetDefaultStores()
1631
1632 for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, DefaultStore, Dummy4,Dummy5 in RecordList:
1633 SkuName = SkuName.upper()
1634 SkuName = 'DEFAULT' if SkuName == 'COMMON' else SkuName
1635 DefaultStore = DefaultStore.upper()
1636 if DefaultStore == "COMMON":
1637 DefaultStore = "STANDARD"
1638 if SkuName not in AvailableSkuIdSet:
1639 EdkLogger.error('build', PARAMETER_INVALID, 'Sku %s is not defined in [SkuIds] section' % SkuName,
1640 File=self.MetaFile, Line=Dummy5)
1641 if DefaultStore not in DefaultStoresDefine:
1642 EdkLogger.error('build', PARAMETER_INVALID, 'DefaultStores %s is not defined in [DefaultStores] section' % DefaultStore,
1643 File=self.MetaFile, Line=Dummy5)
1644 if "." not in TokenSpaceGuid:
1645 PcdSet.add((PcdCName, TokenSpaceGuid, SkuName,DefaultStore, Dummy4))
1646 PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid,DefaultStore] = Setting
1647
1648
1649 # Remove redundant PCD candidates, per the ARCH and SKU
1650 for PcdCName, TokenSpaceGuid, SkuName,DefaultStore, Dummy4 in PcdSet:
1651
1652 Setting = PcdDict[self._Arch, SkuName, PcdCName, TokenSpaceGuid,DefaultStore]
1653 if Setting == None:
1654 continue
1655 VariableName, VariableGuid, VariableOffset, DefaultValue, VarAttribute = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4)
1656
1657 rt, Msg = VariableAttributes.ValidateVarAttributes(VarAttribute)
1658 if not rt:
1659 EdkLogger.error("build", PCD_VARIABLE_ATTRIBUTES_ERROR, "Variable attributes settings for %s is incorrect.\n %s" % (".".join((TokenSpaceGuid, PcdCName)), Msg),
1660 ExtraData="[%s]" % VarAttribute)
1661 ExceedMax = False
1662 FormatCorrect = True
1663 if VariableOffset.isdigit():
1664 if int(VariableOffset, 10) > 0xFFFF:
1665 ExceedMax = True
1666 elif re.match(r'[\t\s]*0[xX][a-fA-F0-9]+$', VariableOffset):
1667 if int(VariableOffset, 16) > 0xFFFF:
1668 ExceedMax = True
1669 # For Offset written in "A.B"
1670 elif VariableOffset.find('.') > -1:
1671 VariableOffsetList = VariableOffset.split(".")
1672 if not (len(VariableOffsetList) == 2
1673 and IsValidWord(VariableOffsetList[0])
1674 and IsValidWord(VariableOffsetList[1])):
1675 FormatCorrect = False
1676 else:
1677 FormatCorrect = False
1678 if not FormatCorrect:
1679 EdkLogger.error('Build', FORMAT_INVALID, "Invalid syntax or format of the variable offset value is incorrect for %s." % ".".join((TokenSpaceGuid, PcdCName)))
1680
1681 if ExceedMax:
1682 EdkLogger.error('Build', OPTION_VALUE_INVALID, "The variable offset value must not exceed the maximum value of 0xFFFF (UINT16) for %s." % ".".join((TokenSpaceGuid, PcdCName)))
1683 if (VariableName, VariableGuid) not in VariableAttrs:
1684 VariableAttrs[(VariableName, VariableGuid)] = VarAttribute
1685 else:
1686 if not self.CompareVarAttr(VariableAttrs[(VariableName, VariableGuid)], VarAttribute):
1687 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)]))
1688
1689 pcdDecObject = self._DecPcds[PcdCName, TokenSpaceGuid]
1690 if (PcdCName, TokenSpaceGuid) in Pcds.keys():
1691 pcdObject = Pcds[PcdCName, TokenSpaceGuid]
1692 if SkuName in pcdObject.SkuInfoList:
1693 Skuitem = pcdObject.SkuInfoList[SkuName]
1694 Skuitem.DefaultStoreDict.update({DefaultStore:DefaultValue})
1695 else:
1696 SkuInfo = SkuInfoClass(SkuName, self.SkuIds[SkuName][0], VariableName, VariableGuid, VariableOffset, DefaultValue, VariableAttribute=VarAttribute,DefaultStore={DefaultStore:DefaultValue})
1697 pcdObject.SkuInfoList[SkuName] = SkuInfo
1698 else:
1699 SkuInfo = SkuInfoClass(SkuName, self.SkuIds[SkuName][0], VariableName, VariableGuid, VariableOffset, DefaultValue, VariableAttribute=VarAttribute,DefaultStore={DefaultStore:DefaultValue})
1700 Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject(
1701 PcdCName,
1702 TokenSpaceGuid,
1703 self._PCD_TYPE_STRING_[Type],
1704 '',
1705 DefaultValue,
1706 '',
1707 '',
1708 {SkuName : SkuInfo},
1709 False,
1710 None,
1711 pcdDecObject.validateranges,
1712 pcdDecObject.validlists,
1713 pcdDecObject.expressions,
1714 IsDsc=True)
1715
1716
1717 for pcd in Pcds.values():
1718 SkuInfoObj = pcd.SkuInfoList.values()[0]
1719 pcdDecObject = self._DecPcds[pcd.TokenCName, pcd.TokenSpaceGuidCName]
1720 # Only fix the value while no value provided in DSC file.
1721 for sku in pcd.SkuInfoList.values():
1722 if (sku.HiiDefaultValue == "" or sku.HiiDefaultValue == None):
1723 sku.HiiDefaultValue = pcdDecObject.DefaultValue
1724 if 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' not in pcd.SkuInfoList.keys():
1725 valuefromDec = pcdDecObject.DefaultValue
1726 SkuInfo = SkuInfoClass('DEFAULT', '0', SkuInfoObj.VariableName, SkuInfoObj.VariableGuid, SkuInfoObj.VariableOffset, valuefromDec,VariableAttribute=SkuInfoObj.VariableAttribute,DefaultStore={DefaultStore:valuefromDec})
1727 pcd.SkuInfoList['DEFAULT'] = SkuInfo
1728 elif 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys():
1729 pcd.SkuInfoList['DEFAULT'] = pcd.SkuInfoList['COMMON']
1730 del(pcd.SkuInfoList['COMMON'])
1731 elif 'DEFAULT' in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys():
1732 del(pcd.SkuInfoList['COMMON'])
1733
1734 if self.SkuIdMgr.SkuUsageType == self.SkuIdMgr.SINGLE:
1735 if 'DEFAULT' in pcd.SkuInfoList.keys() and self.SkuIdMgr.SystemSkuId not in pcd.SkuInfoList.keys():
1736 pcd.SkuInfoList[self.SkuIdMgr.SystemSkuId] = pcd.SkuInfoList['DEFAULT']
1737 del(pcd.SkuInfoList['DEFAULT'])
1738
1739 if pcd.MaxDatumSize.strip():
1740 MaxSize = int(pcd.MaxDatumSize, 0)
1741 else:
1742 MaxSize = 0
1743 if pcdDecObject.DatumType == 'VOID*':
1744 for (_, skuobj) in pcd.SkuInfoList.items():
1745 datalen = 0
1746 skuobj.HiiDefaultValue = StringToArray(skuobj.HiiDefaultValue)
1747 datalen = len(skuobj.HiiDefaultValue.split(","))
1748 if datalen > MaxSize:
1749 MaxSize = datalen
1750 for defaultst in skuobj.DefaultStoreDict:
1751 skuobj.DefaultStoreDict[defaultst] = StringToArray(skuobj.DefaultStoreDict[defaultst])
1752 pcd.DefaultValue = StringToArray(pcd.DefaultValue)
1753 pcd.MaxDatumSize = str(MaxSize)
1754 rt, invalidhii = self.CheckVariableNameAssignment(Pcds)
1755 if not rt:
1756 invalidpcd = ",".join(invalidhii)
1757 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)
1758 return Pcds
1759
1760 def CheckVariableNameAssignment(self,Pcds):
1761 invalidhii = []
1762 for pcdname in Pcds:
1763 pcd = Pcds[pcdname]
1764 varnameset = set([sku.VariableName for (skuid,sku) in pcd.SkuInfoList.items()])
1765 if len(varnameset) > 1:
1766 invalidhii.append(".".join((pcdname[1],pcdname[0])))
1767 if len(invalidhii):
1768 return False,invalidhii
1769 else:
1770 return True, []
1771 ## Retrieve dynamic VPD PCD settings
1772 #
1773 # @param Type PCD type
1774 #
1775 # @retval a dict object contains settings of given PCD type
1776 #
1777 def _GetDynamicVpdPcd(self, Type):
1778
1779
1780 Pcds = sdict()
1781 #
1782 # tdict is a special dict kind of type, used for selecting correct
1783 # PCD settings for certain ARCH and SKU
1784 #
1785 PcdDict = tdict(True, 4)
1786 PcdList = []
1787
1788 # Find out all possible PCD candidates for self._Arch
1789 RecordList = self._RawData[Type, self._Arch]
1790 AvailableSkuIdSet = copy.copy(self.SkuIds)
1791
1792 for TokenSpaceGuid, PcdCName, Setting, Arch, SkuName, Dummy3, Dummy4,Dummy5 in RecordList:
1793 SkuName = SkuName.upper()
1794 SkuName = 'DEFAULT' if SkuName == 'COMMON' else SkuName
1795 if SkuName not in AvailableSkuIdSet:
1796 EdkLogger.error('build', PARAMETER_INVALID, 'Sku %s is not defined in [SkuIds] section' % SkuName,
1797 File=self.MetaFile, Line=Dummy5)
1798 if "." not in TokenSpaceGuid:
1799 PcdList.append((PcdCName, TokenSpaceGuid, SkuName, Dummy4))
1800 PcdDict[Arch, SkuName, PcdCName, TokenSpaceGuid] = Setting
1801
1802 # Remove redundant PCD candidates, per the ARCH and SKU
1803 for PcdCName, TokenSpaceGuid, SkuName, Dummy4 in PcdList:
1804 Setting = PcdDict[self._Arch, SkuName, PcdCName, TokenSpaceGuid]
1805 if Setting == None:
1806 continue
1807 #
1808 # For the VOID* type, it can have optional data of MaxDatumSize and InitialValue
1809 # For the Integer & Boolean type, the optional data can only be InitialValue.
1810 # At this point, we put all the data into the PcdClssObject for we don't know the PCD's datumtype
1811 # until the DEC parser has been called.
1812 #
1813 VpdOffset, MaxDatumSize, InitialValue = self._ValidatePcd(PcdCName, TokenSpaceGuid, Setting, Type, Dummy4)
1814 SkuInfo = SkuInfoClass(SkuName, self.SkuIds[SkuName][0], '', '', '', '', VpdOffset, InitialValue)
1815 if (PcdCName, TokenSpaceGuid) in Pcds.keys():
1816 pcdObject = Pcds[PcdCName, TokenSpaceGuid]
1817 pcdObject.SkuInfoList[SkuName] = SkuInfo
1818 if MaxDatumSize.strip():
1819 CurrentMaxSize = int(MaxDatumSize.strip(), 0)
1820 else:
1821 CurrentMaxSize = 0
1822 if pcdObject.MaxDatumSize:
1823 PcdMaxSize = int(pcdObject.MaxDatumSize, 0)
1824 else:
1825 PcdMaxSize = 0
1826 if CurrentMaxSize > PcdMaxSize:
1827 pcdObject.MaxDatumSize = str(CurrentMaxSize)
1828 else:
1829 Pcds[PcdCName, TokenSpaceGuid] = PcdClassObject(
1830 PcdCName,
1831 TokenSpaceGuid,
1832 self._PCD_TYPE_STRING_[Type],
1833 '',
1834 InitialValue,
1835 '',
1836 MaxDatumSize,
1837 {SkuName : SkuInfo},
1838 False,
1839 None,
1840 IsDsc=True)
1841 for pcd in Pcds.values():
1842 SkuInfoObj = pcd.SkuInfoList.values()[0]
1843 pcdDecObject = self._DecPcds[pcd.TokenCName, pcd.TokenSpaceGuidCName]
1844 # Only fix the value while no value provided in DSC file.
1845 for sku in pcd.SkuInfoList.values():
1846 if (sku.DefaultValue == "" or sku.DefaultValue==None):
1847 sku.DefaultValue = pcdDecObject.DefaultValue
1848 if 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' not in pcd.SkuInfoList.keys():
1849 valuefromDec = pcdDecObject.DefaultValue
1850 SkuInfo = SkuInfoClass('DEFAULT', '0', '', '', '', '', SkuInfoObj.VpdOffset, valuefromDec)
1851 pcd.SkuInfoList['DEFAULT'] = SkuInfo
1852 elif 'DEFAULT' not in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys():
1853 pcd.SkuInfoList['DEFAULT'] = pcd.SkuInfoList['COMMON']
1854 del(pcd.SkuInfoList['COMMON'])
1855 elif 'DEFAULT' in pcd.SkuInfoList.keys() and 'COMMON' in pcd.SkuInfoList.keys():
1856 del(pcd.SkuInfoList['COMMON'])
1857 if self.SkuIdMgr.SkuUsageType == self.SkuIdMgr.SINGLE:
1858 if 'DEFAULT' in pcd.SkuInfoList.keys() and self.SkuIdMgr.SystemSkuId not in pcd.SkuInfoList.keys():
1859 pcd.SkuInfoList[self.SkuIdMgr.SystemSkuId] = pcd.SkuInfoList['DEFAULT']
1860 del(pcd.SkuInfoList['DEFAULT'])
1861
1862 return Pcds
1863
1864 ## Add external modules
1865 #
1866 # The external modules are mostly those listed in FDF file, which don't
1867 # need "build".
1868 #
1869 # @param FilePath The path of module description file
1870 #
1871 def AddModule(self, FilePath):
1872 FilePath = NormPath(FilePath)
1873 if FilePath not in self.Modules:
1874 Module = ModuleBuildClassObject()
1875 Module.MetaFile = FilePath
1876 self.Modules.append(Module)
1877
1878 ## Add external PCDs
1879 #
1880 # The external PCDs are mostly those listed in FDF file to specify address
1881 # or offset information.
1882 #
1883 # @param Name Name of the PCD
1884 # @param Guid Token space guid of the PCD
1885 # @param Value Value of the PCD
1886 #
1887 def AddPcd(self, Name, Guid, Value):
1888 if (Name, Guid) not in self.Pcds:
1889 self.Pcds[Name, Guid] = PcdClassObject(Name, Guid, '', '', '', '', '', {}, False, None)
1890 self.Pcds[Name, Guid].DefaultValue = Value
1891
1892 _Macros = property(_GetMacros)
1893 Arch = property(_GetArch, _SetArch)
1894 Platform = property(_GetPlatformName)
1895 PlatformName = property(_GetPlatformName)
1896 Guid = property(_GetFileGuid)
1897 Version = property(_GetVersion)
1898 DscSpecification = property(_GetDscSpec)
1899 OutputDirectory = property(_GetOutpuDir)
1900 SupArchList = property(_GetSupArch)
1901 BuildTargets = property(_GetBuildTarget)
1902 SkuName = property(_GetSkuName, _SetSkuName)
1903 PcdInfoFlag = property(_GetPcdInfoFlag)
1904 VarCheckFlag = property(_GetVarCheckFlag)
1905 FlashDefinition = property(_GetFdfFile)
1906 Prebuild = property(_GetPrebuild)
1907 Postbuild = property(_GetPostbuild)
1908 BuildNumber = property(_GetBuildNumber)
1909 MakefileName = property(_GetMakefileName)
1910 BsBaseAddress = property(_GetBsBaseAddress)
1911 RtBaseAddress = property(_GetRtBaseAddress)
1912 LoadFixAddress = property(_GetLoadFixAddress)
1913 RFCLanguages = property(_GetRFCLanguages)
1914 ISOLanguages = property(_GetISOLanguages)
1915 VpdToolGuid = property(_GetVpdToolGuid)
1916 SkuIds = property(_GetSkuIds)
1917 Modules = property(_GetModules)
1918 LibraryInstances = property(_GetLibraryInstances)
1919 LibraryClasses = property(_GetLibraryClasses)
1920 Pcds = property(_GetPcds)
1921 BuildOptions = property(_GetBuildOptions)