2 # This file is used to create a database used by build tool
4 # Copyright (c) 2008 - 2018, 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
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.
15 ## Platform build information from DSC file
17 # This class is used to retrieve information stored in database and convert them
18 # into PlatformBuildClassObject form for easier use for AutoGen.
20 from Common
.String
import *
21 from Common
.DataType
import *
22 from Common
.Misc
import *
25 from CommonDataClass
.CommonClass
import SkuInfoClass
26 from Common
.TargetTxtClassObject
import *
27 from Common
.ToolDefClassObject
import *
28 from MetaDataTable
import *
29 from MetaFileTable
import *
30 from MetaFileParser
import *
32 from WorkspaceCommon
import GetDeclaredPcd
33 from Common
.Misc
import AnalyzeDscPcd
34 from Common
.Misc
import ProcessDuplicatedInf
36 from Common
.Parsing
import IsValidWord
37 from Common
.VariableAttributes
import VariableAttributes
38 import Common
.GlobalData
as GlobalData
40 from Workspace
.BuildClassObject
import PlatformBuildClassObject
, StructurePcd
, PcdClassObject
, ModuleBuildClassObject
43 # Treat CHAR16 as a synonym for UINT16. CHAR16 support is required for VFR C structs
45 PcdValueInitName
= 'PcdValueInit'
46 PcdSupportedBaseTypes
= ['BOOLEAN', 'UINT8', 'UINT16', 'UINT32', 'UINT64', 'CHAR16']
47 PcdSupportedBaseTypeWidth
= {'BOOLEAN':8, 'UINT8':8, 'UINT16':16, 'UINT32':32, 'UINT64':64}
48 PcdUnsupportedBaseTypes
= ['INT8', 'INT16', 'INT32', 'INT64', 'CHAR8', 'UINTN', 'INTN', 'VOID']
59 #include <PcdValueCommon.h>
69 return PcdValueMain (argc, argv);
73 PcdMakefileHeader
= '''
76 # This file is auto-generated by build utility
81 WindowsCFLAGS
= 'CFLAGS = $(CFLAGS) /wd4200 /wd4034 /wd4101 '
82 LinuxCFLAGS
= 'BUILD_CFLAGS += -Wno-pointer-to-int-cast -Wno-unused-variable '
84 !INCLUDE $(BASE_TOOLS_PATH)\Source\C\Makefiles\ms.common
86 LIBS = $(LIB_PATH)\Common.lib
88 !INCLUDE $(BASE_TOOLS_PATH)\Source\C\Makefiles\ms.app
93 MAKEROOT ?= $(EDK_TOOLS_PATH)/Source/C
97 class DscBuildData(PlatformBuildClassObject
):
98 # dict used to convert PCD type in database to string used by build tool
100 MODEL_PCD_FIXED_AT_BUILD
: "FixedAtBuild",
101 MODEL_PCD_PATCHABLE_IN_MODULE
: "PatchableInModule",
102 MODEL_PCD_FEATURE_FLAG
: "FeatureFlag",
103 MODEL_PCD_DYNAMIC
: "Dynamic",
104 MODEL_PCD_DYNAMIC_DEFAULT
: "Dynamic",
105 MODEL_PCD_DYNAMIC_HII
: "DynamicHii",
106 MODEL_PCD_DYNAMIC_VPD
: "DynamicVpd",
107 MODEL_PCD_DYNAMIC_EX
: "DynamicEx",
108 MODEL_PCD_DYNAMIC_EX_DEFAULT
: "DynamicEx",
109 MODEL_PCD_DYNAMIC_EX_HII
: "DynamicExHii",
110 MODEL_PCD_DYNAMIC_EX_VPD
: "DynamicExVpd",
113 # dict used to convert part of [Defines] to members of DscBuildData directly
118 TAB_DSC_DEFINES_PLATFORM_NAME
: "_PlatformName",
119 TAB_DSC_DEFINES_PLATFORM_GUID
: "_Guid",
120 TAB_DSC_DEFINES_PLATFORM_VERSION
: "_Version",
121 TAB_DSC_DEFINES_DSC_SPECIFICATION
: "_DscSpecification",
122 # TAB_DSC_DEFINES_OUTPUT_DIRECTORY : "_OutputDirectory",
123 # TAB_DSC_DEFINES_SUPPORTED_ARCHITECTURES : "_SupArchList",
124 # TAB_DSC_DEFINES_BUILD_TARGETS : "_BuildTargets",
125 TAB_DSC_DEFINES_SKUID_IDENTIFIER
: "_SkuName",
126 # TAB_DSC_DEFINES_FLASH_DEFINITION : "_FlashDefinition",
127 TAB_DSC_DEFINES_BUILD_NUMBER
: "_BuildNumber",
128 TAB_DSC_DEFINES_MAKEFILE_NAME
: "_MakefileName",
129 TAB_DSC_DEFINES_BS_BASE_ADDRESS
: "_BsBaseAddress",
130 TAB_DSC_DEFINES_RT_BASE_ADDRESS
: "_RtBaseAddress",
131 # TAB_DSC_DEFINES_RFC_LANGUAGES : "_RFCLanguages",
132 # TAB_DSC_DEFINES_ISO_LANGUAGES : "_ISOLanguages",
135 # used to compose dummy library class name for those forced library instances
136 _NullLibraryNumber
= 0
138 ## Constructor of DscBuildData
140 # Initialize object of DscBuildData
142 # @param FilePath The path of platform description file
143 # @param RawData The raw data of DSC file
144 # @param BuildDataBase Database used to retrieve module/package information
145 # @param Arch The target architecture
146 # @param Platform (not used for DscBuildData)
147 # @param Macros Macros used for replacement in DSC file
149 def __init__(self
, FilePath
, RawData
, BuildDataBase
, Arch
='COMMON', Target
=None, Toolchain
=None):
150 self
.MetaFile
= FilePath
151 self
._RawData
= RawData
152 self
._Bdb
= BuildDataBase
154 self
._Target
= Target
155 self
._Toolchain
= Toolchain
156 self
._ToolChainFamily
= None
158 self
._HandleOverridePath
()
159 if os
.getenv("WORKSPACE"):
160 self
.OutputPath
= os
.path
.join(os
.getenv("WORKSPACE"), 'Build', PcdValueInitName
)
162 self
.OutputPath
= os
.path
.dirname(self
.DscFile
)
163 self
.DefaultStores
= None
164 self
.SkuIdMgr
= SkuClass(self
.SkuName
, self
.SkuIds
)
167 def __setitem__(self
, key
, value
):
168 self
.__dict
__[self
._PROPERTY
_[key
]] = value
171 def __getitem__(self
, key
):
172 return self
.__dict
__[self
._PROPERTY
_[key
]]
175 def __contains__(self
, key
):
176 return key
in self
._PROPERTY
_
178 ## Set all internal used members of DscBuildData to None
181 self
._PlatformName
= None
184 self
._DscSpecification
= None
185 self
._OutputDirectory
= None
186 self
._SupArchList
= None
187 self
._BuildTargets
= None
189 self
._PcdInfoFlag
= None
190 self
._VarCheckFlag
= None
191 self
._FlashDefinition
= None
192 self
._Prebuild
= None
193 self
._Postbuild
= None
194 self
._BuildNumber
= None
195 self
._MakefileName
= None
196 self
._BsBaseAddress
= None
197 self
._RtBaseAddress
= None
200 self
._LibraryInstances
= None
201 self
._LibraryClasses
= None
204 self
._BuildOptions
= None
205 self
._ModuleTypeOptions
= None
206 self
._LoadFixAddress
= None
207 self
._RFCLanguages
= None
208 self
._ISOLanguages
= None
209 self
._VpdToolGuid
= None
211 self
.DefaultStores
= None
214 ## handle Override Path of Module
215 def _HandleOverridePath(self
):
216 RecordList
= self
._RawData
[MODEL_META_DATA_COMPONENT
, self
._Arch
]
217 Macros
= self
._Macros
218 Macros
["EDK_SOURCE"] = GlobalData
.gEcpSource
219 for Record
in RecordList
:
222 ModuleFile
= PathClass(NormPath(Record
[0]), GlobalData
.gWorkspace
, Arch
=self
._Arch
)
223 RecordList
= self
._RawData
[MODEL_META_DATA_COMPONENT_SOURCE_OVERRIDE_PATH
, self
._Arch
, None, ModuleId
]
225 SourceOverridePath
= mws
.join(GlobalData
.gWorkspace
, NormPath(RecordList
[0][0]))
227 # Check if the source override path exists
228 if not os
.path
.isdir(SourceOverridePath
):
229 EdkLogger
.error('build', FILE_NOT_FOUND
, Message
='Source override path does not exist:', File
=self
.MetaFile
, ExtraData
=SourceOverridePath
, Line
=LineNo
)
231 # Add to GlobalData Variables
232 GlobalData
.gOverrideDir
[ModuleFile
.Key
] = SourceOverridePath
234 ## Get current effective macros
235 def _GetMacros(self
):
236 if self
.__Macros
== None:
238 self
.__Macros
.update(GlobalData
.gPlatformDefines
)
239 self
.__Macros
.update(GlobalData
.gGlobalDefines
)
240 self
.__Macros
.update(GlobalData
.gCommandLineDefines
)
249 # Changing the default ARCH to another may affect all other information
250 # because all information in a platform may be ARCH-related. That's
251 # why we need to clear all internal used members, in order to cause all
252 # information to be re-retrieved.
254 # @param Value The value of ARCH
256 def _SetArch(self
, Value
):
257 if self
._Arch
== Value
:
262 ## Retrieve all information in [Defines] section
264 # (Retriving all [Defines] information in one-shot is just to save time.)
266 def _GetHeaderInfo(self
):
267 RecordList
= self
._RawData
[MODEL_META_DATA_HEADER
, self
._Arch
]
268 for Record
in RecordList
:
270 # items defined _PROPERTY_ don't need additional processing
272 # some special items in [Defines] section need special treatment
273 if Name
== TAB_DSC_DEFINES_OUTPUT_DIRECTORY
:
274 self
._OutputDirectory
= NormPath(Record
[2], self
._Macros
)
275 if ' ' in self
._OutputDirectory
:
276 EdkLogger
.error("build", FORMAT_NOT_SUPPORTED
, "No space is allowed in OUTPUT_DIRECTORY",
277 File
=self
.MetaFile
, Line
=Record
[-1],
278 ExtraData
=self
._OutputDirectory
)
279 elif Name
== TAB_DSC_DEFINES_FLASH_DEFINITION
:
280 self
._FlashDefinition
= PathClass(NormPath(Record
[2], self
._Macros
), GlobalData
.gWorkspace
)
281 ErrorCode
, ErrorInfo
= self
._FlashDefinition
.Validate('.fdf')
283 EdkLogger
.error('build', ErrorCode
, File
=self
.MetaFile
, Line
=Record
[-1],
285 elif Name
== TAB_DSC_PREBUILD
:
286 PrebuildValue
= Record
[2]
287 if Record
[2][0] == '"':
288 if Record
[2][-1] != '"':
289 EdkLogger
.error('build', FORMAT_INVALID
, 'Missing double quotes in the end of %s statement.' % TAB_DSC_PREBUILD
,
290 File
=self
.MetaFile
, Line
=Record
[-1])
291 PrebuildValue
= Record
[2][1:-1]
292 self
._Prebuild
= PrebuildValue
293 elif Name
== TAB_DSC_POSTBUILD
:
294 PostbuildValue
= Record
[2]
295 if Record
[2][0] == '"':
296 if Record
[2][-1] != '"':
297 EdkLogger
.error('build', FORMAT_INVALID
, 'Missing double quotes in the end of %s statement.' % TAB_DSC_POSTBUILD
,
298 File
=self
.MetaFile
, Line
=Record
[-1])
299 PostbuildValue
= Record
[2][1:-1]
300 self
._Postbuild
= PostbuildValue
301 elif Name
== TAB_DSC_DEFINES_SUPPORTED_ARCHITECTURES
:
302 self
._SupArchList
= GetSplitValueList(Record
[2], TAB_VALUE_SPLIT
)
303 elif Name
== TAB_DSC_DEFINES_BUILD_TARGETS
:
304 self
._BuildTargets
= GetSplitValueList(Record
[2])
305 elif Name
== TAB_DSC_DEFINES_SKUID_IDENTIFIER
:
306 if self
._SkuName
== None:
307 self
._SkuName
= Record
[2]
308 if GlobalData
.gSKUID_CMD
:
309 self
._SkuName
= GlobalData
.gSKUID_CMD
310 elif Name
== TAB_DSC_DEFINES_PCD_INFO_GENERATION
:
311 self
._PcdInfoFlag
= Record
[2]
312 elif Name
== TAB_DSC_DEFINES_PCD_VAR_CHECK_GENERATION
:
313 self
._VarCheckFlag
= Record
[2]
314 elif Name
== TAB_FIX_LOAD_TOP_MEMORY_ADDRESS
:
316 self
._LoadFixAddress
= int (Record
[2], 0)
318 EdkLogger
.error("build", PARAMETER_INVALID
, "FIX_LOAD_TOP_MEMORY_ADDRESS %s is not valid dec or hex string" % (Record
[2]))
319 elif Name
== TAB_DSC_DEFINES_RFC_LANGUAGES
:
320 if not Record
[2] or Record
[2][0] != '"' or Record
[2][-1] != '"' or len(Record
[2]) == 1:
321 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"',
322 File
=self
.MetaFile
, Line
=Record
[-1])
323 LanguageCodes
= Record
[2][1:-1]
324 if not LanguageCodes
:
325 EdkLogger
.error('build', FORMAT_NOT_SUPPORTED
, 'one or more RFC4646 format language code must be provided for RFC_LANGUAGES statement',
326 File
=self
.MetaFile
, Line
=Record
[-1])
327 LanguageList
= GetSplitValueList(LanguageCodes
, TAB_SEMI_COLON_SPLIT
)
328 # check whether there is empty entries in the list
329 if None in LanguageList
:
330 EdkLogger
.error('build', FORMAT_NOT_SUPPORTED
, 'one or more empty language code is in RFC_LANGUAGES statement',
331 File
=self
.MetaFile
, Line
=Record
[-1])
332 self
._RFCLanguages
= LanguageList
333 elif Name
== TAB_DSC_DEFINES_ISO_LANGUAGES
:
334 if not Record
[2] or Record
[2][0] != '"' or Record
[2][-1] != '"' or len(Record
[2]) == 1:
335 EdkLogger
.error('build', FORMAT_NOT_SUPPORTED
, 'language code for ISO_LANGUAGES must have double quotes around it, for example: ISO_LANGUAGES = "engchn"',
336 File
=self
.MetaFile
, Line
=Record
[-1])
337 LanguageCodes
= Record
[2][1:-1]
338 if not LanguageCodes
:
339 EdkLogger
.error('build', FORMAT_NOT_SUPPORTED
, 'one or more ISO639-2 format language code must be provided for ISO_LANGUAGES statement',
340 File
=self
.MetaFile
, Line
=Record
[-1])
341 if len(LanguageCodes
) % 3:
342 EdkLogger
.error('build', FORMAT_NOT_SUPPORTED
, 'bad ISO639-2 format for ISO_LANGUAGES',
343 File
=self
.MetaFile
, Line
=Record
[-1])
345 for i
in range(0, len(LanguageCodes
), 3):
346 LanguageList
.append(LanguageCodes
[i
:i
+ 3])
347 self
._ISOLanguages
= LanguageList
348 elif Name
== TAB_DSC_DEFINES_VPD_TOOL_GUID
:
350 # try to convert GUID to a real UUID value to see whether the GUID is format
351 # for VPD_TOOL_GUID is correct.
356 EdkLogger
.error("build", FORMAT_INVALID
, "Invalid GUID format for VPD_TOOL_GUID", File
=self
.MetaFile
)
357 self
._VpdToolGuid
= Record
[2]
359 self
[Name
] = Record
[2]
360 # set _Header to non-None in order to avoid database re-querying
361 self
._Header
= 'DUMMY'
363 ## Retrieve platform name
364 def _GetPlatformName(self
):
365 if self
._PlatformName
== None:
366 if self
._Header
== None:
367 self
._GetHeaderInfo
()
368 if self
._PlatformName
== None:
369 EdkLogger
.error('build', ATTRIBUTE_NOT_AVAILABLE
, "No PLATFORM_NAME", File
=self
.MetaFile
)
370 return self
._PlatformName
372 ## Retrieve file guid
373 def _GetFileGuid(self
):
374 if self
._Guid
== None:
375 if self
._Header
== None:
376 self
._GetHeaderInfo
()
377 if self
._Guid
== None:
378 EdkLogger
.error('build', ATTRIBUTE_NOT_AVAILABLE
, "No PLATFORM_GUID", File
=self
.MetaFile
)
381 ## Retrieve platform version
382 def _GetVersion(self
):
383 if self
._Version
== None:
384 if self
._Header
== None:
385 self
._GetHeaderInfo
()
386 if self
._Version
== None:
387 EdkLogger
.error('build', ATTRIBUTE_NOT_AVAILABLE
, "No PLATFORM_VERSION", File
=self
.MetaFile
)
390 ## Retrieve platform description file version
391 def _GetDscSpec(self
):
392 if self
._DscSpecification
== None:
393 if self
._Header
== None:
394 self
._GetHeaderInfo
()
395 if self
._DscSpecification
== None:
396 EdkLogger
.error('build', ATTRIBUTE_NOT_AVAILABLE
, "No DSC_SPECIFICATION", File
=self
.MetaFile
)
397 return self
._DscSpecification
399 ## Retrieve OUTPUT_DIRECTORY
400 def _GetOutpuDir(self
):
401 if self
._OutputDirectory
== None:
402 if self
._Header
== None:
403 self
._GetHeaderInfo
()
404 if self
._OutputDirectory
== None:
405 self
._OutputDirectory
= os
.path
.join("Build", self
._PlatformName
)
406 return self
._OutputDirectory
408 ## Retrieve SUPPORTED_ARCHITECTURES
409 def _GetSupArch(self
):
410 if self
._SupArchList
== None:
411 if self
._Header
== None:
412 self
._GetHeaderInfo
()
413 if self
._SupArchList
== None:
414 EdkLogger
.error('build', ATTRIBUTE_NOT_AVAILABLE
, "No SUPPORTED_ARCHITECTURES", File
=self
.MetaFile
)
415 return self
._SupArchList
417 ## Retrieve BUILD_TARGETS
418 def _GetBuildTarget(self
):
419 if self
._BuildTargets
== None:
420 if self
._Header
== None:
421 self
._GetHeaderInfo
()
422 if self
._BuildTargets
== None:
423 EdkLogger
.error('build', ATTRIBUTE_NOT_AVAILABLE
, "No BUILD_TARGETS", File
=self
.MetaFile
)
424 return self
._BuildTargets
426 def _GetPcdInfoFlag(self
):
427 if self
._PcdInfoFlag
== None or self
._PcdInfoFlag
.upper() == 'FALSE':
429 elif self
._PcdInfoFlag
.upper() == 'TRUE':
433 def _GetVarCheckFlag(self
):
434 if self
._VarCheckFlag
== None or self
._VarCheckFlag
.upper() == 'FALSE':
436 elif self
._VarCheckFlag
.upper() == 'TRUE':
441 # # Retrieve SKUID_IDENTIFIER
442 def _GetSkuName(self
):
443 if self
._SkuName
== None:
444 if self
._Header
== None:
445 self
._GetHeaderInfo
()
446 if self
._SkuName
== None:
447 self
._SkuName
= 'DEFAULT'
450 ## Override SKUID_IDENTIFIER
451 def _SetSkuName(self
, Value
):
452 self
._SkuName
= Value
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
462 def _GetPrebuild(self
):
463 if self
._Prebuild
== None:
464 if self
._Header
== None:
465 self
._GetHeaderInfo
()
466 if self
._Prebuild
== None:
468 return self
._Prebuild
470 def _GetPostbuild(self
):
471 if self
._Postbuild
== None:
472 if self
._Header
== None:
473 self
._GetHeaderInfo
()
474 if self
._Postbuild
== None:
476 return self
._Postbuild
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
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
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
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
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
()
520 if self
._LoadFixAddress
== None:
521 self
._LoadFixAddress
= self
._Macros
.get(TAB_FIX_LOAD_TOP_MEMORY_ADDRESS
, '0')
524 self
._LoadFixAddress
= int (self
._LoadFixAddress
, 0)
526 EdkLogger
.error("build", PARAMETER_INVALID
, "FIX_LOAD_TOP_MEMORY_ADDRESS %s is not valid dec or hex string" % (self
._LoadFixAddress
))
529 # If command line defined, should override the value in DSC file.
531 if 'FIX_LOAD_TOP_MEMORY_ADDRESS' in GlobalData
.gCommandLineDefines
.keys():
533 self
._LoadFixAddress
= int(GlobalData
.gCommandLineDefines
['FIX_LOAD_TOP_MEMORY_ADDRESS'], 0)
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']))
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
))
542 return self
._LoadFixAddress
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
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
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 HexPattern
= re
.compile(r
'0[xX][0-9a-fA-F]+$')
584 if Pattern
.match(Record
[0]) == None and HexPattern
.match(Record
[0]) == None:
585 EdkLogger
.error('build', FORMAT_INVALID
, "The format of the Sku ID number is invalid. It only support Integer and HexNumber",
586 File
=self
.MetaFile
, Line
=Record
[-1])
587 if not IsValidWord(Record
[1]):
588 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_-.)*'",
589 File
=self
.MetaFile
, Line
=Record
[-1])
590 self
._SkuIds
[Record
[1].upper()] = (str(self
.ToInt(Record
[0])), Record
[1].upper(), Record
[2].upper())
591 if 'DEFAULT' not in self
._SkuIds
:
592 self
._SkuIds
['DEFAULT'] = ("0","DEFAULT","DEFAULT")
593 if 'COMMON' not in self
._SkuIds
:
594 self
._SkuIds
['COMMON'] = ("0","DEFAULT","DEFAULT")
596 def ToInt(self
,intstr
):
597 return int(intstr
,16) if intstr
.upper().startswith("0X") else int(intstr
)
598 def _GetDefaultStores(self
):
599 if self
.DefaultStores
== None:
600 self
.DefaultStores
= sdict()
601 RecordList
= self
._RawData
[MODEL_EFI_DEFAULT_STORES
, self
._Arch
]
602 for Record
in RecordList
:
603 if Record
[0] in [None, '']:
604 EdkLogger
.error('build', FORMAT_INVALID
, 'No DefaultStores ID number',
605 File
=self
.MetaFile
, Line
=Record
[-1])
606 if Record
[1] in [None, '']:
607 EdkLogger
.error('build', FORMAT_INVALID
, 'No DefaultStores ID name',
608 File
=self
.MetaFile
, Line
=Record
[-1])
609 Pattern
= re
.compile('^[1-9]\d*|0$')
610 HexPattern
= re
.compile(r
'0[xX][0-9a-fA-F]+$')
611 if Pattern
.match(Record
[0]) == None and HexPattern
.match(Record
[0]) == None:
612 EdkLogger
.error('build', FORMAT_INVALID
, "The format of the DefaultStores ID number is invalid. It only support Integer and HexNumber",
613 File
=self
.MetaFile
, Line
=Record
[-1])
614 if not IsValidWord(Record
[1]):
615 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_-.)*'",
616 File
=self
.MetaFile
, Line
=Record
[-1])
617 self
.DefaultStores
[Record
[1].upper()] = (self
.ToInt(Record
[0]),Record
[1].upper())
618 if TAB_DEFAULT_STORES_DEFAULT
not in self
.DefaultStores
:
619 self
.DefaultStores
[TAB_DEFAULT_STORES_DEFAULT
] = (0,TAB_DEFAULT_STORES_DEFAULT
)
620 GlobalData
.gDefaultStores
= self
.DefaultStores
.keys()
621 if GlobalData
.gDefaultStores
:
622 GlobalData
.gDefaultStores
.sort()
623 return self
.DefaultStores
625 ## Retrieve [Components] section information
626 def _GetModules(self
):
627 if self
._Modules
!= None:
630 self
._Modules
= sdict()
631 RecordList
= self
._RawData
[MODEL_META_DATA_COMPONENT
, self
._Arch
]
632 Macros
= self
._Macros
633 Macros
["EDK_SOURCE"] = GlobalData
.gEcpSource
634 for Record
in RecordList
:
635 DuplicatedFile
= False
637 ModuleFile
= PathClass(NormPath(Record
[0], Macros
), GlobalData
.gWorkspace
, Arch
=self
._Arch
)
641 # check the file validation
642 ErrorCode
, ErrorInfo
= ModuleFile
.Validate('.inf')
644 EdkLogger
.error('build', ErrorCode
, File
=self
.MetaFile
, Line
=LineNo
,
647 # If arch is COMMON, no duplicate module is checked since all modules in all component sections are selected
648 if self
._Arch
!= 'COMMON' and ModuleFile
in self
._Modules
:
649 DuplicatedFile
= True
651 Module
= ModuleBuildClassObject()
652 Module
.MetaFile
= ModuleFile
654 # get module private library instance
655 RecordList
= self
._RawData
[MODEL_EFI_LIBRARY_CLASS
, self
._Arch
, None, ModuleId
]
656 for Record
in RecordList
:
657 LibraryClass
= Record
[0]
658 LibraryPath
= PathClass(NormPath(Record
[1], Macros
), GlobalData
.gWorkspace
, Arch
=self
._Arch
)
661 # check the file validation
662 ErrorCode
, ErrorInfo
= LibraryPath
.Validate('.inf')
664 EdkLogger
.error('build', ErrorCode
, File
=self
.MetaFile
, Line
=LineNo
,
667 if LibraryClass
== '' or LibraryClass
== 'NULL':
668 self
._NullLibraryNumber
+= 1
669 LibraryClass
= 'NULL%d' % self
._NullLibraryNumber
670 EdkLogger
.verbose("Found forced library for %s\n\t%s [%s]" % (ModuleFile
, LibraryPath
, LibraryClass
))
671 Module
.LibraryClasses
[LibraryClass
] = LibraryPath
672 if LibraryPath
not in self
.LibraryInstances
:
673 self
.LibraryInstances
.append(LibraryPath
)
675 # get module private PCD setting
676 for Type
in [MODEL_PCD_FIXED_AT_BUILD
, MODEL_PCD_PATCHABLE_IN_MODULE
, \
677 MODEL_PCD_FEATURE_FLAG
, MODEL_PCD_DYNAMIC
, MODEL_PCD_DYNAMIC_EX
]:
678 RecordList
= self
._RawData
[Type
, self
._Arch
, None, ModuleId
]
679 for TokenSpaceGuid
, PcdCName
, Setting
, Dummy1
, Dummy2
, Dummy3
, Dummy4
,Dummy5
in RecordList
:
680 TokenList
= GetSplitValueList(Setting
)
681 DefaultValue
= TokenList
[0]
682 if len(TokenList
) > 1:
683 MaxDatumSize
= TokenList
[1]
686 TypeString
= self
._PCD
_TYPE
_STRING
_[Type
]
687 Pcd
= PcdClassObject(
699 Module
.Pcds
[PcdCName
, TokenSpaceGuid
] = Pcd
701 # get module private build options
702 RecordList
= self
._RawData
[MODEL_META_DATA_BUILD_OPTION
, self
._Arch
, None, ModuleId
]
703 for ToolChainFamily
, ToolChain
, Option
, Dummy1
, Dummy2
, Dummy3
, Dummy4
,Dummy5
in RecordList
:
704 if (ToolChainFamily
, ToolChain
) not in Module
.BuildOptions
:
705 Module
.BuildOptions
[ToolChainFamily
, ToolChain
] = Option
707 OptionString
= Module
.BuildOptions
[ToolChainFamily
, ToolChain
]
708 Module
.BuildOptions
[ToolChainFamily
, ToolChain
] = OptionString
+ " " + Option
710 RecordList
= self
._RawData
[MODEL_META_DATA_HEADER
, self
._Arch
, None, ModuleId
]
711 if DuplicatedFile
and not RecordList
:
712 EdkLogger
.error('build', FILE_DUPLICATED
, File
=self
.MetaFile
, ExtraData
=str(ModuleFile
), Line
=LineNo
)
714 if len(RecordList
) != 1:
715 EdkLogger
.error('build', OPTION_UNKNOWN
, 'Only FILE_GUID can be listed in <Defines> section.',
716 File
=self
.MetaFile
, ExtraData
=str(ModuleFile
), Line
=LineNo
)
717 ModuleFile
= ProcessDuplicatedInf(ModuleFile
, RecordList
[0][2], GlobalData
.gWorkspace
)
718 ModuleFile
.Arch
= self
._Arch
720 self
._Modules
[ModuleFile
] = Module
723 ## Retrieve all possible library instances used in this platform
724 def _GetLibraryInstances(self
):
725 if self
._LibraryInstances
== None:
726 self
._GetLibraryClasses
()
727 return self
._LibraryInstances
729 ## Retrieve [LibraryClasses] information
730 def _GetLibraryClasses(self
):
731 if self
._LibraryClasses
== None:
732 self
._LibraryInstances
= []
734 # tdict is a special dict kind of type, used for selecting correct
735 # library instance for given library class and module type
737 LibraryClassDict
= tdict(True, 3)
738 # track all library class names
739 LibraryClassSet
= set()
740 RecordList
= self
._RawData
[MODEL_EFI_LIBRARY_CLASS
, self
._Arch
, None, -1]
741 Macros
= self
._Macros
742 for Record
in RecordList
:
743 LibraryClass
, LibraryInstance
, Dummy
, Arch
, ModuleType
, Dummy
,Dummy
, LineNo
= Record
744 if LibraryClass
== '' or LibraryClass
== 'NULL':
745 self
._NullLibraryNumber
+= 1
746 LibraryClass
= 'NULL%d' % self
._NullLibraryNumber
747 EdkLogger
.verbose("Found forced library for arch=%s\n\t%s [%s]" % (Arch
, LibraryInstance
, LibraryClass
))
748 LibraryClassSet
.add(LibraryClass
)
749 LibraryInstance
= PathClass(NormPath(LibraryInstance
, Macros
), GlobalData
.gWorkspace
, Arch
=self
._Arch
)
750 # check the file validation
751 ErrorCode
, ErrorInfo
= LibraryInstance
.Validate('.inf')
753 EdkLogger
.error('build', ErrorCode
, File
=self
.MetaFile
, Line
=LineNo
,
756 if ModuleType
!= 'COMMON' and ModuleType
not in SUP_MODULE_LIST
:
757 EdkLogger
.error('build', OPTION_UNKNOWN
, "Unknown module type [%s]" % ModuleType
,
758 File
=self
.MetaFile
, ExtraData
=LibraryInstance
, Line
=LineNo
)
759 LibraryClassDict
[Arch
, ModuleType
, LibraryClass
] = LibraryInstance
760 if LibraryInstance
not in self
._LibraryInstances
:
761 self
._LibraryInstances
.append(LibraryInstance
)
763 # resolve the specific library instance for each class and each module type
764 self
._LibraryClasses
= tdict(True)
765 for LibraryClass
in LibraryClassSet
:
766 # try all possible module types
767 for ModuleType
in SUP_MODULE_LIST
:
768 LibraryInstance
= LibraryClassDict
[self
._Arch
, ModuleType
, LibraryClass
]
769 if LibraryInstance
== None:
771 self
._LibraryClasses
[LibraryClass
, ModuleType
] = LibraryInstance
773 # for Edk style library instances, which are listed in different section
774 Macros
["EDK_SOURCE"] = GlobalData
.gEcpSource
775 RecordList
= self
._RawData
[MODEL_EFI_LIBRARY_INSTANCE
, self
._Arch
]
776 for Record
in RecordList
:
777 File
= PathClass(NormPath(Record
[0], Macros
), GlobalData
.gWorkspace
, Arch
=self
._Arch
)
779 # check the file validation
780 ErrorCode
, ErrorInfo
= File
.Validate('.inf')
782 EdkLogger
.error('build', ErrorCode
, File
=self
.MetaFile
, Line
=LineNo
,
784 if File
not in self
._LibraryInstances
:
785 self
._LibraryInstances
.append(File
)
787 # we need the module name as the library class name, so we have
788 # to parse it here. (self._Bdb[] will trigger a file parse if it
789 # hasn't been parsed)
791 Library
= self
._Bdb
[File
, self
._Arch
, self
._Target
, self
._Toolchain
]
792 self
._LibraryClasses
[Library
.BaseName
, ':dummy:'] = Library
793 return self
._LibraryClasses
795 def _ValidatePcd(self
, PcdCName
, TokenSpaceGuid
, Setting
, PcdType
, LineNo
):
796 if self
._DecPcds
== None:
799 if GlobalData
.gFdfParser
:
800 FdfInfList
= GlobalData
.gFdfParser
.Profile
.InfList
803 for Inf
in FdfInfList
:
804 ModuleFile
= PathClass(NormPath(Inf
), GlobalData
.gWorkspace
, Arch
=self
._Arch
)
805 if ModuleFile
in self
._Modules
:
807 ModuleData
= self
._Bdb
[ModuleFile
, self
._Arch
, self
._Target
, self
._Toolchain
]
808 PkgSet
.update(ModuleData
.Packages
)
810 self
._DecPcds
, self
._GuidDict
= GetDeclaredPcd(self
, self
._Bdb
, self
._Arch
, self
._Target
, self
._Toolchain
,PkgSet
)
811 self
._GuidDict
.update(GlobalData
.gPlatformPcds
)
813 if (PcdCName
, TokenSpaceGuid
) not in self
._DecPcds
:
814 EdkLogger
.error('build', PARSER_ERROR
,
815 "Pcd (%s.%s) defined in DSC is not declared in DEC files. Arch: ['%s']" % (TokenSpaceGuid
, PcdCName
, self
._Arch
),
816 File
=self
.MetaFile
, Line
=LineNo
)
817 ValueList
, IsValid
, Index
= AnalyzeDscPcd(Setting
, PcdType
, self
._DecPcds
[PcdCName
, TokenSpaceGuid
].DatumType
)
819 if PcdType
not in [MODEL_PCD_FEATURE_FLAG
, MODEL_PCD_FIXED_AT_BUILD
]:
820 EdkLogger
.error('build', FORMAT_INVALID
, "Pcd format incorrect.", File
=self
.MetaFile
, Line
=LineNo
,
821 ExtraData
="%s.%s|%s" % (TokenSpaceGuid
, PcdCName
, Setting
))
823 if ValueList
[2] == '-1':
824 EdkLogger
.error('build', FORMAT_INVALID
, "Pcd format incorrect.", File
=self
.MetaFile
, Line
=LineNo
,
825 ExtraData
="%s.%s|%s" % (TokenSpaceGuid
, PcdCName
, Setting
))
827 DatumType
= self
._DecPcds
[PcdCName
, TokenSpaceGuid
].DatumType
829 ValueList
[Index
] = ValueExpressionEx(ValueList
[Index
], DatumType
, self
._GuidDict
)(True)
830 except BadExpression
, Value
:
831 EdkLogger
.error('Parser', FORMAT_INVALID
, Value
, File
=self
.MetaFile
, Line
=LineNo
,
832 ExtraData
="PCD [%s.%s] Value \"%s\" " % (
833 TokenSpaceGuid
, PcdCName
, ValueList
[Index
]))
834 except EvaluationException
, Excpt
:
835 if hasattr(Excpt
, 'Pcd'):
836 if Excpt
.Pcd
in GlobalData
.gPlatformOtherPcds
:
837 EdkLogger
.error('Parser', FORMAT_INVALID
, "Cannot use this PCD (%s) in an expression as"
838 " it must be defined in a [PcdsFixedAtBuild] or [PcdsFeatureFlag] section"
839 " of the DSC file" % Excpt
.Pcd
,
840 File
=self
.MetaFile
, Line
=LineNo
)
842 EdkLogger
.error('Parser', FORMAT_INVALID
, "PCD (%s) is not defined in DSC file" % Excpt
.Pcd
,
843 File
=self
.MetaFile
, Line
=LineNo
)
845 EdkLogger
.error('Parser', FORMAT_INVALID
, "Invalid expression: %s" % str(Excpt
),
846 File
=self
.MetaFile
, Line
=LineNo
)
849 Valid
, ErrStr
= CheckPcdDatum(self
._DecPcds
[PcdCName
, TokenSpaceGuid
].DatumType
, ValueList
[Index
])
851 EdkLogger
.error('build', FORMAT_INVALID
, ErrStr
, File
=self
.MetaFile
, Line
=LineNo
,
852 ExtraData
="%s.%s" % (TokenSpaceGuid
, PcdCName
))
853 if PcdType
in (MODEL_PCD_DYNAMIC_DEFAULT
, MODEL_PCD_DYNAMIC_EX_DEFAULT
):
854 if self
._DecPcds
[PcdCName
, TokenSpaceGuid
].DatumType
.strip() != ValueList
[1].strip():
855 EdkLogger
.error('build', FORMAT_INVALID
, "Pcd datumtype used in DSC file is not the same as its declaration in DEC file." , File
=self
.MetaFile
, Line
=LineNo
,
856 ExtraData
="%s.%s|%s" % (TokenSpaceGuid
, PcdCName
, Setting
))
857 if (TokenSpaceGuid
+ '.' + PcdCName
) in GlobalData
.gPlatformPcds
:
858 if GlobalData
.gPlatformPcds
[TokenSpaceGuid
+ '.' + PcdCName
] != ValueList
[Index
]:
859 GlobalData
.gPlatformPcds
[TokenSpaceGuid
+ '.' + PcdCName
] = ValueList
[Index
]
862 def _FilterPcdBySkuUsage(self
,Pcds
):
863 available_sku
= self
.SkuIdMgr
.AvailableSkuIdSet
864 sku_usage
= self
.SkuIdMgr
.SkuUsageType
865 if sku_usage
== SkuClass
.SINGLE
:
868 Pcds
[pcdname
].SkuInfoList
= {"DEFAULT":pcd
.SkuInfoList
[skuid
] for skuid
in pcd
.SkuInfoList
if skuid
in available_sku
}
869 if type(pcd
) is StructurePcd
and pcd
.SkuOverrideValues
:
870 Pcds
[pcdname
].SkuOverrideValues
= {"DEFAULT":pcd
.SkuOverrideValues
[skuid
] for skuid
in pcd
.SkuOverrideValues
if skuid
in available_sku
}
874 Pcds
[pcdname
].SkuInfoList
= {skuid
:pcd
.SkuInfoList
[skuid
] for skuid
in pcd
.SkuInfoList
if skuid
in available_sku
}
875 if type(pcd
) is StructurePcd
and pcd
.SkuOverrideValues
:
876 Pcds
[pcdname
].SkuOverrideValues
= {skuid
:pcd
.SkuOverrideValues
[skuid
] for skuid
in pcd
.SkuOverrideValues
if skuid
in available_sku
}
878 def CompleteHiiPcdsDefaultStores(self
,Pcds
):
879 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
]]]
880 DefaultStoreMgr
= DefaultStore(self
.DefaultStores
)
882 for skuid
in pcd
.SkuInfoList
:
883 skuobj
= pcd
.SkuInfoList
.get(skuid
)
884 if "STANDARD" not in skuobj
.DefaultStoreDict
:
885 PcdDefaultStoreSet
= set([defaultstorename
for defaultstorename
in skuobj
.DefaultStoreDict
])
886 mindefaultstorename
= DefaultStoreMgr
.GetMin(PcdDefaultStoreSet
)
887 skuobj
.DefaultStoreDict
['STANDARD'] = copy
.deepcopy(skuobj
.DefaultStoreDict
[mindefaultstorename
])
890 def RecoverCommandLinePcd(self
):
892 if GlobalData
.BuildOptionPcd
:
893 for pcd
in GlobalData
.BuildOptionPcd
:
895 pcdset
.append((pcd
[0],pcd
[1],pcd
[3]))
897 pcdobj
= self
._Pcds
.get((pcd
[1],pcd
[0]))
899 pcdset
.append((pcd
[0],pcd
[1], pcdobj
.DefaultValue
))
901 pcdvalue
= pcd
[3] if len(pcd
) == 4 else pcd
[2]
902 pcdset
.append((pcd
[0],pcd
[1],pcdvalue
))
903 GlobalData
.BuildOptionPcd
= pcdset
904 def GetFieldValueFromComm(self
,ValueStr
,TokenSpaceGuidCName
, TokenCName
, FieldName
):
905 PredictedFieldType
= "VOID*"
906 if ValueStr
.startswith('L'):
908 EdkLogger
.error("build", FORMAT_INVALID
, 'For Void* type PCD, when specify the Value in the command line, please use the following format: "string", L"string", H"{...}"')
909 ValueStr
= ValueStr
[0] + '"' + ValueStr
[1:] + '"'
910 PredictedFieldType
= "VOID*"
911 elif ValueStr
.startswith('H') or ValueStr
.startswith('{'):
912 EdkLogger
.error("build", FORMAT_INVALID
, 'Currently we do not support assign H"{...}" format for Pcd field.', ExtraData
="%s.%s.%s from command line" % (TokenSpaceGuidCName
, TokenCName
, FieldName
))
913 ValueStr
= ValueStr
[1:]
914 PredictedFieldType
= "VOID*"
915 elif ValueStr
.upper() in ['TRUE', '0X1', '0X01', '1', 'FALSE', '0X0', '0X00', '0']:
916 PredictedFieldType
= "BOOLEAN"
917 elif ValueStr
.isdigit() or ValueStr
.upper().startswith('0X'):
918 PredictedFieldType
= TAB_UINT16
921 EdkLogger
.error("build", FORMAT_INVALID
, 'For Void* type PCD, when specify the Value in the command line, please use the following format: "string", L"string", H"{...}"')
922 ValueStr
= '"' + ValueStr
+ '"'
923 PredictedFieldType
= "VOID*"
924 IsValid
, Cause
= CheckPcdDatum(PredictedFieldType
, ValueStr
)
926 EdkLogger
.error("build", FORMAT_INVALID
, Cause
, ExtraData
="%s.%s.%s from command line" % (TokenSpaceGuidCName
, TokenCName
, FieldName
))
927 if PredictedFieldType
== 'BOOLEAN':
928 ValueStr
= ValueStr
.upper()
929 if ValueStr
== 'TRUE' or ValueStr
== '1':
931 elif ValueStr
== 'FALSE' or ValueStr
== '0':
934 def __ParsePcdFromCommandLine(self
):
935 if GlobalData
.BuildOptionPcd
:
936 for i
, pcd
in enumerate(GlobalData
.BuildOptionPcd
):
937 if type(pcd
) is tuple:
939 (pcdname
, pcdvalue
) = pcd
.split('=')
941 EdkLogger
.error('build', AUTOGEN_ERROR
, "No Value specified for the PCD %s." % (pcdname
))
943 (Name1
, Name2
) = pcdname
.split('.',1)
945 (Name3
, FieldName
) = Name2
.split(".",1)
946 if ((Name3
,Name1
)) in self
.DecPcds
:
949 TokenSpaceGuidCName
= Name1
953 TokenSpaceGuidCName
= ''
954 HasTokenSpace
= False
956 if ((Name2
,Name1
)) in self
.DecPcds
:
959 TokenSpaceGuidCName
= Name1
964 TokenSpaceGuidCName
= ''
965 HasTokenSpace
= False
969 TokenSpaceGuidCName
= ''
970 HasTokenSpace
= False
971 TokenSpaceGuidCNameList
= []
975 if not HasTokenSpace
:
976 for key
in self
.DecPcds
:
977 if TokenCName
== key
[0]:
978 if TokenSpaceGuidCName
:
982 "The Pcd %s is found under multiple different TokenSpaceGuid: %s and %s." % (TokenCName
, TokenSpaceGuidCName
, key
[1])
985 TokenSpaceGuidCName
= key
[1]
988 if (TokenCName
, TokenSpaceGuidCName
) in self
.DecPcds
:
991 NewValue
= self
.GetFieldValueFromComm(pcdvalue
, TokenSpaceGuidCName
, TokenCName
, FieldName
)
992 GlobalData
.BuildOptionPcd
[i
] = (TokenSpaceGuidCName
, TokenCName
, FieldName
,NewValue
,("build command options",1))
994 for key
in self
.DecPcds
:
995 PcdItem
= self
.DecPcds
[key
]
997 if (PcdItem
.TokenCName
, PcdItem
.TokenSpaceGuidCName
) == (TokenCName
, TokenSpaceGuidCName
):
998 PcdDatumType
= PcdItem
.DatumType
999 if pcdvalue
.startswith('H'):
1001 pcdvalue
= ValueExpressionEx(pcdvalue
[1:], PcdDatumType
, self
._GuidDict
)(True)
1002 except BadExpression
, Value
:
1003 EdkLogger
.error('Parser', FORMAT_INVALID
, 'PCD [%s.%s] Value "%s", %s' %
1004 (TokenSpaceGuidCName
, TokenCName
, pcdvalue
, Value
))
1005 if PcdDatumType
== "VOID*":
1006 pcdvalue
= 'H' + pcdvalue
1007 elif pcdvalue
.startswith("L'"):
1009 pcdvalue
= ValueExpressionEx(pcdvalue
, PcdDatumType
, self
._GuidDict
)(True)
1010 except BadExpression
, Value
:
1011 EdkLogger
.error('Parser', FORMAT_INVALID
, 'PCD [%s.%s] Value "%s", %s' %
1012 (TokenSpaceGuidCName
, TokenCName
, pcdvalue
, Value
))
1013 if pcdvalue
.startswith('{'):
1014 pcdvalue
= 'H' + pcdvalue
1015 elif pcdvalue
.startswith("'"):
1017 pcdvalue
= ValueExpressionEx(pcdvalue
, PcdDatumType
, self
._GuidDict
)(True)
1018 except BadExpression
, Value
:
1019 EdkLogger
.error('Parser', FORMAT_INVALID
, 'PCD [%s.%s] Value "%s", %s' %
1020 (TokenSpaceGuidCName
, TokenCName
, pcdvalue
, Value
))
1021 if pcdvalue
.startswith('{'):
1022 pcdvalue
= 'H' + pcdvalue
1023 elif pcdvalue
.startswith('L'):
1024 pcdvalue
= 'L"' + pcdvalue
[1:] + '"'
1026 pcdvalue
= ValueExpressionEx(pcdvalue
, PcdDatumType
, self
._GuidDict
)(True)
1027 except BadExpression
, Value
:
1028 EdkLogger
.error('Parser', FORMAT_INVALID
, 'PCD [%s.%s] Value "%s", %s' %
1029 (TokenSpaceGuidCName
, TokenCName
, pcdvalue
, Value
))
1032 pcdvalue
= ValueExpressionEx(pcdvalue
, PcdDatumType
, self
._GuidDict
)(True)
1033 except BadExpression
, Value
:
1034 EdkLogger
.error('Parser', FORMAT_INVALID
, 'PCD [%s.%s] Value "%s", %s' %
1035 (TokenSpaceGuidCName
, TokenCName
, pcdvalue
, Value
))
1036 NewValue
= BuildOptionPcdValueFormat(TokenSpaceGuidCName
, TokenCName
, PcdDatumType
, pcdvalue
)
1039 if PcdItem
.TokenCName
== TokenCName
:
1040 if not PcdItem
.TokenSpaceGuidCName
in TokenSpaceGuidCNameList
:
1041 if len (TokenSpaceGuidCNameList
) < 1:
1042 TokenSpaceGuidCNameList
.append(PcdItem
.TokenSpaceGuidCName
)
1043 PcdDatumType
= PcdItem
.DatumType
1044 TokenSpaceGuidCName
= PcdItem
.TokenSpaceGuidCName
1045 if pcdvalue
.startswith('H'):
1047 pcdvalue
= ValueExpressionEx(pcdvalue
[1:], PcdDatumType
, self
._GuidDict
)(True)
1048 except BadExpression
, Value
:
1049 EdkLogger
.error('Parser', FORMAT_INVALID
, 'PCD [%s.%s] Value "%s", %s' %
1050 (TokenSpaceGuidCName
, TokenCName
, pcdvalue
, Value
))
1051 if PcdDatumType
== "VOID*":
1052 pcdvalue
= 'H' + pcdvalue
1053 elif pcdvalue
.startswith("L'"):
1055 pcdvalue
= ValueExpressionEx(pcdvalue
, PcdDatumType
, self
._GuidDict
)(
1057 except BadExpression
, Value
:
1058 EdkLogger
.error('Parser', FORMAT_INVALID
, 'PCD [%s.%s] Value "%s", %s' %
1059 (TokenSpaceGuidCName
, TokenCName
, pcdvalue
, Value
))
1060 if pcdvalue
.startswith('{'):
1061 pcdvalue
= 'H' + pcdvalue
1062 elif pcdvalue
.startswith("'"):
1064 pcdvalue
= ValueExpressionEx(pcdvalue
, PcdDatumType
, self
._GuidDict
)(
1066 except BadExpression
, Value
:
1067 EdkLogger
.error('Parser', FORMAT_INVALID
, 'PCD [%s.%s] Value "%s", %s' %
1068 (TokenSpaceGuidCName
, TokenCName
, pcdvalue
, Value
))
1069 if pcdvalue
.startswith('{'):
1070 pcdvalue
= 'H' + pcdvalue
1071 elif pcdvalue
.startswith('L'):
1072 pcdvalue
= 'L"' + pcdvalue
[1:] + '"'
1074 pcdvalue
= ValueExpressionEx(pcdvalue
, PcdDatumType
, self
._GuidDict
)(
1076 except BadExpression
, Value
:
1077 EdkLogger
.error('Parser', FORMAT_INVALID
, 'PCD [%s.%s] Value "%s", %s' %
1078 (TokenSpaceGuidCName
, TokenCName
, pcdvalue
, Value
))
1081 pcdvalue
= ValueExpressionEx(pcdvalue
, PcdDatumType
, self
._GuidDict
)(True)
1082 except BadExpression
, Value
:
1083 EdkLogger
.error('Parser', FORMAT_INVALID
,
1084 'PCD [%s.%s] Value "%s", %s' %
1085 (TokenSpaceGuidCName
, TokenCName
, pcdvalue
, Value
))
1086 NewValue
= BuildOptionPcdValueFormat(TokenSpaceGuidCName
, TokenCName
, PcdDatumType
, pcdvalue
)
1092 "The Pcd %s is found under multiple different TokenSpaceGuid: %s and %s." % (TokenCName
, PcdItem
.TokenSpaceGuidCName
, TokenSpaceGuidCNameList
[0])
1094 GlobalData
.BuildOptionPcd
[i
] = (TokenSpaceGuidCName
, TokenCName
, FieldName
,NewValue
,("build command options",1))
1097 EdkLogger
.error('build', AUTOGEN_ERROR
, "The Pcd %s.%s is not found in the DEC file." % (TokenSpaceGuidCName
, TokenCName
))
1099 EdkLogger
.error('build', AUTOGEN_ERROR
, "The Pcd %s is not found in the DEC file." % (TokenCName
))
1100 for BuildData
in self
._Bdb
._CACHE
_.values():
1101 if BuildData
.MetaFile
.Ext
== '.dec' or BuildData
.MetaFile
.Ext
== '.dsc':
1103 for key
in BuildData
.Pcds
:
1104 PcdItem
= BuildData
.Pcds
[key
]
1105 if (TokenSpaceGuidCName
, TokenCName
) == (PcdItem
.TokenSpaceGuidCName
, PcdItem
.TokenCName
) and FieldName
=="":
1106 PcdItem
.DefaultValue
= NewValue
1107 ## Retrieve all PCD settings in platform
1109 if self
._Pcds
== None:
1110 self
._Pcds
= sdict()
1111 self
.__ParsePcdFromCommandLine
()
1112 self
._Pcds
.update(self
._GetPcd
(MODEL_PCD_FIXED_AT_BUILD
))
1113 self
._Pcds
.update(self
._GetPcd
(MODEL_PCD_PATCHABLE_IN_MODULE
))
1114 self
._Pcds
.update(self
._GetPcd
(MODEL_PCD_FEATURE_FLAG
))
1115 self
._Pcds
.update(self
._GetDynamicPcd
(MODEL_PCD_DYNAMIC_DEFAULT
))
1116 self
._Pcds
.update(self
._GetDynamicHiiPcd
(MODEL_PCD_DYNAMIC_HII
))
1117 self
._Pcds
.update(self
._GetDynamicVpdPcd
(MODEL_PCD_DYNAMIC_VPD
))
1118 self
._Pcds
.update(self
._GetDynamicPcd
(MODEL_PCD_DYNAMIC_EX_DEFAULT
))
1119 self
._Pcds
.update(self
._GetDynamicHiiPcd
(MODEL_PCD_DYNAMIC_EX_HII
))
1120 self
._Pcds
.update(self
._GetDynamicVpdPcd
(MODEL_PCD_DYNAMIC_EX_VPD
))
1122 self
._Pcds
= self
.CompletePcdValues(self
._Pcds
)
1123 self
._Pcds
= self
.UpdateStructuredPcds(MODEL_PCD_TYPE_LIST
, self
._Pcds
)
1124 self
._Pcds
= self
.CompleteHiiPcdsDefaultStores(self
._Pcds
)
1125 self
._Pcds
= self
._FilterPcdBySkuUsage
(self
._Pcds
)
1126 self
._Pcds
= self
.OverrideByFdfCommOverAll(self
._Pcds
)
1127 self
.RecoverCommandLinePcd()
1130 def _dumpPcdInfo(self
,Pcds
):
1133 if not pcdobj
.TokenCName
.startswith("Test"):
1135 for skuid
in pcdobj
.SkuInfoList
:
1136 if pcdobj
.Type
in (self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_HII
],self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_HII
]):
1137 for storename
in pcdobj
.SkuInfoList
[skuid
].DefaultStoreDict
:
1138 print "PcdCName: %s, SkuName: %s, StoreName: %s, Value: %s" % (".".join((pcdobj
.TokenSpaceGuidCName
, pcdobj
.TokenCName
)), skuid
,storename
,str(pcdobj
.SkuInfoList
[skuid
].DefaultStoreDict
[storename
]))
1140 print "PcdCName: %s, SkuName: %s, Value: %s" % (".".join((pcdobj
.TokenSpaceGuidCName
, pcdobj
.TokenCName
)), skuid
,str(pcdobj
.SkuInfoList
[skuid
].DefaultValue
))
1141 ## Retrieve [BuildOptions]
1142 def _GetBuildOptions(self
):
1143 if self
._BuildOptions
== None:
1144 self
._BuildOptions
= sdict()
1146 # Retrieve build option for EDKII and EDK style module
1148 for CodeBase
in (EDKII_NAME
, EDK_NAME
):
1149 RecordList
= self
._RawData
[MODEL_META_DATA_BUILD_OPTION
, self
._Arch
, CodeBase
]
1150 for ToolChainFamily
, ToolChain
, Option
, Dummy1
, Dummy2
, Dummy3
, Dummy4
,Dummy5
in RecordList
:
1151 if Dummy3
.upper() != 'COMMON':
1153 CurKey
= (ToolChainFamily
, ToolChain
, CodeBase
)
1155 # Only flags can be appended
1157 if CurKey
not in self
._BuildOptions
or not ToolChain
.endswith('_FLAGS') or Option
.startswith('='):
1158 self
._BuildOptions
[CurKey
] = Option
1160 if ' ' + Option
not in self
._BuildOptions
[CurKey
]:
1161 self
._BuildOptions
[CurKey
] += ' ' + Option
1162 return self
._BuildOptions
1164 def GetBuildOptionsByModuleType(self
, Edk
, ModuleType
):
1165 if self
._ModuleTypeOptions
== None:
1166 self
._ModuleTypeOptions
= sdict()
1167 if (Edk
, ModuleType
) not in self
._ModuleTypeOptions
:
1169 self
._ModuleTypeOptions
[Edk
, ModuleType
] = options
1170 DriverType
= '%s.%s' % (Edk
, ModuleType
)
1171 CommonDriverType
= '%s.%s' % ('COMMON', ModuleType
)
1172 RecordList
= self
._RawData
[MODEL_META_DATA_BUILD_OPTION
, self
._Arch
]
1173 for ToolChainFamily
, ToolChain
, Option
, Dummy1
, Dummy2
, Dummy3
, Dummy4
,Dummy5
in RecordList
:
1174 Type
= Dummy2
+ '.' + Dummy3
1175 if Type
.upper() == DriverType
.upper() or Type
.upper() == CommonDriverType
.upper():
1176 Key
= (ToolChainFamily
, ToolChain
, Edk
)
1177 if Key
not in options
or not ToolChain
.endswith('_FLAGS') or Option
.startswith('='):
1178 options
[Key
] = Option
1180 if ' ' + Option
not in options
[Key
]:
1181 options
[Key
] += ' ' + Option
1182 return self
._ModuleTypeOptions
[Edk
, ModuleType
]
1184 def GetStructurePcdInfo(self
, PcdSet
):
1185 structure_pcd_data
= {}
1187 if (item
[0],item
[1]) not in structure_pcd_data
:
1188 structure_pcd_data
[(item
[0],item
[1])] = []
1189 structure_pcd_data
[(item
[0],item
[1])].append(item
)
1191 return structure_pcd_data
1192 def OverrideByFdfComm(self
,StruPcds
):
1193 StructurePcdInCom
= {(item
[0],item
[1],item
[2] ):(item
[3],item
[4]) for item
in GlobalData
.BuildOptionPcd
if len(item
) == 5 and (item
[1],item
[0]) in StruPcds
} if GlobalData
.BuildOptionPcd
else {}
1194 GlobalPcds
= set([(item
[0],item
[1]) for item
in StructurePcdInCom
.keys()])
1195 for Pcd
in StruPcds
.values():
1196 if (Pcd
.TokenSpaceGuidCName
,Pcd
.TokenCName
) not in GlobalPcds
:
1198 FieldValues
= {item
[2]:StructurePcdInCom
[item
] for item
in StructurePcdInCom
if (Pcd
.TokenSpaceGuidCName
,Pcd
.TokenCName
) == (item
[0],item
[1]) and item
[2]}
1199 for sku
in Pcd
.SkuOverrideValues
:
1200 for defaultstore
in Pcd
.SkuOverrideValues
[sku
]:
1201 for field
in FieldValues
:
1202 if field
not in Pcd
.SkuOverrideValues
[sku
][defaultstore
]:
1203 Pcd
.SkuOverrideValues
[sku
][defaultstore
][field
] = ["","",""]
1204 Pcd
.SkuOverrideValues
[sku
][defaultstore
][field
][0] = FieldValues
[field
][0]
1205 Pcd
.SkuOverrideValues
[sku
][defaultstore
][field
][1] = FieldValues
[field
][1][0]
1206 Pcd
.SkuOverrideValues
[sku
][defaultstore
][field
][2] = FieldValues
[field
][1][1]
1208 def OverrideByFdfCommOverAll(self
,AllPcds
):
1209 def CheckStructureInComm(commpcds
):
1212 if len(commpcds
[0]) == 5:
1216 if CheckStructureInComm(GlobalData
.BuildOptionPcd
):
1217 StructurePcdInCom
= {(item
[0],item
[1],item
[2] ):(item
[3],item
[4]) for item
in GlobalData
.BuildOptionPcd
} if GlobalData
.BuildOptionPcd
else {}
1218 NoFiledValues
= {(item
[0],item
[1]):StructurePcdInCom
[item
] for item
in StructurePcdInCom
if not item
[2]}
1220 NoFiledValues
= {(item
[0],item
[1]):[item
[2]] for item
in GlobalData
.BuildOptionPcd
}
1221 for Guid
,Name
in NoFiledValues
:
1222 if (Name
,Guid
) in AllPcds
:
1223 Pcd
= AllPcds
.get((Name
,Guid
))
1224 Pcd
.DefaultValue
= NoFiledValues
[(Pcd
.TokenSpaceGuidCName
,Pcd
.TokenCName
)][0]
1225 for sku
in Pcd
.SkuInfoList
:
1226 SkuInfo
= Pcd
.SkuInfoList
[sku
]
1227 if SkuInfo
.DefaultValue
:
1228 SkuInfo
.DefaultValue
= NoFiledValues
[(Pcd
.TokenSpaceGuidCName
,Pcd
.TokenCName
)][0]
1230 SkuInfo
.HiiDefaultValue
= NoFiledValues
[(Pcd
.TokenSpaceGuidCName
,Pcd
.TokenCName
)][0]
1231 for defaultstore
in SkuInfo
.DefaultStoreDict
:
1232 SkuInfo
.DefaultStoreDict
[defaultstore
] = NoFiledValues
[(Pcd
.TokenSpaceGuidCName
,Pcd
.TokenCName
)][0]
1234 PcdInDec
= self
.DecPcds
.get((Name
,Guid
))
1236 if PcdInDec
.Type
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_FIXED_AT_BUILD
],
1237 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_PATCHABLE_IN_MODULE
]]:
1238 self
.Pcds
[Name
, Guid
] = copy
.deepcopy(PcdInDec
)
1239 self
.Pcds
[Name
, Guid
].DefaultValue
= NoFiledValues
[( Guid
,Name
)][0]
1241 def UpdateStructuredPcds(self
, TypeList
, AllPcds
):
1243 DynamicPcdType
= [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_DEFAULT
],
1244 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_HII
],
1245 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_VPD
],
1246 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_DEFAULT
],
1247 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_HII
],
1248 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_VPD
]]
1251 DefaultStoreMgr
= DefaultStore(self
.DefaultStores
)
1252 SkuIds
= self
.SkuIdMgr
.AvailableSkuIdSet
1253 SkuIds
.update({'DEFAULT':0})
1254 DefaultStores
= set([storename
for pcdobj
in AllPcds
.values() for skuobj
in pcdobj
.SkuInfoList
.values() for storename
in skuobj
.DefaultStoreDict
.keys()])
1257 # Find out all possible PCD candidates for self._Arch
1260 for Type
in TypeList
:
1261 RecordList
.extend(self
._RawData
[Type
, self
._Arch
])
1263 for TokenSpaceGuid
, PcdCName
, Setting
, Arch
, SkuName
, default_store
, Dummy4
,Dummy5
in RecordList
:
1264 SkuName
= SkuName
.upper()
1265 default_store
= default_store
.upper()
1266 SkuName
= 'DEFAULT' if SkuName
== 'COMMON' else SkuName
1267 if SkuName
not in SkuIds
:
1270 if SkuName
in SkuIds
and "." in TokenSpaceGuid
:
1271 S_PcdSet
.append([ TokenSpaceGuid
.split(".")[0],TokenSpaceGuid
.split(".")[1], PcdCName
,SkuName
, default_store
,Dummy5
, AnalyzePcdExpression(Setting
)[0]])
1273 # handle pcd value override
1274 StrPcdSet
= self
.GetStructurePcdInfo(S_PcdSet
)
1276 for str_pcd
in StrPcdSet
:
1277 str_pcd_obj
= Pcds
.get((str_pcd
[1], str_pcd
[0]), None)
1278 str_pcd_dec
= self
._DecPcds
.get((str_pcd
[1], str_pcd
[0]), None)
1279 if not isinstance (str_pcd_dec
, StructurePcd
):
1280 EdkLogger
.error('build', PARSER_ERROR
,
1281 "Pcd (%s.%s) is not declared as Structure PCD in DEC files. Arch: ['%s']" % (str_pcd
[0], str_pcd
[1], self
._Arch
),
1282 File
=self
.MetaFile
,Line
= StrPcdSet
[str_pcd
][0][5])
1284 str_pcd_obj_str
= StructurePcd()
1285 str_pcd_obj_str
.copy(str_pcd_dec
)
1287 str_pcd_obj_str
.copy(str_pcd_obj
)
1288 if str_pcd_obj
.Type
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_HII
], self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_HII
]]:
1289 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
}
1291 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
}
1292 for str_pcd_data
in StrPcdSet
[str_pcd
]:
1293 if str_pcd_data
[3] in SkuIds
:
1294 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])
1295 S_pcd_set
[str_pcd
[1], str_pcd
[0]] = str_pcd_obj_str
1297 EdkLogger
.error('build', PARSER_ERROR
,
1298 "Pcd (%s.%s) defined in DSC is not declared in DEC files. Arch: ['%s']" % (str_pcd
[0], str_pcd
[1], self
._Arch
),
1299 File
=self
.MetaFile
,Line
= StrPcdSet
[str_pcd
][0][5])
1300 # Add the Structure PCD that only defined in DEC, don't have override in DSC file
1301 for Pcd
in self
.DecPcds
:
1302 if type (self
._DecPcds
[Pcd
]) is StructurePcd
:
1303 if Pcd
not in S_pcd_set
:
1304 str_pcd_obj_str
= StructurePcd()
1305 str_pcd_obj_str
.copy(self
._DecPcds
[Pcd
])
1306 str_pcd_obj
= Pcds
.get(Pcd
, None)
1308 str_pcd_obj_str
.copy(str_pcd_obj
)
1309 if str_pcd_obj
.Type
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_HII
], self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_HII
]]:
1310 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
}
1312 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
}
1313 S_pcd_set
[Pcd
] = str_pcd_obj_str
1315 GlobalData
.gStructurePcd
[self
.Arch
] = S_pcd_set
1316 for stru_pcd
in S_pcd_set
.values():
1317 for skuid
in SkuIds
:
1318 if skuid
in stru_pcd
.SkuOverrideValues
:
1320 nextskuid
= self
.SkuIdMgr
.GetNextSkuId(skuid
)
1322 while nextskuid
not in stru_pcd
.SkuOverrideValues
:
1323 if nextskuid
== "DEFAULT":
1326 nextskuid
= self
.SkuIdMgr
.GetNextSkuId(nextskuid
)
1327 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 {'STANDARD':stru_pcd
.DefaultValues
})
1328 if stru_pcd
.Type
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_HII
], self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_HII
]]:
1329 for skuid
in SkuIds
:
1332 if skuid
not in stru_pcd
.SkuOverrideValues
:
1333 while nextskuid
not in stru_pcd
.SkuOverrideValues
:
1334 if nextskuid
== "DEFAULT":
1337 nextskuid
= self
.SkuIdMgr
.GetNextSkuId(nextskuid
)
1340 PcdDefaultStoreSet
= set([defaultstorename
for defaultstorename
in stru_pcd
.SkuOverrideValues
[nextskuid
]])
1341 mindefaultstorename
= DefaultStoreMgr
.GetMin(PcdDefaultStoreSet
)
1343 for defaultstoreid
in DefaultStores
:
1344 if defaultstoreid
not in stru_pcd
.SkuOverrideValues
[skuid
]:
1345 stru_pcd
.SkuOverrideValues
[skuid
][defaultstoreid
] = copy
.deepcopy(stru_pcd
.SkuOverrideValues
[nextskuid
][mindefaultstorename
])
1346 S_pcd_set
= self
.OverrideByFdfComm(S_pcd_set
)
1347 Str_Pcd_Values
= self
.GenerateByteArrayValue(S_pcd_set
)
1349 for (skuname
,StoreName
,PcdGuid
,PcdName
,PcdValue
) in Str_Pcd_Values
:
1350 str_pcd_obj
= S_pcd_set
.get((PcdName
, PcdGuid
))
1351 if str_pcd_obj
is None:
1352 print PcdName
, PcdGuid
1354 if str_pcd_obj
.Type
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_HII
],
1355 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_HII
]]:
1356 if skuname
not in str_pcd_obj
.SkuInfoList
:
1357 str_pcd_obj
.SkuInfoList
[skuname
] = SkuInfoClass(SkuIdName
=skuname
, SkuId
=self
.SkuIds
[skuname
][0], HiiDefaultValue
=PcdValue
, DefaultStore
= {StoreName
:PcdValue
})
1359 str_pcd_obj
.SkuInfoList
[skuname
].HiiDefaultValue
= PcdValue
1360 str_pcd_obj
.SkuInfoList
[skuname
].DefaultStoreDict
.update({StoreName
:PcdValue
})
1361 elif str_pcd_obj
.Type
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_FIXED_AT_BUILD
],
1362 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_PATCHABLE_IN_MODULE
]]:
1363 if skuname
in (self
.SkuIdMgr
.SystemSkuId
, 'DEFAULT', 'COMMON'):
1364 str_pcd_obj
.DefaultValue
= PcdValue
1366 if skuname
not in str_pcd_obj
.SkuInfoList
:
1367 nextskuid
= self
.SkuIdMgr
.GetNextSkuId(skuname
)
1369 while nextskuid
not in str_pcd_obj
.SkuInfoList
:
1370 if nextskuid
== "DEFAULT":
1373 nextskuid
= self
.SkuIdMgr
.GetNextSkuId(nextskuid
)
1374 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
)
1375 str_pcd_obj
.SkuInfoList
[skuname
].SkuId
= self
.SkuIds
[skuname
][0]
1376 str_pcd_obj
.SkuInfoList
[skuname
].SkuIdName
= skuname
1378 str_pcd_obj
.SkuInfoList
[skuname
].DefaultValue
= PcdValue
1379 for str_pcd_obj
in S_pcd_set
.values():
1380 if str_pcd_obj
.Type
not in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_HII
],
1381 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_HII
]]:
1383 PcdDefaultStoreSet
= set([defaultstorename
for skuobj
in str_pcd_obj
.SkuInfoList
.values() for defaultstorename
in skuobj
.DefaultStoreDict
])
1384 DefaultStoreObj
= DefaultStore(self
._GetDefaultStores
())
1385 mindefaultstorename
= DefaultStoreObj
.GetMin(PcdDefaultStoreSet
)
1386 str_pcd_obj
.SkuInfoList
[self
.SkuIdMgr
.SystemSkuId
].HiiDefaultValue
= str_pcd_obj
.SkuInfoList
[self
.SkuIdMgr
.SystemSkuId
].DefaultStoreDict
[mindefaultstorename
]
1388 for str_pcd_obj
in S_pcd_set
.values():
1390 str_pcd_obj
.MaxDatumSize
= self
.GetStructurePcdMaxSize(str_pcd_obj
)
1391 Pcds
[str_pcd_obj
.TokenCName
, str_pcd_obj
.TokenSpaceGuidCName
] = str_pcd_obj
1395 if 'DEFAULT' not in pcd
.SkuInfoList
.keys() and 'COMMON' in pcd
.SkuInfoList
.keys():
1396 pcd
.SkuInfoList
['DEFAULT'] = pcd
.SkuInfoList
['COMMON']
1397 del(pcd
.SkuInfoList
['COMMON'])
1398 elif 'DEFAULT' in pcd
.SkuInfoList
.keys() and 'COMMON' in pcd
.SkuInfoList
.keys():
1399 del(pcd
.SkuInfoList
['COMMON'])
1401 map(self
.FilterSkuSettings
,[Pcds
[pcdkey
] for pcdkey
in Pcds
if Pcds
[pcdkey
].Type
in DynamicPcdType
])
1404 ## Retrieve non-dynamic PCD settings
1406 # @param Type PCD type
1408 # @retval a dict object contains settings of given PCD type
1410 def _GetPcd(self
, Type
):
1413 # tdict is a special dict kind of type, used for selecting correct
1414 # PCD settings for certain ARCH
1416 AvailableSkuIdSet
= copy
.copy(self
.SkuIds
)
1418 PcdDict
= tdict(True, 3)
1420 # Find out all possible PCD candidates for self._Arch
1421 RecordList
= self
._RawData
[Type
, self
._Arch
]
1422 PcdValueDict
= sdict()
1423 for TokenSpaceGuid
, PcdCName
, Setting
, Arch
, SkuName
, Dummy3
, Dummy4
,Dummy5
in RecordList
:
1424 SkuName
= SkuName
.upper()
1425 SkuName
= 'DEFAULT' if SkuName
== 'COMMON' else SkuName
1426 if SkuName
not in AvailableSkuIdSet
:
1427 EdkLogger
.error('build ', PARAMETER_INVALID
, 'Sku %s is not defined in [SkuIds] section' % SkuName
,
1428 File
=self
.MetaFile
, Line
=Dummy5
)
1429 if SkuName
in (self
.SkuIdMgr
.SystemSkuId
, 'DEFAULT', 'COMMON'):
1430 if "." not in TokenSpaceGuid
:
1431 PcdSet
.add((PcdCName
, TokenSpaceGuid
, SkuName
, Dummy5
))
1432 PcdDict
[Arch
, PcdCName
, TokenSpaceGuid
, SkuName
] = Setting
1434 for PcdCName
, TokenSpaceGuid
, SkuName
, Dummy4
in PcdSet
:
1435 Setting
= PcdDict
[self
._Arch
, PcdCName
, TokenSpaceGuid
, SkuName
]
1438 PcdValue
, DatumType
, MaxDatumSize
= self
._ValidatePcd
(PcdCName
, TokenSpaceGuid
, Setting
, Type
, Dummy4
)
1439 if (PcdCName
, TokenSpaceGuid
) in PcdValueDict
:
1440 PcdValueDict
[PcdCName
, TokenSpaceGuid
][SkuName
] = (PcdValue
, DatumType
, MaxDatumSize
)
1442 PcdValueDict
[PcdCName
, TokenSpaceGuid
] = {SkuName
:(PcdValue
, DatumType
, MaxDatumSize
)}
1444 PcdsKeys
= PcdValueDict
.keys()
1445 for PcdCName
, TokenSpaceGuid
in PcdsKeys
:
1447 PcdSetting
= PcdValueDict
[PcdCName
, TokenSpaceGuid
]
1451 if 'COMMON' in PcdSetting
:
1452 PcdValue
, DatumType
, MaxDatumSize
= PcdSetting
['COMMON']
1453 if 'DEFAULT' in PcdSetting
:
1454 PcdValue
, DatumType
, MaxDatumSize
= PcdSetting
['DEFAULT']
1455 if self
.SkuIdMgr
.SystemSkuId
in PcdSetting
:
1456 PcdValue
, DatumType
, MaxDatumSize
= PcdSetting
[self
.SkuIdMgr
.SystemSkuId
]
1458 Pcds
[PcdCName
, TokenSpaceGuid
] = PcdClassObject(
1461 self
._PCD
_TYPE
_STRING
_[Type
],
1474 def __UNICODE2OCTList(self
,Value
):
1475 Value
= Value
.strip()
1479 Temp
= '%04X' % ord(Item
)
1480 List
.append('0x' + Temp
[2:4])
1481 List
.append('0x' + Temp
[0:2])
1485 def __STRING2OCTList(self
,Value
):
1487 Value
= Value
.strip('"')
1489 Temp
= '%02X' % ord(char
)
1490 OCTList
.append('0x' + Temp
)
1491 OCTList
.append('0x00')
1494 def GetStructurePcdMaxSize(self
, str_pcd
):
1495 pcd_default_value
= str_pcd
.DefaultValue
1496 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()]
1497 sku_values
.append(pcd_default_value
)
1499 def get_length(value
):
1500 Value
= value
.strip()
1502 if Value
.startswith('GUID') and Value
.endswith(')'):
1504 if Value
.startswith('L"') and Value
.endswith('"'):
1505 return len(Value
[2:-1])
1506 if Value
[0] == '"' and Value
[-1] == '"':
1507 return len(Value
) - 2
1508 if Value
[0] == '{' and Value
[-1] == '}':
1509 return len(Value
.split(","))
1510 if Value
.startswith("L'") and Value
.endswith("'") and len(list(Value
[2:-1])) > 1:
1511 return len(list(Value
[2:-1]))
1512 if Value
[0] == "'" and Value
[-1] == "'" and len(list(Value
[1:-1])) > 1:
1513 return len(Value
) - 2
1516 return str(max([pcd_size
for pcd_size
in [get_length(item
) for item
in sku_values
]]))
1518 def IsFieldValueAnArray (self
, Value
):
1519 Value
= Value
.strip()
1520 if Value
.startswith('GUID') and Value
.endswith(')'):
1522 if Value
.startswith('L"') and Value
.endswith('"') and len(list(Value
[2:-1])) > 1:
1524 if Value
[0] == '"' and Value
[-1] == '"' and len(list(Value
[1:-1])) > 1:
1526 if Value
[0] == '{' and Value
[-1] == '}':
1528 if Value
.startswith("L'") and Value
.endswith("'") and len(list(Value
[2:-1])) > 1:
1529 print 'foo = ', list(Value
[2:-1])
1531 if Value
[0] == "'" and Value
[-1] == "'" and len(list(Value
[1:-1])) > 1:
1532 print 'bar = ', list(Value
[1:-1])
1536 def ExecuteCommand (self
, Command
):
1538 Process
= subprocess
.Popen(Command
, stdout
=subprocess
.PIPE
, stderr
=subprocess
.PIPE
, shell
=True)
1540 EdkLogger
.error('Build', COMMAND_FAILURE
, 'Can not execute command: %s' % Command
)
1541 Result
= Process
.communicate()
1542 return Process
.returncode
, Result
[0], Result
[1]
1544 def IntToCString(self
, Value
, ValueSize
):
1546 if not isinstance (Value
, str):
1547 for Index
in range(0, ValueSize
):
1548 Result
= Result
+ '\\x%02x' % (Value
& 0xff)
1550 Result
= Result
+ '"'
1553 def GenerateInitializeFunc(self
, SkuName
, DefaultStoreName
, Pcd
, InitByteValue
, CApp
):
1554 OverrideValues
= {DefaultStoreName
:""}
1555 if Pcd
.SkuOverrideValues
:
1556 OverrideValues
= Pcd
.SkuOverrideValues
[SkuName
]
1557 for DefaultStoreName
in OverrideValues
.keys():
1558 CApp
= CApp
+ 'void\n'
1559 CApp
= CApp
+ 'Initialize_%s_%s_%s_%s(\n' % (SkuName
, DefaultStoreName
, Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
)
1560 CApp
= CApp
+ ' void\n'
1561 CApp
= CApp
+ ' )\n'
1563 CApp
= CApp
+ ' UINT32 Size;\n'
1564 CApp
= CApp
+ ' UINT32 FieldSize;\n'
1565 CApp
= CApp
+ ' CHAR8 *Value;\n'
1566 CApp
= CApp
+ ' UINT32 OriginalSize;\n'
1567 CApp
= CApp
+ ' VOID *OriginalPcd;\n'
1568 CApp
= CApp
+ ' %s *Pcd; // From %s Line %d \n' % (Pcd
.DatumType
, Pcd
.PkgPath
, Pcd
.PcdDefineLineNo
)
1571 if SkuName
in Pcd
.SkuInfoList
:
1572 DefaultValue
= Pcd
.SkuInfoList
[SkuName
].DefaultStoreDict
.get(DefaultStoreName
,Pcd
.SkuInfoList
[SkuName
].HiiDefaultValue
) if Pcd
.SkuInfoList
[SkuName
].HiiDefaultValue
else Pcd
.SkuInfoList
[SkuName
].DefaultValue
1574 DefaultValue
= Pcd
.DefaultValue
1575 PcdDefaultValue
= StringToArray(DefaultValue
.strip())
1577 InitByteValue
+= '%s.%s.%s.%s|%s|%s\n' % (SkuName
, DefaultStoreName
, Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
, Pcd
.DatumType
, PcdDefaultValue
)
1580 # Get current PCD value and size
1582 CApp
= CApp
+ ' OriginalPcd = PcdGetPtr (%s, %s, %s, %s, &OriginalSize);\n' % (SkuName
, DefaultStoreName
, Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
)
1585 # Determine the size of the PCD. For simple structures, sizeof(TYPE) provides
1586 # the correct value. For structures with a flexible array member, the flexible
1587 # array member is detected, and the size is based on the highest index used with
1588 # the flexible array member. The flexible array member must be the last field
1589 # in a structure. The size formula for this case is:
1590 # OFFSET_OF(FlexbleArrayField) + sizeof(FlexibleArray[0]) * (HighestIndex + 1)
1592 CApp
= CApp
+ ' Size = sizeof(%s);\n' % (Pcd
.DatumType
)
1593 CApp
= CApp
+ "// Default Value in Dec \n"
1594 for FieldList
in [Pcd
.DefaultValues
]:
1597 for FieldName
in FieldList
:
1598 FieldName
= "." + FieldName
1599 IsArray
= self
.IsFieldValueAnArray(FieldList
[FieldName
.strip(".")][0])
1602 Value
= ValueExpressionEx(FieldList
[FieldName
.strip(".")][0], "VOID*", self
._GuidDict
)(True)
1603 except BadExpression
:
1604 EdkLogger
.error('Build', FORMAT_INVALID
, "Invalid value format for %s. From %s Line %d " %
1605 (".".join((Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
, FieldName
.strip('.'))), FieldList
[FieldName
.strip(".")][1], FieldList
[FieldName
.strip(".")][2]))
1606 Value
, ValueSize
= ParseFieldValue(Value
)
1607 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]);
1610 FieldName_ori
= FieldName
.strip('.')
1611 while '[' in FieldName
:
1612 NewFieldName
= NewFieldName
+ FieldName
.split('[', 1)[0] + '[0]'
1613 ArrayIndex
= int(FieldName
.split('[', 1)[1].split(']', 1)[0])
1614 FieldName
= FieldName
.split(']', 1)[1]
1615 FieldName
= NewFieldName
+ FieldName
1616 while '[' in FieldName
:
1617 FieldName
= FieldName
.rsplit('[', 1)[0]
1618 CApp
= CApp
+ ' __FLEXIBLE_SIZE(Size, %s, %s, %d); // From %s Line %d Value %s\n' % (Pcd
.DatumType
, FieldName
.strip("."), ArrayIndex
+ 1, FieldList
[FieldName_ori
][1], FieldList
[FieldName_ori
][2], FieldList
[FieldName_ori
][0])
1619 for skuname
in self
.SkuIdMgr
.GetSkuChain(SkuName
):
1620 inherit_OverrideValues
= Pcd
.SkuOverrideValues
[skuname
]
1621 storeset
= [DefaultStoreName
] if DefaultStoreName
== 'STANDARD' else ['STANDARD', DefaultStoreName
]
1622 for defaultstorenameitem
in storeset
:
1623 CApp
= CApp
+ "// SkuName: %s, DefaultStoreName: %s \n" % (skuname
, defaultstorenameitem
)
1624 for FieldList
in [inherit_OverrideValues
.get(defaultstorenameitem
)]:
1627 for FieldName
in FieldList
:
1628 FieldName
= "." + FieldName
1629 IsArray
= self
.IsFieldValueAnArray(FieldList
[FieldName
.strip(".")][0])
1632 Value
= ValueExpressionEx(FieldList
[FieldName
.strip(".")][0], "VOID*", self
._GuidDict
)(True)
1633 except BadExpression
:
1634 EdkLogger
.error('Build', FORMAT_INVALID
, "Invalid value format for %s. From %s Line %d " %
1635 (".".join((Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
, FieldName
.strip('.'))), FieldList
[FieldName
.strip(".")][1], FieldList
[FieldName
.strip(".")][2]))
1636 Value
, ValueSize
= ParseFieldValue(Value
)
1637 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]);
1640 FieldName_ori
= FieldName
.strip('.')
1641 while '[' in FieldName
:
1642 NewFieldName
= NewFieldName
+ FieldName
.split('[', 1)[0] + '[0]'
1643 ArrayIndex
= int(FieldName
.split('[', 1)[1].split(']', 1)[0])
1644 FieldName
= FieldName
.split(']', 1)[1]
1645 FieldName
= NewFieldName
+ FieldName
1646 while '[' in FieldName
:
1647 FieldName
= FieldName
.rsplit('[', 1)[0]
1648 CApp
= CApp
+ ' __FLEXIBLE_SIZE(Size, %s, %s, %d); // From %s Line %d Value %s \n' % (Pcd
.DatumType
, FieldName
.strip("."), ArrayIndex
+ 1, FieldList
[FieldName_ori
][1], FieldList
[FieldName_ori
][2], FieldList
[FieldName_ori
][0])
1649 if skuname
== SkuName
:
1653 # Allocate and zero buffer for the PCD
1654 # Must handle cases where current value is smaller, larger, or same size
1655 # Always keep that larger one as the current size
1657 CApp
= CApp
+ ' Size = (OriginalSize > Size ? OriginalSize : Size);\n'
1658 CApp
= CApp
+ ' Pcd = (%s *)malloc (Size);\n' % (Pcd
.DatumType
)
1659 CApp
= CApp
+ ' memset (Pcd, 0, Size);\n'
1662 # Copy current PCD value into allocated buffer.
1664 CApp
= CApp
+ ' memcpy (Pcd, OriginalPcd, OriginalSize);\n'
1667 # Assign field values in PCD
1669 CApp
= CApp
+ "// Default value in Dec \n"
1670 for FieldList
in [Pcd
.DefaultValues
]:
1673 for FieldName
in FieldList
:
1674 IsArray
= self
.IsFieldValueAnArray(FieldList
[FieldName
][0])
1677 FieldList
[FieldName
][0] = ValueExpressionEx(FieldList
[FieldName
][0], "VOID*", self
._GuidDict
)(True)
1678 except BadExpression
:
1679 EdkLogger
.error('Build', FORMAT_INVALID
, "Invalid value format for %s. From %s Line %d " %
1680 (".".join((Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
, FieldName
)), FieldList
[FieldName
][1],FieldList
[FieldName
][2]))
1683 Value
, ValueSize
= ParseFieldValue (FieldList
[FieldName
][0])
1685 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]))
1686 if isinstance(Value
, str):
1687 CApp
= CApp
+ ' Pcd->%s = %s; // From %s Line %d Value %s\n' % (FieldName
, Value
, FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
1690 # Use memcpy() to copy value into field
1692 CApp
= CApp
+ ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd
.DatumType
, FieldName
)
1693 CApp
= CApp
+ ' Value = %s; // From %s Line %d Value %s\n' % (self
.IntToCString(Value
, ValueSize
), FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
1694 CApp
= CApp
+ ' memcpy (&Pcd->%s[0], Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName
, ValueSize
, ValueSize
)
1697 CApp
= CApp
+ ' Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName
, Value
, FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
1699 CApp
= CApp
+ ' Pcd->%s = %d; // From %s Line %d Value %s\n' % (FieldName
, Value
, FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
1700 for skuname
in self
.SkuIdMgr
.GetSkuChain(SkuName
):
1701 inherit_OverrideValues
= Pcd
.SkuOverrideValues
[skuname
]
1702 storeset
= [DefaultStoreName
] if DefaultStoreName
== 'STANDARD' else ['STANDARD', DefaultStoreName
]
1703 for defaultstorenameitem
in storeset
:
1704 CApp
= CApp
+ "// SkuName: %s, DefaultStoreName: %s \n" % (skuname
, defaultstorenameitem
)
1705 pcddefaultvalue
= Pcd
.DefaultFromDSC
.get(skuname
,{}).get(defaultstorenameitem
, Pcd
.DefaultValue
) if Pcd
.DefaultFromDSC
else Pcd
.DefaultValue
1706 for FieldList
in [pcddefaultvalue
,inherit_OverrideValues
.get(defaultstorenameitem
)]:
1709 if pcddefaultvalue
and FieldList
== pcddefaultvalue
:
1710 IsArray
= self
.IsFieldValueAnArray(FieldList
)
1713 FieldList
= ValueExpressionEx(FieldList
, "VOID*")(True)
1714 except BadExpression
:
1715 EdkLogger
.error("Build", FORMAT_INVALID
, "Invalid value format for %s.%s, from DSC: %s" %
1716 (Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
, FieldList
))
1717 Value
, ValueSize
= ParseFieldValue (FieldList
)
1718 if isinstance(Value
, str):
1719 CApp
= CApp
+ ' Pcd = %s; // From DSC Default Value %s\n' % (Value
, Pcd
.DefaultFromDSC
.get(skuname
,{}).get(defaultstorenameitem
, Pcd
.DefaultValue
) if Pcd
.DefaultFromDSC
else Pcd
.DefaultValue
)
1722 # Use memcpy() to copy value into field
1724 CApp
= CApp
+ ' Value = %s; // From DSC Default Value %s\n' % (self
.IntToCString(Value
, ValueSize
), Pcd
.DefaultFromDSC
.get(skuname
,{}).get(defaultstorenameitem
, Pcd
.DefaultValue
) if Pcd
.DefaultFromDSC
else Pcd
.DefaultValue
)
1725 CApp
= CApp
+ ' memcpy (Pcd, Value, %d);\n' % (ValueSize
)
1727 for FieldName
in FieldList
:
1728 IsArray
= self
.IsFieldValueAnArray(FieldList
[FieldName
][0])
1731 FieldList
[FieldName
][0] = ValueExpressionEx(FieldList
[FieldName
][0], "VOID*", self
._GuidDict
)(True)
1732 except BadExpression
:
1733 EdkLogger
.error('Build', FORMAT_INVALID
, "Invalid value format for %s. From %s Line %d " %
1734 (".".join((Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
, FieldName
)), FieldList
[FieldName
][1], FieldList
[FieldName
][2]))
1736 Value
, ValueSize
= ParseFieldValue (FieldList
[FieldName
][0])
1738 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]))
1739 if isinstance(Value
, str):
1740 CApp
= CApp
+ ' Pcd->%s = %s; // From %s Line %d Value %s\n' % (FieldName
, Value
, FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
1743 # Use memcpy() to copy value into field
1745 CApp
= CApp
+ ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd
.DatumType
, FieldName
)
1746 CApp
= CApp
+ ' Value = %s; // From %s Line %d Value %s\n' % (self
.IntToCString(Value
, ValueSize
), FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
1747 CApp
= CApp
+ ' memcpy (&Pcd->%s[0], Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName
, ValueSize
, ValueSize
)
1750 CApp
= CApp
+ ' Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName
, Value
, FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
1752 CApp
= CApp
+ ' Pcd->%s = %d; // From %s Line %d Value %s\n' % (FieldName
, Value
, FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
1753 if skuname
== SkuName
:
1756 # Set new PCD value and size
1758 CApp
= CApp
+ ' PcdSetPtr (%s, %s, %s, %s, Size, (UINT8 *)Pcd);\n' % (SkuName
, DefaultStoreName
, Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
)
1763 CApp
= CApp
+ ' free (Pcd);\n'
1766 return InitByteValue
, CApp
1768 def GenerateByteArrayValue (self
, StructuredPcds
):
1770 # Generate/Compile/Run C application to determine if there are any flexible array members
1772 if not StructuredPcds
:
1776 CApp
= PcdMainCHeader
1779 for PcdName
in StructuredPcds
:
1780 Pcd
= StructuredPcds
[PcdName
]
1781 for IncludeFile
in Pcd
.StructuredPcdIncludeFile
:
1782 if IncludeFile
not in Includes
:
1783 Includes
[IncludeFile
] = True
1784 CApp
= CApp
+ '#include <%s>\n' % (IncludeFile
)
1787 for PcdName
in StructuredPcds
:
1788 Pcd
= StructuredPcds
[PcdName
]
1789 if not Pcd
.SkuOverrideValues
:
1790 InitByteValue
, CApp
= self
.GenerateInitializeFunc(self
.SkuIdMgr
.SystemSkuId
, 'STANDARD', Pcd
, InitByteValue
, CApp
)
1792 for SkuName
in self
.SkuIdMgr
.SkuOverrideOrder():
1793 if SkuName
not in Pcd
.SkuOverrideValues
:
1795 for DefaultStoreName
in Pcd
.DefaultStoreName
:
1796 Pcd
= StructuredPcds
[PcdName
]
1797 InitByteValue
, CApp
= self
.GenerateInitializeFunc(SkuName
, DefaultStoreName
, Pcd
, InitByteValue
, CApp
)
1799 CApp
= CApp
+ 'VOID\n'
1800 CApp
= CApp
+ 'PcdEntryPoint(\n'
1801 CApp
= CApp
+ ' VOID\n'
1802 CApp
= CApp
+ ' )\n'
1804 for Pcd
in StructuredPcds
.values():
1805 if not Pcd
.SkuOverrideValues
:
1806 CApp
= CApp
+ ' Initialize_%s_%s_%s_%s();\n' % (self
.SkuIdMgr
.SystemSkuId
, 'STANDARD', Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
)
1808 for SkuName
in self
.SkuIdMgr
.SkuOverrideOrder():
1809 if SkuName
not in Pcd
.SkuOverrideValues
:
1811 for DefaultStoreName
in Pcd
.SkuOverrideValues
[SkuName
]:
1812 CApp
= CApp
+ ' Initialize_%s_%s_%s_%s();\n' % (SkuName
, DefaultStoreName
, Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
)
1815 CApp
= CApp
+ PcdMainCEntry
+ '\n'
1817 if not os
.path
.exists(self
.OutputPath
):
1818 os
.makedirs(self
.OutputPath
)
1819 CAppBaseFileName
= os
.path
.join(self
.OutputPath
, PcdValueInitName
)
1820 File
= open (CAppBaseFileName
+ '.c', 'w')
1824 MakeApp
= PcdMakefileHeader
1825 if sys
.platform
== "win32":
1826 MakeApp
= MakeApp
+ 'ARCH = IA32\nAPPNAME = %s\n' % (PcdValueInitName
) + 'OBJECTS = %s\%s.obj\n' % (self
.OutputPath
, PcdValueInitName
) + 'INC = '
1828 MakeApp
= MakeApp
+ PcdGccMakefile
1829 MakeApp
= MakeApp
+ 'APPNAME = %s\n' % (PcdValueInitName
) + 'OBJECTS = %s/%s.o\n' % (self
.OutputPath
, PcdValueInitName
) + \
1830 'include $(MAKEROOT)/Makefiles/app.makefile\n' + 'INCLUDE +='
1833 for Cache
in self
._Bdb
._CACHE
_.values():
1834 if Cache
.MetaFile
.Ext
.lower() != '.dec':
1837 if str(Cache
.MetaFile
.Path
) not in PlatformInc
:
1838 PlatformInc
[str(Cache
.MetaFile
.Path
)] = Cache
.Includes
1841 for Pcd
in StructuredPcds
.values():
1842 for PackageDec
in Pcd
.PackageDecs
:
1843 Package
= os
.path
.normpath(mws
.join(GlobalData
.gWorkspace
, PackageDec
))
1844 if not os
.path
.exists(Package
):
1845 EdkLogger
.error('Build', RESOURCE_NOT_AVAILABLE
, "The dependent Package %s of PCD %s.%s is not exist." % (PackageDec
, Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
))
1846 if Package
not in PcdDependDEC
:
1847 PcdDependDEC
.append(Package
)
1849 if PlatformInc
and PcdDependDEC
:
1850 for pkg
in PcdDependDEC
:
1851 if pkg
in PlatformInc
:
1852 for inc
in PlatformInc
[pkg
]:
1853 MakeApp
+= '-I' + str(inc
) + ' '
1854 MakeApp
= MakeApp
+ '\n'
1856 CC_FLAGS
= LinuxCFLAGS
1857 if sys
.platform
== "win32":
1858 CC_FLAGS
= WindowsCFLAGS
1860 for Options
in self
.BuildOptions
:
1861 if Options
[2] != EDKII_NAME
:
1864 if Family
and Family
!= self
.ToolChainFamily
:
1866 Target
, Tag
, Arch
, Tool
, Attr
= Options
[1].split("_")
1870 if Target
== "*" or Target
== self
._Target
:
1871 if Tag
== "*" or Tag
== self
._Toolchain
:
1872 if Arch
== "*" or Arch
== self
.Arch
:
1873 if Tool
not in BuildOptions
:
1874 BuildOptions
[Tool
] = {}
1875 if Attr
!= "FLAGS" or Attr
not in BuildOptions
[Tool
] or self
.BuildOptions
[Options
].startswith('='):
1876 BuildOptions
[Tool
][Attr
] = self
.BuildOptions
[Options
]
1878 # append options for the same tool except PATH
1880 BuildOptions
[Tool
][Attr
] += " " + self
.BuildOptions
[Options
]
1882 BuildOptions
[Tool
][Attr
] = self
.BuildOptions
[Options
]
1884 for Tool
in BuildOptions
:
1885 for Attr
in BuildOptions
[Tool
]:
1887 Value
= BuildOptions
[Tool
][Attr
]
1888 ValueList
= Value
.split()
1890 for Id
, Item
in enumerate(ValueList
):
1891 if Item
== '-D' or Item
== '/D':
1892 CC_FLAGS
+= ' ' + Item
1893 if Id
+ 1 < len(ValueList
):
1894 CC_FLAGS
+= ' ' + ValueList
[Id
+ 1]
1895 elif Item
.startswith('/D') or Item
.startswith('-D'):
1896 CC_FLAGS
+= ' ' + Item
1899 if sys
.platform
== "win32":
1900 MakeApp
= MakeApp
+ PcdMakefileEnd
1901 MakeFileName
= os
.path
.join(self
.OutputPath
, 'Makefile')
1902 File
= open (MakeFileName
, 'w')
1906 InputValueFile
= os
.path
.join(self
.OutputPath
, 'Input.txt')
1907 OutputValueFile
= os
.path
.join(self
.OutputPath
, 'Output.txt')
1908 File
= open (InputValueFile
, 'w')
1909 File
.write(InitByteValue
)
1913 if sys
.platform
== "win32":
1914 MakeCommand
= 'nmake clean & nmake -f %s' % (MakeFileName
)
1915 returncode
, StdOut
, StdErr
= self
.ExecuteCommand (MakeCommand
)
1918 MakeCommand
= 'make clean & make -f %s' % (MakeFileName
)
1919 returncode
, StdOut
, StdErr
= self
.ExecuteCommand (MakeCommand
)
1921 Messages
= Messages
.split('\n')
1924 CAppBaseFileName
= os
.path
.join(self
.OutputPath
, PcdValueInitName
)
1925 File
= open (CAppBaseFileName
+ '.c', 'r')
1926 FileData
= File
.readlines()
1928 for Message
in Messages
:
1929 if " error" in Message
or "warning" in Message
:
1930 FileInfo
= Message
.strip().split('(')
1931 if len (FileInfo
) > 1:
1932 FileName
= FileInfo
[0]
1933 FileLine
= FileInfo
[1].split (')')[0]
1935 FileInfo
= Message
.strip().split(':')
1936 FileName
= FileInfo
[0]
1937 FileLine
= FileInfo
[1]
1938 if FileLine
.isdigit():
1939 error_line
= FileData
[int (FileLine
) - 1]
1940 if r
"//" in error_line
:
1941 c_line
,dsc_line
= error_line
.split(r
"//")
1943 dsc_line
= error_line
1944 message_itmes
= Message
.split(":")
1946 if "PcdValueInit.c" not in Message
:
1949 for item
in message_itmes
:
1950 if "PcdValueInit.c" in item
:
1951 Index
= message_itmes
.index(item
)
1952 message_itmes
[Index
] = dsc_line
.strip()
1954 MessageGroup
.append(":".join(message_itmes
[Index
:]).strip())
1957 MessageGroup
.append(Message
)
1959 EdkLogger
.error("build", PCD_STRUCTURE_PCD_ERROR
, "\n".join(MessageGroup
) )
1961 EdkLogger
.error('Build', COMMAND_FAILURE
, 'Can not execute command: %s' % MakeCommand
)
1963 PcdValueInitExe
= PcdValueInitName
1964 if not sys
.platform
== "win32":
1965 PcdValueInitExe
= os
.path
.join(os
.getenv("EDK_TOOLS_PATH"), 'Source', 'C', 'bin', PcdValueInitName
)
1967 Command
= PcdValueInitExe
+ ' -i %s -o %s' % (InputValueFile
, OutputValueFile
)
1968 returncode
, StdOut
, StdErr
= self
.ExecuteCommand (Command
)
1970 EdkLogger
.warn('Build', COMMAND_FAILURE
, 'Can not collect output from command: %s' % Command
)
1973 File
= open (OutputValueFile
, 'r')
1974 FileBuffer
= File
.readlines()
1977 StructurePcdSet
= []
1978 for Pcd
in FileBuffer
:
1979 PcdValue
= Pcd
.split ('|')
1980 PcdInfo
= PcdValue
[0].split ('.')
1981 StructurePcdSet
.append((PcdInfo
[0],PcdInfo
[1], PcdInfo
[2], PcdInfo
[3], PcdValue
[2].strip()))
1982 return StructurePcdSet
1984 ## Retrieve dynamic PCD settings
1986 # @param Type PCD type
1988 # @retval a dict object contains settings of given PCD type
1990 def _GetDynamicPcd(self
, Type
):
1995 # tdict is a special dict kind of type, used for selecting correct
1996 # PCD settings for certain ARCH and SKU
1998 PcdDict
= tdict(True, 4)
2000 # Find out all possible PCD candidates for self._Arch
2001 RecordList
= self
._RawData
[Type
, self
._Arch
]
2002 AvailableSkuIdSet
= copy
.copy(self
.SkuIds
)
2005 for TokenSpaceGuid
, PcdCName
, Setting
, Arch
, SkuName
, Dummy3
, Dummy4
,Dummy5
in RecordList
:
2006 SkuName
= SkuName
.upper()
2007 SkuName
= 'DEFAULT' if SkuName
== 'COMMON' else SkuName
2008 if SkuName
not in AvailableSkuIdSet
:
2009 EdkLogger
.error('build', PARAMETER_INVALID
, 'Sku %s is not defined in [SkuIds] section' % SkuName
,
2010 File
=self
.MetaFile
, Line
=Dummy5
)
2011 if "." not in TokenSpaceGuid
:
2012 PcdList
.append((PcdCName
, TokenSpaceGuid
, SkuName
, Dummy5
))
2013 PcdDict
[Arch
, SkuName
, PcdCName
, TokenSpaceGuid
] = Setting
2015 # Remove redundant PCD candidates, per the ARCH and SKU
2016 for PcdCName
, TokenSpaceGuid
, SkuName
, Dummy4
in PcdList
:
2018 Setting
= PcdDict
[self
._Arch
, SkuName
, PcdCName
, TokenSpaceGuid
]
2022 PcdValue
, DatumType
, MaxDatumSize
= self
._ValidatePcd
(PcdCName
, TokenSpaceGuid
, Setting
, Type
, Dummy4
)
2023 SkuInfo
= SkuInfoClass(SkuName
, self
.SkuIds
[SkuName
][0], '', '', '', '', '', PcdValue
)
2024 if (PcdCName
, TokenSpaceGuid
) in Pcds
.keys():
2025 pcdObject
= Pcds
[PcdCName
, TokenSpaceGuid
]
2026 pcdObject
.SkuInfoList
[SkuName
] = SkuInfo
2027 if MaxDatumSize
.strip():
2028 CurrentMaxSize
= int(MaxDatumSize
.strip(), 0)
2031 if pcdObject
.MaxDatumSize
:
2032 PcdMaxSize
= int(pcdObject
.MaxDatumSize
, 0)
2035 if CurrentMaxSize
> PcdMaxSize
:
2036 pcdObject
.MaxDatumSize
= str(CurrentMaxSize
)
2038 Pcds
[PcdCName
, TokenSpaceGuid
] = PcdClassObject(
2041 self
._PCD
_TYPE
_STRING
_[Type
],
2046 {SkuName
: SkuInfo
},
2051 for pcd
in Pcds
.values():
2052 pcdDecObject
= self
._DecPcds
[pcd
.TokenCName
, pcd
.TokenSpaceGuidCName
]
2053 # Only fix the value while no value provided in DSC file.
2054 for sku
in pcd
.SkuInfoList
.values():
2055 if (sku
.DefaultValue
== "" or sku
.DefaultValue
==None):
2056 sku
.DefaultValue
= pcdDecObject
.DefaultValue
2057 if 'DEFAULT' not in pcd
.SkuInfoList
.keys() and 'COMMON' not in pcd
.SkuInfoList
.keys():
2058 valuefromDec
= pcdDecObject
.DefaultValue
2059 SkuInfo
= SkuInfoClass('DEFAULT', '0', '', '', '', '', '', valuefromDec
)
2060 pcd
.SkuInfoList
['DEFAULT'] = SkuInfo
2061 elif 'DEFAULT' not in pcd
.SkuInfoList
.keys() and 'COMMON' in pcd
.SkuInfoList
.keys():
2062 pcd
.SkuInfoList
['DEFAULT'] = pcd
.SkuInfoList
['COMMON']
2063 del(pcd
.SkuInfoList
['COMMON'])
2064 elif 'DEFAULT' in pcd
.SkuInfoList
.keys() and 'COMMON' in pcd
.SkuInfoList
.keys():
2065 del(pcd
.SkuInfoList
['COMMON'])
2067 map(self
.FilterSkuSettings
,Pcds
.values())
2071 def FilterSkuSettings(self
, PcdObj
):
2073 if self
.SkuIdMgr
.SkuUsageType
== self
.SkuIdMgr
.SINGLE
:
2074 if 'DEFAULT' in PcdObj
.SkuInfoList
.keys() and self
.SkuIdMgr
.SystemSkuId
not in PcdObj
.SkuInfoList
.keys():
2075 PcdObj
.SkuInfoList
[self
.SkuIdMgr
.SystemSkuId
] = PcdObj
.SkuInfoList
['DEFAULT']
2076 PcdObj
.SkuInfoList
= {'DEFAULT':PcdObj
.SkuInfoList
[self
.SkuIdMgr
.SystemSkuId
]}
2077 PcdObj
.SkuInfoList
['DEFAULT'].SkuIdName
= 'DEFAULT'
2078 PcdObj
.SkuInfoList
['DEFAULT'].SkuId
= '0'
2080 elif self
.SkuIdMgr
.SkuUsageType
== self
.SkuIdMgr
.DEFAULT
:
2081 PcdObj
.SkuInfoList
= {'DEFAULT':PcdObj
.SkuInfoList
['DEFAULT']}
2086 def CompareVarAttr(self
, Attr1
, Attr2
):
2087 if not Attr1
or not Attr2
: # for empty string
2089 Attr1s
= [attr
.strip() for attr
in Attr1
.split(",")]
2090 Attr1Set
= set(Attr1s
)
2091 Attr2s
= [attr
.strip() for attr
in Attr2
.split(",")]
2092 Attr2Set
= set(Attr2s
)
2093 if Attr2Set
== Attr1Set
:
2097 def CompletePcdValues(self
,PcdSet
):
2099 DefaultStoreObj
= DefaultStore(self
._GetDefaultStores
())
2100 SkuIds
= {skuname
:skuid
for skuname
,skuid
in self
.SkuIdMgr
.AvailableSkuIdSet
.items() if skuname
!='COMMON'}
2101 DefaultStores
= set([storename
for pcdobj
in PcdSet
.values() for skuobj
in pcdobj
.SkuInfoList
.values() for storename
in skuobj
.DefaultStoreDict
.keys()])
2102 for PcdCName
, TokenSpaceGuid
in PcdSet
:
2103 PcdObj
= PcdSet
[(PcdCName
, TokenSpaceGuid
)]
2104 if PcdObj
.Type
not in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_DEFAULT
],
2105 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_HII
],
2106 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_VPD
],
2107 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_DEFAULT
],
2108 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_HII
],
2109 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_VPD
]]:
2110 Pcds
[PcdCName
, TokenSpaceGuid
]= PcdObj
2112 PcdType
= PcdObj
.Type
2113 if PcdType
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_HII
], self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_HII
]]:
2114 for skuid
in PcdObj
.SkuInfoList
:
2115 skuobj
= PcdObj
.SkuInfoList
[skuid
]
2116 mindefaultstorename
= DefaultStoreObj
.GetMin(set([defaultstorename
for defaultstorename
in skuobj
.DefaultStoreDict
]))
2117 for defaultstorename
in DefaultStores
:
2118 if defaultstorename
not in skuobj
.DefaultStoreDict
:
2119 skuobj
.DefaultStoreDict
[defaultstorename
] = copy
.deepcopy(skuobj
.DefaultStoreDict
[mindefaultstorename
])
2120 skuobj
.HiiDefaultValue
= skuobj
.DefaultStoreDict
[mindefaultstorename
]
2121 for skuname
,skuid
in SkuIds
.items():
2122 if skuname
not in PcdObj
.SkuInfoList
:
2123 nextskuid
= self
.SkuIdMgr
.GetNextSkuId(skuname
)
2124 while nextskuid
not in PcdObj
.SkuInfoList
:
2125 nextskuid
= self
.SkuIdMgr
.GetNextSkuId(nextskuid
)
2126 PcdObj
.SkuInfoList
[skuname
] = copy
.deepcopy(PcdObj
.SkuInfoList
[nextskuid
])
2127 PcdObj
.SkuInfoList
[skuname
].SkuId
= skuid
2128 PcdObj
.SkuInfoList
[skuname
].SkuIdName
= skuname
2129 if PcdType
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_HII
], self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_HII
]]:
2130 PcdObj
.DefaultValue
= PcdObj
.SkuInfoList
.values()[0].HiiDefaultValue
if self
.SkuIdMgr
.SkuUsageType
== self
.SkuIdMgr
.SINGLE
else PcdObj
.SkuInfoList
["DEFAULT"].HiiDefaultValue
2131 Pcds
[PcdCName
, TokenSpaceGuid
]= PcdObj
2133 ## Retrieve dynamic HII PCD settings
2135 # @param Type PCD type
2137 # @retval a dict object contains settings of given PCD type
2139 def _GetDynamicHiiPcd(self
, Type
):
2145 # tdict is a special dict kind of type, used for selecting correct
2146 # PCD settings for certain ARCH and SKU
2148 PcdDict
= tdict(True, 5)
2150 RecordList
= self
._RawData
[Type
, self
._Arch
]
2151 # Find out all possible PCD candidates for self._Arch
2152 AvailableSkuIdSet
= copy
.copy(self
.SkuIds
)
2153 DefaultStoresDefine
= self
._GetDefaultStores
()
2155 for TokenSpaceGuid
, PcdCName
, Setting
, Arch
, SkuName
, DefaultStore
, Dummy4
,Dummy5
in RecordList
:
2156 SkuName
= SkuName
.upper()
2157 SkuName
= 'DEFAULT' if SkuName
== 'COMMON' else SkuName
2158 DefaultStore
= DefaultStore
.upper()
2159 if DefaultStore
== "COMMON":
2160 DefaultStore
= "STANDARD"
2161 if SkuName
not in AvailableSkuIdSet
:
2162 EdkLogger
.error('build', PARAMETER_INVALID
, 'Sku %s is not defined in [SkuIds] section' % SkuName
,
2163 File
=self
.MetaFile
, Line
=Dummy5
)
2164 if DefaultStore
not in DefaultStoresDefine
:
2165 EdkLogger
.error('build', PARAMETER_INVALID
, 'DefaultStores %s is not defined in [DefaultStores] section' % DefaultStore
,
2166 File
=self
.MetaFile
, Line
=Dummy5
)
2167 if "." not in TokenSpaceGuid
:
2168 PcdSet
.add((PcdCName
, TokenSpaceGuid
, SkuName
,DefaultStore
, Dummy5
))
2169 PcdDict
[Arch
, SkuName
, PcdCName
, TokenSpaceGuid
,DefaultStore
] = Setting
2172 # Remove redundant PCD candidates, per the ARCH and SKU
2173 for PcdCName
, TokenSpaceGuid
, SkuName
,DefaultStore
, Dummy4
in PcdSet
:
2175 Setting
= PcdDict
[self
._Arch
, SkuName
, PcdCName
, TokenSpaceGuid
,DefaultStore
]
2178 VariableName
, VariableGuid
, VariableOffset
, DefaultValue
, VarAttribute
= self
._ValidatePcd
(PcdCName
, TokenSpaceGuid
, Setting
, Type
, Dummy4
)
2180 rt
, Msg
= VariableAttributes
.ValidateVarAttributes(VarAttribute
)
2182 EdkLogger
.error("build", PCD_VARIABLE_ATTRIBUTES_ERROR
, "Variable attributes settings for %s is incorrect.\n %s" % (".".join((TokenSpaceGuid
, PcdCName
)), Msg
),
2183 ExtraData
="[%s]" % VarAttribute
)
2185 FormatCorrect
= True
2186 if VariableOffset
.isdigit():
2187 if int(VariableOffset
, 10) > 0xFFFF:
2189 elif re
.match(r
'[\t\s]*0[xX][a-fA-F0-9]+$', VariableOffset
):
2190 if int(VariableOffset
, 16) > 0xFFFF:
2192 # For Offset written in "A.B"
2193 elif VariableOffset
.find('.') > -1:
2194 VariableOffsetList
= VariableOffset
.split(".")
2195 if not (len(VariableOffsetList
) == 2
2196 and IsValidWord(VariableOffsetList
[0])
2197 and IsValidWord(VariableOffsetList
[1])):
2198 FormatCorrect
= False
2200 FormatCorrect
= False
2201 if not FormatCorrect
:
2202 EdkLogger
.error('Build', FORMAT_INVALID
, "Invalid syntax or format of the variable offset value is incorrect for %s." % ".".join((TokenSpaceGuid
, PcdCName
)))
2205 EdkLogger
.error('Build', OPTION_VALUE_INVALID
, "The variable offset value must not exceed the maximum value of 0xFFFF (UINT16) for %s." % ".".join((TokenSpaceGuid
, PcdCName
)))
2206 if (VariableName
, VariableGuid
) not in VariableAttrs
:
2207 VariableAttrs
[(VariableName
, VariableGuid
)] = VarAttribute
2209 if not self
.CompareVarAttr(VariableAttrs
[(VariableName
, VariableGuid
)], VarAttribute
):
2210 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
)]))
2212 pcdDecObject
= self
._DecPcds
[PcdCName
, TokenSpaceGuid
]
2213 if (PcdCName
, TokenSpaceGuid
) in Pcds
.keys():
2214 pcdObject
= Pcds
[PcdCName
, TokenSpaceGuid
]
2215 if SkuName
in pcdObject
.SkuInfoList
:
2216 Skuitem
= pcdObject
.SkuInfoList
[SkuName
]
2217 Skuitem
.DefaultStoreDict
.update({DefaultStore
:DefaultValue
})
2219 SkuInfo
= SkuInfoClass(SkuName
, self
.SkuIds
[SkuName
][0], VariableName
, VariableGuid
, VariableOffset
, DefaultValue
, VariableAttribute
=VarAttribute
,DefaultStore
={DefaultStore
:DefaultValue
})
2220 pcdObject
.SkuInfoList
[SkuName
] = SkuInfo
2222 SkuInfo
= SkuInfoClass(SkuName
, self
.SkuIds
[SkuName
][0], VariableName
, VariableGuid
, VariableOffset
, DefaultValue
, VariableAttribute
=VarAttribute
,DefaultStore
={DefaultStore
:DefaultValue
})
2223 Pcds
[PcdCName
, TokenSpaceGuid
] = PcdClassObject(
2226 self
._PCD
_TYPE
_STRING
_[Type
],
2231 {SkuName
: SkuInfo
},
2234 pcdDecObject
.validateranges
,
2235 pcdDecObject
.validlists
,
2236 pcdDecObject
.expressions
,
2240 for pcd
in Pcds
.values():
2241 SkuInfoObj
= pcd
.SkuInfoList
.values()[0]
2242 pcdDecObject
= self
._DecPcds
[pcd
.TokenCName
, pcd
.TokenSpaceGuidCName
]
2243 pcd
.DatumType
= pcdDecObject
.DatumType
2244 # Only fix the value while no value provided in DSC file.
2245 for sku
in pcd
.SkuInfoList
.values():
2246 if (sku
.HiiDefaultValue
== "" or sku
.HiiDefaultValue
== None):
2247 sku
.HiiDefaultValue
= pcdDecObject
.DefaultValue
2248 for default_store
in sku
.DefaultStoreDict
:
2249 sku
.DefaultStoreDict
[default_store
]=pcdDecObject
.DefaultValue
2250 pcd
.DefaultValue
= pcdDecObject
.DefaultValue
2251 if 'DEFAULT' not in pcd
.SkuInfoList
.keys() and 'COMMON' not in pcd
.SkuInfoList
.keys():
2252 valuefromDec
= pcdDecObject
.DefaultValue
2253 SkuInfo
= SkuInfoClass('DEFAULT', '0', SkuInfoObj
.VariableName
, SkuInfoObj
.VariableGuid
, SkuInfoObj
.VariableOffset
, valuefromDec
,VariableAttribute
=SkuInfoObj
.VariableAttribute
,DefaultStore
={DefaultStore
:valuefromDec
})
2254 pcd
.SkuInfoList
['DEFAULT'] = SkuInfo
2255 elif 'DEFAULT' not in pcd
.SkuInfoList
.keys() and 'COMMON' in pcd
.SkuInfoList
.keys():
2256 pcd
.SkuInfoList
['DEFAULT'] = pcd
.SkuInfoList
['COMMON']
2257 del(pcd
.SkuInfoList
['COMMON'])
2258 elif 'DEFAULT' in pcd
.SkuInfoList
.keys() and 'COMMON' in pcd
.SkuInfoList
.keys():
2259 del(pcd
.SkuInfoList
['COMMON'])
2261 if pcd
.MaxDatumSize
.strip():
2262 MaxSize
= int(pcd
.MaxDatumSize
, 0)
2265 if pcdDecObject
.DatumType
== 'VOID*':
2266 for (_
, skuobj
) in pcd
.SkuInfoList
.items():
2268 skuobj
.HiiDefaultValue
= StringToArray(skuobj
.HiiDefaultValue
)
2269 datalen
= len(skuobj
.HiiDefaultValue
.split(","))
2270 if datalen
> MaxSize
:
2272 for defaultst
in skuobj
.DefaultStoreDict
:
2273 skuobj
.DefaultStoreDict
[defaultst
] = StringToArray(skuobj
.DefaultStoreDict
[defaultst
])
2274 pcd
.DefaultValue
= StringToArray(pcd
.DefaultValue
)
2275 pcd
.MaxDatumSize
= str(MaxSize
)
2276 rt
, invalidhii
= self
.CheckVariableNameAssignment(Pcds
)
2278 invalidpcd
= ",".join(invalidhii
)
2279 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
)
2281 map(self
.FilterSkuSettings
,Pcds
.values())
2285 def CheckVariableNameAssignment(self
,Pcds
):
2287 for pcdname
in Pcds
:
2289 varnameset
= set([sku
.VariableName
for (skuid
,sku
) in pcd
.SkuInfoList
.items()])
2290 if len(varnameset
) > 1:
2291 invalidhii
.append(".".join((pcdname
[1],pcdname
[0])))
2293 return False,invalidhii
2296 ## Retrieve dynamic VPD PCD settings
2298 # @param Type PCD type
2300 # @retval a dict object contains settings of given PCD type
2302 def _GetDynamicVpdPcd(self
, Type
):
2307 # tdict is a special dict kind of type, used for selecting correct
2308 # PCD settings for certain ARCH and SKU
2310 PcdDict
= tdict(True, 4)
2313 # Find out all possible PCD candidates for self._Arch
2314 RecordList
= self
._RawData
[Type
, self
._Arch
]
2315 AvailableSkuIdSet
= copy
.copy(self
.SkuIds
)
2317 for TokenSpaceGuid
, PcdCName
, Setting
, Arch
, SkuName
, Dummy3
, Dummy4
,Dummy5
in RecordList
:
2318 SkuName
= SkuName
.upper()
2319 SkuName
= 'DEFAULT' if SkuName
== 'COMMON' else SkuName
2320 if SkuName
not in AvailableSkuIdSet
:
2321 EdkLogger
.error('build', PARAMETER_INVALID
, 'Sku %s is not defined in [SkuIds] section' % SkuName
,
2322 File
=self
.MetaFile
, Line
=Dummy5
)
2323 if "." not in TokenSpaceGuid
:
2324 PcdList
.append((PcdCName
, TokenSpaceGuid
, SkuName
, Dummy5
))
2325 PcdDict
[Arch
, SkuName
, PcdCName
, TokenSpaceGuid
] = Setting
2327 # Remove redundant PCD candidates, per the ARCH and SKU
2328 for PcdCName
, TokenSpaceGuid
, SkuName
, Dummy4
in PcdList
:
2329 Setting
= PcdDict
[self
._Arch
, SkuName
, PcdCName
, TokenSpaceGuid
]
2333 # For the VOID* type, it can have optional data of MaxDatumSize and InitialValue
2334 # For the Integer & Boolean type, the optional data can only be InitialValue.
2335 # At this point, we put all the data into the PcdClssObject for we don't know the PCD's datumtype
2336 # until the DEC parser has been called.
2338 VpdOffset
, MaxDatumSize
, InitialValue
= self
._ValidatePcd
(PcdCName
, TokenSpaceGuid
, Setting
, Type
, Dummy4
)
2339 SkuInfo
= SkuInfoClass(SkuName
, self
.SkuIds
[SkuName
][0], '', '', '', '', VpdOffset
, InitialValue
)
2340 if (PcdCName
, TokenSpaceGuid
) in Pcds
.keys():
2341 pcdObject
= Pcds
[PcdCName
, TokenSpaceGuid
]
2342 pcdObject
.SkuInfoList
[SkuName
] = SkuInfo
2343 if MaxDatumSize
.strip():
2344 CurrentMaxSize
= int(MaxDatumSize
.strip(), 0)
2347 if pcdObject
.MaxDatumSize
:
2348 PcdMaxSize
= int(pcdObject
.MaxDatumSize
, 0)
2351 if CurrentMaxSize
> PcdMaxSize
:
2352 pcdObject
.MaxDatumSize
= str(CurrentMaxSize
)
2354 Pcds
[PcdCName
, TokenSpaceGuid
] = PcdClassObject(
2357 self
._PCD
_TYPE
_STRING
_[Type
],
2362 {SkuName
: SkuInfo
},
2366 for pcd
in Pcds
.values():
2367 SkuInfoObj
= pcd
.SkuInfoList
.values()[0]
2368 pcdDecObject
= self
._DecPcds
[pcd
.TokenCName
, pcd
.TokenSpaceGuidCName
]
2369 pcd
.DatumType
= pcdDecObject
.DatumType
2370 # Only fix the value while no value provided in DSC file.
2371 for sku
in pcd
.SkuInfoList
.values():
2372 if (sku
.DefaultValue
== "" or sku
.DefaultValue
==None):
2373 sku
.DefaultValue
= pcdDecObject
.DefaultValue
2374 if 'DEFAULT' not in pcd
.SkuInfoList
.keys() and 'COMMON' not in pcd
.SkuInfoList
.keys():
2375 valuefromDec
= pcdDecObject
.DefaultValue
2376 SkuInfo
= SkuInfoClass('DEFAULT', '0', '', '', '', '', SkuInfoObj
.VpdOffset
, valuefromDec
)
2377 pcd
.SkuInfoList
['DEFAULT'] = SkuInfo
2378 elif 'DEFAULT' not in pcd
.SkuInfoList
.keys() and 'COMMON' in pcd
.SkuInfoList
.keys():
2379 pcd
.SkuInfoList
['DEFAULT'] = pcd
.SkuInfoList
['COMMON']
2380 del(pcd
.SkuInfoList
['COMMON'])
2381 elif 'DEFAULT' in pcd
.SkuInfoList
.keys() and 'COMMON' in pcd
.SkuInfoList
.keys():
2382 del(pcd
.SkuInfoList
['COMMON'])
2385 map(self
.FilterSkuSettings
,Pcds
.values())
2388 ## Add external modules
2390 # The external modules are mostly those listed in FDF file, which don't
2393 # @param FilePath The path of module description file
2395 def AddModule(self
, FilePath
):
2396 FilePath
= NormPath(FilePath
)
2397 if FilePath
not in self
.Modules
:
2398 Module
= ModuleBuildClassObject()
2399 Module
.MetaFile
= FilePath
2400 self
.Modules
.append(Module
)
2402 def _GetToolChainFamily(self
):
2403 self
._ToolChainFamily
= "MSFT"
2404 BuildConfigurationFile
= os
.path
.normpath(os
.path
.join(GlobalData
.gConfDirectory
, "target.txt"))
2405 if os
.path
.isfile(BuildConfigurationFile
) == True:
2406 TargetTxt
= TargetTxtClassObject()
2407 TargetTxt
.LoadTargetTxtFile(BuildConfigurationFile
)
2408 ToolDefinitionFile
= TargetTxt
.TargetTxtDictionary
[DataType
.TAB_TAT_DEFINES_TOOL_CHAIN_CONF
]
2409 if ToolDefinitionFile
== '':
2410 ToolDefinitionFile
= "tools_def.txt"
2411 ToolDefinitionFile
= os
.path
.normpath(mws
.join(self
.WorkspaceDir
, 'Conf', ToolDefinitionFile
))
2412 if os
.path
.isfile(ToolDefinitionFile
) == True:
2413 ToolDef
= ToolDefClassObject()
2414 ToolDef
.LoadToolDefFile(ToolDefinitionFile
)
2415 ToolDefinition
= ToolDef
.ToolsDefTxtDatabase
2416 if TAB_TOD_DEFINES_FAMILY
not in ToolDefinition \
2417 or self
._Toolchain
not in ToolDefinition
[TAB_TOD_DEFINES_FAMILY
] \
2418 or not ToolDefinition
[TAB_TOD_DEFINES_FAMILY
][self
._Toolchain
]:
2419 self
._ToolChainFamily
= "MSFT"
2421 self
._ToolChainFamily
= ToolDefinition
[TAB_TOD_DEFINES_FAMILY
][self
._Toolchain
]
2422 return self
._ToolChainFamily
2424 ## Add external PCDs
2426 # The external PCDs are mostly those listed in FDF file to specify address
2427 # or offset information.
2429 # @param Name Name of the PCD
2430 # @param Guid Token space guid of the PCD
2431 # @param Value Value of the PCD
2433 def AddPcd(self
, Name
, Guid
, Value
):
2434 if (Name
, Guid
) not in self
.Pcds
:
2435 self
.Pcds
[Name
, Guid
] = PcdClassObject(Name
, Guid
, '', '', '', '', '', {}, False, None)
2436 self
.Pcds
[Name
, Guid
].DefaultValue
= Value
2439 if self
._DecPcds
== None:
2441 if GlobalData
.gFdfParser
:
2442 FdfInfList
= GlobalData
.gFdfParser
.Profile
.InfList
2444 for Inf
in FdfInfList
:
2445 ModuleFile
= PathClass(NormPath(Inf
), GlobalData
.gWorkspace
, Arch
=self
._Arch
)
2446 if ModuleFile
in self
._Modules
:
2448 ModuleData
= self
._Bdb
[ModuleFile
, self
._Arch
, self
._Target
, self
._Toolchain
]
2449 PkgSet
.update(ModuleData
.Packages
)
2450 self
._DecPcds
, self
._GuidDict
= GetDeclaredPcd(self
, self
._Bdb
, self
._Arch
, self
._Target
, self
._Toolchain
,PkgSet
)
2451 return self
._DecPcds
2452 _Macros
= property(_GetMacros
)
2453 Arch
= property(_GetArch
, _SetArch
)
2454 Platform
= property(_GetPlatformName
)
2455 PlatformName
= property(_GetPlatformName
)
2456 Guid
= property(_GetFileGuid
)
2457 Version
= property(_GetVersion
)
2458 DscSpecification
= property(_GetDscSpec
)
2459 OutputDirectory
= property(_GetOutpuDir
)
2460 SupArchList
= property(_GetSupArch
)
2461 BuildTargets
= property(_GetBuildTarget
)
2462 SkuName
= property(_GetSkuName
, _SetSkuName
)
2463 PcdInfoFlag
= property(_GetPcdInfoFlag
)
2464 VarCheckFlag
= property(_GetVarCheckFlag
)
2465 FlashDefinition
= property(_GetFdfFile
)
2466 Prebuild
= property(_GetPrebuild
)
2467 Postbuild
= property(_GetPostbuild
)
2468 BuildNumber
= property(_GetBuildNumber
)
2469 MakefileName
= property(_GetMakefileName
)
2470 BsBaseAddress
= property(_GetBsBaseAddress
)
2471 RtBaseAddress
= property(_GetRtBaseAddress
)
2472 LoadFixAddress
= property(_GetLoadFixAddress
)
2473 RFCLanguages
= property(_GetRFCLanguages
)
2474 ISOLanguages
= property(_GetISOLanguages
)
2475 VpdToolGuid
= property(_GetVpdToolGuid
)
2476 SkuIds
= property(_GetSkuIds
)
2477 Modules
= property(_GetModules
)
2478 LibraryInstances
= property(_GetLibraryInstances
)
2479 LibraryClasses
= property(_GetLibraryClasses
)
2480 Pcds
= property(_GetPcds
)
2481 BuildOptions
= property(_GetBuildOptions
)
2482 ToolChainFamily
= property(_GetToolChainFamily
)