2 # This file is used to create a database used by build tool
4 # Copyright (c) 2008 - 2019, 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 __future__
import print_function
21 from __future__
import absolute_import
22 from Common
.StringUtils
import *
23 from Common
.DataType
import *
24 from Common
.Misc
import *
26 from Common
.Expression
import *
27 from CommonDataClass
.CommonClass
import SkuInfoClass
28 from Common
.TargetTxtClassObject
import TargetTxtClassObject
29 from Common
.ToolDefClassObject
import ToolDefClassObject
30 from .MetaDataTable
import *
31 from .MetaFileTable
import *
32 from .MetaFileParser
import *
34 from .WorkspaceCommon
import GetDeclaredPcd
35 from Common
.Misc
import AnalyzeDscPcd
36 from Common
.Misc
import ProcessDuplicatedInf
,RemoveCComments
38 from Common
.Parsing
import IsValidWord
39 from Common
.VariableAttributes
import VariableAttributes
40 import Common
.GlobalData
as GlobalData
42 from functools
import reduce
43 from Common
.Misc
import SaveFileOnChange
44 from Workspace
.BuildClassObject
import PlatformBuildClassObject
, StructurePcd
, PcdClassObject
, ModuleBuildClassObject
45 from collections
import OrderedDict
, defaultdict
46 from .BuildClassObject
import ArrayIndex
48 def _IsFieldValueAnArray (Value
):
50 if Value
.startswith(TAB_GUID
) and Value
.endswith(')'):
52 if Value
.startswith('L"') and Value
.endswith('"') and len(list(Value
[2:-1])) > 1:
54 if Value
[0] == '"' and Value
[-1] == '"' and len(list(Value
[1:-1])) > 1:
56 if Value
[0] == '{' and Value
[-1] == '}':
58 if Value
.startswith("L'") and Value
.endswith("'") and len(list(Value
[2:-1])) > 1:
60 if Value
[0] == "'" and Value
[-1] == "'" and len(list(Value
[1:-1])) > 1:
64 PcdValueInitName
= 'PcdValueInit'
75 #include <PcdValueCommon.h>
85 return PcdValueMain (argc, argv);
89 PcdMakefileHeader
= '''
92 # This file is auto-generated by build utility
97 WindowsCFLAGS
= 'CFLAGS = $(CFLAGS) /wd4200 /wd4034 /wd4101 '
98 LinuxCFLAGS
= 'BUILD_CFLAGS += -Wno-pointer-to-int-cast -Wno-unused-variable '
100 !INCLUDE $(BASE_TOOLS_PATH)\Source\C\Makefiles\ms.common
102 LIBS = $(LIB_PATH)\Common.lib
104 !INCLUDE $(BASE_TOOLS_PATH)\Source\C\Makefiles\ms.app
109 $(APPFILE): $(OBJECTS)
114 MAKEROOT ?= $(EDK_TOOLS_PATH)/Source/C
118 variablePattern
= re
.compile(r
'[\t\s]*0[xX][a-fA-F0-9]+$')
119 SkuIdPattern
= re
.compile(r
'^[a-zA-Z_][a-zA-Z0-9_]*$')
120 ## regular expressions for finding decimal and hex numbers
121 Pattern
= re
.compile('^[1-9]\d*|0$')
122 HexPattern
= re
.compile(r
'0[xX][0-9a-fA-F]+$')
123 ## Regular expression for finding header file inclusions
124 from AutoGen
.GenMake
import gIncludePattern
126 ## Find dependencies for one source file
128 # By searching recursively "#include" directive in file, find out all the
129 # files needed by given source file. The dependecies will be only searched
130 # in given search path list.
132 # @param SearchPathList The list of search path
134 # @retval list The list of files the given source file depends on
136 def GetDependencyList(FileStack
, SearchPathList
):
138 DependencySet
= set(FileStack
)
139 while len(FileStack
) > 0:
141 FullPathDependList
= []
142 CurrentFileDependencyList
= []
144 CurrentFileDependencyList
= DepDb
[F
]
148 FileContent
= Fd
.read()
149 except BaseException
as X
:
150 EdkLogger
.error("build", FILE_OPEN_FAILURE
, ExtraData
=F
+ "\n\t" + str(X
))
152 if "Fd" in dir(locals()):
155 if len(FileContent
) == 0:
158 if FileContent
[0] == 0xff or FileContent
[0] == 0xfe:
159 FileContent
= FileContent
.decode('utf-16')
160 IncludedFileList
= gIncludePattern
.findall(FileContent
)
163 FileContent
= str(FileContent
)
164 IncludedFileList
= gIncludePattern
.findall(FileContent
)
167 IncludedFileList
= gIncludePattern
.findall(FileContent
)
169 for Inc
in IncludedFileList
:
171 Inc
= os
.path
.normpath(Inc
)
172 CurrentFileDependencyList
.append(Inc
)
173 DepDb
[F
] = CurrentFileDependencyList
175 CurrentFilePath
= os
.path
.dirname(F
)
176 PathList
= [CurrentFilePath
] + SearchPathList
177 for Inc
in CurrentFileDependencyList
:
178 for SearchPath
in PathList
:
179 FilePath
= os
.path
.join(SearchPath
, Inc
)
180 if not os
.path
.exists(FilePath
):
182 if FilePath
not in DependencySet
:
183 FileStack
.append(FilePath
)
184 FullPathDependList
.append(FilePath
)
186 DependencySet
.update(FullPathDependList
)
187 DependencyList
= list(DependencySet
) # remove duplicate ones
189 return DependencyList
191 class DscBuildData(PlatformBuildClassObject
):
192 # dict used to convert PCD type in database to string used by build tool
193 _PCD_TYPE_STRING_
= {
194 MODEL_PCD_FIXED_AT_BUILD
: TAB_PCDS_FIXED_AT_BUILD
,
195 MODEL_PCD_PATCHABLE_IN_MODULE
: TAB_PCDS_PATCHABLE_IN_MODULE
,
196 MODEL_PCD_FEATURE_FLAG
: TAB_PCDS_FEATURE_FLAG
,
197 MODEL_PCD_DYNAMIC
: TAB_PCDS_DYNAMIC
,
198 MODEL_PCD_DYNAMIC_DEFAULT
: TAB_PCDS_DYNAMIC
,
199 MODEL_PCD_DYNAMIC_HII
: TAB_PCDS_DYNAMIC_HII
,
200 MODEL_PCD_DYNAMIC_VPD
: TAB_PCDS_DYNAMIC_VPD
,
201 MODEL_PCD_DYNAMIC_EX
: TAB_PCDS_DYNAMIC_EX
,
202 MODEL_PCD_DYNAMIC_EX_DEFAULT
: TAB_PCDS_DYNAMIC_EX
,
203 MODEL_PCD_DYNAMIC_EX_HII
: TAB_PCDS_DYNAMIC_EX_HII
,
204 MODEL_PCD_DYNAMIC_EX_VPD
: TAB_PCDS_DYNAMIC_EX_VPD
,
207 # dict used to convert part of [Defines] to members of DscBuildData directly
212 TAB_DSC_DEFINES_PLATFORM_NAME
: "_PlatformName",
213 TAB_DSC_DEFINES_PLATFORM_GUID
: "_Guid",
214 TAB_DSC_DEFINES_PLATFORM_VERSION
: "_Version",
215 TAB_DSC_DEFINES_DSC_SPECIFICATION
: "_DscSpecification",
216 # TAB_DSC_DEFINES_OUTPUT_DIRECTORY : "_OutputDirectory",
217 # TAB_DSC_DEFINES_SUPPORTED_ARCHITECTURES : "_SupArchList",
218 # TAB_DSC_DEFINES_BUILD_TARGETS : "_BuildTargets",
219 TAB_DSC_DEFINES_SKUID_IDENTIFIER
: "_SkuName",
220 # TAB_DSC_DEFINES_FLASH_DEFINITION : "_FlashDefinition",
221 TAB_DSC_DEFINES_BUILD_NUMBER
: "_BuildNumber",
222 TAB_DSC_DEFINES_MAKEFILE_NAME
: "_MakefileName",
223 TAB_DSC_DEFINES_BS_BASE_ADDRESS
: "_BsBaseAddress",
224 TAB_DSC_DEFINES_RT_BASE_ADDRESS
: "_RtBaseAddress",
225 # TAB_DSC_DEFINES_RFC_LANGUAGES : "_RFCLanguages",
226 # TAB_DSC_DEFINES_ISO_LANGUAGES : "_ISOLanguages",
229 # used to compose dummy library class name for those forced library instances
230 _NullLibraryNumber
= 0
232 ## Constructor of DscBuildData
234 # Initialize object of DscBuildData
236 # @param FilePath The path of platform description file
237 # @param RawData The raw data of DSC file
238 # @param BuildDataBase Database used to retrieve module/package information
239 # @param Arch The target architecture
240 # @param Platform (not used for DscBuildData)
241 # @param Macros Macros used for replacement in DSC file
243 def __init__(self
, FilePath
, RawData
, BuildDataBase
, Arch
=TAB_ARCH_COMMON
, Target
=None, Toolchain
=None):
244 self
.MetaFile
= FilePath
245 self
._RawData
= RawData
246 self
._Bdb
= BuildDataBase
248 self
._Target
= Target
249 self
._Toolchain
= Toolchain
250 self
._ToolChainFamily
= None
252 self
._HandleOverridePath
()
253 self
.WorkspaceDir
= os
.getenv("WORKSPACE") if os
.getenv("WORKSPACE") else ""
254 self
.DefaultStores
= None
255 self
.SkuIdMgr
= SkuClass(self
.SkuName
, self
.SkuIds
)
258 def OutputPath(self
):
259 if os
.getenv("WORKSPACE"):
260 return os
.path
.join(os
.getenv("WORKSPACE"), self
.OutputDirectory
, self
._Target
+ "_" + self
._Toolchain
, PcdValueInitName
)
262 return os
.path
.dirname(self
.DscFile
)
265 def __setitem__(self
, key
, value
):
266 self
.__dict
__[self
._PROPERTY
_[key
]] = value
269 def __getitem__(self
, key
):
270 return self
.__dict
__[self
._PROPERTY
_[key
]]
273 def __contains__(self
, key
):
274 return key
in self
._PROPERTY
_
276 ## Set all internal used members of DscBuildData to None
279 self
._PlatformName
= None
282 self
._DscSpecification
= None
283 self
._OutputDirectory
= None
284 self
._SupArchList
= None
285 self
._BuildTargets
= None
287 self
._PcdInfoFlag
= None
288 self
._VarCheckFlag
= None
289 self
._FlashDefinition
= None
290 self
._Prebuild
= None
291 self
._Postbuild
= None
292 self
._BuildNumber
= None
293 self
._MakefileName
= None
294 self
._BsBaseAddress
= None
295 self
._RtBaseAddress
= None
298 self
._LibraryInstances
= None
299 self
._LibraryClasses
= None
302 self
._BuildOptions
= None
303 self
._ModuleTypeOptions
= None
304 self
._LoadFixAddress
= None
305 self
._RFCLanguages
= None
306 self
._ISOLanguages
= None
307 self
._VpdToolGuid
= None
308 self
._MacroDict
= None
309 self
.DefaultStores
= None
311 ## handle Override Path of Module
312 def _HandleOverridePath(self
):
313 RecordList
= self
._RawData
[MODEL_META_DATA_COMPONENT
, self
._Arch
]
314 for Record
in RecordList
:
317 ModuleFile
= PathClass(NormPath(Record
[0]), GlobalData
.gWorkspace
, Arch
=self
._Arch
)
318 RecordList
= self
._RawData
[MODEL_META_DATA_COMPONENT_SOURCE_OVERRIDE_PATH
, self
._Arch
, None, ModuleId
]
320 SourceOverridePath
= mws
.join(GlobalData
.gWorkspace
, NormPath(RecordList
[0][0]))
322 # Check if the source override path exists
323 if not os
.path
.isdir(SourceOverridePath
):
324 EdkLogger
.error('build', FILE_NOT_FOUND
, Message
='Source override path does not exist:', File
=self
.MetaFile
, ExtraData
=SourceOverridePath
, Line
=LineNo
)
326 # Add to GlobalData Variables
327 GlobalData
.gOverrideDir
[ModuleFile
.Key
] = SourceOverridePath
329 ## Get current effective macros
332 if self
._MacroDict
is None:
334 self
._MacroDict
.update(GlobalData
.gPlatformDefines
)
335 self
._MacroDict
.update(GlobalData
.gGlobalDefines
)
336 self
._MacroDict
.update(GlobalData
.gCommandLineDefines
)
337 return self
._MacroDict
344 ## Retrieve all information in [Defines] section
346 # (Retrieving all [Defines] information in one-shot is just to save time.)
348 def _GetHeaderInfo(self
):
349 RecordList
= self
._RawData
[MODEL_META_DATA_HEADER
, self
._Arch
]
350 for Record
in RecordList
:
352 # items defined _PROPERTY_ don't need additional processing
354 # some special items in [Defines] section need special treatment
355 if Name
== TAB_DSC_DEFINES_OUTPUT_DIRECTORY
:
356 self
._OutputDirectory
= NormPath(Record
[2], self
._Macros
)
357 if ' ' in self
._OutputDirectory
:
358 EdkLogger
.error("build", FORMAT_NOT_SUPPORTED
, "No space is allowed in OUTPUT_DIRECTORY",
359 File
=self
.MetaFile
, Line
=Record
[-1],
360 ExtraData
=self
._OutputDirectory
)
361 elif Name
== TAB_DSC_DEFINES_FLASH_DEFINITION
:
362 self
._FlashDefinition
= PathClass(NormPath(Record
[2], self
._Macros
), GlobalData
.gWorkspace
)
363 ErrorCode
, ErrorInfo
= self
._FlashDefinition
.Validate('.fdf')
365 EdkLogger
.error('build', ErrorCode
, File
=self
.MetaFile
, Line
=Record
[-1],
367 elif Name
== TAB_DSC_PREBUILD
:
368 PrebuildValue
= Record
[2]
369 if Record
[2][0] == '"':
370 if Record
[2][-1] != '"':
371 EdkLogger
.error('build', FORMAT_INVALID
, 'Missing double quotes in the end of %s statement.' % TAB_DSC_PREBUILD
,
372 File
=self
.MetaFile
, Line
=Record
[-1])
373 PrebuildValue
= Record
[2][1:-1]
374 self
._Prebuild
= PrebuildValue
375 elif Name
== TAB_DSC_POSTBUILD
:
376 PostbuildValue
= Record
[2]
377 if Record
[2][0] == '"':
378 if Record
[2][-1] != '"':
379 EdkLogger
.error('build', FORMAT_INVALID
, 'Missing double quotes in the end of %s statement.' % TAB_DSC_POSTBUILD
,
380 File
=self
.MetaFile
, Line
=Record
[-1])
381 PostbuildValue
= Record
[2][1:-1]
382 self
._Postbuild
= PostbuildValue
383 elif Name
== TAB_DSC_DEFINES_SUPPORTED_ARCHITECTURES
:
384 self
._SupArchList
= GetSplitValueList(Record
[2], TAB_VALUE_SPLIT
)
385 elif Name
== TAB_DSC_DEFINES_BUILD_TARGETS
:
386 self
._BuildTargets
= GetSplitValueList(Record
[2])
387 elif Name
== TAB_DSC_DEFINES_SKUID_IDENTIFIER
:
388 if self
._SkuName
is None:
389 self
._SkuName
= Record
[2]
390 if GlobalData
.gSKUID_CMD
:
391 self
._SkuName
= GlobalData
.gSKUID_CMD
392 elif Name
== TAB_DSC_DEFINES_PCD_INFO_GENERATION
:
393 self
._PcdInfoFlag
= Record
[2]
394 elif Name
== TAB_DSC_DEFINES_PCD_VAR_CHECK_GENERATION
:
395 self
._VarCheckFlag
= Record
[2]
396 elif Name
== TAB_FIX_LOAD_TOP_MEMORY_ADDRESS
:
398 self
._LoadFixAddress
= int (Record
[2], 0)
400 EdkLogger
.error("build", PARAMETER_INVALID
, "FIX_LOAD_TOP_MEMORY_ADDRESS %s is not valid dec or hex string" % (Record
[2]))
401 elif Name
== TAB_DSC_DEFINES_RFC_LANGUAGES
:
402 if not Record
[2] or Record
[2][0] != '"' or Record
[2][-1] != '"' or len(Record
[2]) == 1:
403 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"',
404 File
=self
.MetaFile
, Line
=Record
[-1])
405 LanguageCodes
= Record
[2][1:-1]
406 if not LanguageCodes
:
407 EdkLogger
.error('build', FORMAT_NOT_SUPPORTED
, 'one or more RFC4646 format language code must be provided for RFC_LANGUAGES statement',
408 File
=self
.MetaFile
, Line
=Record
[-1])
409 LanguageList
= GetSplitValueList(LanguageCodes
, TAB_SEMI_COLON_SPLIT
)
410 # check whether there is empty entries in the list
411 if None in LanguageList
:
412 EdkLogger
.error('build', FORMAT_NOT_SUPPORTED
, 'one or more empty language code is in RFC_LANGUAGES statement',
413 File
=self
.MetaFile
, Line
=Record
[-1])
414 self
._RFCLanguages
= LanguageList
415 elif Name
== TAB_DSC_DEFINES_ISO_LANGUAGES
:
416 if not Record
[2] or Record
[2][0] != '"' or Record
[2][-1] != '"' or len(Record
[2]) == 1:
417 EdkLogger
.error('build', FORMAT_NOT_SUPPORTED
, 'language code for ISO_LANGUAGES must have double quotes around it, for example: ISO_LANGUAGES = "engchn"',
418 File
=self
.MetaFile
, Line
=Record
[-1])
419 LanguageCodes
= Record
[2][1:-1]
420 if not LanguageCodes
:
421 EdkLogger
.error('build', FORMAT_NOT_SUPPORTED
, 'one or more ISO639-2 format language code must be provided for ISO_LANGUAGES statement',
422 File
=self
.MetaFile
, Line
=Record
[-1])
423 if len(LanguageCodes
) % 3:
424 EdkLogger
.error('build', FORMAT_NOT_SUPPORTED
, 'bad ISO639-2 format for ISO_LANGUAGES',
425 File
=self
.MetaFile
, Line
=Record
[-1])
427 for i
in range(0, len(LanguageCodes
), 3):
428 LanguageList
.append(LanguageCodes
[i
:i
+ 3])
429 self
._ISOLanguages
= LanguageList
430 elif Name
== TAB_DSC_DEFINES_VPD_TOOL_GUID
:
432 # try to convert GUID to a real UUID value to see whether the GUID is format
433 # for VPD_TOOL_GUID is correct.
438 EdkLogger
.error("build", FORMAT_INVALID
, "Invalid GUID format for VPD_TOOL_GUID", File
=self
.MetaFile
)
439 self
._VpdToolGuid
= Record
[2]
441 self
[Name
] = Record
[2]
442 # set _Header to non-None in order to avoid database re-querying
443 self
._Header
= 'DUMMY'
445 ## Retrieve platform name
447 def PlatformName(self
):
448 if self
._PlatformName
is None:
449 if self
._Header
is None:
450 self
._GetHeaderInfo
()
451 if self
._PlatformName
is None:
452 EdkLogger
.error('build', ATTRIBUTE_NOT_AVAILABLE
, "No PLATFORM_NAME", File
=self
.MetaFile
)
453 return self
._PlatformName
457 return self
.PlatformName
459 ## Retrieve file guid
462 if self
._Guid
is None:
463 if self
._Header
is None:
464 self
._GetHeaderInfo
()
465 if self
._Guid
is None:
466 EdkLogger
.error('build', ATTRIBUTE_NOT_AVAILABLE
, "No PLATFORM_GUID", File
=self
.MetaFile
)
469 ## Retrieve platform version
472 if self
._Version
is None:
473 if self
._Header
is None:
474 self
._GetHeaderInfo
()
475 if self
._Version
is None:
476 EdkLogger
.error('build', ATTRIBUTE_NOT_AVAILABLE
, "No PLATFORM_VERSION", File
=self
.MetaFile
)
479 ## Retrieve platform description file version
481 def DscSpecification(self
):
482 if self
._DscSpecification
is None:
483 if self
._Header
is None:
484 self
._GetHeaderInfo
()
485 if self
._DscSpecification
is None:
486 EdkLogger
.error('build', ATTRIBUTE_NOT_AVAILABLE
, "No DSC_SPECIFICATION", File
=self
.MetaFile
)
487 return self
._DscSpecification
489 ## Retrieve OUTPUT_DIRECTORY
491 def OutputDirectory(self
):
492 if self
._OutputDirectory
is None:
493 if self
._Header
is None:
494 self
._GetHeaderInfo
()
495 if self
._OutputDirectory
is None:
496 self
._OutputDirectory
= os
.path
.join("Build", self
._PlatformName
)
497 return self
._OutputDirectory
499 ## Retrieve SUPPORTED_ARCHITECTURES
501 def SupArchList(self
):
502 if self
._SupArchList
is None:
503 if self
._Header
is None:
504 self
._GetHeaderInfo
()
505 if self
._SupArchList
is None:
506 EdkLogger
.error('build', ATTRIBUTE_NOT_AVAILABLE
, "No SUPPORTED_ARCHITECTURES", File
=self
.MetaFile
)
507 return self
._SupArchList
509 ## Retrieve BUILD_TARGETS
511 def BuildTargets(self
):
512 if self
._BuildTargets
is None:
513 if self
._Header
is None:
514 self
._GetHeaderInfo
()
515 if self
._BuildTargets
is None:
516 EdkLogger
.error('build', ATTRIBUTE_NOT_AVAILABLE
, "No BUILD_TARGETS", File
=self
.MetaFile
)
517 return self
._BuildTargets
520 def PcdInfoFlag(self
):
521 if self
._PcdInfoFlag
is None or self
._PcdInfoFlag
.upper() == 'FALSE':
523 elif self
._PcdInfoFlag
.upper() == 'TRUE':
529 def VarCheckFlag(self
):
530 if self
._VarCheckFlag
is None or self
._VarCheckFlag
.upper() == 'FALSE':
532 elif self
._VarCheckFlag
.upper() == 'TRUE':
537 # # Retrieve SKUID_IDENTIFIER
540 if self
._SkuName
is None:
541 if self
._Header
is None:
542 self
._GetHeaderInfo
()
543 if self
._SkuName
is None:
544 self
._SkuName
= TAB_DEFAULT
547 ## Override SKUID_IDENTIFIER
549 def SkuName(self
, Value
):
550 self
._SkuName
= Value
553 def FlashDefinition(self
):
554 if self
._FlashDefinition
is None:
555 if self
._Header
is None:
556 self
._GetHeaderInfo
()
557 if self
._FlashDefinition
is None:
558 self
._FlashDefinition
= ''
559 return self
._FlashDefinition
563 if self
._Prebuild
is None:
564 if self
._Header
is None:
565 self
._GetHeaderInfo
()
566 if self
._Prebuild
is None:
568 return self
._Prebuild
572 if self
._Postbuild
is None:
573 if self
._Header
is None:
574 self
._GetHeaderInfo
()
575 if self
._Postbuild
is None:
577 return self
._Postbuild
579 ## Retrieve FLASH_DEFINITION
581 def BuildNumber(self
):
582 if self
._BuildNumber
is None:
583 if self
._Header
is None:
584 self
._GetHeaderInfo
()
585 if self
._BuildNumber
is None:
586 self
._BuildNumber
= ''
587 return self
._BuildNumber
589 ## Retrieve MAKEFILE_NAME
591 def MakefileName(self
):
592 if self
._MakefileName
is None:
593 if self
._Header
is None:
594 self
._GetHeaderInfo
()
595 if self
._MakefileName
is None:
596 self
._MakefileName
= ''
597 return self
._MakefileName
599 ## Retrieve BsBaseAddress
601 def BsBaseAddress(self
):
602 if self
._BsBaseAddress
is None:
603 if self
._Header
is None:
604 self
._GetHeaderInfo
()
605 if self
._BsBaseAddress
is None:
606 self
._BsBaseAddress
= ''
607 return self
._BsBaseAddress
609 ## Retrieve RtBaseAddress
611 def RtBaseAddress(self
):
612 if self
._RtBaseAddress
is None:
613 if self
._Header
is None:
614 self
._GetHeaderInfo
()
615 if self
._RtBaseAddress
is None:
616 self
._RtBaseAddress
= ''
617 return self
._RtBaseAddress
619 ## Retrieve the top address for the load fix address
621 def LoadFixAddress(self
):
622 if self
._LoadFixAddress
is None:
623 if self
._Header
is None:
624 self
._GetHeaderInfo
()
626 if self
._LoadFixAddress
is None:
627 self
._LoadFixAddress
= self
._Macros
.get(TAB_FIX_LOAD_TOP_MEMORY_ADDRESS
, '0')
630 self
._LoadFixAddress
= int (self
._LoadFixAddress
, 0)
632 EdkLogger
.error("build", PARAMETER_INVALID
, "FIX_LOAD_TOP_MEMORY_ADDRESS %s is not valid dec or hex string" % (self
._LoadFixAddress
))
635 # If command line defined, should override the value in DSC file.
637 if 'FIX_LOAD_TOP_MEMORY_ADDRESS' in GlobalData
.gCommandLineDefines
:
639 self
._LoadFixAddress
= int(GlobalData
.gCommandLineDefines
['FIX_LOAD_TOP_MEMORY_ADDRESS'], 0)
641 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']))
643 if self
._LoadFixAddress
< 0:
644 EdkLogger
.error("build", PARAMETER_INVALID
, "FIX_LOAD_TOP_MEMORY_ADDRESS is set to the invalid negative value 0x%x" % (self
._LoadFixAddress
))
645 if self
._LoadFixAddress
!= 0xFFFFFFFFFFFFFFFF and self
._LoadFixAddress
% 0x1000 != 0:
646 EdkLogger
.error("build", PARAMETER_INVALID
, "FIX_LOAD_TOP_MEMORY_ADDRESS is set to the invalid unaligned 4K value 0x%x" % (self
._LoadFixAddress
))
648 return self
._LoadFixAddress
650 ## Retrieve RFCLanguage filter
652 def RFCLanguages(self
):
653 if self
._RFCLanguages
is None:
654 if self
._Header
is None:
655 self
._GetHeaderInfo
()
656 if self
._RFCLanguages
is None:
657 self
._RFCLanguages
= []
658 return self
._RFCLanguages
660 ## Retrieve ISOLanguage filter
662 def ISOLanguages(self
):
663 if self
._ISOLanguages
is None:
664 if self
._Header
is None:
665 self
._GetHeaderInfo
()
666 if self
._ISOLanguages
is None:
667 self
._ISOLanguages
= []
668 return self
._ISOLanguages
670 ## Retrieve the GUID string for VPD tool
672 def VpdToolGuid(self
):
673 if self
._VpdToolGuid
is None:
674 if self
._Header
is None:
675 self
._GetHeaderInfo
()
676 if self
._VpdToolGuid
is None:
677 self
._VpdToolGuid
= ''
678 return self
._VpdToolGuid
680 ## Retrieve [SkuIds] section information
683 if self
._SkuIds
is None:
684 self
._SkuIds
= OrderedDict()
685 RecordList
= self
._RawData
[MODEL_EFI_SKU_ID
, self
._Arch
]
686 for Record
in RecordList
:
688 EdkLogger
.error('build', FORMAT_INVALID
, 'No Sku ID number',
689 File
=self
.MetaFile
, Line
=Record
[-1])
691 EdkLogger
.error('build', FORMAT_INVALID
, 'No Sku ID name',
692 File
=self
.MetaFile
, Line
=Record
[-1])
693 if not Pattern
.match(Record
[0]) and not HexPattern
.match(Record
[0]):
694 EdkLogger
.error('build', FORMAT_INVALID
, "The format of the Sku ID number is invalid. It only support Integer and HexNumber",
695 File
=self
.MetaFile
, Line
=Record
[-1])
696 if not SkuIdPattern
.match(Record
[1]) or (Record
[2] and not SkuIdPattern
.match(Record
[2])):
697 EdkLogger
.error('build', FORMAT_INVALID
, "The format of the Sku ID name is invalid. The correct format is '(a-zA-Z_)(a-zA-Z0-9_)*'",
698 File
=self
.MetaFile
, Line
=Record
[-1])
699 self
._SkuIds
[Record
[1].upper()] = (str(DscBuildData
.ToInt(Record
[0])), Record
[1].upper(), Record
[2].upper())
700 if TAB_DEFAULT
not in self
._SkuIds
:
701 self
._SkuIds
[TAB_DEFAULT
] = ("0", TAB_DEFAULT
, TAB_DEFAULT
)
702 if TAB_COMMON
not in self
._SkuIds
:
703 self
._SkuIds
[TAB_COMMON
] = ("0", TAB_DEFAULT
, TAB_DEFAULT
)
708 return int(intstr
, 16) if intstr
.upper().startswith("0X") else int(intstr
)
710 def _GetDefaultStores(self
):
711 if self
.DefaultStores
is None:
712 self
.DefaultStores
= OrderedDict()
713 RecordList
= self
._RawData
[MODEL_EFI_DEFAULT_STORES
, self
._Arch
]
714 for Record
in RecordList
:
716 EdkLogger
.error('build', FORMAT_INVALID
, 'No DefaultStores ID number',
717 File
=self
.MetaFile
, Line
=Record
[-1])
719 EdkLogger
.error('build', FORMAT_INVALID
, 'No DefaultStores ID name',
720 File
=self
.MetaFile
, Line
=Record
[-1])
721 if not Pattern
.match(Record
[0]) and not HexPattern
.match(Record
[0]):
722 EdkLogger
.error('build', FORMAT_INVALID
, "The format of the DefaultStores ID number is invalid. It only support Integer and HexNumber",
723 File
=self
.MetaFile
, Line
=Record
[-1])
724 if not IsValidWord(Record
[1]):
725 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_-.)*'",
726 File
=self
.MetaFile
, Line
=Record
[-1])
727 self
.DefaultStores
[Record
[1].upper()] = (DscBuildData
.ToInt(Record
[0]), Record
[1].upper())
728 if TAB_DEFAULT_STORES_DEFAULT
not in self
.DefaultStores
:
729 self
.DefaultStores
[TAB_DEFAULT_STORES_DEFAULT
] = (0, TAB_DEFAULT_STORES_DEFAULT
)
730 GlobalData
.gDefaultStores
= sorted(self
.DefaultStores
.keys())
731 return self
.DefaultStores
733 def OverrideDuplicateModule(self
):
734 RecordList
= self
._RawData
[MODEL_META_DATA_COMPONENT
, self
._Arch
]
735 Macros
= self
._Macros
737 for Record
in RecordList
:
739 file_guid
= self
._RawData
[MODEL_META_DATA_HEADER
, self
._Arch
, None, ModuleId
]
740 file_guid_str
= file_guid
[0][2] if file_guid
else "NULL"
741 ModuleFile
= PathClass(NormPath(Record
[0], Macros
), GlobalData
.gWorkspace
, Arch
=self
._Arch
)
742 if self
._Arch
!= TAB_ARCH_COMMON
and (file_guid_str
,str(ModuleFile
)) in Components
:
743 self
._RawData
.DisableOverrideComponent(Components
[(file_guid_str
,str(ModuleFile
))])
744 Components
[(file_guid_str
,str(ModuleFile
))] = ModuleId
745 self
._RawData
._PostProcessed
= False
746 ## Retrieve [Components] section information
749 if self
._Modules
is not None:
751 self
.OverrideDuplicateModule()
752 self
._Modules
= OrderedDict()
753 RecordList
= self
._RawData
[MODEL_META_DATA_COMPONENT
, self
._Arch
]
754 Macros
= self
._Macros
755 for Record
in RecordList
:
756 ModuleFile
= PathClass(NormPath(Record
[0], Macros
), GlobalData
.gWorkspace
, Arch
=self
._Arch
)
760 # check the file validation
761 ErrorCode
, ErrorInfo
= ModuleFile
.Validate('.inf')
763 EdkLogger
.error('build', ErrorCode
, File
=self
.MetaFile
, Line
=LineNo
,
766 Module
= ModuleBuildClassObject()
767 Module
.MetaFile
= ModuleFile
769 # get module private library instance
770 RecordList
= self
._RawData
[MODEL_EFI_LIBRARY_CLASS
, self
._Arch
, None, ModuleId
]
771 for Record
in RecordList
:
772 LibraryClass
= Record
[0]
773 LibraryPath
= PathClass(NormPath(Record
[1], Macros
), GlobalData
.gWorkspace
, Arch
=self
._Arch
)
776 # check the file validation
777 ErrorCode
, ErrorInfo
= LibraryPath
.Validate('.inf')
779 EdkLogger
.error('build', ErrorCode
, File
=self
.MetaFile
, Line
=LineNo
,
782 if LibraryClass
== '' or LibraryClass
== 'NULL':
783 self
._NullLibraryNumber
+= 1
784 LibraryClass
= 'NULL%d' % self
._NullLibraryNumber
785 EdkLogger
.verbose("Found forced library for %s\n\t%s [%s]" % (ModuleFile
, LibraryPath
, LibraryClass
))
786 Module
.LibraryClasses
[LibraryClass
] = LibraryPath
787 if LibraryPath
not in self
.LibraryInstances
:
788 self
.LibraryInstances
.append(LibraryPath
)
790 # get module private PCD setting
791 for Type
in [MODEL_PCD_FIXED_AT_BUILD
, MODEL_PCD_PATCHABLE_IN_MODULE
, \
792 MODEL_PCD_FEATURE_FLAG
, MODEL_PCD_DYNAMIC
, MODEL_PCD_DYNAMIC_EX
]:
793 RecordList
= self
._RawData
[Type
, self
._Arch
, None, ModuleId
]
794 for TokenSpaceGuid
, PcdCName
, Setting
, Dummy1
, Dummy2
, Dummy3
, Dummy4
, Dummy5
in RecordList
:
795 TokenList
= GetSplitValueList(Setting
)
796 DefaultValue
= TokenList
[0]
797 # the format is PcdName| Value | VOID* | MaxDatumSize
798 if len(TokenList
) > 2:
799 MaxDatumSize
= TokenList
[2]
802 TypeString
= self
._PCD
_TYPE
_STRING
_[Type
]
803 Pcd
= PcdClassObject(
815 Module
.Pcds
[PcdCName
, TokenSpaceGuid
] = Pcd
817 # get module private build options
818 RecordList
= self
._RawData
[MODEL_META_DATA_BUILD_OPTION
, self
._Arch
, None, ModuleId
]
819 for ToolChainFamily
, ToolChain
, Option
, Dummy1
, Dummy2
, Dummy3
, Dummy4
, Dummy5
in RecordList
:
820 if (ToolChainFamily
, ToolChain
) not in Module
.BuildOptions
:
821 Module
.BuildOptions
[ToolChainFamily
, ToolChain
] = Option
823 OptionString
= Module
.BuildOptions
[ToolChainFamily
, ToolChain
]
824 Module
.BuildOptions
[ToolChainFamily
, ToolChain
] = OptionString
+ " " + Option
826 RecordList
= self
._RawData
[MODEL_META_DATA_HEADER
, self
._Arch
, None, ModuleId
]
828 if len(RecordList
) != 1:
829 EdkLogger
.error('build', OPTION_UNKNOWN
, 'Only FILE_GUID can be listed in <Defines> section.',
830 File
=self
.MetaFile
, ExtraData
=str(ModuleFile
), Line
=LineNo
)
831 ModuleFile
= ProcessDuplicatedInf(ModuleFile
, RecordList
[0][2], GlobalData
.gWorkspace
)
832 ModuleFile
.Arch
= self
._Arch
834 self
._Modules
[ModuleFile
] = Module
837 ## Retrieve all possible library instances used in this platform
839 def LibraryInstances(self
):
840 if self
._LibraryInstances
is None:
842 return self
._LibraryInstances
844 ## Retrieve [LibraryClasses] information
846 def LibraryClasses(self
):
847 if self
._LibraryClasses
is None:
848 self
._LibraryInstances
= []
850 # tdict is a special dict kind of type, used for selecting correct
851 # library instance for given library class and module type
853 LibraryClassDict
= tdict(True, 3)
854 # track all library class names
855 LibraryClassSet
= set()
856 RecordList
= self
._RawData
[MODEL_EFI_LIBRARY_CLASS
, self
._Arch
, None, -1]
857 Macros
= self
._Macros
858 for Record
in RecordList
:
859 LibraryClass
, LibraryInstance
, Dummy
, Arch
, ModuleType
, Dummy
, Dummy
, LineNo
= Record
860 if LibraryClass
== '' or LibraryClass
== 'NULL':
861 self
._NullLibraryNumber
+= 1
862 LibraryClass
= 'NULL%d' % self
._NullLibraryNumber
863 EdkLogger
.verbose("Found forced library for arch=%s\n\t%s [%s]" % (Arch
, LibraryInstance
, LibraryClass
))
864 LibraryClassSet
.add(LibraryClass
)
865 LibraryInstance
= PathClass(NormPath(LibraryInstance
, Macros
), GlobalData
.gWorkspace
, Arch
=self
._Arch
)
866 # check the file validation
867 ErrorCode
, ErrorInfo
= LibraryInstance
.Validate('.inf')
869 EdkLogger
.error('build', ErrorCode
, File
=self
.MetaFile
, Line
=LineNo
,
872 if ModuleType
!= TAB_COMMON
and ModuleType
not in SUP_MODULE_LIST
:
873 EdkLogger
.error('build', OPTION_UNKNOWN
, "Unknown module type [%s]" % ModuleType
,
874 File
=self
.MetaFile
, ExtraData
=LibraryInstance
, Line
=LineNo
)
875 LibraryClassDict
[Arch
, ModuleType
, LibraryClass
] = LibraryInstance
876 if LibraryInstance
not in self
._LibraryInstances
:
877 self
._LibraryInstances
.append(LibraryInstance
)
879 # resolve the specific library instance for each class and each module type
880 self
._LibraryClasses
= tdict(True)
881 for LibraryClass
in LibraryClassSet
:
882 # try all possible module types
883 for ModuleType
in SUP_MODULE_LIST
:
884 LibraryInstance
= LibraryClassDict
[self
._Arch
, ModuleType
, LibraryClass
]
885 if LibraryInstance
is None:
887 self
._LibraryClasses
[LibraryClass
, ModuleType
] = LibraryInstance
889 RecordList
= self
._RawData
[MODEL_EFI_LIBRARY_INSTANCE
, self
._Arch
]
890 for Record
in RecordList
:
891 File
= PathClass(NormPath(Record
[0], Macros
), GlobalData
.gWorkspace
, Arch
=self
._Arch
)
893 # check the file validation
894 ErrorCode
, ErrorInfo
= File
.Validate('.inf')
896 EdkLogger
.error('build', ErrorCode
, File
=self
.MetaFile
, Line
=LineNo
,
898 if File
not in self
._LibraryInstances
:
899 self
._LibraryInstances
.append(File
)
901 # we need the module name as the library class name, so we have
902 # to parse it here. (self._Bdb[] will trigger a file parse if it
903 # hasn't been parsed)
905 Library
= self
._Bdb
[File
, self
._Arch
, self
._Target
, self
._Toolchain
]
906 self
._LibraryClasses
[Library
.BaseName
, ':dummy:'] = Library
907 return self
._LibraryClasses
909 def _ValidatePcd(self
, PcdCName
, TokenSpaceGuid
, Setting
, PcdType
, LineNo
):
910 if not self
._DecPcds
:
913 if GlobalData
.gFdfParser
:
914 FdfInfList
= GlobalData
.gFdfParser
.Profile
.InfList
917 for Inf
in FdfInfList
:
918 ModuleFile
= PathClass(NormPath(Inf
), GlobalData
.gWorkspace
, Arch
=self
._Arch
)
919 if ModuleFile
in self
._Modules
:
921 ModuleData
= self
._Bdb
[ModuleFile
, self
._Arch
, self
._Target
, self
._Toolchain
]
922 PkgSet
.update(ModuleData
.Packages
)
924 self
._DecPcds
, self
._GuidDict
= GetDeclaredPcd(self
, self
._Bdb
, self
._Arch
, self
._Target
, self
._Toolchain
, PkgSet
)
925 self
._GuidDict
.update(GlobalData
.gPlatformPcds
)
927 if (PcdCName
, TokenSpaceGuid
) not in self
._DecPcds
:
928 EdkLogger
.error('build', PARSER_ERROR
,
929 "Pcd (%s.%s) defined in DSC is not declared in DEC files referenced in INF files in FDF. Arch: ['%s']" % (TokenSpaceGuid
, PcdCName
, self
._Arch
),
930 File
=self
.MetaFile
, Line
=LineNo
)
931 ValueList
, IsValid
, Index
= AnalyzeDscPcd(Setting
, PcdType
, self
._DecPcds
[PcdCName
, TokenSpaceGuid
].DatumType
)
933 if PcdType
not in [MODEL_PCD_FEATURE_FLAG
, MODEL_PCD_FIXED_AT_BUILD
]:
934 EdkLogger
.error('build', FORMAT_INVALID
, "Pcd format incorrect.", File
=self
.MetaFile
, Line
=LineNo
,
935 ExtraData
="%s.%s|%s" % (TokenSpaceGuid
, PcdCName
, Setting
))
937 if ValueList
[2] == '-1':
938 EdkLogger
.error('build', FORMAT_INVALID
, "Pcd format incorrect.", File
=self
.MetaFile
, Line
=LineNo
,
939 ExtraData
="%s.%s|%s" % (TokenSpaceGuid
, PcdCName
, Setting
))
941 DatumType
= self
._DecPcds
[PcdCName
, TokenSpaceGuid
].DatumType
942 if "{CODE(" not in ValueList
[Index
]:
944 ValueList
[Index
] = ValueExpressionEx(ValueList
[Index
], DatumType
, self
._GuidDict
)(True)
945 except BadExpression
as Value
:
946 EdkLogger
.error('Parser', FORMAT_INVALID
, Value
, File
=self
.MetaFile
, Line
=LineNo
,
947 ExtraData
="PCD [%s.%s] Value \"%s\" " % (
948 TokenSpaceGuid
, PcdCName
, ValueList
[Index
]))
949 except EvaluationException
as Excpt
:
950 if hasattr(Excpt
, 'Pcd'):
951 if Excpt
.Pcd
in GlobalData
.gPlatformOtherPcds
:
952 EdkLogger
.error('Parser', FORMAT_INVALID
, "Cannot use this PCD (%s) in an expression as"
953 " it must be defined in a [PcdsFixedAtBuild] or [PcdsFeatureFlag] section"
954 " of the DSC file" % Excpt
.Pcd
,
955 File
=self
.MetaFile
, Line
=LineNo
)
957 EdkLogger
.error('Parser', FORMAT_INVALID
, "PCD (%s) is not defined in DSC file" % Excpt
.Pcd
,
958 File
=self
.MetaFile
, Line
=LineNo
)
960 EdkLogger
.error('Parser', FORMAT_INVALID
, "Invalid expression: %s" % str(Excpt
),
961 File
=self
.MetaFile
, Line
=LineNo
)
964 Valid
, ErrStr
= CheckPcdDatum(self
._DecPcds
[PcdCName
, TokenSpaceGuid
].DatumType
, ValueList
[Index
])
966 EdkLogger
.error('build', FORMAT_INVALID
, ErrStr
, File
=self
.MetaFile
, Line
=LineNo
,
967 ExtraData
="%s.%s" % (TokenSpaceGuid
, PcdCName
))
968 if PcdType
in (MODEL_PCD_DYNAMIC_DEFAULT
, MODEL_PCD_DYNAMIC_EX_DEFAULT
, MODEL_PCD_FIXED_AT_BUILD
, MODEL_PCD_PATCHABLE_IN_MODULE
):
969 if self
._DecPcds
[PcdCName
, TokenSpaceGuid
].DatumType
.strip() != ValueList
[1].strip():
970 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
,
971 ExtraData
="%s.%s|%s" % (TokenSpaceGuid
, PcdCName
, Setting
))
972 if (TokenSpaceGuid
+ '.' + PcdCName
) in GlobalData
.gPlatformPcds
:
973 if GlobalData
.gPlatformPcds
[TokenSpaceGuid
+ '.' + PcdCName
] != ValueList
[Index
]:
974 GlobalData
.gPlatformPcds
[TokenSpaceGuid
+ '.' + PcdCName
] = ValueList
[Index
]
977 def _FilterPcdBySkuUsage(self
, Pcds
):
978 available_sku
= self
.SkuIdMgr
.AvailableSkuIdSet
979 sku_usage
= self
.SkuIdMgr
.SkuUsageType
980 if sku_usage
== SkuClass
.SINGLE
:
983 Pcds
[pcdname
].SkuInfoList
= {TAB_DEFAULT
:pcd
.SkuInfoList
[skuid
] for skuid
in pcd
.SkuInfoList
if skuid
in available_sku
}
984 if isinstance(pcd
, StructurePcd
) and pcd
.SkuOverrideValues
:
985 Pcds
[pcdname
].SkuOverrideValues
= {TAB_DEFAULT
:pcd
.SkuOverrideValues
[skuid
] for skuid
in pcd
.SkuOverrideValues
if skuid
in available_sku
}
989 Pcds
[pcdname
].SkuInfoList
= {skuid
:pcd
.SkuInfoList
[skuid
] for skuid
in pcd
.SkuInfoList
if skuid
in available_sku
}
990 if isinstance(pcd
, StructurePcd
) and pcd
.SkuOverrideValues
:
991 Pcds
[pcdname
].SkuOverrideValues
= {skuid
:pcd
.SkuOverrideValues
[skuid
] for skuid
in pcd
.SkuOverrideValues
if skuid
in available_sku
}
994 def CompleteHiiPcdsDefaultStores(self
, Pcds
):
995 HiiPcd
= [Pcds
[pcd
] for pcd
in Pcds
if Pcds
[pcd
].Type
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_HII
], self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_HII
]]]
996 DefaultStoreMgr
= DefaultStore(self
.DefaultStores
)
998 for skuid
in pcd
.SkuInfoList
:
999 skuobj
= pcd
.SkuInfoList
.get(skuid
)
1000 if TAB_DEFAULT_STORES_DEFAULT
not in skuobj
.DefaultStoreDict
:
1001 PcdDefaultStoreSet
= set(defaultstorename
for defaultstorename
in skuobj
.DefaultStoreDict
)
1002 mindefaultstorename
= DefaultStoreMgr
.GetMin(PcdDefaultStoreSet
)
1003 skuobj
.DefaultStoreDict
[TAB_DEFAULT_STORES_DEFAULT
] = skuobj
.DefaultStoreDict
[mindefaultstorename
]
1006 def RecoverCommandLinePcd(self
):
1007 def UpdateCommandLineValue(pcd
):
1008 if pcd
.Type
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_FIXED_AT_BUILD
],
1009 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_PATCHABLE_IN_MODULE
]]:
1010 pcd
.PcdValueFromComm
= pcd
.DefaultValue
1011 elif pcd
.Type
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_HII
], self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_HII
]]:
1012 pcd
.PcdValueFromComm
= pcd
.SkuInfoList
.get(TAB_DEFAULT
).HiiDefaultValue
1014 pcd
.PcdValueFromComm
= pcd
.SkuInfoList
.get(TAB_DEFAULT
).DefaultValue
1015 for pcd
in self
._Pcds
:
1016 if isinstance(self
._Pcds
[pcd
], StructurePcd
) and (self
._Pcds
[pcd
].PcdValueFromComm
or self
._Pcds
[pcd
].PcdFieldValueFromComm
):
1017 UpdateCommandLineValue(self
._Pcds
[pcd
])
1019 def __ParsePcdFromCommandLine(self
):
1020 if GlobalData
.BuildOptionPcd
:
1021 for i
, pcd
in enumerate(GlobalData
.BuildOptionPcd
):
1022 if isinstance(pcd
, tuple):
1024 (pcdname
, pcdvalue
) = pcd
.split('=')
1026 EdkLogger
.error('build', AUTOGEN_ERROR
, "No Value specified for the PCD %s." % (pcdname
))
1028 (Name1
, Name2
) = pcdname
.split('.', 1)
1030 (Name3
, FieldName
) = Name2
.split(".", 1)
1031 if ((Name3
, Name1
)) in self
.DecPcds
:
1032 HasTokenSpace
= True
1034 TokenSpaceGuidCName
= Name1
1038 TokenSpaceGuidCName
= ''
1039 HasTokenSpace
= False
1041 if ((Name2
, Name1
)) in self
.DecPcds
:
1042 HasTokenSpace
= True
1044 TokenSpaceGuidCName
= Name1
1049 TokenSpaceGuidCName
= ''
1050 HasTokenSpace
= False
1053 TokenCName
= pcdname
1054 TokenSpaceGuidCName
= ''
1055 HasTokenSpace
= False
1056 TokenSpaceGuidCNameList
= []
1059 DisplayName
= TokenCName
1061 DisplayName
= TokenCName
+ '.' + FieldName
1062 if not HasTokenSpace
:
1063 for key
in self
.DecPcds
:
1064 PcdItem
= self
.DecPcds
[key
]
1065 if TokenCName
== PcdItem
.TokenCName
:
1066 if not PcdItem
.TokenSpaceGuidCName
in TokenSpaceGuidCNameList
:
1067 if len (TokenSpaceGuidCNameList
) < 1:
1068 TokenSpaceGuidCNameList
.append(PcdItem
.TokenSpaceGuidCName
)
1069 TokenSpaceGuidCName
= PcdItem
.TokenSpaceGuidCName
1070 PcdDatumType
= PcdItem
.DatumType
1076 "The Pcd %s is found under multiple different TokenSpaceGuid: %s and %s." % (DisplayName
, PcdItem
.TokenSpaceGuidCName
, TokenSpaceGuidCNameList
[0])
1079 if (TokenCName
, TokenSpaceGuidCName
) in self
.DecPcds
:
1080 PcdDatumType
= self
.DecPcds
[(TokenCName
, TokenSpaceGuidCName
)].DatumType
1084 EdkLogger
.error('build', AUTOGEN_ERROR
, "The Pcd %s.%s is not found in the DEC file." % (TokenSpaceGuidCName
, DisplayName
))
1086 EdkLogger
.error('build', AUTOGEN_ERROR
, "The Pcd %s is not found in the DEC file." % (DisplayName
))
1087 pcdvalue
= pcdvalue
.replace("\\\\\\'", '\\\\\\"').replace('\\\'', '\'').replace('\\\\\\"', "\\'")
1089 pcdvalue
= DscBuildData
.HandleFlexiblePcd(TokenSpaceGuidCName
, TokenCName
, pcdvalue
, PcdDatumType
, self
._GuidDict
, FieldName
)
1091 pcdvalue
= DscBuildData
.HandleFlexiblePcd(TokenSpaceGuidCName
, TokenCName
, pcdvalue
, PcdDatumType
, self
._GuidDict
)
1092 IsValid
, Cause
= CheckPcdDatum(PcdDatumType
, pcdvalue
)
1094 EdkLogger
.error("build", FORMAT_INVALID
, Cause
, ExtraData
="%s.%s" % (TokenSpaceGuidCName
, TokenCName
))
1095 GlobalData
.BuildOptionPcd
[i
] = (TokenSpaceGuidCName
, TokenCName
, FieldName
, pcdvalue
, ("build command options", 1))
1097 if GlobalData
.BuildOptionPcd
:
1098 for pcd
in GlobalData
.BuildOptionPcd
:
1099 (TokenSpaceGuidCName
, TokenCName
, FieldName
, pcdvalue
, _
) = pcd
1100 for BuildData
in self
._Bdb
._CACHE
_.values():
1101 if BuildData
.Arch
!= self
.Arch
:
1103 if BuildData
.MetaFile
.Ext
== '.dec' or BuildData
.MetaFile
.Ext
== '.dsc':
1105 for key
in BuildData
.Pcds
:
1106 PcdItem
= BuildData
.Pcds
[key
]
1107 if (TokenSpaceGuidCName
, TokenCName
) == (PcdItem
.TokenSpaceGuidCName
, PcdItem
.TokenCName
) and FieldName
=="":
1108 PcdItem
.DefaultValue
= pcdvalue
1109 PcdItem
.PcdValueFromComm
= pcdvalue
1110 #In command line, the latter full assign value in commandLine should override the former field assign value.
1111 #For example, --pcd Token.pcd.field="" --pcd Token.pcd=H"{}"
1114 if GlobalData
.BuildOptionPcd
:
1115 for pcdTuple
in GlobalData
.BuildOptionPcd
:
1116 TokenSpaceGuid
, Token
, Field
= pcdTuple
[0], pcdTuple
[1], pcdTuple
[2]
1118 if (TokenSpaceGuid
, Token
) not in field_assign
:
1119 field_assign
[TokenSpaceGuid
, Token
] = []
1120 field_assign
[TokenSpaceGuid
, Token
].append(pcdTuple
)
1122 if (TokenSpaceGuid
, Token
) in field_assign
:
1123 delete_assign
.extend(field_assign
[TokenSpaceGuid
, Token
])
1124 field_assign
[TokenSpaceGuid
, Token
] = []
1125 for item
in delete_assign
:
1126 GlobalData
.BuildOptionPcd
.remove(item
)
1129 def HandleFlexiblePcd(TokenSpaceGuidCName
, TokenCName
, PcdValue
, PcdDatumType
, GuidDict
, FieldName
=''):
1132 TokenCName
+= '.' + FieldName
1133 if PcdValue
.startswith('H'):
1134 if FieldName
and _IsFieldValueAnArray(PcdValue
[1:]):
1135 PcdDatumType
= TAB_VOID
1137 if FieldName
and not IsArray
:
1140 PcdValue
= ValueExpressionEx(PcdValue
[1:], PcdDatumType
, GuidDict
)(True)
1141 except BadExpression
as Value
:
1142 EdkLogger
.error('Parser', FORMAT_INVALID
, 'PCD [%s.%s] Value "%s", %s' %
1143 (TokenSpaceGuidCName
, TokenCName
, PcdValue
, Value
))
1144 elif PcdValue
.startswith("L'") or PcdValue
.startswith("'"):
1145 if FieldName
and _IsFieldValueAnArray(PcdValue
):
1146 PcdDatumType
= TAB_VOID
1148 if FieldName
and not IsArray
:
1151 PcdValue
= ValueExpressionEx(PcdValue
, PcdDatumType
, GuidDict
)(True)
1152 except BadExpression
as Value
:
1153 EdkLogger
.error('Parser', FORMAT_INVALID
, 'PCD [%s.%s] Value "%s", %s' %
1154 (TokenSpaceGuidCName
, TokenCName
, PcdValue
, Value
))
1155 elif PcdValue
.startswith('L'):
1156 PcdValue
= 'L"' + PcdValue
[1:] + '"'
1157 if FieldName
and _IsFieldValueAnArray(PcdValue
):
1158 PcdDatumType
= TAB_VOID
1160 if FieldName
and not IsArray
:
1163 PcdValue
= ValueExpressionEx(PcdValue
, PcdDatumType
, GuidDict
)(True)
1164 except BadExpression
as Value
:
1165 EdkLogger
.error('Parser', FORMAT_INVALID
, 'PCD [%s.%s] Value "%s", %s' %
1166 (TokenSpaceGuidCName
, TokenCName
, PcdValue
, Value
))
1168 if PcdValue
.upper() == 'FALSE':
1170 if PcdValue
.upper() == 'TRUE':
1173 if PcdDatumType
not in TAB_PCD_NUMERIC_TYPES
:
1174 PcdValue
= '"' + PcdValue
+ '"'
1175 elif not PcdValue
.isdigit() and not PcdValue
.upper().startswith('0X'):
1176 PcdValue
= '"' + PcdValue
+ '"'
1180 if PcdValue
.upper().startswith('0X'):
1183 Num
= int(PcdValue
, Base
)
1185 PcdValue
= '"' + PcdValue
+ '"'
1186 if _IsFieldValueAnArray(PcdValue
):
1187 PcdDatumType
= TAB_VOID
1192 PcdValue
= ValueExpressionEx(PcdValue
, PcdDatumType
, GuidDict
)(True)
1193 except BadExpression
as Value
:
1194 EdkLogger
.error('Parser', FORMAT_INVALID
, 'PCD [%s.%s] Value "%s", %s' %
1195 (TokenSpaceGuidCName
, TokenCName
, PcdValue
, Value
))
1198 ## Retrieve all PCD settings in platform
1201 if self
._Pcds
is None:
1202 self
._Pcds
= OrderedDict()
1203 self
.__ParsePcdFromCommandLine
()
1204 self
._Pcds
.update(self
._GetPcd
(MODEL_PCD_FIXED_AT_BUILD
))
1205 self
._Pcds
.update(self
._GetPcd
(MODEL_PCD_PATCHABLE_IN_MODULE
))
1206 self
._Pcds
.update(self
._GetPcd
(MODEL_PCD_FEATURE_FLAG
))
1207 self
._Pcds
.update(self
._GetDynamicPcd
(MODEL_PCD_DYNAMIC_DEFAULT
))
1208 self
._Pcds
.update(self
._GetDynamicHiiPcd
(MODEL_PCD_DYNAMIC_HII
))
1209 self
._Pcds
.update(self
._GetDynamicVpdPcd
(MODEL_PCD_DYNAMIC_VPD
))
1210 self
._Pcds
.update(self
._GetDynamicPcd
(MODEL_PCD_DYNAMIC_EX_DEFAULT
))
1211 self
._Pcds
.update(self
._GetDynamicHiiPcd
(MODEL_PCD_DYNAMIC_EX_HII
))
1212 self
._Pcds
.update(self
._GetDynamicVpdPcd
(MODEL_PCD_DYNAMIC_EX_VPD
))
1214 self
._Pcds
= self
.CompletePcdValues(self
._Pcds
)
1215 self
._Pcds
= self
.OverrideByFdfOverAll(self
._Pcds
)
1216 self
._Pcds
= self
.OverrideByCommOverAll(self
._Pcds
)
1217 self
._Pcds
= self
.UpdateStructuredPcds(MODEL_PCD_TYPE_LIST
, self
._Pcds
)
1218 self
._Pcds
= self
.CompleteHiiPcdsDefaultStores(self
._Pcds
)
1219 self
._Pcds
= self
._FilterPcdBySkuUsage
(self
._Pcds
)
1221 self
.RecoverCommandLinePcd()
1224 ## Retrieve [BuildOptions]
1226 def BuildOptions(self
):
1227 if self
._BuildOptions
is None:
1228 self
._BuildOptions
= OrderedDict()
1230 # Retrieve build option for EDKII and EDK style module
1232 for CodeBase
in (EDKII_NAME
, EDK_NAME
):
1233 RecordList
= self
._RawData
[MODEL_META_DATA_BUILD_OPTION
, self
._Arch
, CodeBase
]
1234 for ToolChainFamily
, ToolChain
, Option
, Dummy1
, Dummy2
, Dummy3
, Dummy4
, Dummy5
in RecordList
:
1235 if Dummy3
.upper() != TAB_COMMON
:
1237 CurKey
= (ToolChainFamily
, ToolChain
, CodeBase
)
1239 # Only flags can be appended
1241 if CurKey
not in self
._BuildOptions
or not ToolChain
.endswith('_FLAGS') or Option
.startswith('='):
1242 self
._BuildOptions
[CurKey
] = Option
1244 if ' ' + Option
not in self
._BuildOptions
[CurKey
]:
1245 self
._BuildOptions
[CurKey
] += ' ' + Option
1246 return self
._BuildOptions
1248 def GetBuildOptionsByModuleType(self
, Edk
, ModuleType
):
1249 if self
._ModuleTypeOptions
is None:
1250 self
._ModuleTypeOptions
= OrderedDict()
1251 if (Edk
, ModuleType
) not in self
._ModuleTypeOptions
:
1252 options
= OrderedDict()
1253 self
._ModuleTypeOptions
[Edk
, ModuleType
] = options
1254 DriverType
= '%s.%s' % (Edk
, ModuleType
)
1255 CommonDriverType
= '%s.%s' % (TAB_COMMON
, ModuleType
)
1256 RecordList
= self
._RawData
[MODEL_META_DATA_BUILD_OPTION
, self
._Arch
]
1257 for ToolChainFamily
, ToolChain
, Option
, Dummy1
, Dummy2
, Dummy3
, Dummy4
, Dummy5
in RecordList
:
1258 Type
= Dummy2
+ '.' + Dummy3
1259 if Type
.upper() == DriverType
.upper() or Type
.upper() == CommonDriverType
.upper():
1260 Key
= (ToolChainFamily
, ToolChain
, Edk
)
1261 if Key
not in options
or not ToolChain
.endswith('_FLAGS') or Option
.startswith('='):
1262 options
[Key
] = Option
1264 if ' ' + Option
not in options
[Key
]:
1265 options
[Key
] += ' ' + Option
1266 return self
._ModuleTypeOptions
[Edk
, ModuleType
]
1269 def GetStructurePcdInfo(PcdSet
):
1270 structure_pcd_data
= defaultdict(list)
1272 structure_pcd_data
[(item
[0], item
[1])].append(item
)
1274 return structure_pcd_data
1277 def OverrideByFdf(StruPcds
,workspace
):
1278 if GlobalData
.gFdfParser
is None:
1280 StructurePcdInFdf
= OrderedDict()
1281 fdfpcd
= GlobalData
.gFdfParser
.Profile
.PcdDict
1282 fdfpcdlocation
= GlobalData
.gFdfParser
.Profile
.PcdLocalDict
1283 for item
in fdfpcd
:
1284 if len(item
[2]) and (item
[0],item
[1]) in StruPcds
:
1285 StructurePcdInFdf
[(item
[1],item
[0],item
[2] )] = fdfpcd
[item
]
1286 GlobalPcds
= {(item
[0],item
[1]) for item
in StructurePcdInFdf
}
1287 for Pcd
in StruPcds
.values():
1288 if (Pcd
.TokenSpaceGuidCName
,Pcd
.TokenCName
) not in GlobalPcds
:
1290 FieldValues
= OrderedDict()
1291 for item
in StructurePcdInFdf
:
1292 if (Pcd
.TokenSpaceGuidCName
,Pcd
.TokenCName
) == (item
[0],item
[1]) and item
[2]:
1293 FieldValues
[item
[2]] = StructurePcdInFdf
[item
]
1294 for field
in FieldValues
:
1295 if field
not in Pcd
.PcdFieldValueFromFdf
:
1296 Pcd
.PcdFieldValueFromFdf
[field
] = ["","",""]
1297 Pcd
.PcdFieldValueFromFdf
[field
][0] = FieldValues
[field
]
1298 Pcd
.PcdFieldValueFromFdf
[field
][1] = os
.path
.relpath(fdfpcdlocation
[(Pcd
.TokenCName
,Pcd
.TokenSpaceGuidCName
,field
)][0],workspace
)
1299 Pcd
.PcdFieldValueFromFdf
[field
][2] = fdfpcdlocation
[(Pcd
.TokenCName
,Pcd
.TokenSpaceGuidCName
,field
)][1]
1304 def OverrideByComm(StruPcds
):
1305 StructurePcdInCom
= OrderedDict()
1306 for item
in GlobalData
.BuildOptionPcd
:
1307 if len(item
) == 5 and (item
[1], item
[0]) in StruPcds
:
1308 StructurePcdInCom
[(item
[0], item
[1], item
[2] )] = (item
[3], item
[4])
1309 GlobalPcds
= {(item
[0], item
[1]) for item
in StructurePcdInCom
}
1310 for Pcd
in StruPcds
.values():
1311 if (Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
) not in GlobalPcds
:
1313 FieldValues
= OrderedDict()
1314 for item
in StructurePcdInCom
:
1315 if (Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
) == (item
[0], item
[1]) and item
[2]:
1316 FieldValues
[item
[2]] = StructurePcdInCom
[item
]
1317 for field
in FieldValues
:
1318 if field
not in Pcd
.PcdFieldValueFromComm
:
1319 Pcd
.PcdFieldValueFromComm
[field
] = ["", "", ""]
1320 Pcd
.PcdFieldValueFromComm
[field
][0] = FieldValues
[field
][0]
1321 Pcd
.PcdFieldValueFromComm
[field
][1] = FieldValues
[field
][1][0]
1322 Pcd
.PcdFieldValueFromComm
[field
][2] = FieldValues
[field
][1][1]
1325 def OverrideByCommOverAll(self
,AllPcds
):
1326 def CheckStructureInComm(commpcds
):
1329 if len(commpcds
[0]) == 5:
1332 NoFiledValues
= OrderedDict()
1333 if CheckStructureInComm(GlobalData
.BuildOptionPcd
):
1334 StructurePcdInCom
= OrderedDict()
1335 for item
in GlobalData
.BuildOptionPcd
:
1336 StructurePcdInCom
[(item
[0], item
[1], item
[2] )] = (item
[3], item
[4])
1337 for item
in StructurePcdInCom
:
1339 NoFiledValues
[(item
[0], item
[1])] = StructurePcdInCom
[item
]
1341 for item
in GlobalData
.BuildOptionPcd
:
1342 NoFiledValues
[(item
[0], item
[1])] = [item
[2]]
1343 for Guid
, Name
in NoFiledValues
:
1344 if (Name
, Guid
) in AllPcds
:
1345 Pcd
= AllPcds
.get((Name
, Guid
))
1346 if isinstance(self
._DecPcds
.get((Pcd
.TokenCName
, Pcd
.TokenSpaceGuidCName
), None), StructurePcd
):
1347 self
._DecPcds
.get((Pcd
.TokenCName
, Pcd
.TokenSpaceGuidCName
)).PcdValueFromComm
= NoFiledValues
[(Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
)][0]
1349 Pcd
.PcdValueFromComm
= NoFiledValues
[(Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
)][0]
1350 Pcd
.DefaultValue
= NoFiledValues
[(Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
)][0]
1351 for sku
in Pcd
.SkuInfoList
:
1352 SkuInfo
= Pcd
.SkuInfoList
[sku
]
1353 if SkuInfo
.DefaultValue
:
1354 SkuInfo
.DefaultValue
= NoFiledValues
[(Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
)][0]
1356 SkuInfo
.HiiDefaultValue
= NoFiledValues
[(Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
)][0]
1357 for defaultstore
in SkuInfo
.DefaultStoreDict
:
1358 SkuInfo
.DefaultStoreDict
[defaultstore
] = NoFiledValues
[(Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
)][0]
1359 if Pcd
.Type
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_HII
], self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_HII
]]:
1360 if Pcd
.DatumType
== TAB_VOID
:
1361 if not Pcd
.MaxDatumSize
:
1362 Pcd
.MaxDatumSize
= '0'
1363 CurrentSize
= int(Pcd
.MaxDatumSize
, 16) if Pcd
.MaxDatumSize
.upper().startswith("0X") else int(Pcd
.MaxDatumSize
)
1364 OptionSize
= len((StringToArray(Pcd
.PcdValueFromComm
)).split(","))
1365 MaxSize
= max(CurrentSize
, OptionSize
)
1366 Pcd
.MaxDatumSize
= str(MaxSize
)
1368 PcdInDec
= self
.DecPcds
.get((Name
, Guid
))
1370 PcdInDec
.PcdValueFromComm
= NoFiledValues
[(Guid
, Name
)][0]
1371 if PcdInDec
.Type
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_FIXED_AT_BUILD
],
1372 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_PATCHABLE_IN_MODULE
],
1373 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_FEATURE_FLAG
],
1374 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC
],
1375 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX
]]:
1376 self
.Pcds
[Name
, Guid
] = copy
.deepcopy(PcdInDec
)
1377 self
.Pcds
[Name
, Guid
].DefaultValue
= NoFiledValues
[( Guid
, Name
)][0]
1378 if PcdInDec
.Type
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC
],
1379 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX
]]:
1380 self
.Pcds
[Name
, Guid
].SkuInfoList
= {TAB_DEFAULT
:SkuInfoClass(TAB_DEFAULT
, self
.SkuIds
[TAB_DEFAULT
][0], '', '', '', '', '', NoFiledValues
[( Guid
, Name
)][0])}
1383 def OverrideByFdfOverAll(self
,AllPcds
):
1385 if GlobalData
.gFdfParser
is None:
1387 NoFiledValues
= GlobalData
.gFdfParser
.Profile
.PcdDict
1388 for Name
,Guid
,Field
in NoFiledValues
:
1391 Value
= NoFiledValues
[(Name
,Guid
,Field
)]
1392 if (Name
,Guid
) in AllPcds
:
1393 Pcd
= AllPcds
.get((Name
,Guid
))
1394 if isinstance(self
._DecPcds
.get((Pcd
.TokenCName
,Pcd
.TokenSpaceGuidCName
), None),StructurePcd
):
1395 self
._DecPcds
.get((Pcd
.TokenCName
,Pcd
.TokenSpaceGuidCName
)).PcdValueFromComm
= Value
1397 Pcd
.PcdValueFromComm
= Value
1398 Pcd
.DefaultValue
= Value
1399 for sku
in Pcd
.SkuInfoList
:
1400 SkuInfo
= Pcd
.SkuInfoList
[sku
]
1401 if SkuInfo
.DefaultValue
:
1402 SkuInfo
.DefaultValue
= Value
1404 SkuInfo
.HiiDefaultValue
= Value
1405 for defaultstore
in SkuInfo
.DefaultStoreDict
:
1406 SkuInfo
.DefaultStoreDict
[defaultstore
] = Value
1407 if Pcd
.Type
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_HII
], self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_HII
]]:
1408 if Pcd
.DatumType
== TAB_VOID
:
1409 if not Pcd
.MaxDatumSize
:
1410 Pcd
.MaxDatumSize
= '0'
1411 CurrentSize
= int(Pcd
.MaxDatumSize
,16) if Pcd
.MaxDatumSize
.upper().startswith("0X") else int(Pcd
.MaxDatumSize
)
1412 OptionSize
= len((StringToArray(Pcd
.PcdValueFromComm
)).split(","))
1413 MaxSize
= max(CurrentSize
, OptionSize
)
1414 Pcd
.MaxDatumSize
= str(MaxSize
)
1416 PcdInDec
= self
.DecPcds
.get((Name
,Guid
))
1418 PcdInDec
.PcdValueFromFdf
= Value
1419 if PcdInDec
.Type
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_FIXED_AT_BUILD
],
1420 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_PATCHABLE_IN_MODULE
],
1421 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_FEATURE_FLAG
]]:
1422 self
.Pcds
[Name
, Guid
] = copy
.deepcopy(PcdInDec
)
1423 self
.Pcds
[Name
, Guid
].DefaultValue
= Value
1426 def ParsePcdNameStruct(self
,NamePart1
,NamePart2
):
1427 TokenSpaceCName
= PcdCName
= DimensionAttr
= Field
= ""
1428 if "." in NamePart1
:
1429 TokenSpaceCName
, TempPcdCName
= NamePart1
.split(".")
1430 if "[" in TempPcdCName
:
1431 PcdCName
= TempPcdCName
[:TempPcdCName
.index("[")]
1432 DimensionAttr
= TempPcdCName
[TempPcdCName
.index("["):]
1434 PcdCName
= TempPcdCName
1437 TokenSpaceCName
= NamePart1
1438 if "[" in NamePart2
:
1439 PcdCName
= NamePart2
[:NamePart2
.index("[")]
1440 DimensionAttr
= NamePart2
[NamePart2
.index("["):]
1442 PcdCName
= NamePart2
1444 return TokenSpaceCName
,PcdCName
,DimensionAttr
,Field
1446 def UpdateStructuredPcds(self
, TypeList
, AllPcds
):
1448 DynamicPcdType
= [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_DEFAULT
],
1449 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_HII
],
1450 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_VPD
],
1451 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_DEFAULT
],
1452 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_HII
],
1453 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_VPD
]]
1456 DefaultStoreMgr
= DefaultStore(self
.DefaultStores
)
1457 SkuIds
= self
.SkuIds
1458 self
.SkuIdMgr
.AvailableSkuIdSet
.update({TAB_DEFAULT
:0})
1459 DefaultStores
= {storename
for pcdobj
in AllPcds
.values() for skuobj
in pcdobj
.SkuInfoList
.values() for storename
in skuobj
.DefaultStoreDict
}
1460 DefaultStores
.add(TAB_DEFAULT_STORES_DEFAULT
)
1463 # Find out all possible PCD candidates for self._Arch
1466 for Type
in TypeList
:
1467 RecordList
.extend(self
._RawData
[Type
, self
._Arch
])
1469 for TokenSpaceGuid
, PcdCName
, Setting
, Arch
, SkuName
, default_store
, Dummy4
, Dummy5
in RecordList
:
1470 SkuName
= SkuName
.upper()
1471 default_store
= default_store
.upper()
1472 SkuName
= TAB_DEFAULT
if SkuName
== TAB_COMMON
else SkuName
1473 if SkuName
not in SkuIds
:
1475 TCName
,PCName
,DimensionAttr
,Field
= self
.ParsePcdNameStruct(TokenSpaceGuid
, PcdCName
)
1476 pcd_in_dec
= self
._DecPcds
.get((PCName
,TCName
), None)
1477 if pcd_in_dec
is None:
1478 EdkLogger
.error('build', PARSER_ERROR
,
1479 "Pcd (%s.%s) defined in DSC is not declared in DEC files. Arch: ['%s']" % (TCName
, PCName
, self
._Arch
),
1480 File
=self
.MetaFile
, Line
= Dummy5
)
1481 if SkuName
in SkuIds
and ("." in TokenSpaceGuid
or "[" in PcdCName
):
1482 if not isinstance (pcd_in_dec
, StructurePcd
):
1483 EdkLogger
.error('build', PARSER_ERROR
,
1484 "Pcd (%s.%s) is not declared as Structure PCD in DEC files. Arch: ['%s']" % (TCName
, PCName
, self
._Arch
),
1485 File
=self
.MetaFile
, Line
= Dummy5
)
1487 S_PcdSet
.append([ TCName
,PCName
,DimensionAttr
,Field
, SkuName
, default_store
, Dummy5
, AnalyzePcdExpression(Setting
)[0]])
1489 # handle pcd value override
1490 StrPcdSet
= DscBuildData
.GetStructurePcdInfo(S_PcdSet
)
1491 S_pcd_set
= OrderedDict()
1492 for str_pcd
in StrPcdSet
:
1493 str_pcd_obj
= Pcds
.get((str_pcd
[1], str_pcd
[0]), None)
1494 str_pcd_dec
= self
._DecPcds
.get((str_pcd
[1], str_pcd
[0]), None)
1495 str_pcd_obj_str
= StructurePcd()
1496 str_pcd_obj_str
.copy(str_pcd_dec
)
1498 str_pcd_obj_str
.copy(str_pcd_obj
)
1499 if str_pcd_obj
.Type
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_HII
], self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_HII
]]:
1500 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
}
1502 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
}
1503 for str_pcd_data
in StrPcdSet
[str_pcd
]:
1504 if str_pcd_data
[4] in SkuIds
:
1505 str_pcd_obj_str
.AddOverrideValue(str_pcd_data
[3], str(str_pcd_data
[7]), TAB_DEFAULT
if str_pcd_data
[4] == TAB_COMMON
else str_pcd_data
[4], TAB_DEFAULT_STORES_DEFAULT
if str_pcd_data
[5] == TAB_COMMON
else str_pcd_data
[5], self
.MetaFile
.File
if self
.WorkspaceDir
not in self
.MetaFile
.File
else self
.MetaFile
.File
[len(self
.WorkspaceDir
) if self
.WorkspaceDir
.endswith(os
.path
.sep
) else len(self
.WorkspaceDir
)+1:], LineNo
=str_pcd_data
[6],DimensionAttr
= str_pcd_data
[2])
1506 S_pcd_set
[str_pcd
[1], str_pcd
[0]] = str_pcd_obj_str
1508 # Add the Structure PCD that only defined in DEC, don't have override in DSC file
1509 for Pcd
in self
.DecPcds
:
1510 if isinstance(self
._DecPcds
[Pcd
], StructurePcd
):
1511 if Pcd
not in S_pcd_set
:
1512 str_pcd_obj_str
= StructurePcd()
1513 str_pcd_obj_str
.copy(self
._DecPcds
[Pcd
])
1514 str_pcd_obj
= Pcds
.get(Pcd
, None)
1516 str_pcd_obj_str
.copy(str_pcd_obj
)
1517 if str_pcd_obj
.Type
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_HII
], self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_HII
]]:
1518 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
}
1520 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
}
1521 S_pcd_set
[Pcd
] = str_pcd_obj_str
1523 GlobalData
.gStructurePcd
[self
.Arch
] = S_pcd_set
.copy()
1524 self
.FilterStrcturePcd(S_pcd_set
)
1525 for stru_pcd
in S_pcd_set
.values():
1526 for skuid
in SkuIds
:
1527 if skuid
in stru_pcd
.SkuOverrideValues
:
1529 nextskuid
= self
.SkuIdMgr
.GetNextSkuId(skuid
)
1531 if skuid
not in stru_pcd
.SkuOverrideValues
:
1532 while nextskuid
not in stru_pcd
.SkuOverrideValues
:
1533 if nextskuid
== TAB_DEFAULT
:
1536 nextskuid
= self
.SkuIdMgr
.GetNextSkuId(nextskuid
)
1537 stru_pcd
.SkuOverrideValues
[skuid
] = copy
.deepcopy(stru_pcd
.SkuOverrideValues
[nextskuid
]) if not NoDefault
else copy
.deepcopy({defaultstorename
: stru_pcd
.DefaultValues
for defaultstorename
in DefaultStores
} if DefaultStores
else {}) #{TAB_DEFAULT_STORES_DEFAULT:stru_pcd.DefaultValues})
1539 stru_pcd
.ValueChain
.add((skuid
, ''))
1540 if 'DEFAULT' in stru_pcd
.SkuOverrideValues
and not GlobalData
.gPcdSkuOverrides
.get((stru_pcd
.TokenCName
, stru_pcd
.TokenSpaceGuidCName
)):
1541 GlobalData
.gPcdSkuOverrides
.update(
1542 {(stru_pcd
.TokenCName
, stru_pcd
.TokenSpaceGuidCName
): {'DEFAULT':stru_pcd
.SkuOverrideValues
['DEFAULT']}})
1543 if stru_pcd
.Type
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_HII
], self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_HII
]]:
1544 for skuid
in SkuIds
:
1547 if skuid
not in stru_pcd
.SkuOverrideValues
:
1548 while nextskuid
not in stru_pcd
.SkuOverrideValues
:
1549 if nextskuid
== TAB_DEFAULT
:
1552 nextskuid
= self
.SkuIdMgr
.GetNextSkuId(nextskuid
)
1555 PcdDefaultStoreSet
= set(defaultstorename
for defaultstorename
in stru_pcd
.SkuOverrideValues
[nextskuid
])
1556 mindefaultstorename
= DefaultStoreMgr
.GetMin(PcdDefaultStoreSet
)
1558 for defaultstoreid
in DefaultStores
:
1559 if defaultstoreid
not in stru_pcd
.SkuOverrideValues
[skuid
]:
1560 stru_pcd
.SkuOverrideValues
[skuid
][defaultstoreid
] = CopyDict(stru_pcd
.SkuOverrideValues
[nextskuid
][mindefaultstorename
])
1561 stru_pcd
.ValueChain
.add((skuid
, defaultstoreid
))
1562 S_pcd_set
= DscBuildData
.OverrideByFdf(S_pcd_set
,self
.WorkspaceDir
)
1563 S_pcd_set
= DscBuildData
.OverrideByComm(S_pcd_set
)
1564 Str_Pcd_Values
= self
.GenerateByteArrayValue(S_pcd_set
)
1566 for (skuname
, StoreName
, PcdGuid
, PcdName
, PcdValue
) in Str_Pcd_Values
:
1567 str_pcd_obj
= S_pcd_set
.get((PcdName
, PcdGuid
))
1568 if str_pcd_obj
is None:
1569 print(PcdName
, PcdGuid
)
1571 if str_pcd_obj
.Type
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_HII
],
1572 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_HII
]]:
1573 if skuname
not in str_pcd_obj
.SkuInfoList
:
1574 str_pcd_obj
.SkuInfoList
[skuname
] = SkuInfoClass(SkuIdName
=skuname
, SkuId
=self
.SkuIds
[skuname
][0], HiiDefaultValue
=PcdValue
, DefaultStore
= {StoreName
:PcdValue
})
1576 str_pcd_obj
.SkuInfoList
[skuname
].HiiDefaultValue
= PcdValue
1577 str_pcd_obj
.SkuInfoList
[skuname
].DefaultStoreDict
.update({StoreName
:PcdValue
})
1578 elif str_pcd_obj
.Type
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_FIXED_AT_BUILD
],
1579 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_PATCHABLE_IN_MODULE
]]:
1580 if skuname
in (self
.SkuIdMgr
.SystemSkuId
, TAB_DEFAULT
, TAB_COMMON
):
1581 str_pcd_obj
.DefaultValue
= PcdValue
1583 if skuname
not in str_pcd_obj
.SkuInfoList
:
1584 nextskuid
= self
.SkuIdMgr
.GetNextSkuId(skuname
)
1586 while nextskuid
not in str_pcd_obj
.SkuInfoList
:
1587 if nextskuid
== TAB_DEFAULT
:
1590 nextskuid
= self
.SkuIdMgr
.GetNextSkuId(nextskuid
)
1591 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
)
1592 str_pcd_obj
.SkuInfoList
[skuname
].SkuId
= self
.SkuIds
[skuname
][0]
1593 str_pcd_obj
.SkuInfoList
[skuname
].SkuIdName
= skuname
1595 str_pcd_obj
.SkuInfoList
[skuname
].DefaultValue
= PcdValue
1596 for str_pcd_obj
in S_pcd_set
.values():
1597 if str_pcd_obj
.Type
not in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_HII
],
1598 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_HII
]]:
1600 PcdDefaultStoreSet
= set(defaultstorename
for skuobj
in str_pcd_obj
.SkuInfoList
.values() for defaultstorename
in skuobj
.DefaultStoreDict
)
1601 DefaultStoreObj
= DefaultStore(self
._GetDefaultStores
())
1602 mindefaultstorename
= DefaultStoreObj
.GetMin(PcdDefaultStoreSet
)
1603 str_pcd_obj
.SkuInfoList
[self
.SkuIdMgr
.SystemSkuId
].HiiDefaultValue
= str_pcd_obj
.SkuInfoList
[self
.SkuIdMgr
.SystemSkuId
].DefaultStoreDict
[mindefaultstorename
]
1605 for str_pcd_obj
in S_pcd_set
.values():
1607 str_pcd_obj
.MaxDatumSize
= DscBuildData
.GetStructurePcdMaxSize(str_pcd_obj
)
1608 Pcds
[str_pcd_obj
.TokenCName
, str_pcd_obj
.TokenSpaceGuidCName
] = str_pcd_obj
1609 Pcds
[str_pcd_obj
.TokenCName
, str_pcd_obj
.TokenSpaceGuidCName
].CustomAttribute
['IsStru']=True
1613 if TAB_DEFAULT
not in pcd
.SkuInfoList
and TAB_COMMON
in pcd
.SkuInfoList
:
1614 pcd
.SkuInfoList
[TAB_DEFAULT
] = pcd
.SkuInfoList
[TAB_COMMON
]
1615 del pcd
.SkuInfoList
[TAB_COMMON
]
1616 elif TAB_DEFAULT
in pcd
.SkuInfoList
and TAB_COMMON
in pcd
.SkuInfoList
:
1617 del pcd
.SkuInfoList
[TAB_COMMON
]
1619 list(map(self
.FilterSkuSettings
, [Pcds
[pcdkey
] for pcdkey
in Pcds
if Pcds
[pcdkey
].Type
in DynamicPcdType
]))
1622 def PlatformUsedPcds(self
):
1624 if GlobalData
.gFdfParser
:
1625 FdfInfList
= GlobalData
.gFdfParser
.Profile
.InfList
1626 FdfModuleList
= [PathClass(NormPath(Inf
), GlobalData
.gWorkspace
, Arch
=self
._Arch
) for Inf
in FdfInfList
]
1627 AllModulePcds
= set()
1628 ModuleSet
= set(list(self
._Modules
.keys()) + FdfModuleList
)
1629 for ModuleFile
in ModuleSet
:
1630 ModuleData
= self
._Bdb
[ModuleFile
, self
._Arch
, self
._Target
, self
._Toolchain
]
1631 AllModulePcds
= AllModulePcds | ModuleData
.PcdsName
1632 for ModuleFile
in self
.LibraryInstances
:
1633 ModuleData
= self
._Bdb
.CreateBuildObject(ModuleFile
, self
._Arch
, self
._Target
, self
._Toolchain
)
1634 AllModulePcds
= AllModulePcds | ModuleData
.PcdsName
1635 return AllModulePcds
1637 #Filter the StrucutrePcd that is not used by any module in dsc file and fdf file.
1638 def FilterStrcturePcd(self
, S_pcd_set
):
1639 UnusedStruPcds
= set(S_pcd_set
.keys()) - self
.PlatformUsedPcds
1640 for (Token
, TokenSpaceGuid
) in UnusedStruPcds
:
1641 del S_pcd_set
[(Token
, TokenSpaceGuid
)]
1643 ## Retrieve non-dynamic PCD settings
1645 # @param Type PCD type
1647 # @retval a dict object contains settings of given PCD type
1649 def _GetPcd(self
, Type
):
1650 Pcds
= OrderedDict()
1652 # tdict is a special dict kind of type, used for selecting correct
1653 # PCD settings for certain ARCH
1655 AvailableSkuIdSet
= copy
.copy(self
.SkuIds
)
1657 PcdDict
= tdict(True, 4)
1659 # Find out all possible PCD candidates for self._Arch
1660 RecordList
= self
._RawData
[Type
, self
._Arch
]
1661 PcdValueDict
= OrderedDict()
1662 for TokenSpaceGuid
, PcdCName
, Setting
, Arch
, SkuName
, Dummy3
, Dummy4
, Dummy5
in RecordList
:
1663 SkuName
= SkuName
.upper()
1664 SkuName
= TAB_DEFAULT
if SkuName
== TAB_COMMON
else SkuName
1665 if SkuName
not in AvailableSkuIdSet
:
1666 EdkLogger
.error('build ', PARAMETER_INVALID
, 'Sku %s is not defined in [SkuIds] section' % SkuName
,
1667 File
=self
.MetaFile
, Line
=Dummy5
)
1668 if SkuName
in (self
.SkuIdMgr
.SystemSkuId
, TAB_DEFAULT
, TAB_COMMON
):
1669 if "." not in TokenSpaceGuid
and "[" not in PcdCName
:
1670 PcdSet
.add((PcdCName
, TokenSpaceGuid
, SkuName
, Dummy5
))
1671 PcdDict
[Arch
, PcdCName
, TokenSpaceGuid
, SkuName
] = Setting
1673 for PcdCName
, TokenSpaceGuid
, SkuName
, Dummy4
in PcdSet
:
1674 Setting
= PcdDict
[self
._Arch
, PcdCName
, TokenSpaceGuid
, SkuName
]
1677 PcdValue
, DatumType
, MaxDatumSize
= self
._ValidatePcd
(PcdCName
, TokenSpaceGuid
, Setting
, Type
, Dummy4
)
1679 if int(MaxDatumSize
, 0) > 0xFFFF:
1680 EdkLogger
.error('build', FORMAT_INVALID
, "The size value must not exceed the maximum value of 0xFFFF (UINT16) for %s." % ".".join((TokenSpaceGuid
, PcdCName
)),
1681 File
=self
.MetaFile
, Line
=Dummy4
)
1682 if int(MaxDatumSize
, 0) < 0:
1683 EdkLogger
.error('build', FORMAT_INVALID
, "The size value can't be set to negative value for %s." % ".".join((TokenSpaceGuid
, PcdCName
)),
1684 File
=self
.MetaFile
, Line
=Dummy4
)
1685 if (PcdCName
, TokenSpaceGuid
) in PcdValueDict
:
1686 PcdValueDict
[PcdCName
, TokenSpaceGuid
][SkuName
] = (PcdValue
, DatumType
, MaxDatumSize
)
1688 PcdValueDict
[PcdCName
, TokenSpaceGuid
] = {SkuName
:(PcdValue
, DatumType
, MaxDatumSize
)}
1690 for ((PcdCName
, TokenSpaceGuid
), PcdSetting
) in PcdValueDict
.items():
1691 if self
.SkuIdMgr
.SystemSkuId
in PcdSetting
:
1692 PcdValue
, DatumType
, MaxDatumSize
= PcdSetting
[self
.SkuIdMgr
.SystemSkuId
]
1693 elif TAB_DEFAULT
in PcdSetting
:
1694 PcdValue
, DatumType
, MaxDatumSize
= PcdSetting
[TAB_DEFAULT
]
1695 elif TAB_COMMON
in PcdSetting
:
1696 PcdValue
, DatumType
, MaxDatumSize
= PcdSetting
[TAB_COMMON
]
1702 Pcds
[PcdCName
, TokenSpaceGuid
] = PcdClassObject(
1705 self
._PCD
_TYPE
_STRING
_[Type
],
1714 for SkuName
in PcdValueDict
[PcdCName
, TokenSpaceGuid
]:
1715 Settings
= PcdValueDict
[PcdCName
, TokenSpaceGuid
][SkuName
]
1716 if SkuName
not in Pcds
[PcdCName
, TokenSpaceGuid
].DscRawValue
:
1717 Pcds
[PcdCName
, TokenSpaceGuid
].DscRawValue
[SkuName
] = {}
1718 Pcds
[PcdCName
, TokenSpaceGuid
].DscRawValue
[SkuName
][TAB_DEFAULT_STORES_DEFAULT
] = Settings
[0]
1722 def GetStructurePcdMaxSize(str_pcd
):
1723 pcd_default_value
= str_pcd
.DefaultValue
1724 sku_values
= [skuobj
.HiiDefaultValue
if str_pcd
.Type
in [DscBuildData
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_HII
], DscBuildData
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_HII
]] else skuobj
.DefaultValue
for skuobj
in str_pcd
.SkuInfoList
.values()]
1725 sku_values
.append(pcd_default_value
)
1727 def get_length(value
):
1728 Value
= value
.strip()
1730 if Value
.startswith(TAB_GUID
) and Value
.endswith(')'):
1732 if Value
.startswith('L"') and Value
.endswith('"'):
1733 return len(Value
[2:-1])
1734 if Value
[0] == '"' and Value
[-1] == '"':
1735 return len(Value
) - 2
1736 if Value
.strip().startswith("{CODE("):
1737 tmpValue
= RemoveCComments(Value
)
1738 return len(tmpValue
.split(","))
1739 if (Value
[0] == '{' and Value
[-1] == '}'):
1740 return len(Value
.split(","))
1741 if Value
.startswith("L'") and Value
.endswith("'") and len(list(Value
[2:-1])) > 1:
1742 return len(list(Value
[2:-1]))
1743 if Value
[0] == "'" and Value
[-1] == "'" and len(list(Value
[1:-1])) > 1:
1744 return len(Value
) - 2
1747 return str(max(get_length(item
) for item
in sku_values
))
1750 def ExecuteCommand (Command
):
1752 Process
= subprocess
.Popen(Command
, stdout
=subprocess
.PIPE
, stderr
=subprocess
.PIPE
, shell
=True)
1754 EdkLogger
.error('Build', COMMAND_FAILURE
, 'Can not execute command: %s' % Command
)
1755 Result
= Process
.communicate()
1756 return Process
.returncode
, Result
[0].decode(encoding
='utf-8', errors
='ignore'), Result
[1].decode(encoding
='utf-8', errors
='ignore')
1759 def IntToCString(Value
, ValueSize
):
1761 if not isinstance (Value
, str):
1762 for Index
in range(0, ValueSize
):
1763 Result
= Result
+ '\\x%02x' % (Value
& 0xff)
1765 Result
= Result
+ '"'
1768 def GenerateSizeFunction(self
, Pcd
):
1769 CApp
= "// Default Value in Dec \n"
1770 CApp
= CApp
+ "void Cal_%s_%s_Size(UINT32 *Size){\n" % (Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
)
1772 if Pcd
.Type
in PCD_DYNAMIC_TYPE_SET | PCD_DYNAMIC_EX_TYPE_SET
:
1773 for skuname
in Pcd
.SkuInfoList
:
1774 skuobj
= Pcd
.SkuInfoList
[skuname
]
1775 if skuobj
.VariableName
:
1776 for defaultstore
in skuobj
.DefaultStoreDict
:
1777 pcddef
= self
.GetPcdDscRawDefaultValue(Pcd
,skuname
,defaultstore
)
1778 if pcddef
and "{CODE(" in pcddef
:
1779 CApp
+= " *Size = (sizeof (%s_%s_%s_%s_Value) > *Size ? sizeof (%s_%s_%s_%s_Value) : *Size);\n" % (Pcd
.TokenSpaceGuidCName
,Pcd
.TokenCName
,skuname
,defaultstore
,Pcd
.TokenSpaceGuidCName
,Pcd
.TokenCName
,skuname
,defaultstore
)
1781 pcddef
= self
.GetPcdDscRawDefaultValue(Pcd
,skuname
,TAB_DEFAULT_STORES_DEFAULT
)
1782 if pcddef
and "{CODE(" in pcddef
:
1783 CApp
+= " *Size = (sizeof (%s_%s_%s_%s_Value) > *Size ? sizeof (%s_%s_%s_%s_Value) : *Size);\n" % (Pcd
.TokenSpaceGuidCName
,Pcd
.TokenCName
,skuname
,TAB_DEFAULT_STORES_DEFAULT
,Pcd
.TokenSpaceGuidCName
,Pcd
.TokenCName
,skuname
,TAB_DEFAULT_STORES_DEFAULT
)
1785 pcddef
= self
.GetPcdDscRawDefaultValue(Pcd
,TAB_DEFAULT
,TAB_DEFAULT_STORES_DEFAULT
)
1786 if pcddef
and "{CODE(" in pcddef
:
1787 CApp
+= " *Size = (sizeof (%s_%s_%s_%s_Value) > *Size ? sizeof (%s_%s_%s_%s_Value) : *Size);\n" % (Pcd
.TokenSpaceGuidCName
,Pcd
.TokenCName
,TAB_DEFAULT
,TAB_DEFAULT_STORES_DEFAULT
,Pcd
.TokenSpaceGuidCName
,Pcd
.TokenCName
,TAB_DEFAULT
,TAB_DEFAULT_STORES_DEFAULT
)
1788 for index
in Pcd
.DefaultValues
:
1789 FieldList
= Pcd
.DefaultValues
[index
]
1792 for FieldName
in FieldList
:
1793 FieldName
= "." + FieldName
1794 IsArray
= _IsFieldValueAnArray(FieldList
[FieldName
.strip(".")][0])
1795 if IsArray
and not (FieldList
[FieldName
.strip(".")][0].startswith('{GUID') and FieldList
[FieldName
.strip(".")][0].endswith('}')):
1797 Value
= ValueExpressionEx(FieldList
[FieldName
.strip(".")][0], TAB_VOID
, self
._GuidDict
)(True)
1798 except BadExpression
:
1799 EdkLogger
.error('Build', FORMAT_INVALID
, "Invalid value format for %s. From %s Line %d " %
1800 (".".join((Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
, FieldName
.strip('.'))), FieldList
[FieldName
.strip(".")][1], FieldList
[FieldName
.strip(".")][2]))
1801 Value
, ValueSize
= ParseFieldValue(Value
)
1803 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]);
1806 FieldName_ori
= FieldName
.strip('.')
1807 while '[' in FieldName
:
1808 NewFieldName
= NewFieldName
+ FieldName
.split('[', 1)[0] + '[0]'
1809 ArrayIndex
= int(FieldName
.split('[', 1)[1].split(']', 1)[0])
1810 FieldName
= FieldName
.split(']', 1)[1]
1811 FieldName
= NewFieldName
+ FieldName
1812 while '[' in FieldName
and not Pcd
.IsArray
:
1813 FieldName
= FieldName
.rsplit('[', 1)[0]
1814 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])
1815 for skuname
in Pcd
.SkuOverrideValues
:
1816 if skuname
== TAB_COMMON
:
1818 for defaultstorenameitem
in Pcd
.SkuOverrideValues
[skuname
]:
1819 CApp
= CApp
+ "// SkuName: %s, DefaultStoreName: %s \n" % (skuname
, defaultstorenameitem
)
1820 for index
in Pcd
.SkuOverrideValues
[skuname
][defaultstorenameitem
]:
1821 for FieldList
in [Pcd
.SkuOverrideValues
[skuname
][defaultstorenameitem
][index
]]:
1824 for FieldName
in FieldList
:
1825 FieldName
= "." + FieldName
1826 IsArray
= _IsFieldValueAnArray(FieldList
[FieldName
.strip(".")][0])
1827 if IsArray
and not (FieldList
[FieldName
.strip(".")][0].startswith('{GUID') and FieldList
[FieldName
.strip(".")][0].endswith('}')):
1829 Value
= ValueExpressionEx(FieldList
[FieldName
.strip(".")][0], TAB_VOID
, self
._GuidDict
)(True)
1830 except BadExpression
:
1831 EdkLogger
.error('Build', FORMAT_INVALID
, "Invalid value format for %s. From %s Line %d " %
1832 (".".join((Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
, FieldName
.strip('.'))), FieldList
[FieldName
.strip(".")][1], FieldList
[FieldName
.strip(".")][2]))
1833 Value
, ValueSize
= ParseFieldValue(Value
)
1835 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]);
1838 FieldName_ori
= FieldName
.strip('.')
1839 while '[' in FieldName
:
1840 NewFieldName
= NewFieldName
+ FieldName
.split('[', 1)[0] + '[0]'
1841 ArrayIndex
= int(FieldName
.split('[', 1)[1].split(']', 1)[0])
1842 FieldName
= FieldName
.split(']', 1)[1]
1843 FieldName
= NewFieldName
+ FieldName
1844 while '[' in FieldName
and not Pcd
.IsArray
:
1845 FieldName
= FieldName
.rsplit('[', 1)[0]
1846 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])
1847 if Pcd
.PcdFieldValueFromFdf
:
1848 CApp
= CApp
+ "// From fdf \n"
1849 for FieldName
in Pcd
.PcdFieldValueFromFdf
:
1850 FieldName
= "." + FieldName
1851 IsArray
= _IsFieldValueAnArray(Pcd
.PcdFieldValueFromFdf
[FieldName
.strip(".")][0])
1852 if IsArray
and not (Pcd
.PcdFieldValueFromFdf
[FieldName
.strip(".")][0].startswith('{GUID') and Pcd
.PcdFieldValueFromFdf
[FieldName
.strip(".")][0].endswith('}')):
1854 Value
= ValueExpressionEx(Pcd
.PcdFieldValueFromFdf
[FieldName
.strip(".")][0], TAB_VOID
, self
._GuidDict
)(True)
1855 except BadExpression
:
1856 EdkLogger
.error('Build', FORMAT_INVALID
, "Invalid value format for %s. From %s Line %d " %
1857 (".".join((Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
, FieldName
.strip('.'))), Pcd
.PcdFieldValueFromFdf
[FieldName
.strip(".")][1], Pcd
.PcdFieldValueFromFdf
[FieldName
.strip(".")][2]))
1858 Value
, ValueSize
= ParseFieldValue(Value
)
1860 CApp
= CApp
+ ' __FLEXIBLE_SIZE(*Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s) + ((%d %% __ARRAY_ELEMENT_SIZE(%s, %s)) ? 1 : 0)); // From %s Line %d Value %s\n' % (Pcd
.DatumType
, FieldName
.strip("."), ValueSize
, Pcd
.DatumType
, FieldName
.strip("."), ValueSize
, Pcd
.DatumType
, FieldName
.strip("."), Pcd
.PcdFieldValueFromFdf
[FieldName
.strip(".")][1], Pcd
.PcdFieldValueFromFdf
[FieldName
.strip(".")][2], Pcd
.PcdFieldValueFromFdf
[FieldName
.strip(".")][0]);
1863 FieldName_ori
= FieldName
.strip('.')
1864 while '[' in FieldName
:
1865 NewFieldName
= NewFieldName
+ FieldName
.split('[', 1)[0] + '[0]'
1866 ArrayIndex
= int(FieldName
.split('[', 1)[1].split(']', 1)[0])
1867 FieldName
= FieldName
.split(']', 1)[1]
1868 FieldName
= NewFieldName
+ FieldName
1869 while '[' in FieldName
:
1870 FieldName
= FieldName
.rsplit('[', 1)[0]
1871 CApp
= CApp
+ ' __FLEXIBLE_SIZE(*Size, %s, %s, %d); // From %s Line %s Value %s \n' % (Pcd
.DatumType
, FieldName
.strip("."), ArrayIndex
+ 1, Pcd
.PcdFieldValueFromFdf
[FieldName_ori
][1], Pcd
.PcdFieldValueFromFdf
[FieldName_ori
][2], Pcd
.PcdFieldValueFromFdf
[FieldName_ori
][0])
1872 if Pcd
.PcdFieldValueFromComm
:
1873 CApp
= CApp
+ "// From Command Line \n"
1874 for FieldName
in Pcd
.PcdFieldValueFromComm
:
1875 FieldName
= "." + FieldName
1876 IsArray
= _IsFieldValueAnArray(Pcd
.PcdFieldValueFromComm
[FieldName
.strip(".")][0])
1877 if IsArray
and not (Pcd
.PcdFieldValueFromComm
[FieldName
.strip(".")][0].startswith('{GUID') and Pcd
.PcdFieldValueFromComm
[FieldName
.strip(".")][0].endswith('}')):
1879 Value
= ValueExpressionEx(Pcd
.PcdFieldValueFromComm
[FieldName
.strip(".")][0], TAB_VOID
, self
._GuidDict
)(True)
1880 except BadExpression
:
1881 EdkLogger
.error('Build', FORMAT_INVALID
, "Invalid value format for %s. From %s Line %d " %
1882 (".".join((Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
, FieldName
.strip('.'))), Pcd
.PcdFieldValueFromComm
[FieldName
.strip(".")][1], Pcd
.PcdFieldValueFromComm
[FieldName
.strip(".")][2]))
1883 Value
, ValueSize
= ParseFieldValue(Value
)
1885 CApp
= CApp
+ ' __FLEXIBLE_SIZE(*Size, %s, %s, %d / __ARRAY_ELEMENT_SIZE(%s, %s) + ((%d %% __ARRAY_ELEMENT_SIZE(%s, %s)) ? 1 : 0)); // From %s Line %d Value %s\n' % (Pcd
.DatumType
, FieldName
.strip("."), ValueSize
, Pcd
.DatumType
, FieldName
.strip("."), ValueSize
, Pcd
.DatumType
, FieldName
.strip("."), Pcd
.PcdFieldValueFromComm
[FieldName
.strip(".")][1], Pcd
.PcdFieldValueFromComm
[FieldName
.strip(".")][2], Pcd
.PcdFieldValueFromComm
[FieldName
.strip(".")][0]);
1888 FieldName_ori
= FieldName
.strip('.')
1889 while '[' in FieldName
:
1890 NewFieldName
= NewFieldName
+ FieldName
.split('[', 1)[0] + '[0]'
1891 ArrayIndex
= int(FieldName
.split('[', 1)[1].split(']', 1)[0])
1892 FieldName
= FieldName
.split(']', 1)[1]
1893 FieldName
= NewFieldName
+ FieldName
1894 while '[' in FieldName
and not Pcd
.IsArray
:
1895 FieldName
= FieldName
.rsplit('[', 1)[0]
1896 CApp
= CApp
+ ' __FLEXIBLE_SIZE(*Size, %s, %s, %d); // From %s Line %d Value %s \n' % (Pcd
.DatumType
, FieldName
.strip("."), ArrayIndex
+ 1, Pcd
.PcdFieldValueFromComm
[FieldName_ori
][1], Pcd
.PcdFieldValueFromComm
[FieldName_ori
][2], Pcd
.PcdFieldValueFromComm
[FieldName_ori
][0])
1897 if Pcd
.GetPcdMaxSize():
1898 CApp
= CApp
+ " *Size = (%d > *Size ? %d : *Size); // The Pcd maxsize is %d \n" % (Pcd
.GetPcdMaxSize(), Pcd
.GetPcdMaxSize(), Pcd
.GetPcdMaxSize())
1903 def GenerateSizeStatments(Pcd
,skuname
,defaultstorename
):
1905 r_datatype
= [Pcd
.BaseDatumType
]
1906 lastoneisEmpty
= False
1907 for dem
in Pcd
.Capacity
:
1909 EdkLogger
.error('Build', FORMAT_INVALID
, "Invalid value format for %s. " %
1910 (".".join((Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
))))
1911 if dem
== '0' or dem
== "-1":
1912 r_datatype
.append("[1]")
1913 lastoneisEmpty
= True
1915 r_datatype
.append("[" + dem
+ "]")
1917 if Pcd
.Type
in [MODEL_PCD_DYNAMIC_EX_HII
, MODEL_PCD_DYNAMIC_HII
]:
1918 PcdDefValue
= Pcd
.SkuInfoList
.get(skuname
).DefaultStoreDict
.get(defaultstorename
)
1919 elif Pcd
.Type
in [MODEL_PCD_DYNAMIC_EX_DEFAULT
,MODEL_PCD_DYNAMIC_VPD
,MODEL_PCD_DYNAMIC_DEFAULT
,MODEL_PCD_DYNAMIC_EX_VPD
]:
1920 PcdDefValue
= Pcd
.SkuInfoList
.get(skuname
).DefaultValue
1922 PcdDefValue
= Pcd
.DefaultValue
1924 if "{CODE(" not in PcdDefValue
:
1925 sizebasevalue_plus
= "(%s / sizeof(%s) + 1)" % ((DscBuildData
.GetStructurePcdMaxSize(Pcd
), Pcd
.BaseDatumType
))
1926 sizebasevalue
= "(%s / sizeof(%s))" % ((DscBuildData
.GetStructurePcdMaxSize(Pcd
), Pcd
.BaseDatumType
))
1927 sizeof
= "sizeof(%s)" % Pcd
.BaseDatumType
1928 CApp
= ' int ArraySize = %s %% %s ? %s : %s ;\n' % ( (DscBuildData
.GetStructurePcdMaxSize(Pcd
), sizeof
, sizebasevalue_plus
, sizebasevalue
))
1929 CApp
+= ' Size = ArraySize * sizeof(%s); \n' % Pcd
.BaseDatumType
1931 CApp
= " Size = 0;\n"
1933 CApp
= ' Size = sizeof(%s);\n' % ("".join(r_datatype
) )
1935 CApp
= ' Size = sizeof(%s);\n' % (Pcd
.DatumType
)
1936 CApp
= CApp
+ ' Cal_%s_%s_Size(&Size);\n' % (Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
)
1939 def GetIndicator(self
,index
,FieldName
,Pcd
):
1940 def cleanupindex(indexstr
):
1941 return indexstr
.strip("[").strip("]").strip()
1942 index_elements
= ArrayIndex
.findall(index
)
1943 pcd_capacity
= Pcd
.Capacity
1946 if len(pcd_capacity
)>2:
1947 for i
in range(0,len(index_elements
)):
1948 index_ele
= index_elements
[i
]
1949 index_num
= index_ele
.strip("[").strip("]").strip()
1950 if i
== len(index_elements
) -2:
1951 indicator
+= "+ %d*Size/sizeof(%s)/%d + %s)" %(int(cleanupindex(index_elements
[i
+1])),Pcd
.BaseDatumType
,reduce(lambda x
,y
: int(x
)*int(y
),pcd_capacity
[:-1]), cleanupindex(index_elements
[i
]))
1954 indicator
+= " + %d*%s*Size/sizeof(%s)/%d" %(int(cleanupindex(index_elements
[i
])),reduce(lambda x
,y
: int(x
)*int(y
),pcd_capacity
[i
+1:-1]),Pcd
.BaseDatumType
,reduce(lambda x
,y
: int(x
)*int(y
),pcd_capacity
[:-1]))
1955 elif len(pcd_capacity
) == 2:
1956 indicator
+= "+ %d*Size/sizeof(%s)/%d + %s)" %(int(cleanupindex(index_elements
[0])),Pcd
.BaseDatumType
,int(pcd_capacity
[0]), index_elements
[1].strip("[").strip("]").strip())
1957 elif len(pcd_capacity
) == 1:
1958 index_ele
= index_elements
[0]
1959 index_num
= index_ele
.strip("[").strip("]").strip()
1960 indicator
+= " + %s)" % (index_num
)
1964 indicator
+= "->" + FieldName
1967 def GetStarNum(self
,Pcd
):
1968 if not Pcd
.IsArray():
1970 elif Pcd
.IsSimpleTypeArray():
1971 return len(Pcd
.Capacity
)
1973 return len(Pcd
.Capacity
) + 1
1974 def GenerateDefaultValueAssignFunction(self
, Pcd
):
1975 CApp
= "// Default value in Dec \n"
1976 CApp
= CApp
+ "void Assign_%s_%s_Default_Value(%s *Pcd){\n" % (Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
, Pcd
.BaseDatumType
)
1977 CApp
= CApp
+ ' UINT32 FieldSize;\n'
1978 CApp
= CApp
+ ' CHAR8 *Value;\n'
1979 DefaultValueFromDec
= Pcd
.DefaultValueFromDec
1980 IsArray
= _IsFieldValueAnArray(Pcd
.DefaultValueFromDec
)
1983 DefaultValueFromDec
= ValueExpressionEx(Pcd
.DefaultValueFromDec
, TAB_VOID
)(True)
1984 except BadExpression
:
1985 EdkLogger
.error("Build", FORMAT_INVALID
, "Invalid value format for %s.%s, from DEC: %s" %
1986 (Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
, DefaultValueFromDec
))
1987 DefaultValueFromDec
= StringToArray(DefaultValueFromDec
)
1988 Value
, ValueSize
= ParseFieldValue (DefaultValueFromDec
)
1991 # Use memcpy() to copy value into field
1993 if "{CODE(" in Pcd
.DefaultValueFromDec
:
1994 CApp
= CApp
+ ' memcpy (Pcd, %s_%s_INIT_Value, sizeof(%s_%s_INIT_Value));\n' % (Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
,Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
)
1996 CApp
= CApp
+ ' Value = %s; // From DEC Default Value %s\n' % (DscBuildData
.IntToCString(Value
, ValueSize
), Pcd
.DefaultValueFromDec
)
1997 CApp
= CApp
+ ' memcpy (Pcd, Value, %d);\n' % (ValueSize
)
1998 elif isinstance(Value
, str):
1999 CApp
= CApp
+ ' Pcd = %s; // From DEC Default Value %s\n' % (Value
, Pcd
.DefaultValueFromDec
)
2000 for index
in Pcd
.DefaultValues
:
2001 FieldList
= Pcd
.DefaultValues
[index
]
2004 for FieldName
in FieldList
:
2005 IsArray
= _IsFieldValueAnArray(FieldList
[FieldName
][0])
2008 FieldList
[FieldName
][0] = ValueExpressionEx(FieldList
[FieldName
][0], TAB_VOID
, self
._GuidDict
)(True)
2009 except BadExpression
:
2010 EdkLogger
.error('Build', FORMAT_INVALID
, "Invalid value format for %s. From %s Line %d " %
2011 (".".join((Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
, FieldName
)), FieldList
[FieldName
][1], FieldList
[FieldName
][2]))
2014 Value
, ValueSize
= ParseFieldValue (FieldList
[FieldName
][0])
2016 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]))
2018 indicator
= self
.GetIndicator(index
, FieldName
,Pcd
)
2021 # Use memcpy() to copy value into field
2023 CApp
= CApp
+ ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd
.BaseDatumType
, FieldName
)
2024 CApp
= CApp
+ ' Value = %s; // From %s Line %d Value %s\n' % (DscBuildData
.IntToCString(Value
, ValueSize
), FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
2025 CApp
= CApp
+ ' __STATIC_ASSERT((__FIELD_SIZE(%s, %s) >= %d) || (__FIELD_SIZE(%s, %s) == 0), "Input buffer exceeds the buffer array"); // From %s Line %d Value %s\n' % (Pcd
.BaseDatumType
, FieldName
, ValueSize
, Pcd
.BaseDatumType
, FieldName
, FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
2026 CApp
= CApp
+ ' memcpy (&%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (indicator
, ValueSize
, ValueSize
)
2027 elif isinstance(Value
, str):
2028 CApp
= CApp
+ ' %s = %s; // From %s Line %d Value %s\n' % (indicator
, Value
, FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
2030 if '[' in FieldName
and ']' in FieldName
:
2031 Index
= int(FieldName
.split('[')[1].split(']')[0])
2032 CApp
= CApp
+ ' __STATIC_ASSERT((%d < __ARRAY_SIZE(Pcd->%s)) || (__ARRAY_SIZE(Pcd->%s) == 0), "array index exceeds the array number"); // From %s Line %d Index of %s\n' % (Index
, FieldName
.split('[')[0], FieldName
.split('[')[0], FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldName
)
2034 CApp
= CApp
+ ' %s = %dULL; // From %s Line %d Value %s\n' % (indicator
, Value
, FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
2036 CApp
= CApp
+ ' %s = %d; // From %s Line %d Value %s\n' % (indicator
, Value
, FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
2041 def GenerateDefaultValueAssignStatement(Pcd
):
2042 CApp
= ' Assign_%s_%s_Default_Value(Pcd);\n' % (Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
)
2045 def GetPcdDscRawDefaultValue(self
,Pcd
, SkuName
,DefaultStoreName
):
2046 if Pcd
.Type
in PCD_DYNAMIC_TYPE_SET
or Pcd
.Type
in PCD_DYNAMIC_EX_TYPE_SET
:
2047 if (SkuName
, DefaultStoreName
) == (TAB_DEFAULT
, TAB_DEFAULT_STORES_DEFAULT
):
2048 pcddefaultvalue
= Pcd
.DefaultFromDSC
.get(TAB_DEFAULT
, {}).get(TAB_DEFAULT_STORES_DEFAULT
) if Pcd
.DefaultFromDSC
else None
2050 pcddefaultvalue
= Pcd
.DscRawValue
.get(SkuName
, {}).get(DefaultStoreName
)
2052 pcddefaultvalue
= Pcd
.DscRawValue
.get(SkuName
, {}).get(TAB_DEFAULT_STORES_DEFAULT
)
2054 return pcddefaultvalue
2055 def GenerateInitValueFunction(self
, Pcd
, SkuName
, DefaultStoreName
):
2056 CApp
= "// Value in Dsc for Sku: %s, DefaultStore %s\n" % (SkuName
, DefaultStoreName
)
2057 CApp
= CApp
+ "void Assign_%s_%s_%s_%s_Value(%s *Pcd){\n" % (Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
, SkuName
, DefaultStoreName
, Pcd
.BaseDatumType
)
2058 CApp
= CApp
+ ' UINT32 FieldSize;\n'
2059 CApp
= CApp
+ ' CHAR8 *Value;\n'
2061 CApp
= CApp
+ "// SkuName: %s, DefaultStoreName: %s \n" % (TAB_DEFAULT
, TAB_DEFAULT_STORES_DEFAULT
)
2062 inherit_OverrideValues
= Pcd
.SkuOverrideValues
[SkuName
]
2064 pcddefaultvalue
= self
.GetPcdDscRawDefaultValue(Pcd
, SkuName
, DefaultStoreName
)
2066 FieldList
= pcddefaultvalue
2067 IsArray
= _IsFieldValueAnArray(FieldList
)
2069 if "{CODE(" not in FieldList
:
2071 FieldList
= ValueExpressionEx(FieldList
, TAB_VOID
)(True)
2072 except BadExpression
:
2073 EdkLogger
.error("Build", FORMAT_INVALID
, "Invalid value format for %s.%s, from DSC: %s" %
2074 (Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
, FieldList
))
2075 Value
, ValueSize
= ParseFieldValue (FieldList
)
2077 if (SkuName
, DefaultStoreName
) == (TAB_DEFAULT
, TAB_DEFAULT_STORES_DEFAULT
):
2078 if isinstance(Value
, str):
2079 if "{CODE(" in Value
:
2080 CApp
= CApp
+ ' memcpy (Pcd, %s_%s_%s_%s_Value, sizeof(%s_%s_%s_%s_Value));\n' % (Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
,SkuName
, DefaultStoreName
,Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
,SkuName
, DefaultStoreName
)
2082 CApp
= CApp
+ ' Pcd = %s; // From DSC Default Value %s\n' % (Value
, Pcd
.DefaultFromDSC
.get(TAB_DEFAULT
, {}).get(TAB_DEFAULT_STORES_DEFAULT
, Pcd
.DefaultValue
) if Pcd
.DefaultFromDSC
else Pcd
.DefaultValue
)
2085 # Use memcpy() to copy value into field
2087 if Pcd
.IsArray() and "{CODE(" in pcddefaultvalue
:
2088 CApp
= CApp
+ ' memcpy (Pcd, %s_%s_%s_%s_Value, sizeof(%s_%s_%s_%s_Value));\n' % (Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
,SkuName
, DefaultStoreName
,Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
,SkuName
, DefaultStoreName
)
2090 CApp
= CApp
+ ' Value = %s; // From DSC Default Value %s\n' % (DscBuildData
.IntToCString(Value
, ValueSize
), Pcd
.DefaultFromDSC
.get(TAB_DEFAULT
, {}).get(TAB_DEFAULT_STORES_DEFAULT
, Pcd
.DefaultValue
) if Pcd
.DefaultFromDSC
else Pcd
.DefaultValue
)
2091 CApp
= CApp
+ ' memcpy (Pcd, Value, %d);\n' % (ValueSize
)
2093 if isinstance(Value
, str):
2094 if "{CODE(" in Value
:
2095 CApp
= CApp
+ ' memcpy (Pcd, %s_%s_%s_%s_Value, sizeof(%s_%s_%s_%s_Value));\n' % (Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
,SkuName
, DefaultStoreName
,Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
,SkuName
, DefaultStoreName
)
2097 CApp
= CApp
+ ' Pcd = %s; // From DSC Default Value %s\n' % (Value
, Pcd
.DscRawValue
.get(SkuName
, {}).get(DefaultStoreName
))
2100 # Use memcpy() to copy value into field
2102 if Pcd
.IsArray() and "{CODE(" in pcddefaultvalue
:
2103 CApp
= CApp
+ ' memcpy (Pcd, %s_%s_%s_%s_Value, sizeof(%s_%s_%s_%s_Value));\n' % (Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
,SkuName
, DefaultStoreName
,Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
,SkuName
, DefaultStoreName
)
2105 CApp
= CApp
+ ' Value = %s; // From DSC Default Value %s\n' % (DscBuildData
.IntToCString(Value
, ValueSize
), Pcd
.DscRawValue
.get(SkuName
, {}).get(DefaultStoreName
))
2106 CApp
= CApp
+ ' memcpy (Pcd, Value, %d);\n' % (ValueSize
)
2108 inheritvalue
= inherit_OverrideValues
.get(DefaultStoreName
)
2109 if not inheritvalue
:
2111 for index
in inheritvalue
:
2112 FieldList
= inheritvalue
[index
]
2115 if (SkuName
, DefaultStoreName
) == (TAB_DEFAULT
, TAB_DEFAULT_STORES_DEFAULT
) or (( (SkuName
, '') not in Pcd
.ValueChain
) and ( (SkuName
, DefaultStoreName
) not in Pcd
.ValueChain
)):
2116 for FieldName
in FieldList
:
2117 indicator
= self
.GetIndicator(index
, FieldName
,Pcd
)
2118 IsArray
= _IsFieldValueAnArray(FieldList
[FieldName
][0])
2121 FieldList
[FieldName
][0] = ValueExpressionEx(FieldList
[FieldName
][0], TAB_VOID
, self
._GuidDict
)(True)
2122 except BadExpression
:
2123 EdkLogger
.error('Build', FORMAT_INVALID
, "Invalid value format for %s. From %s Line %d " %
2124 (".".join((Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
, FieldName
)), FieldList
[FieldName
][1], FieldList
[FieldName
][2]))
2126 Value
, ValueSize
= ParseFieldValue (FieldList
[FieldName
][0])
2128 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]))
2129 if isinstance(Value
, str):
2130 CApp
= CApp
+ ' Pcd->%s = %s; // From %s Line %d Value %s\n' % (FieldName
, Value
, FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
2133 # Use memcpy() to copy value into field
2135 CApp
= CApp
+ ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd
.BaseDatumType
, FieldName
)
2136 CApp
= CApp
+ ' Value = %s; // From %s Line %d Value %s\n' % (DscBuildData
.IntToCString(Value
, ValueSize
), FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
2137 CApp
= CApp
+ ' __STATIC_ASSERT((__FIELD_SIZE(%s, %s) >= %d) || (__FIELD_SIZE(%s, %s) == 0), "Input buffer exceeds the buffer array"); // From %s Line %d Value %s\n' % (Pcd
.BaseDatumType
, FieldName
, ValueSize
, Pcd
.BaseDatumType
, FieldName
, FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
2138 CApp
= CApp
+ ' memcpy (&%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (indicator
, ValueSize
, ValueSize
)
2140 if '[' in FieldName
and ']' in FieldName
:
2141 Index
= int(FieldName
.split('[')[1].split(']')[0])
2142 CApp
= CApp
+ ' __STATIC_ASSERT((%d < __ARRAY_SIZE(Pcd->%s)) || (__ARRAY_SIZE(Pcd->%s) == 0), "array index exceeds the array number"); // From %s Line %d Index of %s\n' % (Index
, FieldName
.split('[')[0], FieldName
.split('[')[0], FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldName
)
2144 CApp
= CApp
+ ' %s = %dULL; // From %s Line %d Value %s\n' % (indicator
, Value
, FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
2146 CApp
= CApp
+ ' %s = %d; // From %s Line %d Value %s\n' % (indicator
, Value
, FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
2151 def GenerateInitValueStatement(Pcd
, SkuName
, DefaultStoreName
):
2152 CApp
= ' Assign_%s_%s_%s_%s_Value(Pcd);\n' % (Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
, SkuName
, DefaultStoreName
)
2155 def GenerateCommandLineValue(self
, Pcd
):
2156 CApp
= "// Value in CommandLine\n"
2157 CApp
= CApp
+ "void Assign_%s_%s_CommandLine_Value(%s *Pcd){\n" % (Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
, Pcd
.BaseDatumType
)
2158 CApp
= CApp
+ ' UINT32 FieldSize;\n'
2159 CApp
= CApp
+ ' CHAR8 *Value;\n'
2161 pcddefaultvalue
= Pcd
.PcdValueFromComm
2162 for FieldList
in [pcddefaultvalue
, Pcd
.PcdFieldValueFromComm
]:
2165 if pcddefaultvalue
and FieldList
== pcddefaultvalue
:
2166 IsArray
= _IsFieldValueAnArray(FieldList
)
2169 FieldList
= ValueExpressionEx(FieldList
, TAB_VOID
)(True)
2170 except BadExpression
:
2171 EdkLogger
.error("Build", FORMAT_INVALID
, "Invalid value format for %s.%s, from Command: %s" %
2172 (Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
, FieldList
))
2173 Value
, ValueSize
= ParseFieldValue (FieldList
)
2175 if isinstance(Value
, str):
2176 CApp
= CApp
+ ' Pcd = %s; // From Command Line \n' % (Value
)
2179 # Use memcpy() to copy value into field
2181 CApp
= CApp
+ ' Value = %s; // From Command Line.\n' % (DscBuildData
.IntToCString(Value
, ValueSize
))
2182 CApp
= CApp
+ ' memcpy (Pcd, Value, %d);\n' % (ValueSize
)
2184 for FieldName
in FieldList
:
2185 IsArray
= _IsFieldValueAnArray(FieldList
[FieldName
][0])
2188 FieldList
[FieldName
][0] = ValueExpressionEx(FieldList
[FieldName
][0], TAB_VOID
, self
._GuidDict
)(True)
2189 except BadExpression
:
2190 EdkLogger
.error('Build', FORMAT_INVALID
, "Invalid value format for %s. From %s Line %d " %
2191 (".".join((Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
, FieldName
)), FieldList
[FieldName
][1], FieldList
[FieldName
][2]))
2195 Value
, ValueSize
= ParseFieldValue (FieldList
[FieldName
][0])
2197 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]))
2198 if isinstance(Value
, str):
2199 CApp
= CApp
+ ' Pcd->%s = %s; // From %s Line %d Value %s\n' % (FieldName
, Value
, FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
2202 # Use memcpy() to copy value into field
2204 CApp
= CApp
+ ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd
.BaseDatumType
, FieldName
)
2205 CApp
= CApp
+ ' Value = %s; // From %s Line %d Value %s\n' % (DscBuildData
.IntToCString(Value
, ValueSize
), FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
2206 CApp
= CApp
+ ' __STATIC_ASSERT((__FIELD_SIZE(%s, %s) >= %d) || (__FIELD_SIZE(%s, %s) == 0), "Input buffer exceeds the buffer array"); // From %s Line %d Value %s\n' % (Pcd
.BaseDatumType
, FieldName
, ValueSize
, Pcd
.BaseDatumType
, FieldName
, FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
2207 CApp
= CApp
+ ' memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName
, ValueSize
, ValueSize
)
2209 if '[' in FieldName
and ']' in FieldName
:
2210 Index
= int(FieldName
.split('[')[1].split(']')[0])
2211 CApp
= CApp
+ ' __STATIC_ASSERT((%d < __ARRAY_SIZE(Pcd->%s)) || (__ARRAY_SIZE(Pcd->%s) == 0), "array index exceeds the array number"); // From %s Line %d Index of %s\n' % (Index
, FieldName
.split('[')[0], FieldName
.split('[')[0], FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldName
)
2213 CApp
= CApp
+ ' Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName
, Value
, FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
2215 CApp
= CApp
+ ' Pcd->%s = %d; // From %s Line %d Value %s\n' % (FieldName
, Value
, FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
2220 def GenerateCommandLineValueStatement(Pcd
):
2221 CApp
= ' Assign_%s_%s_CommandLine_Value(Pcd);\n' % (Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
)
2223 def GenerateFdfValue(self
,Pcd
):
2224 CApp
= "// Value in Fdf\n"
2225 CApp
= CApp
+ "void Assign_%s_%s_Fdf_Value(%s *Pcd){\n" % (Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
,Pcd
.BaseDatumType
)
2226 CApp
= CApp
+ ' UINT32 FieldSize;\n'
2227 CApp
= CApp
+ ' CHAR8 *Value;\n'
2229 pcddefaultvalue
= Pcd
.PcdValueFromFdf
2230 for FieldList
in [pcddefaultvalue
,Pcd
.PcdFieldValueFromFdf
]:
2233 if pcddefaultvalue
and FieldList
== pcddefaultvalue
:
2234 IsArray
= _IsFieldValueAnArray(FieldList
)
2237 FieldList
= ValueExpressionEx(FieldList
, TAB_VOID
)(True)
2238 except BadExpression
:
2239 EdkLogger
.error("Build", FORMAT_INVALID
, "Invalid value format for %s.%s, from Fdf: %s" %
2240 (Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
, FieldList
))
2241 Value
, ValueSize
= ParseFieldValue (FieldList
)
2243 if isinstance(Value
, str):
2244 CApp
= CApp
+ ' Pcd = %s; // From Fdf \n' % (Value
)
2247 # Use memcpy() to copy value into field
2249 CApp
= CApp
+ ' Value = %s; // From Fdf .\n' % (DscBuildData
.IntToCString(Value
, ValueSize
))
2250 CApp
= CApp
+ ' memcpy (Pcd, Value, %d);\n' % (ValueSize
)
2252 for FieldName
in FieldList
:
2253 IsArray
= _IsFieldValueAnArray(FieldList
[FieldName
][0])
2256 FieldList
[FieldName
][0] = ValueExpressionEx(FieldList
[FieldName
][0], TAB_VOID
, self
._GuidDict
)(True)
2257 except BadExpression
:
2258 EdkLogger
.error('Build', FORMAT_INVALID
, "Invalid value format for %s. From %s Line %d " %
2259 (".".join((Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
, FieldName
)), FieldList
[FieldName
][1], FieldList
[FieldName
][2]))
2263 Value
, ValueSize
= ParseFieldValue (FieldList
[FieldName
][0])
2265 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]))
2266 if isinstance(Value
, str):
2267 CApp
= CApp
+ ' Pcd->%s = %s; // From %s Line %d Value %s\n' % (FieldName
, Value
, FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
2270 # Use memcpy() to copy value into field
2272 CApp
= CApp
+ ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd
.BaseDatumType
, FieldName
)
2273 CApp
= CApp
+ ' Value = %s; // From %s Line %d Value %s\n' % (DscBuildData
.IntToCString(Value
, ValueSize
), FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
2274 CApp
= CApp
+ ' __STATIC_ASSERT((__FIELD_SIZE(%s, %s) >= %d) || (__FIELD_SIZE(%s, %s) == 0), "Input buffer exceeds the buffer array"); // From %s Line %d Value %s\n' % (Pcd
.BaseDatumType
, FieldName
, ValueSize
, Pcd
.BaseDatumType
, FieldName
, FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
2275 CApp
= CApp
+ ' memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName
, ValueSize
, ValueSize
)
2277 if '[' in FieldName
and ']' in FieldName
:
2278 Index
= int(FieldName
.split('[')[1].split(']')[0])
2279 CApp
= CApp
+ ' __STATIC_ASSERT((%d < __ARRAY_SIZE(Pcd->%s)) || (__ARRAY_SIZE(Pcd->%s) == 0), "array index exceeds the array number"); // From %s Line %d Index of %s\n' % (Index
, FieldName
.split('[')[0], FieldName
.split('[')[0], FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldName
)
2281 CApp
= CApp
+ ' Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName
, Value
, FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
2283 CApp
= CApp
+ ' Pcd->%s = %d; // From %s Line %s Value %s\n' % (FieldName
, Value
, FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
2288 def GenerateFdfValueStatement(Pcd
):
2289 CApp
= ' Assign_%s_%s_Fdf_Value(Pcd);\n' % (Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
)
2292 def GenerateInitializeFunc(self
, SkuName
, DefaultStore
, Pcd
, InitByteValue
, CApp
):
2293 OverrideValues
= {DefaultStore
:{}}
2294 if Pcd
.SkuOverrideValues
:
2295 OverrideValues
= Pcd
.SkuOverrideValues
[SkuName
]
2296 if not OverrideValues
:
2297 OverrideValues
= {TAB_DEFAULT_STORES_DEFAULT
:Pcd
.DefaultValues
}
2298 for DefaultStoreName
in OverrideValues
:
2299 CApp
= CApp
+ 'void\n'
2300 CApp
= CApp
+ 'Initialize_%s_%s_%s_%s(\n' % (SkuName
, DefaultStoreName
, Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
)
2301 CApp
= CApp
+ ' void\n'
2302 CApp
= CApp
+ ' )\n'
2304 CApp
= CApp
+ ' UINT32 Size;\n'
2305 CApp
= CApp
+ ' UINT32 FieldSize;\n'
2306 CApp
= CApp
+ ' CHAR8 *Value;\n'
2307 CApp
= CApp
+ ' UINT32 OriginalSize;\n'
2308 CApp
= CApp
+ ' VOID *OriginalPcd;\n'
2310 CApp
= CApp
+ ' %s *Pcd; // From %s Line %d \n' % (Pcd
.BaseDatumType
,Pcd
.PkgPath
, Pcd
.PcdDefineLineNo
)
2314 PcdDefaultValue
= StringToArray(Pcd
.DefaultValueFromDec
.strip())
2316 InitByteValue
+= '%s.%s.%s.%s|%s|%s\n' % (SkuName
, DefaultStoreName
, Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
, Pcd
.DatumType
, PcdDefaultValue
)
2319 # Get current PCD value and size
2321 CApp
= CApp
+ ' OriginalPcd = PcdGetPtr (%s, %s, %s, %s, &OriginalSize);\n' % (SkuName
, DefaultStoreName
, Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
)
2324 # Determine the size of the PCD. For simple structures, sizeof(TYPE) provides
2325 # the correct value. For structures with a flexible array member, the flexible
2326 # array member is detected, and the size is based on the highest index used with
2327 # the flexible array member. The flexible array member must be the last field
2328 # in a structure. The size formula for this case is:
2329 # OFFSET_OF(FlexbleArrayField) + sizeof(FlexibleArray[0]) * (HighestIndex + 1)
2331 CApp
= CApp
+ DscBuildData
.GenerateSizeStatments(Pcd
,SkuName
,DefaultStoreName
)
2334 # Allocate and zero buffer for the PCD
2335 # Must handle cases where current value is smaller, larger, or same size
2336 # Always keep that larger one as the current size
2338 CApp
= CApp
+ ' Size = (OriginalSize > Size ? OriginalSize : Size);\n'
2339 CApp
= CApp
+ ' Pcd = (%s *)malloc (Size);\n' % (Pcd
.BaseDatumType
,)
2340 CApp
= CApp
+ ' memset (Pcd, 0, Size);\n'
2343 # Copy current PCD value into allocated buffer.
2345 CApp
= CApp
+ ' memcpy (Pcd, OriginalPcd, OriginalSize);\n'
2348 # Assign field values in PCD
2350 CApp
= CApp
+ DscBuildData
.GenerateDefaultValueAssignStatement(Pcd
)
2351 if Pcd
.Type
not in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_FIXED_AT_BUILD
],
2352 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_PATCHABLE_IN_MODULE
]]:
2353 for skuname
in self
.SkuIdMgr
.GetSkuChain(SkuName
):
2354 storeset
= [DefaultStoreName
] if DefaultStoreName
== TAB_DEFAULT_STORES_DEFAULT
else [TAB_DEFAULT_STORES_DEFAULT
, DefaultStoreName
]
2355 for defaultstorenameitem
in storeset
:
2356 CApp
= CApp
+ "// SkuName: %s, DefaultStoreName: %s \n" % (skuname
, defaultstorenameitem
)
2357 CApp
= CApp
+ DscBuildData
.GenerateInitValueStatement(Pcd
, skuname
, defaultstorenameitem
)
2358 if skuname
== SkuName
:
2361 CApp
= CApp
+ "// SkuName: %s, DefaultStoreName: STANDARD \n" % self
.SkuIdMgr
.SystemSkuId
2362 CApp
= CApp
+ DscBuildData
.GenerateInitValueStatement(Pcd
, self
.SkuIdMgr
.SystemSkuId
, TAB_DEFAULT_STORES_DEFAULT
)
2363 CApp
= CApp
+ DscBuildData
.GenerateFdfValueStatement(Pcd
)
2364 CApp
= CApp
+ DscBuildData
.GenerateCommandLineValueStatement(Pcd
)
2366 # Set new PCD value and size
2368 CApp
= CApp
+ ' PcdSetPtr (%s, %s, %s, %s, Size, (void *)Pcd);\n' % (SkuName
, DefaultStoreName
, Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
)
2373 CApp
= CApp
+ ' free (Pcd);\n'
2376 return InitByteValue
, CApp
2378 def GenerateArrayAssignment(self
, Pcd
):
2382 if not Pcd
.IsArray():
2385 for d
in Pcd
.Capacity
:
2388 Value
= Pcd
.DefaultValueFromDec
2389 if "{CODE(" in Pcd
.DefaultValueFromDec
:
2390 realvalue
= Pcd
.DefaultValueFromDec
.strip()[6:-2] # "{CODE(").rstrip(")}"
2391 CApp
+= "static %s %s_%s_INIT_Value%s = %s;\n" % (Pcd
.BaseDatumType
,Pcd
.TokenSpaceGuidCName
,Pcd
.TokenCName
,Demesion
,realvalue
)
2393 if Pcd
.Type
in PCD_DYNAMIC_TYPE_SET | PCD_DYNAMIC_EX_TYPE_SET
:
2394 for skuname
in Pcd
.SkuInfoList
:
2395 skuinfo
= Pcd
.SkuInfoList
[skuname
]
2396 if skuinfo
.VariableName
:
2397 for defaultstore
in skuinfo
.DefaultStoreDict
:
2398 pcddscrawdefaultvalue
= self
.GetPcdDscRawDefaultValue(Pcd
, skuname
, defaultstore
)
2399 if pcddscrawdefaultvalue
:
2400 Value
= skuinfo
[defaultstore
]
2401 if "{CODE(" in Value
:
2402 realvalue
= Value
.strip()[6:-2] # "{CODE(").rstrip(")}"
2403 CApp
+= "static %s %s_%s_%s_%s_Value%s = %s;\n" % (Pcd
.BaseDatumType
,Pcd
.TokenSpaceGuidCName
,Pcd
.TokenCName
,skuname
,defaultstore
,Demesion
,realvalue
)
2405 pcddscrawdefaultvalue
= self
.GetPcdDscRawDefaultValue(Pcd
, skuname
, TAB_DEFAULT_STORES_DEFAULT
)
2406 if pcddscrawdefaultvalue
:
2407 Value
= skuinfo
.DefaultValue
2408 if "{CODE(" in Value
:
2409 realvalue
= Value
.strip()[6:-2] # "{CODE(").rstrip(")}"
2410 CApp
+= "static %s %s_%s_%s_%s_Value%s = %s;\n" % (Pcd
.BaseDatumType
,Pcd
.TokenSpaceGuidCName
,Pcd
.TokenCName
,skuname
,TAB_DEFAULT_STORES_DEFAULT
,Demesion
,realvalue
)
2412 pcddscrawdefaultvalue
= self
.GetPcdDscRawDefaultValue(Pcd
, TAB_DEFAULT
, TAB_DEFAULT_STORES_DEFAULT
)
2413 if pcddscrawdefaultvalue
:
2414 if "{CODE(" in Pcd
.DefaultValue
:
2415 realvalue
= Pcd
.DefaultValue
.strip()[6:-2] # "{CODE(").rstrip(")}"
2416 CApp
+= "static %s %s_%s_DEFAULT_STANDARD_Value%s = %s;\n" % (Pcd
.BaseDatumType
,Pcd
.TokenSpaceGuidCName
,Pcd
.TokenCName
,Demesion
,realvalue
)
2420 def SkuOverrideValuesEmpty(self
,OverrideValues
):
2421 if not OverrideValues
:
2423 for key
in OverrideValues
:
2424 if OverrideValues
[key
]:
2428 def ParseCCFlags(self
, ccflag
):
2430 ccflaglist
= ccflag
.split(" ")
2432 while i
< len(ccflaglist
):
2433 item
= ccflaglist
[i
].strip()
2434 if item
in (r
"/D", r
"/U","-D","-U"):
2435 ccflags
.add(" ".join((ccflaglist
[i
],ccflaglist
[i
+1])))
2437 elif item
.startswith((r
"/D", r
"/U","-D","-U")):
2441 def GenerateByteArrayValue (self
, StructuredPcds
):
2443 # Generate/Compile/Run C application to determine if there are any flexible array members
2445 if not StructuredPcds
:
2449 CApp
= PcdMainCHeader
2451 IncludeFiles
= set()
2452 for PcdName
in StructuredPcds
:
2453 Pcd
= StructuredPcds
[PcdName
]
2454 for IncludeFile
in Pcd
.StructuredPcdIncludeFile
:
2455 if IncludeFile
not in IncludeFiles
:
2456 IncludeFiles
.add(IncludeFile
)
2457 CApp
= CApp
+ '#include <%s>\n' % (IncludeFile
)
2459 for Pcd
in StructuredPcds
.values():
2460 CApp
= CApp
+ self
.GenerateArrayAssignment(Pcd
)
2461 for PcdName
in StructuredPcds
:
2462 Pcd
= StructuredPcds
[PcdName
]
2463 CApp
= CApp
+ self
.GenerateSizeFunction(Pcd
)
2464 CApp
= CApp
+ self
.GenerateDefaultValueAssignFunction(Pcd
)
2465 CApp
= CApp
+ self
.GenerateFdfValue(Pcd
)
2466 CApp
= CApp
+ self
.GenerateCommandLineValue(Pcd
)
2467 if self
.SkuOverrideValuesEmpty(Pcd
.SkuOverrideValues
) or Pcd
.Type
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_FIXED_AT_BUILD
],
2468 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_PATCHABLE_IN_MODULE
]]:
2469 CApp
= CApp
+ self
.GenerateInitValueFunction(Pcd
, self
.SkuIdMgr
.SystemSkuId
, TAB_DEFAULT_STORES_DEFAULT
)
2471 for SkuName
in self
.SkuIdMgr
.SkuOverrideOrder():
2472 if SkuName
not in Pcd
.SkuOverrideValues
:
2474 for DefaultStoreName
in Pcd
.SkuOverrideValues
[SkuName
]:
2475 CApp
= CApp
+ self
.GenerateInitValueFunction(Pcd
, SkuName
, DefaultStoreName
)
2476 if self
.SkuOverrideValuesEmpty(Pcd
.SkuOverrideValues
) or Pcd
.Type
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_FIXED_AT_BUILD
],
2477 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_PATCHABLE_IN_MODULE
]]:
2478 InitByteValue
, CApp
= self
.GenerateInitializeFunc(self
.SkuIdMgr
.SystemSkuId
, TAB_DEFAULT_STORES_DEFAULT
, Pcd
, InitByteValue
, CApp
)
2480 for SkuName
in self
.SkuIdMgr
.SkuOverrideOrder():
2481 if SkuName
not in Pcd
.SkuOverrideValues
:
2483 for DefaultStoreName
in Pcd
.DefaultStoreName
:
2484 Pcd
= StructuredPcds
[PcdName
]
2485 InitByteValue
, CApp
= self
.GenerateInitializeFunc(SkuName
, DefaultStoreName
, Pcd
, InitByteValue
, CApp
)
2487 CApp
= CApp
+ 'VOID\n'
2488 CApp
= CApp
+ 'PcdEntryPoint(\n'
2489 CApp
= CApp
+ ' VOID\n'
2490 CApp
= CApp
+ ' )\n'
2492 for Pcd
in StructuredPcds
.values():
2493 if self
.SkuOverrideValuesEmpty(Pcd
.SkuOverrideValues
) or Pcd
.Type
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_FIXED_AT_BUILD
], self
._PCD
_TYPE
_STRING
_[MODEL_PCD_PATCHABLE_IN_MODULE
]]:
2494 CApp
= CApp
+ ' Initialize_%s_%s_%s_%s();\n' % (self
.SkuIdMgr
.SystemSkuId
, TAB_DEFAULT_STORES_DEFAULT
, Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
)
2496 for SkuName
in self
.SkuIdMgr
.SkuOverrideOrder():
2497 if SkuName
not in self
.SkuIdMgr
.AvailableSkuIdSet
:
2499 for DefaultStoreName
in Pcd
.SkuOverrideValues
[SkuName
]:
2500 CApp
= CApp
+ ' Initialize_%s_%s_%s_%s();\n' % (SkuName
, DefaultStoreName
, Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
)
2503 CApp
= CApp
+ PcdMainCEntry
+ '\n'
2505 if not os
.path
.exists(self
.OutputPath
):
2506 os
.makedirs(self
.OutputPath
)
2507 CAppBaseFileName
= os
.path
.join(self
.OutputPath
, PcdValueInitName
)
2508 SaveFileOnChange(CAppBaseFileName
+ '.c', CApp
, False)
2510 MakeApp
= PcdMakefileHeader
2511 if sys
.platform
== "win32":
2512 MakeApp
= MakeApp
+ 'APPFILE = %s\%s.exe\n' % (self
.OutputPath
, PcdValueInitName
) + 'APPNAME = %s\n' % (PcdValueInitName
) + 'OBJECTS = %s\%s.obj\n' % (self
.OutputPath
, PcdValueInitName
) + 'INC = '
2514 MakeApp
= MakeApp
+ PcdGccMakefile
2515 MakeApp
= MakeApp
+ 'APPFILE = %s/%s\n' % (self
.OutputPath
, PcdValueInitName
) + 'APPNAME = %s\n' % (PcdValueInitName
) + 'OBJECTS = %s/%s.o\n' % (self
.OutputPath
, PcdValueInitName
) + \
2516 'include $(MAKEROOT)/Makefiles/app.makefile\n' + 'INCLUDE +='
2519 PlatformInc
= OrderedDict()
2520 for Cache
in self
._Bdb
._CACHE
_.values():
2521 if Cache
.MetaFile
.Ext
.lower() != '.dec':
2524 if str(Cache
.MetaFile
.Path
) not in PlatformInc
:
2525 PlatformInc
[str(Cache
.MetaFile
.Path
)] = []
2526 PlatformInc
[str(Cache
.MetaFile
.Path
)].append (os
.path
.dirname(Cache
.MetaFile
.Path
))
2527 PlatformInc
[str(Cache
.MetaFile
.Path
)].extend (Cache
.CommonIncludes
)
2530 for Pcd
in StructuredPcds
.values():
2531 for PackageDec
in Pcd
.PackageDecs
:
2532 Package
= os
.path
.normpath(mws
.join(GlobalData
.gWorkspace
, PackageDec
))
2533 if not os
.path
.exists(Package
):
2534 EdkLogger
.error('Build', RESOURCE_NOT_AVAILABLE
, "The dependent Package %s of PCD %s.%s is not exist." % (PackageDec
, Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
))
2535 if Package
not in PcdDependDEC
:
2536 PcdDependDEC
.append(Package
)
2538 if PlatformInc
and PcdDependDEC
:
2539 for pkg
in PcdDependDEC
:
2540 if pkg
in PlatformInc
:
2541 for inc
in PlatformInc
[pkg
]:
2542 MakeApp
+= '-I' + str(inc
) + ' '
2543 IncSearchList
.append(inc
)
2544 MakeApp
= MakeApp
+ '\n'
2546 CC_FLAGS
= LinuxCFLAGS
2547 if sys
.platform
== "win32":
2548 CC_FLAGS
= WindowsCFLAGS
2549 BuildOptions
= OrderedDict()
2550 for Options
in self
.BuildOptions
:
2551 if Options
[2] != EDKII_NAME
:
2554 if Family
and Family
!= self
.ToolChainFamily
:
2556 Target
, Tag
, Arch
, Tool
, Attr
= Options
[1].split("_")
2561 if Target
== TAB_STAR
or Target
== self
._Target
:
2562 if Tag
== TAB_STAR
or Tag
== self
._Toolchain
:
2563 if 'COMMON' not in BuildOptions
:
2564 BuildOptions
['COMMON'] = set()
2565 if Arch
== TAB_STAR
:
2566 BuildOptions
['COMMON']|
= self
.ParseCCFlags(self
.BuildOptions
[Options
])
2567 if Arch
in self
.SupArchList
:
2568 if Arch
not in BuildOptions
:
2569 BuildOptions
[Arch
] = set()
2570 BuildOptions
[Arch
] |
= self
.ParseCCFlags(self
.BuildOptions
[Options
])
2573 ArchBuildOptions
= {arch
:flags
for arch
,flags
in BuildOptions
.items() if arch
!= 'COMMON'}
2574 if len(ArchBuildOptions
.keys()) == 1:
2575 BuildOptions
['COMMON'] |
= (list(ArchBuildOptions
.values())[0])
2576 elif len(ArchBuildOptions
.keys()) > 1:
2577 CommonBuildOptions
= reduce(lambda x
,y
: x
&y
, ArchBuildOptions
.values())
2578 BuildOptions
['COMMON'] |
= CommonBuildOptions
2579 ValueList
= list(BuildOptions
['COMMON'])
2580 CC_FLAGS
+= " ".join(ValueList
)
2583 if sys
.platform
== "win32":
2584 MakeApp
= MakeApp
+ PcdMakefileEnd
2585 MakeApp
= MakeApp
+ AppTarget
% ("""\tcopy $(APPLICATION) $(APPFILE) /y """)
2587 MakeApp
= MakeApp
+ AppTarget
% ("""\tcp $(APPLICATION) $(APPFILE) """)
2588 MakeApp
= MakeApp
+ '\n'
2589 IncludeFileFullPaths
= []
2590 for includefile
in IncludeFiles
:
2591 for includepath
in IncSearchList
:
2592 includefullpath
= os
.path
.join(str(includepath
), includefile
)
2593 if os
.path
.exists(includefullpath
):
2594 IncludeFileFullPaths
.append(os
.path
.normpath(includefullpath
))
2597 SearchPathList
.append(os
.path
.normpath(mws
.join(GlobalData
.gWorkspace
, "BaseTools/Source/C/Include")))
2598 SearchPathList
.append(os
.path
.normpath(mws
.join(GlobalData
.gWorkspace
, "BaseTools/Source/C/Common")))
2599 SearchPathList
.extend(str(item
) for item
in IncSearchList
)
2600 IncFileList
= GetDependencyList(IncludeFileFullPaths
, SearchPathList
)
2601 for include_file
in IncFileList
:
2602 MakeApp
+= "$(OBJECTS) : %s\n" % include_file
2603 MakeFileName
= os
.path
.join(self
.OutputPath
, 'Makefile')
2604 MakeApp
+= "$(OBJECTS) : %s\n" % MakeFileName
2605 SaveFileOnChange(MakeFileName
, MakeApp
, False)
2607 InputValueFile
= os
.path
.join(self
.OutputPath
, 'Input.txt')
2608 OutputValueFile
= os
.path
.join(self
.OutputPath
, 'Output.txt')
2609 SaveFileOnChange(InputValueFile
, InitByteValue
, False)
2611 Dest_PcdValueInitExe
= PcdValueInitName
2612 if not sys
.platform
== "win32":
2613 Dest_PcdValueInitExe
= os
.path
.join(self
.OutputPath
, PcdValueInitName
)
2615 Dest_PcdValueInitExe
= os
.path
.join(self
.OutputPath
, PcdValueInitName
) +".exe"
2617 if sys
.platform
== "win32":
2618 MakeCommand
= 'nmake -f %s' % (MakeFileName
)
2619 returncode
, StdOut
, StdErr
= DscBuildData
.ExecuteCommand (MakeCommand
)
2622 MakeCommand
= 'make -f %s' % (MakeFileName
)
2623 returncode
, StdOut
, StdErr
= DscBuildData
.ExecuteCommand (MakeCommand
)
2626 Messages
= Messages
.split('\n')
2629 CAppBaseFileName
= os
.path
.join(self
.OutputPath
, PcdValueInitName
)
2630 File
= open (CAppBaseFileName
+ '.c', 'r')
2631 FileData
= File
.readlines()
2633 for Message
in Messages
:
2634 if " error" in Message
or "warning" in Message
:
2635 FileInfo
= Message
.strip().split('(')
2636 if len (FileInfo
) > 1:
2637 FileName
= FileInfo
[0]
2638 FileLine
= FileInfo
[1].split (')')[0]
2640 FileInfo
= Message
.strip().split(':')
2641 if len(FileInfo
) < 2:
2643 FileName
= FileInfo
[0]
2644 FileLine
= FileInfo
[1]
2645 if FileLine
.isdigit():
2646 error_line
= FileData
[int (FileLine
) - 1]
2647 if r
"//" in error_line
:
2648 c_line
, dsc_line
= error_line
.split(r
"//")
2650 dsc_line
= error_line
2651 message_itmes
= Message
.split(":")
2653 if "PcdValueInit.c" not in Message
:
2654 if not MessageGroup
:
2655 MessageGroup
.append(Message
)
2658 for item
in message_itmes
:
2659 if "PcdValueInit.c" in item
:
2660 Index
= message_itmes
.index(item
)
2661 message_itmes
[Index
] = dsc_line
.strip()
2663 MessageGroup
.append(":".join(message_itmes
[Index
:]).strip())
2666 MessageGroup
.append(Message
)
2668 EdkLogger
.error("build", PCD_STRUCTURE_PCD_ERROR
, "\n".join(MessageGroup
) )
2670 EdkLogger
.error('Build', COMMAND_FAILURE
, 'Can not execute command: %s' % MakeCommand
)
2672 if DscBuildData
.NeedUpdateOutput(OutputValueFile
, Dest_PcdValueInitExe
, InputValueFile
):
2673 Command
= Dest_PcdValueInitExe
+ ' -i %s -o %s' % (InputValueFile
, OutputValueFile
)
2674 returncode
, StdOut
, StdErr
= DscBuildData
.ExecuteCommand (Command
)
2676 EdkLogger
.warn('Build', COMMAND_FAILURE
, 'Can not collect output from command: %s' % Command
)
2678 File
= open (OutputValueFile
, 'r')
2679 FileBuffer
= File
.readlines()
2682 StructurePcdSet
= []
2683 for Pcd
in FileBuffer
:
2684 PcdValue
= Pcd
.split ('|')
2685 PcdInfo
= PcdValue
[0].split ('.')
2686 StructurePcdSet
.append((PcdInfo
[0], PcdInfo
[1], PcdInfo
[2], PcdInfo
[3], PcdValue
[2].strip()))
2687 return StructurePcdSet
2690 def NeedUpdateOutput(OutputFile
, ValueCFile
, StructureInput
):
2691 if not os
.path
.exists(OutputFile
):
2693 if os
.stat(OutputFile
).st_mtime
<= os
.stat(ValueCFile
).st_mtime
:
2695 if os
.stat(OutputFile
).st_mtime
<= os
.stat(StructureInput
).st_mtime
:
2699 ## Retrieve dynamic PCD settings
2701 # @param Type PCD type
2703 # @retval a dict object contains settings of given PCD type
2705 def _GetDynamicPcd(self
, Type
):
2708 Pcds
= OrderedDict()
2710 # tdict is a special dict kind of type, used for selecting correct
2711 # PCD settings for certain ARCH and SKU
2713 PcdDict
= tdict(True, 4)
2715 # Find out all possible PCD candidates for self._Arch
2716 RecordList
= self
._RawData
[Type
, self
._Arch
]
2717 AvailableSkuIdSet
= copy
.copy(self
.SkuIds
)
2720 for TokenSpaceGuid
, PcdCName
, Setting
, Arch
, SkuName
, Dummy3
, Dummy4
, Dummy5
in RecordList
:
2721 SkuName
= SkuName
.upper()
2722 SkuName
= TAB_DEFAULT
if SkuName
== TAB_COMMON
else SkuName
2723 if SkuName
not in AvailableSkuIdSet
:
2724 EdkLogger
.error('build', PARAMETER_INVALID
, 'Sku %s is not defined in [SkuIds] section' % SkuName
,
2725 File
=self
.MetaFile
, Line
=Dummy5
)
2726 if "." not in TokenSpaceGuid
and "[" not in PcdCName
:
2727 PcdList
.append((PcdCName
, TokenSpaceGuid
, SkuName
, Dummy5
))
2728 PcdDict
[Arch
, SkuName
, PcdCName
, TokenSpaceGuid
] = Setting
2730 # Remove redundant PCD candidates, per the ARCH and SKU
2731 for PcdCName
, TokenSpaceGuid
, SkuName
, Dummy4
in PcdList
:
2733 Setting
= PcdDict
[self
._Arch
, SkuName
, PcdCName
, TokenSpaceGuid
]
2737 PcdValue
, DatumType
, MaxDatumSize
= self
._ValidatePcd
(PcdCName
, TokenSpaceGuid
, Setting
, Type
, Dummy4
)
2739 if int(MaxDatumSize
, 0) > 0xFFFF:
2740 EdkLogger
.error('build', FORMAT_INVALID
, "The size value must not exceed the maximum value of 0xFFFF (UINT16) for %s." % ".".join((TokenSpaceGuid
, PcdCName
)),
2741 File
=self
.MetaFile
, Line
=Dummy4
)
2742 if int(MaxDatumSize
, 0) < 0:
2743 EdkLogger
.error('build', FORMAT_INVALID
, "The size value can't be set to negative value for %s." % ".".join((TokenSpaceGuid
, PcdCName
)),
2744 File
=self
.MetaFile
, Line
=Dummy4
)
2745 SkuInfo
= SkuInfoClass(SkuName
, self
.SkuIds
[SkuName
][0], '', '', '', '', '', PcdValue
)
2746 if (PcdCName
, TokenSpaceGuid
) in Pcds
:
2747 pcdObject
= Pcds
[PcdCName
, TokenSpaceGuid
]
2748 pcdObject
.SkuInfoList
[SkuName
] = SkuInfo
2749 if MaxDatumSize
.strip():
2750 CurrentMaxSize
= int(MaxDatumSize
.strip(), 0)
2753 if pcdObject
.MaxDatumSize
:
2754 PcdMaxSize
= int(pcdObject
.MaxDatumSize
, 0)
2757 if CurrentMaxSize
> PcdMaxSize
:
2758 pcdObject
.MaxDatumSize
= str(CurrentMaxSize
)
2760 Pcds
[PcdCName
, TokenSpaceGuid
] = PcdClassObject(
2763 self
._PCD
_TYPE
_STRING
_[Type
],
2768 OrderedDict({SkuName
: SkuInfo
}),
2773 if SkuName
not in Pcds
[PcdCName
, TokenSpaceGuid
].DscRawValue
:
2774 Pcds
[PcdCName
, TokenSpaceGuid
].DscRawValue
[SkuName
] = {}
2775 Pcds
[PcdCName
, TokenSpaceGuid
].DscRawValue
[SkuName
][TAB_DEFAULT_STORES_DEFAULT
] = PcdValue
2777 for pcd
in Pcds
.values():
2778 pcdDecObject
= self
._DecPcds
[pcd
.TokenCName
, pcd
.TokenSpaceGuidCName
]
2779 # Only fix the value while no value provided in DSC file.
2780 for sku
in pcd
.SkuInfoList
.values():
2781 if not sku
.DefaultValue
:
2782 sku
.DefaultValue
= pcdDecObject
.DefaultValue
2783 if TAB_DEFAULT
not in pcd
.SkuInfoList
and TAB_COMMON
not in pcd
.SkuInfoList
:
2784 valuefromDec
= pcdDecObject
.DefaultValue
2785 SkuInfo
= SkuInfoClass(TAB_DEFAULT
, '0', '', '', '', '', '', valuefromDec
)
2786 pcd
.SkuInfoList
[TAB_DEFAULT
] = SkuInfo
2787 elif TAB_DEFAULT
not in pcd
.SkuInfoList
and TAB_COMMON
in pcd
.SkuInfoList
:
2788 pcd
.SkuInfoList
[TAB_DEFAULT
] = pcd
.SkuInfoList
[TAB_COMMON
]
2789 del pcd
.SkuInfoList
[TAB_COMMON
]
2790 elif TAB_DEFAULT
in pcd
.SkuInfoList
and TAB_COMMON
in pcd
.SkuInfoList
:
2791 del pcd
.SkuInfoList
[TAB_COMMON
]
2793 list(map(self
.FilterSkuSettings
, Pcds
.values()))
2797 def FilterSkuSettings(self
, PcdObj
):
2799 if self
.SkuIdMgr
.SkuUsageType
== self
.SkuIdMgr
.SINGLE
:
2800 if TAB_DEFAULT
in PcdObj
.SkuInfoList
and self
.SkuIdMgr
.SystemSkuId
not in PcdObj
.SkuInfoList
:
2801 PcdObj
.SkuInfoList
[self
.SkuIdMgr
.SystemSkuId
] = PcdObj
.SkuInfoList
[TAB_DEFAULT
]
2802 PcdObj
.SkuInfoList
= {TAB_DEFAULT
:PcdObj
.SkuInfoList
[self
.SkuIdMgr
.SystemSkuId
]}
2803 PcdObj
.SkuInfoList
[TAB_DEFAULT
].SkuIdName
= TAB_DEFAULT
2804 PcdObj
.SkuInfoList
[TAB_DEFAULT
].SkuId
= '0'
2806 elif self
.SkuIdMgr
.SkuUsageType
== self
.SkuIdMgr
.DEFAULT
:
2807 PcdObj
.SkuInfoList
= {TAB_DEFAULT
:PcdObj
.SkuInfoList
[TAB_DEFAULT
]}
2812 def CompareVarAttr(Attr1
, Attr2
):
2813 if not Attr1
or not Attr2
: # for empty string
2815 Attr1s
= [attr
.strip() for attr
in Attr1
.split(",")]
2816 Attr1Set
= set(Attr1s
)
2817 Attr2s
= [attr
.strip() for attr
in Attr2
.split(",")]
2818 Attr2Set
= set(Attr2s
)
2819 if Attr2Set
== Attr1Set
:
2824 def CompletePcdValues(self
, PcdSet
):
2825 Pcds
= OrderedDict()
2826 DefaultStoreObj
= DefaultStore(self
._GetDefaultStores
())
2827 SkuIds
= {skuname
:skuid
for skuname
, skuid
in self
.SkuIdMgr
.AvailableSkuIdSet
.items() if skuname
!= TAB_COMMON
}
2828 DefaultStores
= set(storename
for pcdobj
in PcdSet
.values() for skuobj
in pcdobj
.SkuInfoList
.values() for storename
in skuobj
.DefaultStoreDict
)
2829 for PcdCName
, TokenSpaceGuid
in PcdSet
:
2830 PcdObj
= PcdSet
[(PcdCName
, TokenSpaceGuid
)]
2832 if PcdObj
.Type
not in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_DEFAULT
],
2833 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_HII
],
2834 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_VPD
],
2835 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_DEFAULT
],
2836 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_HII
],
2837 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_VPD
]]:
2838 Pcds
[PcdCName
, TokenSpaceGuid
]= PcdObj
2840 PcdType
= PcdObj
.Type
2841 if PcdType
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_HII
], self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_HII
]]:
2842 for skuid
in PcdObj
.SkuInfoList
:
2843 skuobj
= PcdObj
.SkuInfoList
[skuid
]
2844 mindefaultstorename
= DefaultStoreObj
.GetMin(set(defaultstorename
for defaultstorename
in skuobj
.DefaultStoreDict
))
2845 for defaultstorename
in DefaultStores
:
2846 if defaultstorename
not in skuobj
.DefaultStoreDict
:
2847 skuobj
.DefaultStoreDict
[defaultstorename
] = skuobj
.DefaultStoreDict
[mindefaultstorename
]
2848 skuobj
.HiiDefaultValue
= skuobj
.DefaultStoreDict
[mindefaultstorename
]
2849 for skuname
, skuid
in SkuIds
.items():
2850 if skuname
not in PcdObj
.SkuInfoList
:
2851 nextskuid
= self
.SkuIdMgr
.GetNextSkuId(skuname
)
2852 while nextskuid
not in PcdObj
.SkuInfoList
:
2853 nextskuid
= self
.SkuIdMgr
.GetNextSkuId(nextskuid
)
2854 PcdObj
.SkuInfoList
[skuname
] = copy
.deepcopy(PcdObj
.SkuInfoList
[nextskuid
])
2855 PcdObj
.SkuInfoList
[skuname
].SkuId
= skuid
2856 PcdObj
.SkuInfoList
[skuname
].SkuIdName
= skuname
2857 if PcdType
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_HII
], self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_HII
]]:
2858 PcdObj
.DefaultValue
= list(PcdObj
.SkuInfoList
.values())[0].HiiDefaultValue
if self
.SkuIdMgr
.SkuUsageType
== self
.SkuIdMgr
.SINGLE
else PcdObj
.SkuInfoList
[TAB_DEFAULT
].HiiDefaultValue
2859 Pcds
[PcdCName
, TokenSpaceGuid
]= PcdObj
2861 ## Retrieve dynamic HII PCD settings
2863 # @param Type PCD type
2865 # @retval a dict object contains settings of given PCD type
2867 def _GetDynamicHiiPcd(self
, Type
):
2871 Pcds
= OrderedDict()
2872 UserDefinedDefaultStores
= []
2874 # tdict is a special dict kind of type, used for selecting correct
2875 # PCD settings for certain ARCH and SKU
2877 PcdDict
= tdict(True, 5)
2879 RecordList
= self
._RawData
[Type
, self
._Arch
]
2880 # Find out all possible PCD candidates for self._Arch
2881 AvailableSkuIdSet
= copy
.copy(self
.SkuIds
)
2882 DefaultStoresDefine
= self
._GetDefaultStores
()
2884 for TokenSpaceGuid
, PcdCName
, Setting
, Arch
, SkuName
, DefaultStore
, Dummy4
, Dummy5
in RecordList
:
2885 SkuName
= SkuName
.upper()
2886 SkuName
= TAB_DEFAULT
if SkuName
== TAB_COMMON
else SkuName
2887 DefaultStore
= DefaultStore
.upper()
2888 if DefaultStore
== TAB_COMMON
:
2889 DefaultStore
= TAB_DEFAULT_STORES_DEFAULT
2891 #The end user define [DefaultStores] and [SKUID_IDENTIFIER.Menufacturing] in DSC
2892 UserDefinedDefaultStores
.append((PcdCName
, TokenSpaceGuid
))
2893 if SkuName
not in AvailableSkuIdSet
:
2894 EdkLogger
.error('build', PARAMETER_INVALID
, 'Sku %s is not defined in [SkuIds] section' % SkuName
,
2895 File
=self
.MetaFile
, Line
=Dummy5
)
2896 if DefaultStore
not in DefaultStoresDefine
:
2897 EdkLogger
.error('build', PARAMETER_INVALID
, 'DefaultStores %s is not defined in [DefaultStores] section' % DefaultStore
,
2898 File
=self
.MetaFile
, Line
=Dummy5
)
2899 if "." not in TokenSpaceGuid
and "[" not in PcdCName
:
2900 PcdSet
.add((PcdCName
, TokenSpaceGuid
, SkuName
, DefaultStore
, Dummy5
))
2901 PcdDict
[Arch
, SkuName
, PcdCName
, TokenSpaceGuid
, DefaultStore
] = Setting
2904 # Remove redundant PCD candidates, per the ARCH and SKU
2905 for PcdCName
, TokenSpaceGuid
, SkuName
, DefaultStore
, Dummy4
in PcdSet
:
2907 Setting
= PcdDict
[self
._Arch
, SkuName
, PcdCName
, TokenSpaceGuid
, DefaultStore
]
2910 VariableName
, VariableGuid
, VariableOffset
, DefaultValue
, VarAttribute
= self
._ValidatePcd
(PcdCName
, TokenSpaceGuid
, Setting
, Type
, Dummy4
)
2912 rt
, Msg
= VariableAttributes
.ValidateVarAttributes(VarAttribute
)
2914 EdkLogger
.error("build", PCD_VARIABLE_ATTRIBUTES_ERROR
, "Variable attributes settings for %s is incorrect.\n %s" % (".".join((TokenSpaceGuid
, PcdCName
)), Msg
),
2915 ExtraData
="[%s]" % VarAttribute
)
2917 FormatCorrect
= True
2918 if VariableOffset
.isdigit():
2919 if int(VariableOffset
, 10) > 0xFFFF:
2921 elif variablePattern
.match(VariableOffset
):
2922 if int(VariableOffset
, 16) > 0xFFFF:
2924 # For Offset written in "A.B"
2925 elif VariableOffset
.find('.') > -1:
2926 VariableOffsetList
= VariableOffset
.split(".")
2927 if not (len(VariableOffsetList
) == 2
2928 and IsValidWord(VariableOffsetList
[0])
2929 and IsValidWord(VariableOffsetList
[1])):
2930 FormatCorrect
= False
2932 FormatCorrect
= False
2933 if not FormatCorrect
:
2934 EdkLogger
.error('Build', FORMAT_INVALID
, "Invalid syntax or format of the variable offset value is incorrect for %s." % ".".join((TokenSpaceGuid
, PcdCName
)))
2937 EdkLogger
.error('Build', OPTION_VALUE_INVALID
, "The variable offset value must not exceed the maximum value of 0xFFFF (UINT16) for %s." % ".".join((TokenSpaceGuid
, PcdCName
)))
2938 if (VariableName
, VariableGuid
) not in VariableAttrs
:
2939 VariableAttrs
[(VariableName
, VariableGuid
)] = VarAttribute
2941 if not DscBuildData
.CompareVarAttr(VariableAttrs
[(VariableName
, VariableGuid
)], VarAttribute
):
2942 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
)]))
2944 pcdDecObject
= self
._DecPcds
[PcdCName
, TokenSpaceGuid
]
2945 if (PcdCName
, TokenSpaceGuid
) in Pcds
:
2946 pcdObject
= Pcds
[PcdCName
, TokenSpaceGuid
]
2947 if SkuName
in pcdObject
.SkuInfoList
:
2948 Skuitem
= pcdObject
.SkuInfoList
[SkuName
]
2949 Skuitem
.DefaultStoreDict
.update({DefaultStore
:DefaultValue
})
2951 SkuInfo
= SkuInfoClass(SkuName
, self
.SkuIds
[SkuName
][0], VariableName
, VariableGuid
, VariableOffset
, DefaultValue
, VariableAttribute
=VarAttribute
, DefaultStore
={DefaultStore
:DefaultValue
})
2952 pcdObject
.SkuInfoList
[SkuName
] = SkuInfo
2954 SkuInfo
= SkuInfoClass(SkuName
, self
.SkuIds
[SkuName
][0], VariableName
, VariableGuid
, VariableOffset
, DefaultValue
, VariableAttribute
=VarAttribute
, DefaultStore
={DefaultStore
:DefaultValue
})
2955 PcdClassObj
= PcdClassObject(
2958 self
._PCD
_TYPE
_STRING
_[Type
],
2963 OrderedDict({SkuName
: SkuInfo
}),
2966 pcdDecObject
.validateranges
,
2967 pcdDecObject
.validlists
,
2968 pcdDecObject
.expressions
,
2970 if (PcdCName
, TokenSpaceGuid
) in UserDefinedDefaultStores
:
2971 PcdClassObj
.UserDefinedDefaultStoresFlag
= True
2972 Pcds
[PcdCName
, TokenSpaceGuid
] = PcdClassObj
2974 Pcds
[PcdCName
, TokenSpaceGuid
].CustomAttribute
['DscPosition'] = int(Dummy4
)
2975 if SkuName
not in Pcds
[PcdCName
, TokenSpaceGuid
].DscRawValue
:
2976 Pcds
[PcdCName
, TokenSpaceGuid
].DscRawValue
[SkuName
] = {}
2977 Pcds
[PcdCName
, TokenSpaceGuid
].DscRawValue
[SkuName
][DefaultStore
] = DefaultValue
2978 for pcd
in Pcds
.values():
2979 pcdDecObject
= self
._DecPcds
[pcd
.TokenCName
, pcd
.TokenSpaceGuidCName
]
2980 pcd
.DatumType
= pcdDecObject
.DatumType
2981 # Only fix the value while no value provided in DSC file.
2982 for sku
in pcd
.SkuInfoList
.values():
2983 if (sku
.HiiDefaultValue
== "" or sku
.HiiDefaultValue
is None):
2984 sku
.HiiDefaultValue
= pcdDecObject
.DefaultValue
2985 for default_store
in sku
.DefaultStoreDict
:
2986 sku
.DefaultStoreDict
[default_store
]=pcdDecObject
.DefaultValue
2987 pcd
.DefaultValue
= pcdDecObject
.DefaultValue
2988 if TAB_DEFAULT
not in pcd
.SkuInfoList
and TAB_COMMON
not in pcd
.SkuInfoList
:
2989 SkuInfoObj
= list(pcd
.SkuInfoList
.values())[0]
2990 valuefromDec
= pcdDecObject
.DefaultValue
2991 SkuInfo
= SkuInfoClass(TAB_DEFAULT
, '0', SkuInfoObj
.VariableName
, SkuInfoObj
.VariableGuid
, SkuInfoObj
.VariableOffset
, valuefromDec
, VariableAttribute
=SkuInfoObj
.VariableAttribute
, DefaultStore
={DefaultStore
:valuefromDec
})
2992 pcd
.SkuInfoList
[TAB_DEFAULT
] = SkuInfo
2993 elif TAB_DEFAULT
not in pcd
.SkuInfoList
and TAB_COMMON
in pcd
.SkuInfoList
:
2994 pcd
.SkuInfoList
[TAB_DEFAULT
] = pcd
.SkuInfoList
[TAB_COMMON
]
2995 del pcd
.SkuInfoList
[TAB_COMMON
]
2996 elif TAB_DEFAULT
in pcd
.SkuInfoList
and TAB_COMMON
in pcd
.SkuInfoList
:
2997 del pcd
.SkuInfoList
[TAB_COMMON
]
2999 if pcd
.MaxDatumSize
.strip():
3000 MaxSize
= int(pcd
.MaxDatumSize
, 0)
3003 if pcd
.DatumType
not in TAB_PCD_NUMERIC_TYPES
:
3004 for (_
, skuobj
) in pcd
.SkuInfoList
.items():
3006 skuobj
.HiiDefaultValue
= StringToArray(skuobj
.HiiDefaultValue
)
3007 datalen
= len(skuobj
.HiiDefaultValue
.split(","))
3008 if datalen
> MaxSize
:
3010 for defaultst
in skuobj
.DefaultStoreDict
:
3011 skuobj
.DefaultStoreDict
[defaultst
] = StringToArray(skuobj
.DefaultStoreDict
[defaultst
])
3012 pcd
.DefaultValue
= StringToArray(pcd
.DefaultValue
)
3013 pcd
.MaxDatumSize
= str(MaxSize
)
3014 rt
, invalidhii
= DscBuildData
.CheckVariableNameAssignment(Pcds
)
3016 invalidpcd
= ",".join(invalidhii
)
3017 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
)
3019 list(map(self
.FilterSkuSettings
, Pcds
.values()))
3024 def CheckVariableNameAssignment(Pcds
):
3026 for pcdname
in Pcds
:
3028 varnameset
= set(sku
.VariableName
for (skuid
, sku
) in pcd
.SkuInfoList
.items())
3029 if len(varnameset
) > 1:
3030 invalidhii
.append(".".join((pcdname
[1], pcdname
[0])))
3032 return False, invalidhii
3035 ## Retrieve dynamic VPD PCD settings
3037 # @param Type PCD type
3039 # @retval a dict object contains settings of given PCD type
3041 def _GetDynamicVpdPcd(self
, Type
):
3044 Pcds
= OrderedDict()
3046 # tdict is a special dict kind of type, used for selecting correct
3047 # PCD settings for certain ARCH and SKU
3049 PcdDict
= tdict(True, 4)
3052 # Find out all possible PCD candidates for self._Arch
3053 RecordList
= self
._RawData
[Type
, self
._Arch
]
3054 AvailableSkuIdSet
= copy
.copy(self
.SkuIds
)
3056 for TokenSpaceGuid
, PcdCName
, Setting
, Arch
, SkuName
, Dummy3
, Dummy4
, Dummy5
in RecordList
:
3057 SkuName
= SkuName
.upper()
3058 SkuName
= TAB_DEFAULT
if SkuName
== TAB_COMMON
else SkuName
3059 if SkuName
not in AvailableSkuIdSet
:
3060 EdkLogger
.error('build', PARAMETER_INVALID
, 'Sku %s is not defined in [SkuIds] section' % SkuName
,
3061 File
=self
.MetaFile
, Line
=Dummy5
)
3062 if "." not in TokenSpaceGuid
and "[" not in PcdCName
:
3063 PcdList
.append((PcdCName
, TokenSpaceGuid
, SkuName
, Dummy5
))
3064 PcdDict
[Arch
, SkuName
, PcdCName
, TokenSpaceGuid
] = Setting
3066 # Remove redundant PCD candidates, per the ARCH and SKU
3067 for PcdCName
, TokenSpaceGuid
, SkuName
, Dummy4
in PcdList
:
3068 Setting
= PcdDict
[self
._Arch
, SkuName
, PcdCName
, TokenSpaceGuid
]
3072 # For the VOID* type, it can have optional data of MaxDatumSize and InitialValue
3073 # For the Integer & Boolean type, the optional data can only be InitialValue.
3074 # At this point, we put all the data into the PcdClssObject for we don't know the PCD's datumtype
3075 # until the DEC parser has been called.
3077 VpdOffset
, MaxDatumSize
, InitialValue
= self
._ValidatePcd
(PcdCName
, TokenSpaceGuid
, Setting
, Type
, Dummy4
)
3079 if int(MaxDatumSize
, 0) > 0xFFFF:
3080 EdkLogger
.error('build', FORMAT_INVALID
, "The size value must not exceed the maximum value of 0xFFFF (UINT16) for %s." % ".".join((TokenSpaceGuid
, PcdCName
)),
3081 File
=self
.MetaFile
, Line
=Dummy4
)
3082 if int(MaxDatumSize
, 0) < 0:
3083 EdkLogger
.error('build', FORMAT_INVALID
, "The size value can't be set to negative value for %s." % ".".join((TokenSpaceGuid
, PcdCName
)),
3084 File
=self
.MetaFile
, Line
=Dummy4
)
3085 SkuInfo
= SkuInfoClass(SkuName
, self
.SkuIds
[SkuName
][0], '', '', '', '', VpdOffset
, InitialValue
)
3086 if (PcdCName
, TokenSpaceGuid
) in Pcds
:
3087 pcdObject
= Pcds
[PcdCName
, TokenSpaceGuid
]
3088 pcdObject
.SkuInfoList
[SkuName
] = SkuInfo
3089 if MaxDatumSize
.strip():
3090 CurrentMaxSize
= int(MaxDatumSize
.strip(), 0)
3093 if pcdObject
.MaxDatumSize
:
3094 PcdMaxSize
= int(pcdObject
.MaxDatumSize
, 0)
3097 if CurrentMaxSize
> PcdMaxSize
:
3098 pcdObject
.MaxDatumSize
= str(CurrentMaxSize
)
3100 Pcds
[PcdCName
, TokenSpaceGuid
] = PcdClassObject(
3103 self
._PCD
_TYPE
_STRING
_[Type
],
3108 OrderedDict({SkuName
: SkuInfo
}),
3113 if SkuName
not in Pcds
[PcdCName
, TokenSpaceGuid
].DscRawValue
:
3114 Pcds
[PcdCName
, TokenSpaceGuid
].DscRawValue
[SkuName
] = {}
3115 Pcds
[PcdCName
, TokenSpaceGuid
].DscRawValue
[SkuName
][TAB_DEFAULT_STORES_DEFAULT
] = InitialValue
3116 for pcd
in Pcds
.values():
3117 pcdDecObject
= self
._DecPcds
[pcd
.TokenCName
, pcd
.TokenSpaceGuidCName
]
3118 pcd
.DatumType
= pcdDecObject
.DatumType
3119 # Only fix the value while no value provided in DSC file.
3120 for sku
in pcd
.SkuInfoList
.values():
3121 if not sku
.DefaultValue
:
3122 sku
.DefaultValue
= pcdDecObject
.DefaultValue
3123 if TAB_DEFAULT
not in pcd
.SkuInfoList
and TAB_COMMON
not in pcd
.SkuInfoList
:
3124 SkuInfoObj
= list(pcd
.SkuInfoList
.values())[0]
3125 valuefromDec
= pcdDecObject
.DefaultValue
3126 SkuInfo
= SkuInfoClass(TAB_DEFAULT
, '0', '', '', '', '', SkuInfoObj
.VpdOffset
, valuefromDec
)
3127 pcd
.SkuInfoList
[TAB_DEFAULT
] = SkuInfo
3128 elif TAB_DEFAULT
not in pcd
.SkuInfoList
and TAB_COMMON
in pcd
.SkuInfoList
:
3129 pcd
.SkuInfoList
[TAB_DEFAULT
] = pcd
.SkuInfoList
[TAB_COMMON
]
3130 del pcd
.SkuInfoList
[TAB_COMMON
]
3131 elif TAB_DEFAULT
in pcd
.SkuInfoList
and TAB_COMMON
in pcd
.SkuInfoList
:
3132 del pcd
.SkuInfoList
[TAB_COMMON
]
3134 #For the same one VOID* pcd, if the default value type of one SKU is "Unicode string",
3135 #the other SKUs are "OtherVOID*"(ASCII string or byte array),Then convert "Unicode string" to "byte array".
3136 for pcd
in Pcds
.values():
3137 PcdValueTypeSet
= set()
3138 for sku
in pcd
.SkuInfoList
.values():
3139 PcdValueTypeSet
.add("UnicodeString" if sku
.DefaultValue
.startswith(('L"',"L'")) else "OtherVOID*")
3140 if len(PcdValueTypeSet
) > 1:
3141 for sku
in pcd
.SkuInfoList
.values():
3142 sku
.DefaultValue
= StringToArray(sku
.DefaultValue
) if sku
.DefaultValue
.startswith(('L"',"L'")) else sku
.DefaultValue
3144 list(map(self
.FilterSkuSettings
, Pcds
.values()))
3147 ## Add external modules
3149 # The external modules are mostly those listed in FDF file, which don't
3152 # @param FilePath The path of module description file
3154 def AddModule(self
, FilePath
):
3155 FilePath
= NormPath(FilePath
)
3156 if FilePath
not in self
.Modules
:
3157 Module
= ModuleBuildClassObject()
3158 Module
.MetaFile
= FilePath
3159 self
.Modules
.append(Module
)
3162 def ToolChainFamily(self
):
3163 self
._ToolChainFamily
= TAB_COMPILER_MSFT
3164 BuildConfigurationFile
= os
.path
.normpath(os
.path
.join(GlobalData
.gConfDirectory
, "target.txt"))
3165 if os
.path
.isfile(BuildConfigurationFile
) == True:
3166 TargetTxt
= TargetTxtClassObject()
3167 TargetTxt
.LoadTargetTxtFile(BuildConfigurationFile
)
3168 ToolDefinitionFile
= TargetTxt
.TargetTxtDictionary
[DataType
.TAB_TAT_DEFINES_TOOL_CHAIN_CONF
]
3169 if ToolDefinitionFile
== '':
3170 ToolDefinitionFile
= "tools_def.txt"
3171 ToolDefinitionFile
= os
.path
.normpath(mws
.join(self
.WorkspaceDir
, 'Conf', ToolDefinitionFile
))
3172 if os
.path
.isfile(ToolDefinitionFile
) == True:
3173 ToolDef
= ToolDefClassObject()
3174 ToolDef
.LoadToolDefFile(ToolDefinitionFile
)
3175 ToolDefinition
= ToolDef
.ToolsDefTxtDatabase
3176 if TAB_TOD_DEFINES_FAMILY
not in ToolDefinition \
3177 or self
._Toolchain
not in ToolDefinition
[TAB_TOD_DEFINES_FAMILY
] \
3178 or not ToolDefinition
[TAB_TOD_DEFINES_FAMILY
][self
._Toolchain
]:
3179 self
._ToolChainFamily
= TAB_COMPILER_MSFT
3181 self
._ToolChainFamily
= ToolDefinition
[TAB_TOD_DEFINES_FAMILY
][self
._Toolchain
]
3182 return self
._ToolChainFamily
3184 ## Add external PCDs
3186 # The external PCDs are mostly those listed in FDF file to specify address
3187 # or offset information.
3189 # @param Name Name of the PCD
3190 # @param Guid Token space guid of the PCD
3191 # @param Value Value of the PCD
3193 def AddPcd(self
, Name
, Guid
, Value
):
3194 if (Name
, Guid
) not in self
.Pcds
:
3195 self
.Pcds
[Name
, Guid
] = PcdClassObject(Name
, Guid
, '', '', '', '', '', {}, False, None)
3196 self
.Pcds
[Name
, Guid
].DefaultValue
= Value
3200 if self
._DecPcds
is None:
3202 if GlobalData
.gFdfParser
:
3203 FdfInfList
= GlobalData
.gFdfParser
.Profile
.InfList
3205 for Inf
in FdfInfList
:
3206 ModuleFile
= PathClass(NormPath(Inf
), GlobalData
.gWorkspace
, Arch
=self
._Arch
)
3207 if ModuleFile
in self
._Modules
:
3209 ModuleData
= self
._Bdb
[ModuleFile
, self
._Arch
, self
._Target
, self
._Toolchain
]
3210 PkgSet
.update(ModuleData
.Packages
)
3211 self
._DecPcds
, self
._GuidDict
= GetDeclaredPcd(self
, self
._Bdb
, self
._Arch
, self
._Target
, self
._Toolchain
, PkgSet
)
3212 self
._GuidDict
.update(GlobalData
.gPlatformPcds
)
3213 return self
._DecPcds