2 # This file is used to create a database used by build tool
4 # Copyright (c) 2008 - 2018, Intel Corporation. All rights reserved.<BR>
5 # (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>
6 # This program and the accompanying materials
7 # are licensed and made available under the terms and conditions of the BSD License
8 # which accompanies this distribution. The full text of the license may be found at
9 # http://opensource.org/licenses/bsd-license.php
11 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15 ## Platform build information from DSC file
17 # This class is used to retrieve information stored in database and convert them
18 # into PlatformBuildClassObject form for easier use for AutoGen.
20 from __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 Common
.Misc
import SaveFileOnChange
43 from Workspace
.BuildClassObject
import PlatformBuildClassObject
, StructurePcd
, PcdClassObject
, ModuleBuildClassObject
44 from collections
import OrderedDict
, defaultdict
45 from .BuildClassObject
import ArrayIndex
47 PcdValueInitName
= 'PcdValueInit'
58 #include <PcdValueCommon.h>
68 return PcdValueMain (argc, argv);
72 PcdMakefileHeader
= '''
75 # This file is auto-generated by build utility
80 WindowsCFLAGS
= 'CFLAGS = $(CFLAGS) /wd4200 /wd4034 /wd4101 '
81 LinuxCFLAGS
= 'BUILD_CFLAGS += -Wno-pointer-to-int-cast -Wno-unused-variable '
83 !INCLUDE $(BASE_TOOLS_PATH)\Source\C\Makefiles\ms.common
85 LIBS = $(LIB_PATH)\Common.lib
87 !INCLUDE $(BASE_TOOLS_PATH)\Source\C\Makefiles\ms.app
92 $(APPFILE): $(OBJECTS)
97 MAKEROOT ?= $(EDK_TOOLS_PATH)/Source/C
101 variablePattern
= re
.compile(r
'[\t\s]*0[xX][a-fA-F0-9]+$')
102 SkuIdPattern
= re
.compile(r
'^[a-zA-Z_][a-zA-Z0-9_]*$')
103 ## regular expressions for finding decimal and hex numbers
104 Pattern
= re
.compile('^[1-9]\d*|0$')
105 HexPattern
= re
.compile(r
'0[xX][0-9a-fA-F]+$')
106 ## Regular expression for finding header file inclusions
107 from AutoGen
.GenMake
import gIncludePattern
109 ## Find dependencies for one source file
111 # By searching recursively "#include" directive in file, find out all the
112 # files needed by given source file. The dependecies will be only searched
113 # in given search path list.
115 # @param SearchPathList The list of search path
117 # @retval list The list of files the given source file depends on
119 def GetDependencyList(FileStack
, SearchPathList
):
121 DependencySet
= set(FileStack
)
122 while len(FileStack
) > 0:
124 FullPathDependList
= []
125 CurrentFileDependencyList
= []
127 CurrentFileDependencyList
= DepDb
[F
]
131 FileContent
= Fd
.read()
132 except BaseException
as X
:
133 EdkLogger
.error("build", FILE_OPEN_FAILURE
, ExtraData
=F
+ "\n\t" + str(X
))
135 if "Fd" in dir(locals()):
138 if len(FileContent
) == 0:
141 if FileContent
[0] == 0xff or FileContent
[0] == 0xfe:
142 FileContent
= unicode(FileContent
, "utf-16")
143 IncludedFileList
= gIncludePattern
.findall(FileContent
)
145 for Inc
in IncludedFileList
:
147 Inc
= os
.path
.normpath(Inc
)
148 CurrentFileDependencyList
.append(Inc
)
149 DepDb
[F
] = CurrentFileDependencyList
151 CurrentFilePath
= os
.path
.dirname(F
)
152 PathList
= [CurrentFilePath
] + SearchPathList
153 for Inc
in CurrentFileDependencyList
:
154 for SearchPath
in PathList
:
155 FilePath
= os
.path
.join(SearchPath
, Inc
)
156 if not os
.path
.exists(FilePath
):
158 if FilePath
not in DependencySet
:
159 FileStack
.append(FilePath
)
160 FullPathDependList
.append(FilePath
)
162 DependencySet
.update(FullPathDependList
)
163 DependencyList
= list(DependencySet
) # remove duplicate ones
165 return DependencyList
167 class DscBuildData(PlatformBuildClassObject
):
168 # dict used to convert PCD type in database to string used by build tool
169 _PCD_TYPE_STRING_
= {
170 MODEL_PCD_FIXED_AT_BUILD
: TAB_PCDS_FIXED_AT_BUILD
,
171 MODEL_PCD_PATCHABLE_IN_MODULE
: TAB_PCDS_PATCHABLE_IN_MODULE
,
172 MODEL_PCD_FEATURE_FLAG
: TAB_PCDS_FEATURE_FLAG
,
173 MODEL_PCD_DYNAMIC
: TAB_PCDS_DYNAMIC
,
174 MODEL_PCD_DYNAMIC_DEFAULT
: TAB_PCDS_DYNAMIC
,
175 MODEL_PCD_DYNAMIC_HII
: TAB_PCDS_DYNAMIC_HII
,
176 MODEL_PCD_DYNAMIC_VPD
: TAB_PCDS_DYNAMIC_VPD
,
177 MODEL_PCD_DYNAMIC_EX
: TAB_PCDS_DYNAMIC_EX
,
178 MODEL_PCD_DYNAMIC_EX_DEFAULT
: TAB_PCDS_DYNAMIC_EX
,
179 MODEL_PCD_DYNAMIC_EX_HII
: TAB_PCDS_DYNAMIC_EX_HII
,
180 MODEL_PCD_DYNAMIC_EX_VPD
: TAB_PCDS_DYNAMIC_EX_VPD
,
183 # dict used to convert part of [Defines] to members of DscBuildData directly
188 TAB_DSC_DEFINES_PLATFORM_NAME
: "_PlatformName",
189 TAB_DSC_DEFINES_PLATFORM_GUID
: "_Guid",
190 TAB_DSC_DEFINES_PLATFORM_VERSION
: "_Version",
191 TAB_DSC_DEFINES_DSC_SPECIFICATION
: "_DscSpecification",
192 # TAB_DSC_DEFINES_OUTPUT_DIRECTORY : "_OutputDirectory",
193 # TAB_DSC_DEFINES_SUPPORTED_ARCHITECTURES : "_SupArchList",
194 # TAB_DSC_DEFINES_BUILD_TARGETS : "_BuildTargets",
195 TAB_DSC_DEFINES_SKUID_IDENTIFIER
: "_SkuName",
196 # TAB_DSC_DEFINES_FLASH_DEFINITION : "_FlashDefinition",
197 TAB_DSC_DEFINES_BUILD_NUMBER
: "_BuildNumber",
198 TAB_DSC_DEFINES_MAKEFILE_NAME
: "_MakefileName",
199 TAB_DSC_DEFINES_BS_BASE_ADDRESS
: "_BsBaseAddress",
200 TAB_DSC_DEFINES_RT_BASE_ADDRESS
: "_RtBaseAddress",
201 # TAB_DSC_DEFINES_RFC_LANGUAGES : "_RFCLanguages",
202 # TAB_DSC_DEFINES_ISO_LANGUAGES : "_ISOLanguages",
205 # used to compose dummy library class name for those forced library instances
206 _NullLibraryNumber
= 0
208 ## Constructor of DscBuildData
210 # Initialize object of DscBuildData
212 # @param FilePath The path of platform description file
213 # @param RawData The raw data of DSC file
214 # @param BuildDataBase Database used to retrieve module/package information
215 # @param Arch The target architecture
216 # @param Platform (not used for DscBuildData)
217 # @param Macros Macros used for replacement in DSC file
219 def __init__(self
, FilePath
, RawData
, BuildDataBase
, Arch
=TAB_ARCH_COMMON
, Target
=None, Toolchain
=None):
220 self
.MetaFile
= FilePath
221 self
._RawData
= RawData
222 self
._Bdb
= BuildDataBase
224 self
._Target
= Target
225 self
._Toolchain
= Toolchain
226 self
._ToolChainFamily
= None
228 self
._HandleOverridePath
()
229 self
.WorkspaceDir
= os
.getenv("WORKSPACE") if os
.getenv("WORKSPACE") else ""
230 self
.DefaultStores
= None
231 self
.SkuIdMgr
= SkuClass(self
.SkuName
, self
.SkuIds
)
234 def OutputPath(self
):
235 if os
.getenv("WORKSPACE"):
236 return os
.path
.join(os
.getenv("WORKSPACE"), self
.OutputDirectory
, self
._Target
+ "_" + self
._Toolchain
, PcdValueInitName
)
238 return os
.path
.dirname(self
.DscFile
)
241 def __setitem__(self
, key
, value
):
242 self
.__dict
__[self
._PROPERTY
_[key
]] = value
245 def __getitem__(self
, key
):
246 return self
.__dict
__[self
._PROPERTY
_[key
]]
249 def __contains__(self
, key
):
250 return key
in self
._PROPERTY
_
252 ## Set all internal used members of DscBuildData to None
255 self
._PlatformName
= None
258 self
._DscSpecification
= None
259 self
._OutputDirectory
= None
260 self
._SupArchList
= None
261 self
._BuildTargets
= None
263 self
._PcdInfoFlag
= None
264 self
._VarCheckFlag
= None
265 self
._FlashDefinition
= None
266 self
._Prebuild
= None
267 self
._Postbuild
= None
268 self
._BuildNumber
= None
269 self
._MakefileName
= None
270 self
._BsBaseAddress
= None
271 self
._RtBaseAddress
= None
274 self
._LibraryInstances
= None
275 self
._LibraryClasses
= None
278 self
._BuildOptions
= None
279 self
._ModuleTypeOptions
= None
280 self
._LoadFixAddress
= None
281 self
._RFCLanguages
= None
282 self
._ISOLanguages
= None
283 self
._VpdToolGuid
= None
284 self
._MacroDict
= None
285 self
.DefaultStores
= None
287 ## handle Override Path of Module
288 def _HandleOverridePath(self
):
289 RecordList
= self
._RawData
[MODEL_META_DATA_COMPONENT
, self
._Arch
]
290 for Record
in RecordList
:
293 ModuleFile
= PathClass(NormPath(Record
[0]), GlobalData
.gWorkspace
, Arch
=self
._Arch
)
294 RecordList
= self
._RawData
[MODEL_META_DATA_COMPONENT_SOURCE_OVERRIDE_PATH
, self
._Arch
, None, ModuleId
]
296 SourceOverridePath
= mws
.join(GlobalData
.gWorkspace
, NormPath(RecordList
[0][0]))
298 # Check if the source override path exists
299 if not os
.path
.isdir(SourceOverridePath
):
300 EdkLogger
.error('build', FILE_NOT_FOUND
, Message
='Source override path does not exist:', File
=self
.MetaFile
, ExtraData
=SourceOverridePath
, Line
=LineNo
)
302 # Add to GlobalData Variables
303 GlobalData
.gOverrideDir
[ModuleFile
.Key
] = SourceOverridePath
305 ## Get current effective macros
308 if self
._MacroDict
is None:
310 self
._MacroDict
.update(GlobalData
.gPlatformDefines
)
311 self
._MacroDict
.update(GlobalData
.gGlobalDefines
)
312 self
._MacroDict
.update(GlobalData
.gCommandLineDefines
)
313 return self
._MacroDict
320 ## Retrieve all information in [Defines] section
322 # (Retriving all [Defines] information in one-shot is just to save time.)
324 def _GetHeaderInfo(self
):
325 RecordList
= self
._RawData
[MODEL_META_DATA_HEADER
, self
._Arch
]
326 for Record
in RecordList
:
328 # items defined _PROPERTY_ don't need additional processing
330 # some special items in [Defines] section need special treatment
331 if Name
== TAB_DSC_DEFINES_OUTPUT_DIRECTORY
:
332 self
._OutputDirectory
= NormPath(Record
[2], self
._Macros
)
333 if ' ' in self
._OutputDirectory
:
334 EdkLogger
.error("build", FORMAT_NOT_SUPPORTED
, "No space is allowed in OUTPUT_DIRECTORY",
335 File
=self
.MetaFile
, Line
=Record
[-1],
336 ExtraData
=self
._OutputDirectory
)
337 elif Name
== TAB_DSC_DEFINES_FLASH_DEFINITION
:
338 self
._FlashDefinition
= PathClass(NormPath(Record
[2], self
._Macros
), GlobalData
.gWorkspace
)
339 ErrorCode
, ErrorInfo
= self
._FlashDefinition
.Validate('.fdf')
341 EdkLogger
.error('build', ErrorCode
, File
=self
.MetaFile
, Line
=Record
[-1],
343 elif Name
== TAB_DSC_PREBUILD
:
344 PrebuildValue
= Record
[2]
345 if Record
[2][0] == '"':
346 if Record
[2][-1] != '"':
347 EdkLogger
.error('build', FORMAT_INVALID
, 'Missing double quotes in the end of %s statement.' % TAB_DSC_PREBUILD
,
348 File
=self
.MetaFile
, Line
=Record
[-1])
349 PrebuildValue
= Record
[2][1:-1]
350 self
._Prebuild
= PrebuildValue
351 elif Name
== TAB_DSC_POSTBUILD
:
352 PostbuildValue
= Record
[2]
353 if Record
[2][0] == '"':
354 if Record
[2][-1] != '"':
355 EdkLogger
.error('build', FORMAT_INVALID
, 'Missing double quotes in the end of %s statement.' % TAB_DSC_POSTBUILD
,
356 File
=self
.MetaFile
, Line
=Record
[-1])
357 PostbuildValue
= Record
[2][1:-1]
358 self
._Postbuild
= PostbuildValue
359 elif Name
== TAB_DSC_DEFINES_SUPPORTED_ARCHITECTURES
:
360 self
._SupArchList
= GetSplitValueList(Record
[2], TAB_VALUE_SPLIT
)
361 elif Name
== TAB_DSC_DEFINES_BUILD_TARGETS
:
362 self
._BuildTargets
= GetSplitValueList(Record
[2])
363 elif Name
== TAB_DSC_DEFINES_SKUID_IDENTIFIER
:
364 if self
._SkuName
is None:
365 self
._SkuName
= Record
[2]
366 if GlobalData
.gSKUID_CMD
:
367 self
._SkuName
= GlobalData
.gSKUID_CMD
368 elif Name
== TAB_DSC_DEFINES_PCD_INFO_GENERATION
:
369 self
._PcdInfoFlag
= Record
[2]
370 elif Name
== TAB_DSC_DEFINES_PCD_VAR_CHECK_GENERATION
:
371 self
._VarCheckFlag
= Record
[2]
372 elif Name
== TAB_FIX_LOAD_TOP_MEMORY_ADDRESS
:
374 self
._LoadFixAddress
= int (Record
[2], 0)
376 EdkLogger
.error("build", PARAMETER_INVALID
, "FIX_LOAD_TOP_MEMORY_ADDRESS %s is not valid dec or hex string" % (Record
[2]))
377 elif Name
== TAB_DSC_DEFINES_RFC_LANGUAGES
:
378 if not Record
[2] or Record
[2][0] != '"' or Record
[2][-1] != '"' or len(Record
[2]) == 1:
379 EdkLogger
.error('build', FORMAT_NOT_SUPPORTED
, 'language code for RFC_LANGUAGES must have double quotes around it, for example: RFC_LANGUAGES = "en-us;zh-hans"',
380 File
=self
.MetaFile
, Line
=Record
[-1])
381 LanguageCodes
= Record
[2][1:-1]
382 if not LanguageCodes
:
383 EdkLogger
.error('build', FORMAT_NOT_SUPPORTED
, 'one or more RFC4646 format language code must be provided for RFC_LANGUAGES statement',
384 File
=self
.MetaFile
, Line
=Record
[-1])
385 LanguageList
= GetSplitValueList(LanguageCodes
, TAB_SEMI_COLON_SPLIT
)
386 # check whether there is empty entries in the list
387 if None in LanguageList
:
388 EdkLogger
.error('build', FORMAT_NOT_SUPPORTED
, 'one or more empty language code is in RFC_LANGUAGES statement',
389 File
=self
.MetaFile
, Line
=Record
[-1])
390 self
._RFCLanguages
= LanguageList
391 elif Name
== TAB_DSC_DEFINES_ISO_LANGUAGES
:
392 if not Record
[2] or Record
[2][0] != '"' or Record
[2][-1] != '"' or len(Record
[2]) == 1:
393 EdkLogger
.error('build', FORMAT_NOT_SUPPORTED
, 'language code for ISO_LANGUAGES must have double quotes around it, for example: ISO_LANGUAGES = "engchn"',
394 File
=self
.MetaFile
, Line
=Record
[-1])
395 LanguageCodes
= Record
[2][1:-1]
396 if not LanguageCodes
:
397 EdkLogger
.error('build', FORMAT_NOT_SUPPORTED
, 'one or more ISO639-2 format language code must be provided for ISO_LANGUAGES statement',
398 File
=self
.MetaFile
, Line
=Record
[-1])
399 if len(LanguageCodes
) % 3:
400 EdkLogger
.error('build', FORMAT_NOT_SUPPORTED
, 'bad ISO639-2 format for ISO_LANGUAGES',
401 File
=self
.MetaFile
, Line
=Record
[-1])
403 for i
in range(0, len(LanguageCodes
), 3):
404 LanguageList
.append(LanguageCodes
[i
:i
+ 3])
405 self
._ISOLanguages
= LanguageList
406 elif Name
== TAB_DSC_DEFINES_VPD_TOOL_GUID
:
408 # try to convert GUID to a real UUID value to see whether the GUID is format
409 # for VPD_TOOL_GUID is correct.
414 EdkLogger
.error("build", FORMAT_INVALID
, "Invalid GUID format for VPD_TOOL_GUID", File
=self
.MetaFile
)
415 self
._VpdToolGuid
= Record
[2]
417 self
[Name
] = Record
[2]
418 # set _Header to non-None in order to avoid database re-querying
419 self
._Header
= 'DUMMY'
421 ## Retrieve platform name
423 def PlatformName(self
):
424 if self
._PlatformName
is None:
425 if self
._Header
is None:
426 self
._GetHeaderInfo
()
427 if self
._PlatformName
is None:
428 EdkLogger
.error('build', ATTRIBUTE_NOT_AVAILABLE
, "No PLATFORM_NAME", File
=self
.MetaFile
)
429 return self
._PlatformName
433 return self
.PlatformName
435 ## Retrieve file guid
438 if self
._Guid
is None:
439 if self
._Header
is None:
440 self
._GetHeaderInfo
()
441 if self
._Guid
is None:
442 EdkLogger
.error('build', ATTRIBUTE_NOT_AVAILABLE
, "No PLATFORM_GUID", File
=self
.MetaFile
)
445 ## Retrieve platform version
448 if self
._Version
is None:
449 if self
._Header
is None:
450 self
._GetHeaderInfo
()
451 if self
._Version
is None:
452 EdkLogger
.error('build', ATTRIBUTE_NOT_AVAILABLE
, "No PLATFORM_VERSION", File
=self
.MetaFile
)
455 ## Retrieve platform description file version
457 def DscSpecification(self
):
458 if self
._DscSpecification
is None:
459 if self
._Header
is None:
460 self
._GetHeaderInfo
()
461 if self
._DscSpecification
is None:
462 EdkLogger
.error('build', ATTRIBUTE_NOT_AVAILABLE
, "No DSC_SPECIFICATION", File
=self
.MetaFile
)
463 return self
._DscSpecification
465 ## Retrieve OUTPUT_DIRECTORY
467 def OutputDirectory(self
):
468 if self
._OutputDirectory
is None:
469 if self
._Header
is None:
470 self
._GetHeaderInfo
()
471 if self
._OutputDirectory
is None:
472 self
._OutputDirectory
= os
.path
.join("Build", self
._PlatformName
)
473 return self
._OutputDirectory
475 ## Retrieve SUPPORTED_ARCHITECTURES
477 def SupArchList(self
):
478 if self
._SupArchList
is None:
479 if self
._Header
is None:
480 self
._GetHeaderInfo
()
481 if self
._SupArchList
is None:
482 EdkLogger
.error('build', ATTRIBUTE_NOT_AVAILABLE
, "No SUPPORTED_ARCHITECTURES", File
=self
.MetaFile
)
483 return self
._SupArchList
485 ## Retrieve BUILD_TARGETS
487 def BuildTargets(self
):
488 if self
._BuildTargets
is None:
489 if self
._Header
is None:
490 self
._GetHeaderInfo
()
491 if self
._BuildTargets
is None:
492 EdkLogger
.error('build', ATTRIBUTE_NOT_AVAILABLE
, "No BUILD_TARGETS", File
=self
.MetaFile
)
493 return self
._BuildTargets
496 def PcdInfoFlag(self
):
497 if self
._PcdInfoFlag
is None or self
._PcdInfoFlag
.upper() == 'FALSE':
499 elif self
._PcdInfoFlag
.upper() == 'TRUE':
505 def VarCheckFlag(self
):
506 if self
._VarCheckFlag
is None or self
._VarCheckFlag
.upper() == 'FALSE':
508 elif self
._VarCheckFlag
.upper() == 'TRUE':
513 # # Retrieve SKUID_IDENTIFIER
516 if self
._SkuName
is None:
517 if self
._Header
is None:
518 self
._GetHeaderInfo
()
519 if self
._SkuName
is None:
520 self
._SkuName
= TAB_DEFAULT
523 ## Override SKUID_IDENTIFIER
525 def SkuName(self
, Value
):
526 self
._SkuName
= Value
529 def FlashDefinition(self
):
530 if self
._FlashDefinition
is None:
531 if self
._Header
is None:
532 self
._GetHeaderInfo
()
533 if self
._FlashDefinition
is None:
534 self
._FlashDefinition
= ''
535 return self
._FlashDefinition
539 if self
._Prebuild
is None:
540 if self
._Header
is None:
541 self
._GetHeaderInfo
()
542 if self
._Prebuild
is None:
544 return self
._Prebuild
548 if self
._Postbuild
is None:
549 if self
._Header
is None:
550 self
._GetHeaderInfo
()
551 if self
._Postbuild
is None:
553 return self
._Postbuild
555 ## Retrieve FLASH_DEFINITION
557 def BuildNumber(self
):
558 if self
._BuildNumber
is None:
559 if self
._Header
is None:
560 self
._GetHeaderInfo
()
561 if self
._BuildNumber
is None:
562 self
._BuildNumber
= ''
563 return self
._BuildNumber
565 ## Retrieve MAKEFILE_NAME
567 def MakefileName(self
):
568 if self
._MakefileName
is None:
569 if self
._Header
is None:
570 self
._GetHeaderInfo
()
571 if self
._MakefileName
is None:
572 self
._MakefileName
= ''
573 return self
._MakefileName
575 ## Retrieve BsBaseAddress
577 def BsBaseAddress(self
):
578 if self
._BsBaseAddress
is None:
579 if self
._Header
is None:
580 self
._GetHeaderInfo
()
581 if self
._BsBaseAddress
is None:
582 self
._BsBaseAddress
= ''
583 return self
._BsBaseAddress
585 ## Retrieve RtBaseAddress
587 def RtBaseAddress(self
):
588 if self
._RtBaseAddress
is None:
589 if self
._Header
is None:
590 self
._GetHeaderInfo
()
591 if self
._RtBaseAddress
is None:
592 self
._RtBaseAddress
= ''
593 return self
._RtBaseAddress
595 ## Retrieve the top address for the load fix address
597 def LoadFixAddress(self
):
598 if self
._LoadFixAddress
is None:
599 if self
._Header
is None:
600 self
._GetHeaderInfo
()
602 if self
._LoadFixAddress
is None:
603 self
._LoadFixAddress
= self
._Macros
.get(TAB_FIX_LOAD_TOP_MEMORY_ADDRESS
, '0')
606 self
._LoadFixAddress
= int (self
._LoadFixAddress
, 0)
608 EdkLogger
.error("build", PARAMETER_INVALID
, "FIX_LOAD_TOP_MEMORY_ADDRESS %s is not valid dec or hex string" % (self
._LoadFixAddress
))
611 # If command line defined, should override the value in DSC file.
613 if 'FIX_LOAD_TOP_MEMORY_ADDRESS' in GlobalData
.gCommandLineDefines
:
615 self
._LoadFixAddress
= int(GlobalData
.gCommandLineDefines
['FIX_LOAD_TOP_MEMORY_ADDRESS'], 0)
617 EdkLogger
.error("build", PARAMETER_INVALID
, "FIX_LOAD_TOP_MEMORY_ADDRESS %s is not valid dec or hex string" % (GlobalData
.gCommandLineDefines
['FIX_LOAD_TOP_MEMORY_ADDRESS']))
619 if self
._LoadFixAddress
< 0:
620 EdkLogger
.error("build", PARAMETER_INVALID
, "FIX_LOAD_TOP_MEMORY_ADDRESS is set to the invalid negative value 0x%x" % (self
._LoadFixAddress
))
621 if self
._LoadFixAddress
!= 0xFFFFFFFFFFFFFFFF and self
._LoadFixAddress
% 0x1000 != 0:
622 EdkLogger
.error("build", PARAMETER_INVALID
, "FIX_LOAD_TOP_MEMORY_ADDRESS is set to the invalid unaligned 4K value 0x%x" % (self
._LoadFixAddress
))
624 return self
._LoadFixAddress
626 ## Retrieve RFCLanguage filter
628 def RFCLanguages(self
):
629 if self
._RFCLanguages
is None:
630 if self
._Header
is None:
631 self
._GetHeaderInfo
()
632 if self
._RFCLanguages
is None:
633 self
._RFCLanguages
= []
634 return self
._RFCLanguages
636 ## Retrieve ISOLanguage filter
638 def ISOLanguages(self
):
639 if self
._ISOLanguages
is None:
640 if self
._Header
is None:
641 self
._GetHeaderInfo
()
642 if self
._ISOLanguages
is None:
643 self
._ISOLanguages
= []
644 return self
._ISOLanguages
646 ## Retrieve the GUID string for VPD tool
648 def VpdToolGuid(self
):
649 if self
._VpdToolGuid
is None:
650 if self
._Header
is None:
651 self
._GetHeaderInfo
()
652 if self
._VpdToolGuid
is None:
653 self
._VpdToolGuid
= ''
654 return self
._VpdToolGuid
656 ## Retrieve [SkuIds] section information
659 if self
._SkuIds
is None:
660 self
._SkuIds
= OrderedDict()
661 RecordList
= self
._RawData
[MODEL_EFI_SKU_ID
, self
._Arch
]
662 for Record
in RecordList
:
664 EdkLogger
.error('build', FORMAT_INVALID
, 'No Sku ID number',
665 File
=self
.MetaFile
, Line
=Record
[-1])
667 EdkLogger
.error('build', FORMAT_INVALID
, 'No Sku ID name',
668 File
=self
.MetaFile
, Line
=Record
[-1])
669 if not Pattern
.match(Record
[0]) and not HexPattern
.match(Record
[0]):
670 EdkLogger
.error('build', FORMAT_INVALID
, "The format of the Sku ID number is invalid. It only support Integer and HexNumber",
671 File
=self
.MetaFile
, Line
=Record
[-1])
672 if not SkuIdPattern
.match(Record
[1]) or (Record
[2] and not SkuIdPattern
.match(Record
[2])):
673 EdkLogger
.error('build', FORMAT_INVALID
, "The format of the Sku ID name is invalid. The correct format is '(a-zA-Z_)(a-zA-Z0-9_)*'",
674 File
=self
.MetaFile
, Line
=Record
[-1])
675 self
._SkuIds
[Record
[1].upper()] = (str(DscBuildData
.ToInt(Record
[0])), Record
[1].upper(), Record
[2].upper())
676 if TAB_DEFAULT
not in self
._SkuIds
:
677 self
._SkuIds
[TAB_DEFAULT
] = ("0", TAB_DEFAULT
, TAB_DEFAULT
)
678 if TAB_COMMON
not in self
._SkuIds
:
679 self
._SkuIds
[TAB_COMMON
] = ("0", TAB_DEFAULT
, TAB_DEFAULT
)
684 return int(intstr
, 16) if intstr
.upper().startswith("0X") else int(intstr
)
686 def _GetDefaultStores(self
):
687 if self
.DefaultStores
is None:
688 self
.DefaultStores
= OrderedDict()
689 RecordList
= self
._RawData
[MODEL_EFI_DEFAULT_STORES
, self
._Arch
]
690 for Record
in RecordList
:
692 EdkLogger
.error('build', FORMAT_INVALID
, 'No DefaultStores ID number',
693 File
=self
.MetaFile
, Line
=Record
[-1])
695 EdkLogger
.error('build', FORMAT_INVALID
, 'No DefaultStores ID name',
696 File
=self
.MetaFile
, Line
=Record
[-1])
697 if not Pattern
.match(Record
[0]) and not HexPattern
.match(Record
[0]):
698 EdkLogger
.error('build', FORMAT_INVALID
, "The format of the DefaultStores ID number is invalid. It only support Integer and HexNumber",
699 File
=self
.MetaFile
, Line
=Record
[-1])
700 if not IsValidWord(Record
[1]):
701 EdkLogger
.error('build', FORMAT_INVALID
, "The format of the DefaultStores ID name is invalid. The correct format is '(a-zA-Z0-9_)(a-zA-Z0-9_-.)*'",
702 File
=self
.MetaFile
, Line
=Record
[-1])
703 self
.DefaultStores
[Record
[1].upper()] = (DscBuildData
.ToInt(Record
[0]), Record
[1].upper())
704 if TAB_DEFAULT_STORES_DEFAULT
not in self
.DefaultStores
:
705 self
.DefaultStores
[TAB_DEFAULT_STORES_DEFAULT
] = (0, TAB_DEFAULT_STORES_DEFAULT
)
706 GlobalData
.gDefaultStores
= sorted(self
.DefaultStores
.keys())
707 return self
.DefaultStores
709 def OverrideDuplicateModule(self
):
710 RecordList
= self
._RawData
[MODEL_META_DATA_COMPONENT
, self
._Arch
]
711 Macros
= self
._Macros
712 Macros
["EDK_SOURCE"] = GlobalData
.gEcpSource
714 for Record
in RecordList
:
716 file_guid
= self
._RawData
[MODEL_META_DATA_HEADER
, self
._Arch
, None, ModuleId
]
717 file_guid_str
= file_guid
[0][2] if file_guid
else "NULL"
718 ModuleFile
= PathClass(NormPath(Record
[0], Macros
), GlobalData
.gWorkspace
, Arch
=self
._Arch
)
719 if self
._Arch
!= TAB_ARCH_COMMON
and (file_guid_str
,str(ModuleFile
)) in Components
:
720 self
._RawData
.DisableOverrideComponent(Components
[(file_guid_str
,str(ModuleFile
))])
721 Components
[(file_guid_str
,str(ModuleFile
))] = ModuleId
722 self
._RawData
._PostProcessed
= False
723 ## Retrieve [Components] section information
726 if self
._Modules
is not None:
728 self
.OverrideDuplicateModule()
729 self
._Modules
= OrderedDict()
730 RecordList
= self
._RawData
[MODEL_META_DATA_COMPONENT
, self
._Arch
]
731 Macros
= self
._Macros
732 for Record
in RecordList
:
733 ModuleFile
= PathClass(NormPath(Record
[0], Macros
), GlobalData
.gWorkspace
, Arch
=self
._Arch
)
737 # check the file validation
738 ErrorCode
, ErrorInfo
= ModuleFile
.Validate('.inf')
740 EdkLogger
.error('build', ErrorCode
, File
=self
.MetaFile
, Line
=LineNo
,
743 Module
= ModuleBuildClassObject()
744 Module
.MetaFile
= ModuleFile
746 # get module private library instance
747 RecordList
= self
._RawData
[MODEL_EFI_LIBRARY_CLASS
, self
._Arch
, None, ModuleId
]
748 for Record
in RecordList
:
749 LibraryClass
= Record
[0]
750 LibraryPath
= PathClass(NormPath(Record
[1], Macros
), GlobalData
.gWorkspace
, Arch
=self
._Arch
)
753 # check the file validation
754 ErrorCode
, ErrorInfo
= LibraryPath
.Validate('.inf')
756 EdkLogger
.error('build', ErrorCode
, File
=self
.MetaFile
, Line
=LineNo
,
759 if LibraryClass
== '' or LibraryClass
== 'NULL':
760 self
._NullLibraryNumber
+= 1
761 LibraryClass
= 'NULL%d' % self
._NullLibraryNumber
762 EdkLogger
.verbose("Found forced library for %s\n\t%s [%s]" % (ModuleFile
, LibraryPath
, LibraryClass
))
763 Module
.LibraryClasses
[LibraryClass
] = LibraryPath
764 if LibraryPath
not in self
.LibraryInstances
:
765 self
.LibraryInstances
.append(LibraryPath
)
767 # get module private PCD setting
768 for Type
in [MODEL_PCD_FIXED_AT_BUILD
, MODEL_PCD_PATCHABLE_IN_MODULE
, \
769 MODEL_PCD_FEATURE_FLAG
, MODEL_PCD_DYNAMIC
, MODEL_PCD_DYNAMIC_EX
]:
770 RecordList
= self
._RawData
[Type
, self
._Arch
, None, ModuleId
]
771 for TokenSpaceGuid
, PcdCName
, Setting
, Dummy1
, Dummy2
, Dummy3
, Dummy4
, Dummy5
in RecordList
:
772 TokenList
= GetSplitValueList(Setting
)
773 DefaultValue
= TokenList
[0]
774 # the format is PcdName| Value | VOID* | MaxDatumSize
775 if len(TokenList
) > 2:
776 MaxDatumSize
= TokenList
[2]
779 TypeString
= self
._PCD
_TYPE
_STRING
_[Type
]
780 Pcd
= PcdClassObject(
792 Module
.Pcds
[PcdCName
, TokenSpaceGuid
] = Pcd
794 # get module private build options
795 RecordList
= self
._RawData
[MODEL_META_DATA_BUILD_OPTION
, self
._Arch
, None, ModuleId
]
796 for ToolChainFamily
, ToolChain
, Option
, Dummy1
, Dummy2
, Dummy3
, Dummy4
, Dummy5
in RecordList
:
797 if (ToolChainFamily
, ToolChain
) not in Module
.BuildOptions
:
798 Module
.BuildOptions
[ToolChainFamily
, ToolChain
] = Option
800 OptionString
= Module
.BuildOptions
[ToolChainFamily
, ToolChain
]
801 Module
.BuildOptions
[ToolChainFamily
, ToolChain
] = OptionString
+ " " + Option
803 RecordList
= self
._RawData
[MODEL_META_DATA_HEADER
, self
._Arch
, None, ModuleId
]
805 if len(RecordList
) != 1:
806 EdkLogger
.error('build', OPTION_UNKNOWN
, 'Only FILE_GUID can be listed in <Defines> section.',
807 File
=self
.MetaFile
, ExtraData
=str(ModuleFile
), Line
=LineNo
)
808 ModuleFile
= ProcessDuplicatedInf(ModuleFile
, RecordList
[0][2], GlobalData
.gWorkspace
)
809 ModuleFile
.Arch
= self
._Arch
811 self
._Modules
[ModuleFile
] = Module
814 ## Retrieve all possible library instances used in this platform
816 def LibraryInstances(self
):
817 if self
._LibraryInstances
is None:
819 return self
._LibraryInstances
821 ## Retrieve [LibraryClasses] information
823 def LibraryClasses(self
):
824 if self
._LibraryClasses
is None:
825 self
._LibraryInstances
= []
827 # tdict is a special dict kind of type, used for selecting correct
828 # library instance for given library class and module type
830 LibraryClassDict
= tdict(True, 3)
831 # track all library class names
832 LibraryClassSet
= set()
833 RecordList
= self
._RawData
[MODEL_EFI_LIBRARY_CLASS
, self
._Arch
, None, -1]
834 Macros
= self
._Macros
835 for Record
in RecordList
:
836 LibraryClass
, LibraryInstance
, Dummy
, Arch
, ModuleType
, Dummy
, Dummy
, LineNo
= Record
837 if LibraryClass
== '' or LibraryClass
== 'NULL':
838 self
._NullLibraryNumber
+= 1
839 LibraryClass
= 'NULL%d' % self
._NullLibraryNumber
840 EdkLogger
.verbose("Found forced library for arch=%s\n\t%s [%s]" % (Arch
, LibraryInstance
, LibraryClass
))
841 LibraryClassSet
.add(LibraryClass
)
842 LibraryInstance
= PathClass(NormPath(LibraryInstance
, Macros
), GlobalData
.gWorkspace
, Arch
=self
._Arch
)
843 # check the file validation
844 ErrorCode
, ErrorInfo
= LibraryInstance
.Validate('.inf')
846 EdkLogger
.error('build', ErrorCode
, File
=self
.MetaFile
, Line
=LineNo
,
849 if ModuleType
!= TAB_COMMON
and ModuleType
not in SUP_MODULE_LIST
:
850 EdkLogger
.error('build', OPTION_UNKNOWN
, "Unknown module type [%s]" % ModuleType
,
851 File
=self
.MetaFile
, ExtraData
=LibraryInstance
, Line
=LineNo
)
852 LibraryClassDict
[Arch
, ModuleType
, LibraryClass
] = LibraryInstance
853 if LibraryInstance
not in self
._LibraryInstances
:
854 self
._LibraryInstances
.append(LibraryInstance
)
856 # resolve the specific library instance for each class and each module type
857 self
._LibraryClasses
= tdict(True)
858 for LibraryClass
in LibraryClassSet
:
859 # try all possible module types
860 for ModuleType
in SUP_MODULE_LIST
:
861 LibraryInstance
= LibraryClassDict
[self
._Arch
, ModuleType
, LibraryClass
]
862 if LibraryInstance
is None:
864 self
._LibraryClasses
[LibraryClass
, ModuleType
] = LibraryInstance
866 RecordList
= self
._RawData
[MODEL_EFI_LIBRARY_INSTANCE
, self
._Arch
]
867 for Record
in RecordList
:
868 File
= PathClass(NormPath(Record
[0], Macros
), GlobalData
.gWorkspace
, Arch
=self
._Arch
)
870 # check the file validation
871 ErrorCode
, ErrorInfo
= File
.Validate('.inf')
873 EdkLogger
.error('build', ErrorCode
, File
=self
.MetaFile
, Line
=LineNo
,
875 if File
not in self
._LibraryInstances
:
876 self
._LibraryInstances
.append(File
)
878 # we need the module name as the library class name, so we have
879 # to parse it here. (self._Bdb[] will trigger a file parse if it
880 # hasn't been parsed)
882 Library
= self
._Bdb
[File
, self
._Arch
, self
._Target
, self
._Toolchain
]
883 self
._LibraryClasses
[Library
.BaseName
, ':dummy:'] = Library
884 return self
._LibraryClasses
886 def _ValidatePcd(self
, PcdCName
, TokenSpaceGuid
, Setting
, PcdType
, LineNo
):
887 if not self
._DecPcds
:
890 if GlobalData
.gFdfParser
:
891 FdfInfList
= GlobalData
.gFdfParser
.Profile
.InfList
894 for Inf
in FdfInfList
:
895 ModuleFile
= PathClass(NormPath(Inf
), GlobalData
.gWorkspace
, Arch
=self
._Arch
)
896 if ModuleFile
in self
._Modules
:
898 ModuleData
= self
._Bdb
[ModuleFile
, self
._Arch
, self
._Target
, self
._Toolchain
]
899 PkgSet
.update(ModuleData
.Packages
)
901 self
._DecPcds
, self
._GuidDict
= GetDeclaredPcd(self
, self
._Bdb
, self
._Arch
, self
._Target
, self
._Toolchain
, PkgSet
)
902 self
._GuidDict
.update(GlobalData
.gPlatformPcds
)
904 if (PcdCName
, TokenSpaceGuid
) not in self
._DecPcds
:
905 EdkLogger
.error('build', PARSER_ERROR
,
906 "Pcd (%s.%s) defined in DSC is not declared in DEC files referenced in INF files in FDF. Arch: ['%s']" % (TokenSpaceGuid
, PcdCName
, self
._Arch
),
907 File
=self
.MetaFile
, Line
=LineNo
)
908 ValueList
, IsValid
, Index
= AnalyzeDscPcd(Setting
, PcdType
, self
._DecPcds
[PcdCName
, TokenSpaceGuid
].DatumType
)
910 if PcdType
not in [MODEL_PCD_FEATURE_FLAG
, MODEL_PCD_FIXED_AT_BUILD
]:
911 EdkLogger
.error('build', FORMAT_INVALID
, "Pcd format incorrect.", File
=self
.MetaFile
, Line
=LineNo
,
912 ExtraData
="%s.%s|%s" % (TokenSpaceGuid
, PcdCName
, Setting
))
914 if ValueList
[2] == '-1':
915 EdkLogger
.error('build', FORMAT_INVALID
, "Pcd format incorrect.", File
=self
.MetaFile
, Line
=LineNo
,
916 ExtraData
="%s.%s|%s" % (TokenSpaceGuid
, PcdCName
, Setting
))
918 DatumType
= self
._DecPcds
[PcdCName
, TokenSpaceGuid
].DatumType
919 if "{CODE(" not in ValueList
[Index
]:
921 ValueList
[Index
] = ValueExpressionEx(ValueList
[Index
], DatumType
, self
._GuidDict
)(True)
922 except BadExpression
as Value
:
923 EdkLogger
.error('Parser', FORMAT_INVALID
, Value
, File
=self
.MetaFile
, Line
=LineNo
,
924 ExtraData
="PCD [%s.%s] Value \"%s\" " % (
925 TokenSpaceGuid
, PcdCName
, ValueList
[Index
]))
926 except EvaluationException
as Excpt
:
927 if hasattr(Excpt
, 'Pcd'):
928 if Excpt
.Pcd
in GlobalData
.gPlatformOtherPcds
:
929 EdkLogger
.error('Parser', FORMAT_INVALID
, "Cannot use this PCD (%s) in an expression as"
930 " it must be defined in a [PcdsFixedAtBuild] or [PcdsFeatureFlag] section"
931 " of the DSC file" % Excpt
.Pcd
,
932 File
=self
.MetaFile
, Line
=LineNo
)
934 EdkLogger
.error('Parser', FORMAT_INVALID
, "PCD (%s) is not defined in DSC file" % Excpt
.Pcd
,
935 File
=self
.MetaFile
, Line
=LineNo
)
937 EdkLogger
.error('Parser', FORMAT_INVALID
, "Invalid expression: %s" % str(Excpt
),
938 File
=self
.MetaFile
, Line
=LineNo
)
941 Valid
, ErrStr
= CheckPcdDatum(self
._DecPcds
[PcdCName
, TokenSpaceGuid
].DatumType
, ValueList
[Index
])
943 EdkLogger
.error('build', FORMAT_INVALID
, ErrStr
, File
=self
.MetaFile
, Line
=LineNo
,
944 ExtraData
="%s.%s" % (TokenSpaceGuid
, PcdCName
))
945 if PcdType
in (MODEL_PCD_DYNAMIC_DEFAULT
, MODEL_PCD_DYNAMIC_EX_DEFAULT
, MODEL_PCD_FIXED_AT_BUILD
, MODEL_PCD_PATCHABLE_IN_MODULE
):
946 if self
._DecPcds
[PcdCName
, TokenSpaceGuid
].DatumType
.strip() != ValueList
[1].strip():
947 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
,
948 ExtraData
="%s.%s|%s" % (TokenSpaceGuid
, PcdCName
, Setting
))
949 if (TokenSpaceGuid
+ '.' + PcdCName
) in GlobalData
.gPlatformPcds
:
950 if GlobalData
.gPlatformPcds
[TokenSpaceGuid
+ '.' + PcdCName
] != ValueList
[Index
]:
951 GlobalData
.gPlatformPcds
[TokenSpaceGuid
+ '.' + PcdCName
] = ValueList
[Index
]
954 def _FilterPcdBySkuUsage(self
, Pcds
):
955 available_sku
= self
.SkuIdMgr
.AvailableSkuIdSet
956 sku_usage
= self
.SkuIdMgr
.SkuUsageType
957 if sku_usage
== SkuClass
.SINGLE
:
960 Pcds
[pcdname
].SkuInfoList
= {TAB_DEFAULT
:pcd
.SkuInfoList
[skuid
] for skuid
in pcd
.SkuInfoList
if skuid
in available_sku
}
961 if isinstance(pcd
, StructurePcd
) and pcd
.SkuOverrideValues
:
962 Pcds
[pcdname
].SkuOverrideValues
= {TAB_DEFAULT
:pcd
.SkuOverrideValues
[skuid
] for skuid
in pcd
.SkuOverrideValues
if skuid
in available_sku
}
966 Pcds
[pcdname
].SkuInfoList
= {skuid
:pcd
.SkuInfoList
[skuid
] for skuid
in pcd
.SkuInfoList
if skuid
in available_sku
}
967 if isinstance(pcd
, StructurePcd
) and pcd
.SkuOverrideValues
:
968 Pcds
[pcdname
].SkuOverrideValues
= {skuid
:pcd
.SkuOverrideValues
[skuid
] for skuid
in pcd
.SkuOverrideValues
if skuid
in available_sku
}
971 def CompleteHiiPcdsDefaultStores(self
, Pcds
):
972 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
]]]
973 DefaultStoreMgr
= DefaultStore(self
.DefaultStores
)
975 for skuid
in pcd
.SkuInfoList
:
976 skuobj
= pcd
.SkuInfoList
.get(skuid
)
977 if TAB_DEFAULT_STORES_DEFAULT
not in skuobj
.DefaultStoreDict
:
978 PcdDefaultStoreSet
= set(defaultstorename
for defaultstorename
in skuobj
.DefaultStoreDict
)
979 mindefaultstorename
= DefaultStoreMgr
.GetMin(PcdDefaultStoreSet
)
980 skuobj
.DefaultStoreDict
[TAB_DEFAULT_STORES_DEFAULT
] = skuobj
.DefaultStoreDict
[mindefaultstorename
]
983 def RecoverCommandLinePcd(self
):
984 def UpdateCommandLineValue(pcd
):
985 if pcd
.Type
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_FIXED_AT_BUILD
],
986 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_PATCHABLE_IN_MODULE
]]:
987 pcd
.PcdValueFromComm
= pcd
.DefaultValue
988 elif pcd
.Type
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_HII
], self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_HII
]]:
989 pcd
.PcdValueFromComm
= pcd
.SkuInfoList
.get(TAB_DEFAULT
).HiiDefaultValue
991 pcd
.PcdValueFromComm
= pcd
.SkuInfoList
.get(TAB_DEFAULT
).DefaultValue
992 for pcd
in self
._Pcds
:
993 if isinstance(self
._Pcds
[pcd
], StructurePcd
) and (self
._Pcds
[pcd
].PcdValueFromComm
or self
._Pcds
[pcd
].PcdFieldValueFromComm
):
994 UpdateCommandLineValue(self
._Pcds
[pcd
])
996 def __ParsePcdFromCommandLine(self
):
997 if GlobalData
.BuildOptionPcd
:
998 for i
, pcd
in enumerate(GlobalData
.BuildOptionPcd
):
999 if isinstance(pcd
, tuple):
1001 (pcdname
, pcdvalue
) = pcd
.split('=')
1003 EdkLogger
.error('build', AUTOGEN_ERROR
, "No Value specified for the PCD %s." % (pcdname
))
1005 (Name1
, Name2
) = pcdname
.split('.', 1)
1007 (Name3
, FieldName
) = Name2
.split(".", 1)
1008 if ((Name3
, Name1
)) in self
.DecPcds
:
1009 HasTokenSpace
= True
1011 TokenSpaceGuidCName
= Name1
1015 TokenSpaceGuidCName
= ''
1016 HasTokenSpace
= False
1018 if ((Name2
, Name1
)) in self
.DecPcds
:
1019 HasTokenSpace
= True
1021 TokenSpaceGuidCName
= Name1
1026 TokenSpaceGuidCName
= ''
1027 HasTokenSpace
= False
1030 TokenCName
= pcdname
1031 TokenSpaceGuidCName
= ''
1032 HasTokenSpace
= False
1033 TokenSpaceGuidCNameList
= []
1036 DisplayName
= TokenCName
1038 DisplayName
= TokenCName
+ '.' + FieldName
1039 if not HasTokenSpace
:
1040 for key
in self
.DecPcds
:
1041 PcdItem
= self
.DecPcds
[key
]
1042 if TokenCName
== PcdItem
.TokenCName
:
1043 if not PcdItem
.TokenSpaceGuidCName
in TokenSpaceGuidCNameList
:
1044 if len (TokenSpaceGuidCNameList
) < 1:
1045 TokenSpaceGuidCNameList
.append(PcdItem
.TokenSpaceGuidCName
)
1046 TokenSpaceGuidCName
= PcdItem
.TokenSpaceGuidCName
1047 PcdDatumType
= PcdItem
.DatumType
1053 "The Pcd %s is found under multiple different TokenSpaceGuid: %s and %s." % (DisplayName
, PcdItem
.TokenSpaceGuidCName
, TokenSpaceGuidCNameList
[0])
1056 if (TokenCName
, TokenSpaceGuidCName
) in self
.DecPcds
:
1057 PcdDatumType
= self
.DecPcds
[(TokenCName
, TokenSpaceGuidCName
)].DatumType
1061 EdkLogger
.error('build', AUTOGEN_ERROR
, "The Pcd %s.%s is not found in the DEC file." % (TokenSpaceGuidCName
, DisplayName
))
1063 EdkLogger
.error('build', AUTOGEN_ERROR
, "The Pcd %s is not found in the DEC file." % (DisplayName
))
1064 pcdvalue
= pcdvalue
.replace("\\\\\\'", '\\\\\\"').replace('\\\'', '\'').replace('\\\\\\"', "\\'")
1066 pcdvalue
= DscBuildData
.HandleFlexiblePcd(TokenSpaceGuidCName
, TokenCName
, pcdvalue
, PcdDatumType
, self
._GuidDict
, FieldName
)
1068 pcdvalue
= DscBuildData
.HandleFlexiblePcd(TokenSpaceGuidCName
, TokenCName
, pcdvalue
, PcdDatumType
, self
._GuidDict
)
1069 IsValid
, Cause
= CheckPcdDatum(PcdDatumType
, pcdvalue
)
1071 EdkLogger
.error("build", FORMAT_INVALID
, Cause
, ExtraData
="%s.%s" % (TokenSpaceGuidCName
, TokenCName
))
1072 GlobalData
.BuildOptionPcd
[i
] = (TokenSpaceGuidCName
, TokenCName
, FieldName
, pcdvalue
, ("build command options", 1))
1074 if GlobalData
.BuildOptionPcd
:
1075 for pcd
in GlobalData
.BuildOptionPcd
:
1076 (TokenSpaceGuidCName
, TokenCName
, FieldName
, pcdvalue
, _
) = pcd
1077 for BuildData
in self
._Bdb
._CACHE
_.values():
1078 if BuildData
.Arch
!= self
.Arch
:
1080 if BuildData
.MetaFile
.Ext
== '.dec' or BuildData
.MetaFile
.Ext
== '.dsc':
1082 for key
in BuildData
.Pcds
:
1083 PcdItem
= BuildData
.Pcds
[key
]
1084 if (TokenSpaceGuidCName
, TokenCName
) == (PcdItem
.TokenSpaceGuidCName
, PcdItem
.TokenCName
) and FieldName
=="":
1085 PcdItem
.DefaultValue
= pcdvalue
1086 PcdItem
.PcdValueFromComm
= pcdvalue
1087 #In command line, the latter full assign value in commandLine should override the former field assign value.
1088 #For example, --pcd Token.pcd.field="" --pcd Token.pcd=H"{}"
1091 if GlobalData
.BuildOptionPcd
:
1092 for pcdTuple
in GlobalData
.BuildOptionPcd
:
1093 TokenSpaceGuid
, Token
, Field
= pcdTuple
[0], pcdTuple
[1], pcdTuple
[2]
1095 if (TokenSpaceGuid
, Token
) not in field_assign
:
1096 field_assign
[TokenSpaceGuid
, Token
] = []
1097 field_assign
[TokenSpaceGuid
, Token
].append(pcdTuple
)
1099 if (TokenSpaceGuid
, Token
) in field_assign
:
1100 delete_assign
.extend(field_assign
[TokenSpaceGuid
, Token
])
1101 field_assign
[TokenSpaceGuid
, Token
] = []
1102 for item
in delete_assign
:
1103 GlobalData
.BuildOptionPcd
.remove(item
)
1106 def HandleFlexiblePcd(TokenSpaceGuidCName
, TokenCName
, PcdValue
, PcdDatumType
, GuidDict
, FieldName
=''):
1109 TokenCName
+= '.' + FieldName
1110 if PcdValue
.startswith('H'):
1111 if FieldName
and IsFieldValueAnArray(PcdValue
[1:]):
1112 PcdDatumType
= TAB_VOID
1114 if FieldName
and not IsArray
:
1117 PcdValue
= ValueExpressionEx(PcdValue
[1:], PcdDatumType
, GuidDict
)(True)
1118 except BadExpression
as Value
:
1119 EdkLogger
.error('Parser', FORMAT_INVALID
, 'PCD [%s.%s] Value "%s", %s' %
1120 (TokenSpaceGuidCName
, TokenCName
, PcdValue
, Value
))
1121 elif PcdValue
.startswith("L'") or PcdValue
.startswith("'"):
1122 if FieldName
and IsFieldValueAnArray(PcdValue
):
1123 PcdDatumType
= TAB_VOID
1125 if FieldName
and not IsArray
:
1128 PcdValue
= ValueExpressionEx(PcdValue
, PcdDatumType
, GuidDict
)(True)
1129 except BadExpression
as Value
:
1130 EdkLogger
.error('Parser', FORMAT_INVALID
, 'PCD [%s.%s] Value "%s", %s' %
1131 (TokenSpaceGuidCName
, TokenCName
, PcdValue
, Value
))
1132 elif PcdValue
.startswith('L'):
1133 PcdValue
= 'L"' + PcdValue
[1:] + '"'
1134 if FieldName
and IsFieldValueAnArray(PcdValue
):
1135 PcdDatumType
= TAB_VOID
1137 if FieldName
and not IsArray
:
1140 PcdValue
= ValueExpressionEx(PcdValue
, 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
))
1145 if PcdValue
.upper() == 'FALSE':
1147 if PcdValue
.upper() == 'TRUE':
1150 if PcdDatumType
not in TAB_PCD_NUMERIC_TYPES
:
1151 PcdValue
= '"' + PcdValue
+ '"'
1152 elif not PcdValue
.isdigit() and not PcdValue
.upper().startswith('0X'):
1153 PcdValue
= '"' + PcdValue
+ '"'
1157 if PcdValue
.upper().startswith('0X'):
1160 Num
= int(PcdValue
, Base
)
1162 PcdValue
= '"' + PcdValue
+ '"'
1163 if IsFieldValueAnArray(PcdValue
):
1164 PcdDatumType
= TAB_VOID
1169 PcdValue
= ValueExpressionEx(PcdValue
, PcdDatumType
, GuidDict
)(True)
1170 except BadExpression
as Value
:
1171 EdkLogger
.error('Parser', FORMAT_INVALID
, 'PCD [%s.%s] Value "%s", %s' %
1172 (TokenSpaceGuidCName
, TokenCName
, PcdValue
, Value
))
1175 ## Retrieve all PCD settings in platform
1178 if self
._Pcds
is None:
1179 self
._Pcds
= OrderedDict()
1180 self
.__ParsePcdFromCommandLine
()
1181 self
._Pcds
.update(self
._GetPcd
(MODEL_PCD_FIXED_AT_BUILD
))
1182 self
._Pcds
.update(self
._GetPcd
(MODEL_PCD_PATCHABLE_IN_MODULE
))
1183 self
._Pcds
.update(self
._GetPcd
(MODEL_PCD_FEATURE_FLAG
))
1184 self
._Pcds
.update(self
._GetDynamicPcd
(MODEL_PCD_DYNAMIC_DEFAULT
))
1185 self
._Pcds
.update(self
._GetDynamicHiiPcd
(MODEL_PCD_DYNAMIC_HII
))
1186 self
._Pcds
.update(self
._GetDynamicVpdPcd
(MODEL_PCD_DYNAMIC_VPD
))
1187 self
._Pcds
.update(self
._GetDynamicPcd
(MODEL_PCD_DYNAMIC_EX_DEFAULT
))
1188 self
._Pcds
.update(self
._GetDynamicHiiPcd
(MODEL_PCD_DYNAMIC_EX_HII
))
1189 self
._Pcds
.update(self
._GetDynamicVpdPcd
(MODEL_PCD_DYNAMIC_EX_VPD
))
1191 self
._Pcds
= self
.CompletePcdValues(self
._Pcds
)
1192 self
._Pcds
= self
.OverrideByFdfOverAll(self
._Pcds
)
1193 self
._Pcds
= self
.OverrideByCommOverAll(self
._Pcds
)
1194 self
._Pcds
= self
.UpdateStructuredPcds(MODEL_PCD_TYPE_LIST
, self
._Pcds
)
1195 self
._Pcds
= self
.CompleteHiiPcdsDefaultStores(self
._Pcds
)
1196 self
._Pcds
= self
._FilterPcdBySkuUsage
(self
._Pcds
)
1198 self
.RecoverCommandLinePcd()
1201 ## Retrieve [BuildOptions]
1203 def BuildOptions(self
):
1204 if self
._BuildOptions
is None:
1205 self
._BuildOptions
= OrderedDict()
1207 # Retrieve build option for EDKII and EDK style module
1209 for CodeBase
in (EDKII_NAME
, EDK_NAME
):
1210 RecordList
= self
._RawData
[MODEL_META_DATA_BUILD_OPTION
, self
._Arch
, CodeBase
]
1211 for ToolChainFamily
, ToolChain
, Option
, Dummy1
, Dummy2
, Dummy3
, Dummy4
, Dummy5
in RecordList
:
1212 if Dummy3
.upper() != TAB_COMMON
:
1214 CurKey
= (ToolChainFamily
, ToolChain
, CodeBase
)
1216 # Only flags can be appended
1218 if CurKey
not in self
._BuildOptions
or not ToolChain
.endswith('_FLAGS') or Option
.startswith('='):
1219 self
._BuildOptions
[CurKey
] = Option
1221 if ' ' + Option
not in self
._BuildOptions
[CurKey
]:
1222 self
._BuildOptions
[CurKey
] += ' ' + Option
1223 return self
._BuildOptions
1225 def GetBuildOptionsByModuleType(self
, Edk
, ModuleType
):
1226 if self
._ModuleTypeOptions
is None:
1227 self
._ModuleTypeOptions
= OrderedDict()
1228 if (Edk
, ModuleType
) not in self
._ModuleTypeOptions
:
1229 options
= OrderedDict()
1230 self
._ModuleTypeOptions
[Edk
, ModuleType
] = options
1231 DriverType
= '%s.%s' % (Edk
, ModuleType
)
1232 CommonDriverType
= '%s.%s' % (TAB_COMMON
, ModuleType
)
1233 RecordList
= self
._RawData
[MODEL_META_DATA_BUILD_OPTION
, self
._Arch
]
1234 for ToolChainFamily
, ToolChain
, Option
, Dummy1
, Dummy2
, Dummy3
, Dummy4
, Dummy5
in RecordList
:
1235 Type
= Dummy2
+ '.' + Dummy3
1236 if Type
.upper() == DriverType
.upper() or Type
.upper() == CommonDriverType
.upper():
1237 Key
= (ToolChainFamily
, ToolChain
, Edk
)
1238 if Key
not in options
or not ToolChain
.endswith('_FLAGS') or Option
.startswith('='):
1239 options
[Key
] = Option
1241 if ' ' + Option
not in options
[Key
]:
1242 options
[Key
] += ' ' + Option
1243 return self
._ModuleTypeOptions
[Edk
, ModuleType
]
1246 def GetStructurePcdInfo(PcdSet
):
1247 structure_pcd_data
= defaultdict(list)
1249 structure_pcd_data
[(item
[0], item
[1])].append(item
)
1251 return structure_pcd_data
1254 def OverrideByFdf(StruPcds
,workspace
):
1255 if GlobalData
.gFdfParser
is None:
1257 StructurePcdInFdf
= OrderedDict()
1258 fdfpcd
= GlobalData
.gFdfParser
.Profile
.PcdDict
1259 fdfpcdlocation
= GlobalData
.gFdfParser
.Profile
.PcdLocalDict
1260 for item
in fdfpcd
:
1261 if len(item
[2]) and (item
[0],item
[1]) in StruPcds
:
1262 StructurePcdInFdf
[(item
[1],item
[0],item
[2] )] = fdfpcd
[item
]
1263 GlobalPcds
= {(item
[0],item
[1]) for item
in StructurePcdInFdf
}
1264 for Pcd
in StruPcds
.values():
1265 if (Pcd
.TokenSpaceGuidCName
,Pcd
.TokenCName
) not in GlobalPcds
:
1267 FieldValues
= OrderedDict()
1268 for item
in StructurePcdInFdf
:
1269 if (Pcd
.TokenSpaceGuidCName
,Pcd
.TokenCName
) == (item
[0],item
[1]) and item
[2]:
1270 FieldValues
[item
[2]] = StructurePcdInFdf
[item
]
1271 for field
in FieldValues
:
1272 if field
not in Pcd
.PcdFieldValueFromFdf
:
1273 Pcd
.PcdFieldValueFromFdf
[field
] = ["","",""]
1274 Pcd
.PcdFieldValueFromFdf
[field
][0] = FieldValues
[field
]
1275 Pcd
.PcdFieldValueFromFdf
[field
][1] = os
.path
.relpath(fdfpcdlocation
[(Pcd
.TokenCName
,Pcd
.TokenSpaceGuidCName
,field
)][0],workspace
)
1276 Pcd
.PcdFieldValueFromFdf
[field
][2] = fdfpcdlocation
[(Pcd
.TokenCName
,Pcd
.TokenSpaceGuidCName
,field
)][1]
1281 def OverrideByComm(StruPcds
):
1282 StructurePcdInCom
= OrderedDict()
1283 for item
in GlobalData
.BuildOptionPcd
:
1284 if len(item
) == 5 and (item
[1], item
[0]) in StruPcds
:
1285 StructurePcdInCom
[(item
[0], item
[1], item
[2] )] = (item
[3], item
[4])
1286 GlobalPcds
= {(item
[0], item
[1]) for item
in StructurePcdInCom
}
1287 for Pcd
in StruPcds
.values():
1288 if (Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
) not in GlobalPcds
:
1290 FieldValues
= OrderedDict()
1291 for item
in StructurePcdInCom
:
1292 if (Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
) == (item
[0], item
[1]) and item
[2]:
1293 FieldValues
[item
[2]] = StructurePcdInCom
[item
]
1294 for field
in FieldValues
:
1295 if field
not in Pcd
.PcdFieldValueFromComm
:
1296 Pcd
.PcdFieldValueFromComm
[field
] = ["", "", ""]
1297 Pcd
.PcdFieldValueFromComm
[field
][0] = FieldValues
[field
][0]
1298 Pcd
.PcdFieldValueFromComm
[field
][1] = FieldValues
[field
][1][0]
1299 Pcd
.PcdFieldValueFromComm
[field
][2] = FieldValues
[field
][1][1]
1302 def OverrideByCommOverAll(self
,AllPcds
):
1303 def CheckStructureInComm(commpcds
):
1306 if len(commpcds
[0]) == 5:
1309 NoFiledValues
= OrderedDict()
1310 if CheckStructureInComm(GlobalData
.BuildOptionPcd
):
1311 StructurePcdInCom
= OrderedDict()
1312 for item
in GlobalData
.BuildOptionPcd
:
1313 StructurePcdInCom
[(item
[0], item
[1], item
[2] )] = (item
[3], item
[4])
1314 for item
in StructurePcdInCom
:
1316 NoFiledValues
[(item
[0], item
[1])] = StructurePcdInCom
[item
]
1318 for item
in GlobalData
.BuildOptionPcd
:
1319 NoFiledValues
[(item
[0], item
[1])] = [item
[2]]
1320 for Guid
, Name
in NoFiledValues
:
1321 if (Name
, Guid
) in AllPcds
:
1322 Pcd
= AllPcds
.get((Name
, Guid
))
1323 if isinstance(self
._DecPcds
.get((Pcd
.TokenCName
, Pcd
.TokenSpaceGuidCName
), None), StructurePcd
):
1324 self
._DecPcds
.get((Pcd
.TokenCName
, Pcd
.TokenSpaceGuidCName
)).PcdValueFromComm
= NoFiledValues
[(Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
)][0]
1326 Pcd
.PcdValueFromComm
= NoFiledValues
[(Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
)][0]
1327 Pcd
.DefaultValue
= NoFiledValues
[(Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
)][0]
1328 for sku
in Pcd
.SkuInfoList
:
1329 SkuInfo
= Pcd
.SkuInfoList
[sku
]
1330 if SkuInfo
.DefaultValue
:
1331 SkuInfo
.DefaultValue
= NoFiledValues
[(Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
)][0]
1333 SkuInfo
.HiiDefaultValue
= NoFiledValues
[(Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
)][0]
1334 for defaultstore
in SkuInfo
.DefaultStoreDict
:
1335 SkuInfo
.DefaultStoreDict
[defaultstore
] = NoFiledValues
[(Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
)][0]
1336 if Pcd
.Type
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_HII
], self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_HII
]]:
1337 if Pcd
.DatumType
== TAB_VOID
:
1338 if not Pcd
.MaxDatumSize
:
1339 Pcd
.MaxDatumSize
= '0'
1340 CurrentSize
= int(Pcd
.MaxDatumSize
, 16) if Pcd
.MaxDatumSize
.upper().startswith("0X") else int(Pcd
.MaxDatumSize
)
1341 OptionSize
= len((StringToArray(Pcd
.PcdValueFromComm
)).split(","))
1342 MaxSize
= max(CurrentSize
, OptionSize
)
1343 Pcd
.MaxDatumSize
= str(MaxSize
)
1345 PcdInDec
= self
.DecPcds
.get((Name
, Guid
))
1347 PcdInDec
.PcdValueFromComm
= NoFiledValues
[(Guid
, Name
)][0]
1348 if PcdInDec
.Type
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_FIXED_AT_BUILD
],
1349 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_PATCHABLE_IN_MODULE
],
1350 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_FEATURE_FLAG
],
1351 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC
],
1352 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX
]]:
1353 self
.Pcds
[Name
, Guid
] = copy
.deepcopy(PcdInDec
)
1354 self
.Pcds
[Name
, Guid
].DefaultValue
= NoFiledValues
[( Guid
, Name
)][0]
1355 if PcdInDec
.Type
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC
],
1356 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX
]]:
1357 self
.Pcds
[Name
, Guid
].SkuInfoList
= {TAB_DEFAULT
:SkuInfoClass(TAB_DEFAULT
, self
.SkuIds
[TAB_DEFAULT
][0], '', '', '', '', '', NoFiledValues
[( Guid
, Name
)][0])}
1360 def OverrideByFdfOverAll(self
,AllPcds
):
1362 if GlobalData
.gFdfParser
is None:
1364 NoFiledValues
= GlobalData
.gFdfParser
.Profile
.PcdDict
1365 for Name
,Guid
,Field
in NoFiledValues
:
1368 Value
= NoFiledValues
[(Name
,Guid
,Field
)]
1369 if (Name
,Guid
) in AllPcds
:
1370 Pcd
= AllPcds
.get((Name
,Guid
))
1371 if isinstance(self
._DecPcds
.get((Pcd
.TokenCName
,Pcd
.TokenSpaceGuidCName
), None),StructurePcd
):
1372 self
._DecPcds
.get((Pcd
.TokenCName
,Pcd
.TokenSpaceGuidCName
)).PcdValueFromComm
= Value
1374 Pcd
.PcdValueFromComm
= Value
1375 Pcd
.DefaultValue
= Value
1376 for sku
in Pcd
.SkuInfoList
:
1377 SkuInfo
= Pcd
.SkuInfoList
[sku
]
1378 if SkuInfo
.DefaultValue
:
1379 SkuInfo
.DefaultValue
= Value
1381 SkuInfo
.HiiDefaultValue
= Value
1382 for defaultstore
in SkuInfo
.DefaultStoreDict
:
1383 SkuInfo
.DefaultStoreDict
[defaultstore
] = Value
1384 if Pcd
.Type
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_HII
], self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_HII
]]:
1385 if Pcd
.DatumType
== TAB_VOID
:
1386 if not Pcd
.MaxDatumSize
:
1387 Pcd
.MaxDatumSize
= '0'
1388 CurrentSize
= int(Pcd
.MaxDatumSize
,16) if Pcd
.MaxDatumSize
.upper().startswith("0X") else int(Pcd
.MaxDatumSize
)
1389 OptionSize
= len((StringToArray(Pcd
.PcdValueFromComm
)).split(","))
1390 MaxSize
= max(CurrentSize
, OptionSize
)
1391 Pcd
.MaxDatumSize
= str(MaxSize
)
1393 PcdInDec
= self
.DecPcds
.get((Name
,Guid
))
1395 PcdInDec
.PcdValueFromFdf
= Value
1396 if PcdInDec
.Type
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_FIXED_AT_BUILD
],
1397 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_PATCHABLE_IN_MODULE
],
1398 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_FEATURE_FLAG
]]:
1399 self
.Pcds
[Name
, Guid
] = copy
.deepcopy(PcdInDec
)
1400 self
.Pcds
[Name
, Guid
].DefaultValue
= Value
1403 def ParsePcdNameStruct(self
,NamePart1
,NamePart2
):
1404 TokenSpaceCName
= PcdCName
= DimensionAttr
= Field
= ""
1405 if "." in NamePart1
:
1406 TokenSpaceCName
, TempPcdCName
= NamePart1
.split(".")
1407 if "[" in TempPcdCName
:
1408 PcdCName
= TempPcdCName
[:TempPcdCName
.index("[")]
1409 DimensionAttr
= TempPcdCName
[TempPcdCName
.index("["):]
1411 PcdCName
= TempPcdCName
1414 TokenSpaceCName
= NamePart1
1415 if "[" in NamePart2
:
1416 PcdCName
= NamePart2
[:NamePart2
.index("[")]
1417 DimensionAttr
= NamePart2
[NamePart2
.index("["):]
1419 PcdCName
= NamePart2
1421 return TokenSpaceCName
,PcdCName
,DimensionAttr
,Field
1423 def UpdateStructuredPcds(self
, TypeList
, AllPcds
):
1425 DynamicPcdType
= [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_DEFAULT
],
1426 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_HII
],
1427 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_VPD
],
1428 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_DEFAULT
],
1429 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_HII
],
1430 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_VPD
]]
1433 DefaultStoreMgr
= DefaultStore(self
.DefaultStores
)
1434 SkuIds
= self
.SkuIds
1435 self
.SkuIdMgr
.AvailableSkuIdSet
.update({TAB_DEFAULT
:0})
1436 DefaultStores
= {storename
for pcdobj
in AllPcds
.values() for skuobj
in pcdobj
.SkuInfoList
.values() for storename
in skuobj
.DefaultStoreDict
}
1437 DefaultStores
.add(TAB_DEFAULT_STORES_DEFAULT
)
1440 # Find out all possible PCD candidates for self._Arch
1443 for Type
in TypeList
:
1444 RecordList
.extend(self
._RawData
[Type
, self
._Arch
])
1446 for TokenSpaceGuid
, PcdCName
, Setting
, Arch
, SkuName
, default_store
, Dummy4
, Dummy5
in RecordList
:
1447 SkuName
= SkuName
.upper()
1448 default_store
= default_store
.upper()
1449 SkuName
= TAB_DEFAULT
if SkuName
== TAB_COMMON
else SkuName
1450 if SkuName
not in SkuIds
:
1452 TCName
,PCName
,DimensionAttr
,Field
= self
.ParsePcdNameStruct(TokenSpaceGuid
, PcdCName
)
1453 pcd_in_dec
= self
._DecPcds
.get((PCName
,TCName
), None)
1454 if pcd_in_dec
is None:
1455 EdkLogger
.error('build', PARSER_ERROR
,
1456 "Pcd (%s.%s) defined in DSC is not declared in DEC files. Arch: ['%s']" % (TCName
, PCName
, self
._Arch
),
1457 File
=self
.MetaFile
, Line
= Dummy5
)
1458 if SkuName
in SkuIds
and ("." in TokenSpaceGuid
or "[" in PcdCName
):
1459 if not isinstance (pcd_in_dec
, StructurePcd
):
1460 EdkLogger
.error('build', PARSER_ERROR
,
1461 "Pcd (%s.%s) is not declared as Structure PCD in DEC files. Arch: ['%s']" % (TCName
, PCName
, self
._Arch
),
1462 File
=self
.MetaFile
, Line
= Dummy5
)
1464 S_PcdSet
.append([ TCName
,PCName
,DimensionAttr
,Field
, SkuName
, default_store
, Dummy5
, AnalyzePcdExpression(Setting
)[0]])
1466 # handle pcd value override
1467 StrPcdSet
= DscBuildData
.GetStructurePcdInfo(S_PcdSet
)
1468 S_pcd_set
= OrderedDict()
1469 for str_pcd
in StrPcdSet
:
1470 str_pcd_obj
= Pcds
.get((str_pcd
[1], str_pcd
[0]), None)
1471 str_pcd_dec
= self
._DecPcds
.get((str_pcd
[1], str_pcd
[0]), None)
1472 str_pcd_obj_str
= StructurePcd()
1473 str_pcd_obj_str
.copy(str_pcd_dec
)
1475 str_pcd_obj_str
.copy(str_pcd_obj
)
1476 if str_pcd_obj
.Type
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_HII
], self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_HII
]]:
1477 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
}
1479 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
}
1480 for str_pcd_data
in StrPcdSet
[str_pcd
]:
1481 if str_pcd_data
[4] in SkuIds
:
1482 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])
1483 S_pcd_set
[str_pcd
[1], str_pcd
[0]] = str_pcd_obj_str
1485 # Add the Structure PCD that only defined in DEC, don't have override in DSC file
1486 for Pcd
in self
.DecPcds
:
1487 if isinstance(self
._DecPcds
[Pcd
], StructurePcd
):
1488 if Pcd
not in S_pcd_set
:
1489 str_pcd_obj_str
= StructurePcd()
1490 str_pcd_obj_str
.copy(self
._DecPcds
[Pcd
])
1491 str_pcd_obj
= Pcds
.get(Pcd
, None)
1493 str_pcd_obj_str
.copy(str_pcd_obj
)
1494 if str_pcd_obj
.Type
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_HII
], self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_HII
]]:
1495 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
}
1497 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
}
1498 S_pcd_set
[Pcd
] = str_pcd_obj_str
1499 self
.FilterStrcturePcd(S_pcd_set
)
1501 GlobalData
.gStructurePcd
[self
.Arch
] = S_pcd_set
1502 for stru_pcd
in S_pcd_set
.values():
1503 for skuid
in SkuIds
:
1504 if skuid
in stru_pcd
.SkuOverrideValues
:
1506 nextskuid
= self
.SkuIdMgr
.GetNextSkuId(skuid
)
1508 if skuid
not in stru_pcd
.SkuOverrideValues
:
1509 while nextskuid
not in stru_pcd
.SkuOverrideValues
:
1510 if nextskuid
== TAB_DEFAULT
:
1513 nextskuid
= self
.SkuIdMgr
.GetNextSkuId(nextskuid
)
1514 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})
1516 stru_pcd
.ValueChain
.add((skuid
, ''))
1517 if stru_pcd
.Type
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_HII
], self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_HII
]]:
1518 for skuid
in SkuIds
:
1521 if skuid
not in stru_pcd
.SkuOverrideValues
:
1522 while nextskuid
not in stru_pcd
.SkuOverrideValues
:
1523 if nextskuid
== TAB_DEFAULT
:
1526 nextskuid
= self
.SkuIdMgr
.GetNextSkuId(nextskuid
)
1529 PcdDefaultStoreSet
= set(defaultstorename
for defaultstorename
in stru_pcd
.SkuOverrideValues
[nextskuid
])
1530 mindefaultstorename
= DefaultStoreMgr
.GetMin(PcdDefaultStoreSet
)
1532 for defaultstoreid
in DefaultStores
:
1533 if defaultstoreid
not in stru_pcd
.SkuOverrideValues
[skuid
]:
1534 stru_pcd
.SkuOverrideValues
[skuid
][defaultstoreid
] = CopyDict(stru_pcd
.SkuOverrideValues
[nextskuid
][mindefaultstorename
])
1535 stru_pcd
.ValueChain
.add((skuid
, defaultstoreid
))
1536 S_pcd_set
= DscBuildData
.OverrideByFdf(S_pcd_set
,self
.WorkspaceDir
)
1537 S_pcd_set
= DscBuildData
.OverrideByComm(S_pcd_set
)
1538 Str_Pcd_Values
= self
.GenerateByteArrayValue(S_pcd_set
)
1540 for (skuname
, StoreName
, PcdGuid
, PcdName
, PcdValue
) in Str_Pcd_Values
:
1541 str_pcd_obj
= S_pcd_set
.get((PcdName
, PcdGuid
))
1542 if str_pcd_obj
is None:
1543 print(PcdName
, PcdGuid
)
1545 if str_pcd_obj
.Type
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_HII
],
1546 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_HII
]]:
1547 if skuname
not in str_pcd_obj
.SkuInfoList
:
1548 str_pcd_obj
.SkuInfoList
[skuname
] = SkuInfoClass(SkuIdName
=skuname
, SkuId
=self
.SkuIds
[skuname
][0], HiiDefaultValue
=PcdValue
, DefaultStore
= {StoreName
:PcdValue
})
1550 str_pcd_obj
.SkuInfoList
[skuname
].HiiDefaultValue
= PcdValue
1551 str_pcd_obj
.SkuInfoList
[skuname
].DefaultStoreDict
.update({StoreName
:PcdValue
})
1552 elif str_pcd_obj
.Type
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_FIXED_AT_BUILD
],
1553 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_PATCHABLE_IN_MODULE
]]:
1554 if skuname
in (self
.SkuIdMgr
.SystemSkuId
, TAB_DEFAULT
, TAB_COMMON
):
1555 str_pcd_obj
.DefaultValue
= PcdValue
1557 if skuname
not in str_pcd_obj
.SkuInfoList
:
1558 nextskuid
= self
.SkuIdMgr
.GetNextSkuId(skuname
)
1560 while nextskuid
not in str_pcd_obj
.SkuInfoList
:
1561 if nextskuid
== TAB_DEFAULT
:
1564 nextskuid
= self
.SkuIdMgr
.GetNextSkuId(nextskuid
)
1565 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
)
1566 str_pcd_obj
.SkuInfoList
[skuname
].SkuId
= self
.SkuIds
[skuname
][0]
1567 str_pcd_obj
.SkuInfoList
[skuname
].SkuIdName
= skuname
1569 str_pcd_obj
.SkuInfoList
[skuname
].DefaultValue
= PcdValue
1570 for str_pcd_obj
in S_pcd_set
.values():
1571 if str_pcd_obj
.Type
not in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_HII
],
1572 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_HII
]]:
1574 PcdDefaultStoreSet
= set(defaultstorename
for skuobj
in str_pcd_obj
.SkuInfoList
.values() for defaultstorename
in skuobj
.DefaultStoreDict
)
1575 DefaultStoreObj
= DefaultStore(self
._GetDefaultStores
())
1576 mindefaultstorename
= DefaultStoreObj
.GetMin(PcdDefaultStoreSet
)
1577 str_pcd_obj
.SkuInfoList
[self
.SkuIdMgr
.SystemSkuId
].HiiDefaultValue
= str_pcd_obj
.SkuInfoList
[self
.SkuIdMgr
.SystemSkuId
].DefaultStoreDict
[mindefaultstorename
]
1579 for str_pcd_obj
in S_pcd_set
.values():
1581 str_pcd_obj
.MaxDatumSize
= DscBuildData
.GetStructurePcdMaxSize(str_pcd_obj
)
1582 Pcds
[str_pcd_obj
.TokenCName
, str_pcd_obj
.TokenSpaceGuidCName
] = str_pcd_obj
1583 Pcds
[str_pcd_obj
.TokenCName
, str_pcd_obj
.TokenSpaceGuidCName
].CustomAttribute
['IsStru']=True
1587 if TAB_DEFAULT
not in pcd
.SkuInfoList
and TAB_COMMON
in pcd
.SkuInfoList
:
1588 pcd
.SkuInfoList
[TAB_DEFAULT
] = pcd
.SkuInfoList
[TAB_COMMON
]
1589 del pcd
.SkuInfoList
[TAB_COMMON
]
1590 elif TAB_DEFAULT
in pcd
.SkuInfoList
and TAB_COMMON
in pcd
.SkuInfoList
:
1591 del pcd
.SkuInfoList
[TAB_COMMON
]
1593 map(self
.FilterSkuSettings
, [Pcds
[pcdkey
] for pcdkey
in Pcds
if Pcds
[pcdkey
].Type
in DynamicPcdType
])
1596 def PlatformUsedPcds(self
):
1598 if GlobalData
.gFdfParser
:
1599 FdfInfList
= GlobalData
.gFdfParser
.Profile
.InfList
1600 FdfModuleList
= [PathClass(NormPath(Inf
), GlobalData
.gWorkspace
, Arch
=self
._Arch
) for Inf
in FdfInfList
]
1601 AllModulePcds
= set()
1602 ModuleSet
= set(self
._Modules
.keys() + FdfModuleList
)
1603 for ModuleFile
in ModuleSet
:
1604 ModuleData
= self
._Bdb
[ModuleFile
, self
._Arch
, self
._Target
, self
._Toolchain
]
1605 AllModulePcds
= AllModulePcds | ModuleData
.PcdsName
1606 for ModuleFile
in self
.LibraryInstances
:
1607 ModuleData
= self
._Bdb
.CreateBuildObject(ModuleFile
, self
._Arch
, self
._Target
, self
._Toolchain
)
1608 AllModulePcds
= AllModulePcds | ModuleData
.PcdsName
1609 return AllModulePcds
1611 #Filter the StrucutrePcd that is not used by any module in dsc file and fdf file.
1612 def FilterStrcturePcd(self
, S_pcd_set
):
1613 UnusedStruPcds
= set(S_pcd_set
.keys()) - self
.PlatformUsedPcds
1614 for (Token
, TokenSpaceGuid
) in UnusedStruPcds
:
1615 del S_pcd_set
[(Token
, TokenSpaceGuid
)]
1617 ## Retrieve non-dynamic PCD settings
1619 # @param Type PCD type
1621 # @retval a dict object contains settings of given PCD type
1623 def _GetPcd(self
, Type
):
1624 Pcds
= OrderedDict()
1626 # tdict is a special dict kind of type, used for selecting correct
1627 # PCD settings for certain ARCH
1629 AvailableSkuIdSet
= copy
.copy(self
.SkuIds
)
1631 PcdDict
= tdict(True, 4)
1633 # Find out all possible PCD candidates for self._Arch
1634 RecordList
= self
._RawData
[Type
, self
._Arch
]
1635 PcdValueDict
= OrderedDict()
1636 for TokenSpaceGuid
, PcdCName
, Setting
, Arch
, SkuName
, Dummy3
, Dummy4
, Dummy5
in RecordList
:
1637 SkuName
= SkuName
.upper()
1638 SkuName
= TAB_DEFAULT
if SkuName
== TAB_COMMON
else SkuName
1639 if SkuName
not in AvailableSkuIdSet
:
1640 EdkLogger
.error('build ', PARAMETER_INVALID
, 'Sku %s is not defined in [SkuIds] section' % SkuName
,
1641 File
=self
.MetaFile
, Line
=Dummy5
)
1642 if SkuName
in (self
.SkuIdMgr
.SystemSkuId
, TAB_DEFAULT
, TAB_COMMON
):
1643 if "." not in TokenSpaceGuid
and "[" not in PcdCName
:
1644 PcdSet
.add((PcdCName
, TokenSpaceGuid
, SkuName
, Dummy5
))
1645 PcdDict
[Arch
, PcdCName
, TokenSpaceGuid
, SkuName
] = Setting
1647 for PcdCName
, TokenSpaceGuid
, SkuName
, Dummy4
in PcdSet
:
1648 Setting
= PcdDict
[self
._Arch
, PcdCName
, TokenSpaceGuid
, SkuName
]
1651 PcdValue
, DatumType
, MaxDatumSize
= self
._ValidatePcd
(PcdCName
, TokenSpaceGuid
, Setting
, Type
, Dummy4
)
1653 if int(MaxDatumSize
, 0) > 0xFFFF:
1654 EdkLogger
.error('build', FORMAT_INVALID
, "The size value must not exceed the maximum value of 0xFFFF (UINT16) for %s." % ".".join((TokenSpaceGuid
, PcdCName
)),
1655 File
=self
.MetaFile
, Line
=Dummy4
)
1656 if int(MaxDatumSize
, 0) < 0:
1657 EdkLogger
.error('build', FORMAT_INVALID
, "The size value can't be set to negative value for %s." % ".".join((TokenSpaceGuid
, PcdCName
)),
1658 File
=self
.MetaFile
, Line
=Dummy4
)
1659 if (PcdCName
, TokenSpaceGuid
) in PcdValueDict
:
1660 PcdValueDict
[PcdCName
, TokenSpaceGuid
][SkuName
] = (PcdValue
, DatumType
, MaxDatumSize
)
1662 PcdValueDict
[PcdCName
, TokenSpaceGuid
] = {SkuName
:(PcdValue
, DatumType
, MaxDatumSize
)}
1664 for ((PcdCName
, TokenSpaceGuid
), PcdSetting
) in PcdValueDict
.iteritems():
1665 if self
.SkuIdMgr
.SystemSkuId
in PcdSetting
:
1666 PcdValue
, DatumType
, MaxDatumSize
= PcdSetting
[self
.SkuIdMgr
.SystemSkuId
]
1667 elif TAB_DEFAULT
in PcdSetting
:
1668 PcdValue
, DatumType
, MaxDatumSize
= PcdSetting
[TAB_DEFAULT
]
1669 elif TAB_COMMON
in PcdSetting
:
1670 PcdValue
, DatumType
, MaxDatumSize
= PcdSetting
[TAB_COMMON
]
1676 Pcds
[PcdCName
, TokenSpaceGuid
] = PcdClassObject(
1679 self
._PCD
_TYPE
_STRING
_[Type
],
1688 for SkuName
in PcdValueDict
[PcdCName
, TokenSpaceGuid
]:
1689 Settings
= PcdValueDict
[PcdCName
, TokenSpaceGuid
][SkuName
]
1690 if SkuName
not in Pcds
[PcdCName
, TokenSpaceGuid
].DscRawValue
:
1691 Pcds
[PcdCName
, TokenSpaceGuid
].DscRawValue
[SkuName
] = {}
1692 Pcds
[PcdCName
, TokenSpaceGuid
].DscRawValue
[SkuName
][TAB_DEFAULT_STORES_DEFAULT
] = Settings
[0]
1696 def GetStructurePcdMaxSize(str_pcd
):
1697 pcd_default_value
= str_pcd
.DefaultValue
1698 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()]
1699 sku_values
.append(pcd_default_value
)
1701 def get_length(value
):
1702 Value
= value
.strip()
1704 if Value
.startswith(TAB_GUID
) and Value
.endswith(')'):
1706 if Value
.startswith('L"') and Value
.endswith('"'):
1707 return len(Value
[2:-1])
1708 if Value
[0] == '"' and Value
[-1] == '"':
1709 return len(Value
) - 2
1710 if Value
.strip().startswith("{CODE("):
1711 tmpValue
= RemoveCComments(Value
)
1712 return len(tmpValue
.split(","))
1713 if (Value
[0] == '{' and Value
[-1] == '}'):
1714 return len(Value
.split(","))
1715 if Value
.startswith("L'") and Value
.endswith("'") and len(list(Value
[2:-1])) > 1:
1716 return len(list(Value
[2:-1]))
1717 if Value
[0] == "'" and Value
[-1] == "'" and len(list(Value
[1:-1])) > 1:
1718 return len(Value
) - 2
1721 return str(max(get_length(item
) for item
in sku_values
))
1724 def ExecuteCommand (Command
):
1726 Process
= subprocess
.Popen(Command
, stdout
=subprocess
.PIPE
, stderr
=subprocess
.PIPE
, shell
=True)
1728 EdkLogger
.error('Build', COMMAND_FAILURE
, 'Can not execute command: %s' % Command
)
1729 Result
= Process
.communicate()
1730 return Process
.returncode
, Result
[0], Result
[1]
1733 def IntToCString(Value
, ValueSize
):
1735 if not isinstance (Value
, str):
1736 for Index
in range(0, ValueSize
):
1737 Result
= Result
+ '\\x%02x' % (Value
& 0xff)
1739 Result
= Result
+ '"'
1742 def GenerateSizeFunction(self
, Pcd
):
1743 CApp
= "// Default Value in Dec \n"
1744 CApp
= CApp
+ "void Cal_%s_%s_Size(UINT32 *Size){\n" % (Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
)
1746 if Pcd
.Type
in PCD_DYNAMIC_TYPE_SET | PCD_DYNAMIC_EX_TYPE_SET
:
1747 for skuname
in Pcd
.SkuInfoList
:
1748 skuobj
= Pcd
.SkuInfoList
[skuname
]
1749 if skuobj
.VariableName
:
1750 for defaultstore
in skuobj
.DefaultStoreDict
:
1751 pcddef
= self
.GetPcdDscRawDefaultValue(Pcd
,skuname
,defaultstore
)
1752 if pcddef
and "{CODE(" in pcddef
:
1753 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
)
1755 pcddef
= self
.GetPcdDscRawDefaultValue(Pcd
,skuname
,TAB_DEFAULT_STORES_DEFAULT
)
1756 if pcddef
and "{CODE(" in pcddef
:
1757 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
)
1759 pcddef
= self
.GetPcdDscRawDefaultValue(Pcd
,TAB_DEFAULT
,TAB_DEFAULT_STORES_DEFAULT
)
1760 if pcddef
and "{CODE(" in pcddef
:
1761 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
)
1762 for index
in Pcd
.DefaultValues
:
1763 FieldList
= Pcd
.DefaultValues
[index
]
1766 for FieldName
in FieldList
:
1767 FieldName
= "." + FieldName
1768 IsArray
= IsFieldValueAnArray(FieldList
[FieldName
.strip(".")][0])
1769 if IsArray
and not (FieldList
[FieldName
.strip(".")][0].startswith('{GUID') and FieldList
[FieldName
.strip(".")][0].endswith('}')):
1771 Value
= ValueExpressionEx(FieldList
[FieldName
.strip(".")][0], TAB_VOID
, self
._GuidDict
)(True)
1772 except BadExpression
:
1773 EdkLogger
.error('Build', FORMAT_INVALID
, "Invalid value format for %s. From %s Line %d " %
1774 (".".join((Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
, FieldName
.strip('.'))), FieldList
[FieldName
.strip(".")][1], FieldList
[FieldName
.strip(".")][2]))
1775 Value
, ValueSize
= ParseFieldValue(Value
)
1776 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]);
1779 FieldName_ori
= FieldName
.strip('.')
1780 while '[' in FieldName
:
1781 NewFieldName
= NewFieldName
+ FieldName
.split('[', 1)[0] + '[0]'
1782 ArrayIndex
= int(FieldName
.split('[', 1)[1].split(']', 1)[0])
1783 FieldName
= FieldName
.split(']', 1)[1]
1784 FieldName
= NewFieldName
+ FieldName
1785 while '[' in FieldName
:
1786 FieldName
= FieldName
.rsplit('[', 1)[0]
1787 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])
1788 for skuname
in Pcd
.SkuOverrideValues
:
1789 if skuname
== TAB_COMMON
:
1791 for defaultstorenameitem
in Pcd
.SkuOverrideValues
[skuname
]:
1792 CApp
= CApp
+ "// SkuName: %s, DefaultStoreName: %s \n" % (skuname
, defaultstorenameitem
)
1793 for index
in Pcd
.SkuOverrideValues
[skuname
][defaultstorenameitem
]:
1794 for FieldList
in [Pcd
.SkuOverrideValues
[skuname
][defaultstorenameitem
][index
]]:
1797 for FieldName
in FieldList
:
1798 FieldName
= "." + FieldName
1799 IsArray
= IsFieldValueAnArray(FieldList
[FieldName
.strip(".")][0])
1800 if IsArray
and not (FieldList
[FieldName
.strip(".")][0].startswith('{GUID') and FieldList
[FieldName
.strip(".")][0].endswith('}')):
1802 Value
= ValueExpressionEx(FieldList
[FieldName
.strip(".")][0], TAB_VOID
, self
._GuidDict
)(True)
1803 except BadExpression
:
1804 EdkLogger
.error('Build', FORMAT_INVALID
, "Invalid value format for %s. From %s Line %d " %
1805 (".".join((Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
, FieldName
.strip('.'))), FieldList
[FieldName
.strip(".")][1], FieldList
[FieldName
.strip(".")][2]))
1806 Value
, ValueSize
= ParseFieldValue(Value
)
1807 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]);
1810 FieldName_ori
= FieldName
.strip('.')
1811 while '[' in FieldName
:
1812 NewFieldName
= NewFieldName
+ FieldName
.split('[', 1)[0] + '[0]'
1813 ArrayIndex
= int(FieldName
.split('[', 1)[1].split(']', 1)[0])
1814 FieldName
= FieldName
.split(']', 1)[1]
1815 FieldName
= NewFieldName
+ FieldName
1816 while '[' in FieldName
:
1817 FieldName
= FieldName
.rsplit('[', 1)[0]
1818 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])
1819 if Pcd
.PcdFieldValueFromFdf
:
1820 CApp
= CApp
+ "// From fdf \n"
1821 for FieldName
in Pcd
.PcdFieldValueFromFdf
:
1822 FieldName
= "." + FieldName
1823 IsArray
= IsFieldValueAnArray(Pcd
.PcdFieldValueFromFdf
[FieldName
.strip(".")][0])
1824 if IsArray
and not (Pcd
.PcdFieldValueFromFdf
[FieldName
.strip(".")][0].startswith('{GUID') and Pcd
.PcdFieldValueFromFdf
[FieldName
.strip(".")][0].endswith('}')):
1826 Value
= ValueExpressionEx(Pcd
.PcdFieldValueFromFdf
[FieldName
.strip(".")][0], TAB_VOID
, self
._GuidDict
)(True)
1827 except BadExpression
:
1828 EdkLogger
.error('Build', FORMAT_INVALID
, "Invalid value format for %s. From %s Line %d " %
1829 (".".join((Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
, FieldName
.strip('.'))), Pcd
.PcdFieldValueFromFdf
[FieldName
.strip(".")][1], Pcd
.PcdFieldValueFromFdf
[FieldName
.strip(".")][2]))
1830 Value
, ValueSize
= ParseFieldValue(Value
)
1831 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]);
1834 FieldName_ori
= FieldName
.strip('.')
1835 while '[' in FieldName
:
1836 NewFieldName
= NewFieldName
+ FieldName
.split('[', 1)[0] + '[0]'
1837 ArrayIndex
= int(FieldName
.split('[', 1)[1].split(']', 1)[0])
1838 FieldName
= FieldName
.split(']', 1)[1]
1839 FieldName
= NewFieldName
+ FieldName
1840 while '[' in FieldName
:
1841 FieldName
= FieldName
.rsplit('[', 1)[0]
1842 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])
1843 if Pcd
.PcdFieldValueFromComm
:
1844 CApp
= CApp
+ "// From Command Line \n"
1845 for FieldName
in Pcd
.PcdFieldValueFromComm
:
1846 FieldName
= "." + FieldName
1847 IsArray
= IsFieldValueAnArray(Pcd
.PcdFieldValueFromComm
[FieldName
.strip(".")][0])
1848 if IsArray
and not (Pcd
.PcdFieldValueFromComm
[FieldName
.strip(".")][0].startswith('{GUID') and Pcd
.PcdFieldValueFromComm
[FieldName
.strip(".")][0].endswith('}')):
1850 Value
= ValueExpressionEx(Pcd
.PcdFieldValueFromComm
[FieldName
.strip(".")][0], TAB_VOID
, self
._GuidDict
)(True)
1851 except BadExpression
:
1852 EdkLogger
.error('Build', FORMAT_INVALID
, "Invalid value format for %s. From %s Line %d " %
1853 (".".join((Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
, FieldName
.strip('.'))), Pcd
.PcdFieldValueFromComm
[FieldName
.strip(".")][1], Pcd
.PcdFieldValueFromComm
[FieldName
.strip(".")][2]))
1854 Value
, ValueSize
= ParseFieldValue(Value
)
1855 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]);
1858 FieldName_ori
= FieldName
.strip('.')
1859 while '[' in FieldName
:
1860 NewFieldName
= NewFieldName
+ FieldName
.split('[', 1)[0] + '[0]'
1861 ArrayIndex
= int(FieldName
.split('[', 1)[1].split(']', 1)[0])
1862 FieldName
= FieldName
.split(']', 1)[1]
1863 FieldName
= NewFieldName
+ FieldName
1864 while '[' in FieldName
:
1865 FieldName
= FieldName
.rsplit('[', 1)[0]
1866 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])
1867 if Pcd
.GetPcdMaxSize():
1868 CApp
= CApp
+ " *Size = (%d > *Size ? %d : *Size); // The Pcd maxsize is %d \n" % (Pcd
.GetPcdMaxSize(), Pcd
.GetPcdMaxSize(), Pcd
.GetPcdMaxSize())
1873 def GenerateSizeStatments(Pcd
,skuname
,defaultstorename
):
1875 r_datatype
= [Pcd
.BaseDatumType
]
1876 lastoneisEmpty
= False
1877 for dem
in Pcd
.Capacity
:
1879 EdkLogger
.error('Build', FORMAT_INVALID
, "Invalid value format for %s. " %
1880 (".".join((Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
))))
1881 if dem
== '0' or dem
== "-1":
1882 r_datatype
.append("[1]")
1883 lastoneisEmpty
= True
1885 r_datatype
.append("[" + dem
+ "]")
1887 if Pcd
.Type
in [MODEL_PCD_DYNAMIC_EX_HII
, MODEL_PCD_DYNAMIC_HII
]:
1888 PcdDefValue
= Pcd
.SkuInfoList
.get(skuname
).DefaultStoreDict
.get(defaultstorename
)
1889 elif Pcd
.Type
in [MODEL_PCD_DYNAMIC_EX_DEFAULT
,MODEL_PCD_DYNAMIC_VPD
,MODEL_PCD_DYNAMIC_DEFAULT
,MODEL_PCD_DYNAMIC_EX_VPD
]:
1890 PcdDefValue
= Pcd
.SkuInfoList
.get(skuname
).DefaultValue
1892 PcdDefValue
= Pcd
.DefaultValue
1894 if "{CODE(" not in PcdDefValue
:
1895 sizebasevalue_plus
= "(%s / sizeof(%s) + 1)" % ((DscBuildData
.GetStructurePcdMaxSize(Pcd
), "".join(r_datatype
)))
1896 sizebasevalue
= "(%s / sizeof(%s))" % ((DscBuildData
.GetStructurePcdMaxSize(Pcd
), "".join(r_datatype
)))
1897 sizeof
= "sizeof(%s)" % Pcd
.BaseDatumType
1898 CApp
= ' Size = %s %% %s ? %s : %s ;\n' % ( (DscBuildData
.GetStructurePcdMaxSize(Pcd
), sizeof
, sizebasevalue_plus
, sizebasevalue
))
1900 CApp
= " Size = 0;\n"
1902 CApp
= ' Size = sizeof(%s);\n' % ("".join(r_datatype
) )
1904 CApp
= ' Size = sizeof(%s);\n' % (Pcd
.DatumType
)
1905 CApp
= CApp
+ ' Cal_%s_%s_Size(&Size);\n' % (Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
)
1908 def GetIndicator(self
,index
,FieldName
,Pcd
):
1909 def cleanupindex(indexstr
):
1910 return indexstr
.strip("[").strip("]").strip()
1911 index_elements
= ArrayIndex
.findall(index
)
1912 pcd_capacity
= Pcd
.Capacity
1915 if len(pcd_capacity
)>2:
1916 for i
in xrange(0,len(index_elements
)):
1917 index_ele
= index_elements
[i
]
1918 index_num
= index_ele
.strip("[").strip("]").strip()
1919 if i
== len(index_elements
) -2:
1920 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
]))
1923 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]))
1924 elif len(pcd_capacity
) == 2:
1925 indicator
+= "+ %d*Size/sizeof(%s)/%d + %s)" %(int(cleanupindex(index_elements
[0])),Pcd
.BaseDatumType
,int(pcd_capacity
[0]), index_elements
[1].strip("[").strip("]").strip())
1926 elif len(pcd_capacity
) == 1:
1927 index_ele
= index_elements
[0]
1928 index_num
= index_ele
.strip("[").strip("]").strip()
1929 indicator
+= " + %s)" % (index_num
)
1933 indicator
+= "->" + FieldName
1936 def GetStarNum(self
,Pcd
):
1937 if not Pcd
.IsArray():
1939 elif Pcd
.IsSimpleTypeArray():
1940 return len(Pcd
.Capacity
)
1942 return len(Pcd
.Capacity
) + 1
1943 def GenerateDefaultValueAssignFunction(self
, Pcd
):
1944 CApp
= "// Default value in Dec \n"
1945 CApp
= CApp
+ "void Assign_%s_%s_Default_Value(%s *Pcd){\n" % (Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
, Pcd
.BaseDatumType
)
1946 CApp
= CApp
+ ' UINT32 FieldSize;\n'
1947 CApp
= CApp
+ ' CHAR8 *Value;\n'
1948 DefaultValueFromDec
= Pcd
.DefaultValueFromDec
1949 IsArray
= IsFieldValueAnArray(Pcd
.DefaultValueFromDec
)
1952 DefaultValueFromDec
= ValueExpressionEx(Pcd
.DefaultValueFromDec
, TAB_VOID
)(True)
1953 except BadExpression
:
1954 EdkLogger
.error("Build", FORMAT_INVALID
, "Invalid value format for %s.%s, from DEC: %s" %
1955 (Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
, DefaultValueFromDec
))
1956 DefaultValueFromDec
= StringToArray(DefaultValueFromDec
)
1957 Value
, ValueSize
= ParseFieldValue (DefaultValueFromDec
)
1958 if isinstance(Value
, str):
1959 CApp
= CApp
+ ' Pcd = %s; // From DEC Default Value %s\n' % (Value
, Pcd
.DefaultValueFromDec
)
1962 # Use memcpy() to copy value into field
1964 if "{CODE(" in Pcd
.DefaultValueFromDec
:
1965 CApp
= CApp
+ ' memcpy (Pcd, %s_%s_INIT_Value, sizeof(%s_%s_INIT_Value));\n' % (Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
,Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
)
1967 CApp
= CApp
+ ' Value = %s; // From DEC Default Value %s\n' % (DscBuildData
.IntToCString(Value
, ValueSize
), Pcd
.DefaultValueFromDec
)
1968 CApp
= CApp
+ ' memcpy (Pcd, Value, %d);\n' % (ValueSize
)
1969 for index
in Pcd
.DefaultValues
:
1970 FieldList
= Pcd
.DefaultValues
[index
]
1973 for FieldName
in FieldList
:
1974 IsArray
= IsFieldValueAnArray(FieldList
[FieldName
][0])
1977 FieldList
[FieldName
][0] = ValueExpressionEx(FieldList
[FieldName
][0], TAB_VOID
, self
._GuidDict
)(True)
1978 except BadExpression
:
1979 EdkLogger
.error('Build', FORMAT_INVALID
, "Invalid value format for %s. From %s Line %d " %
1980 (".".join((Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
, FieldName
)), FieldList
[FieldName
][1], FieldList
[FieldName
][2]))
1983 Value
, ValueSize
= ParseFieldValue (FieldList
[FieldName
][0])
1985 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]))
1987 indicator
= self
.GetIndicator(index
, FieldName
,Pcd
)
1988 if isinstance(Value
, str):
1989 CApp
= CApp
+ ' %s = %s; // From %s Line %d Value %s\n' % (indicator
, Value
, FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
1992 # Use memcpy() to copy value into field
1994 CApp
= CApp
+ ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd
.DatumType
, FieldName
)
1995 CApp
= CApp
+ ' Value = %s; // From %s Line %d Value %s\n' % (DscBuildData
.IntToCString(Value
, ValueSize
), FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
1996 CApp
= CApp
+ ' __STATIC_ASSERT((__FIELD_SIZE(%s, %s) >= %d) || (__FIELD_SIZE(%s, %s) == 0), "Input buffer exceeds the buffer array"); // From %s Line %d Value %s\n' % (Pcd
.DatumType
, FieldName
, ValueSize
, Pcd
.DatumType
, FieldName
, FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
1997 CApp
= CApp
+ ' memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName
, ValueSize
, ValueSize
)
1998 CApp
= CApp
+ ' memcpy (&%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (indicator
, ValueSize
, ValueSize
)
2001 if '[' in FieldName
and ']' in FieldName
:
2002 Index
= int(FieldName
.split('[')[1].split(']')[0])
2003 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
)
2005 CApp
= CApp
+ ' %s = %dULL; // From %s Line %d Value %s\n' % (indicator
, Value
, FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
2007 CApp
= CApp
+ ' %s = %d; // From %s Line %d Value %s\n' % (indicator
, Value
, FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
2012 def GenerateDefaultValueAssignStatement(Pcd
):
2013 CApp
= ' Assign_%s_%s_Default_Value(Pcd);\n' % (Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
)
2016 def GetPcdDscRawDefaultValue(self
,Pcd
, SkuName
,DefaultStoreName
):
2017 if Pcd
.Type
in PCD_DYNAMIC_TYPE_SET
or Pcd
.Type
in PCD_DYNAMIC_EX_TYPE_SET
:
2018 if (SkuName
, DefaultStoreName
) == (TAB_DEFAULT
, TAB_DEFAULT_STORES_DEFAULT
):
2019 pcddefaultvalue
= Pcd
.DefaultFromDSC
.get(TAB_DEFAULT
, {}).get(TAB_DEFAULT_STORES_DEFAULT
) if Pcd
.DefaultFromDSC
else None
2021 pcddefaultvalue
= Pcd
.DscRawValue
.get(SkuName
, {}).get(DefaultStoreName
)
2023 pcddefaultvalue
= Pcd
.DscRawValue
.get(SkuName
, {}).get(TAB_DEFAULT_STORES_DEFAULT
)
2025 return pcddefaultvalue
2026 def GenerateInitValueFunction(self
, Pcd
, SkuName
, DefaultStoreName
):
2027 CApp
= "// Value in Dsc for Sku: %s, DefaultStore %s\n" % (SkuName
, DefaultStoreName
)
2028 CApp
= CApp
+ "void Assign_%s_%s_%s_%s_Value(%s *Pcd){\n" % (Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
, SkuName
, DefaultStoreName
, Pcd
.BaseDatumType
)
2029 CApp
= CApp
+ ' UINT32 FieldSize;\n'
2030 CApp
= CApp
+ ' CHAR8 *Value;\n'
2032 CApp
= CApp
+ "// SkuName: %s, DefaultStoreName: %s \n" % (TAB_DEFAULT
, TAB_DEFAULT_STORES_DEFAULT
)
2033 inherit_OverrideValues
= Pcd
.SkuOverrideValues
[SkuName
]
2035 pcddefaultvalue
= self
.GetPcdDscRawDefaultValue(Pcd
, SkuName
, DefaultStoreName
)
2037 FieldList
= pcddefaultvalue
2038 IsArray
= IsFieldValueAnArray(FieldList
)
2040 if "{CODE(" not in FieldList
:
2042 FieldList
= ValueExpressionEx(FieldList
, TAB_VOID
)(True)
2043 except BadExpression
:
2044 EdkLogger
.error("Build", FORMAT_INVALID
, "Invalid value format for %s.%s, from DSC: %s" %
2045 (Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
, FieldList
))
2046 Value
, ValueSize
= ParseFieldValue (FieldList
)
2048 if (SkuName
, DefaultStoreName
) == (TAB_DEFAULT
, TAB_DEFAULT_STORES_DEFAULT
):
2049 if isinstance(Value
, str):
2050 if "{CODE(" in Value
:
2051 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
)
2053 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
)
2056 # Use memcpy() to copy value into field
2058 if Pcd
.IsArray() and "{CODE(" in pcddefaultvalue
:
2059 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
)
2061 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
)
2062 CApp
= CApp
+ ' memcpy (Pcd, Value, %d);\n' % (ValueSize
)
2064 if isinstance(Value
, str):
2065 if "{CODE(" in Value
:
2066 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
)
2068 CApp
= CApp
+ ' Pcd = %s; // From DSC Default Value %s\n' % (Value
, Pcd
.DscRawValue
.get(SkuName
, {}).get(DefaultStoreName
))
2071 # Use memcpy() to copy value into field
2073 if Pcd
.IsArray() and "{CODE(" in pcddefaultvalue
:
2074 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
)
2076 CApp
= CApp
+ ' Value = %s; // From DSC Default Value %s\n' % (DscBuildData
.IntToCString(Value
, ValueSize
), Pcd
.DscRawValue
.get(SkuName
, {}).get(DefaultStoreName
))
2077 CApp
= CApp
+ ' memcpy (Pcd, Value, %d);\n' % (ValueSize
)
2079 inheritvalue
= inherit_OverrideValues
.get(DefaultStoreName
)
2080 if not inheritvalue
:
2082 for index
in inheritvalue
:
2083 FieldList
= inheritvalue
[index
]
2086 if (SkuName
, DefaultStoreName
) == (TAB_DEFAULT
, TAB_DEFAULT_STORES_DEFAULT
) or (( (SkuName
, '') not in Pcd
.ValueChain
) and ( (SkuName
, DefaultStoreName
) not in Pcd
.ValueChain
)):
2087 for FieldName
in FieldList
:
2088 indicator
= self
.GetIndicator(index
, FieldName
,Pcd
)
2089 IsArray
= IsFieldValueAnArray(FieldList
[FieldName
][0])
2092 FieldList
[FieldName
][0] = ValueExpressionEx(FieldList
[FieldName
][0], TAB_VOID
, self
._GuidDict
)(True)
2093 except BadExpression
:
2094 EdkLogger
.error('Build', FORMAT_INVALID
, "Invalid value format for %s. From %s Line %d " %
2095 (".".join((Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
, FieldName
)), FieldList
[FieldName
][1], FieldList
[FieldName
][2]))
2097 Value
, ValueSize
= ParseFieldValue (FieldList
[FieldName
][0])
2099 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]))
2100 if isinstance(Value
, str):
2101 CApp
= CApp
+ ' Pcd->%s = %s; // From %s Line %d Value %s\n' % (FieldName
, Value
, FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
2104 # Use memcpy() to copy value into field
2106 CApp
= CApp
+ ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd
.BaseDatumType
, FieldName
)
2107 CApp
= CApp
+ ' Value = %s; // From %s Line %d Value %s\n' % (DscBuildData
.IntToCString(Value
, ValueSize
), FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
2108 CApp
= CApp
+ ' __STATIC_ASSERT((__FIELD_SIZE(%s, %s) >= %d) || (__FIELD_SIZE(%s, %s) == 0), "Input buffer exceeds the buffer array"); // From %s Line %d Value %s\n' % (Pcd
.DatumType
, FieldName
, ValueSize
, Pcd
.DatumType
, FieldName
, FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
2109 CApp
= CApp
+ ' memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName
, ValueSize
, ValueSize
)
2110 CApp
= CApp
+ ' memcpy (&%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (indicator
, ValueSize
, ValueSize
)
2112 if '[' in FieldName
and ']' in FieldName
:
2113 Index
= int(FieldName
.split('[')[1].split(']')[0])
2114 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
)
2116 CApp
= CApp
+ ' %s = %dULL; // From %s Line %d Value %s\n' % (indicator
, Value
, FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
2118 CApp
= CApp
+ ' %s = %d; // From %s Line %d Value %s\n' % (indicator
, Value
, FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
2123 def GenerateInitValueStatement(Pcd
, SkuName
, DefaultStoreName
):
2124 CApp
= ' Assign_%s_%s_%s_%s_Value(Pcd);\n' % (Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
, SkuName
, DefaultStoreName
)
2127 def GenerateCommandLineValue(self
, Pcd
):
2128 CApp
= "// Value in CommandLine\n"
2129 CApp
= CApp
+ "void Assign_%s_%s_CommandLine_Value(%s *Pcd){\n" % (Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
, Pcd
.BaseDatumType
)
2130 CApp
= CApp
+ ' UINT32 FieldSize;\n'
2131 CApp
= CApp
+ ' CHAR8 *Value;\n'
2133 pcddefaultvalue
= Pcd
.PcdValueFromComm
2134 for FieldList
in [pcddefaultvalue
, Pcd
.PcdFieldValueFromComm
]:
2137 if pcddefaultvalue
and FieldList
== pcddefaultvalue
:
2138 IsArray
= IsFieldValueAnArray(FieldList
)
2141 FieldList
= ValueExpressionEx(FieldList
, TAB_VOID
)(True)
2142 except BadExpression
:
2143 EdkLogger
.error("Build", FORMAT_INVALID
, "Invalid value format for %s.%s, from Command: %s" %
2144 (Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
, FieldList
))
2145 Value
, ValueSize
= ParseFieldValue (FieldList
)
2147 if isinstance(Value
, str):
2148 CApp
= CApp
+ ' Pcd = %s; // From Command Line \n' % (Value
)
2151 # Use memcpy() to copy value into field
2153 CApp
= CApp
+ ' Value = %s; // From Command Line.\n' % (DscBuildData
.IntToCString(Value
, ValueSize
))
2154 CApp
= CApp
+ ' memcpy (Pcd, Value, %d);\n' % (ValueSize
)
2156 for FieldName
in FieldList
:
2157 IsArray
= IsFieldValueAnArray(FieldList
[FieldName
][0])
2160 FieldList
[FieldName
][0] = ValueExpressionEx(FieldList
[FieldName
][0], TAB_VOID
, self
._GuidDict
)(True)
2161 except BadExpression
:
2162 EdkLogger
.error('Build', FORMAT_INVALID
, "Invalid value format for %s. From %s Line %d " %
2163 (".".join((Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
, FieldName
)), FieldList
[FieldName
][1], FieldList
[FieldName
][2]))
2167 Value
, ValueSize
= ParseFieldValue (FieldList
[FieldName
][0])
2169 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]))
2170 if isinstance(Value
, str):
2171 CApp
= CApp
+ ' Pcd->%s = %s; // From %s Line %d Value %s\n' % (FieldName
, Value
, FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
2174 # Use memcpy() to copy value into field
2176 CApp
= CApp
+ ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd
.BaseDatumType
, FieldName
)
2177 CApp
= CApp
+ ' Value = %s; // From %s Line %d Value %s\n' % (DscBuildData
.IntToCString(Value
, ValueSize
), FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
2178 CApp
= CApp
+ ' __STATIC_ASSERT((__FIELD_SIZE(%s, %s) >= %d) || (__FIELD_SIZE(%s, %s) == 0), "Input buffer exceeds the buffer array"); // From %s Line %d Value %s\n' % (Pcd
.DatumType
, FieldName
, ValueSize
, Pcd
.DatumType
, FieldName
, FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
2179 CApp
= CApp
+ ' memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName
, ValueSize
, ValueSize
)
2181 if '[' in FieldName
and ']' in FieldName
:
2182 Index
= int(FieldName
.split('[')[1].split(']')[0])
2183 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
)
2185 CApp
= CApp
+ ' Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName
, Value
, FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
2187 CApp
= CApp
+ ' Pcd->%s = %d; // From %s Line %d Value %s\n' % (FieldName
, Value
, FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
2192 def GenerateCommandLineValueStatement(Pcd
):
2193 CApp
= ' Assign_%s_%s_CommandLine_Value(Pcd);\n' % (Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
)
2195 def GenerateFdfValue(self
,Pcd
):
2196 CApp
= "// Value in Fdf\n"
2197 CApp
= CApp
+ "void Assign_%s_%s_Fdf_Value(%s *Pcd){\n" % (Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
,Pcd
.BaseDatumType
)
2198 CApp
= CApp
+ ' UINT32 FieldSize;\n'
2199 CApp
= CApp
+ ' CHAR8 *Value;\n'
2201 pcddefaultvalue
= Pcd
.PcdValueFromFdf
2202 for FieldList
in [pcddefaultvalue
,Pcd
.PcdFieldValueFromFdf
]:
2205 if pcddefaultvalue
and FieldList
== pcddefaultvalue
:
2206 IsArray
= IsFieldValueAnArray(FieldList
)
2209 FieldList
= ValueExpressionEx(FieldList
, TAB_VOID
)(True)
2210 except BadExpression
:
2211 EdkLogger
.error("Build", FORMAT_INVALID
, "Invalid value format for %s.%s, from Fdf: %s" %
2212 (Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
, FieldList
))
2213 Value
, ValueSize
= ParseFieldValue (FieldList
)
2215 if isinstance(Value
, str):
2216 CApp
= CApp
+ ' Pcd = %s; // From Fdf \n' % (Value
)
2219 # Use memcpy() to copy value into field
2221 CApp
= CApp
+ ' Value = %s; // From Fdf .\n' % (DscBuildData
.IntToCString(Value
, ValueSize
))
2222 CApp
= CApp
+ ' memcpy (Pcd, Value, %d);\n' % (ValueSize
)
2224 for FieldName
in FieldList
:
2225 IsArray
= IsFieldValueAnArray(FieldList
[FieldName
][0])
2228 FieldList
[FieldName
][0] = ValueExpressionEx(FieldList
[FieldName
][0], TAB_VOID
, self
._GuidDict
)(True)
2229 except BadExpression
:
2230 EdkLogger
.error('Build', FORMAT_INVALID
, "Invalid value format for %s. From %s Line %d " %
2231 (".".join((Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
, FieldName
)), FieldList
[FieldName
][1], FieldList
[FieldName
][2]))
2235 Value
, ValueSize
= ParseFieldValue (FieldList
[FieldName
][0])
2237 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]))
2238 if isinstance(Value
, str):
2239 CApp
= CApp
+ ' Pcd->%s = %s; // From %s Line %d Value %s\n' % (FieldName
, Value
, FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
2242 # Use memcpy() to copy value into field
2244 CApp
= CApp
+ ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd
.BaseDatumType
, FieldName
)
2245 CApp
= CApp
+ ' Value = %s; // From %s Line %d Value %s\n' % (DscBuildData
.IntToCString(Value
, ValueSize
), FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
2246 CApp
= CApp
+ ' __STATIC_ASSERT((__FIELD_SIZE(%s, %s) >= %d) || (__FIELD_SIZE(%s, %s) == 0), "Input buffer exceeds the buffer array"); // From %s Line %d Value %s\n' % (Pcd
.DatumType
, FieldName
, ValueSize
, Pcd
.DatumType
, FieldName
, FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
2247 CApp
= CApp
+ ' memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName
, ValueSize
, ValueSize
)
2249 if '[' in FieldName
and ']' in FieldName
:
2250 Index
= int(FieldName
.split('[')[1].split(']')[0])
2251 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
)
2253 CApp
= CApp
+ ' Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName
, Value
, FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
2255 CApp
= CApp
+ ' Pcd->%s = %d; // From %s Line %s Value %s\n' % (FieldName
, Value
, FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
2260 def GenerateFdfValueStatement(Pcd
):
2261 CApp
= ' Assign_%s_%s_Fdf_Value(Pcd);\n' % (Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
)
2264 def GenerateInitializeFunc(self
, SkuName
, DefaultStore
, Pcd
, InitByteValue
, CApp
):
2265 OverrideValues
= {DefaultStore
:{}}
2266 if Pcd
.SkuOverrideValues
:
2267 OverrideValues
= Pcd
.SkuOverrideValues
[SkuName
]
2268 if not OverrideValues
:
2269 OverrideValues
= {TAB_DEFAULT_STORES_DEFAULT
:Pcd
.DefaultValues
}
2270 for DefaultStoreName
in OverrideValues
:
2271 CApp
= CApp
+ 'void\n'
2272 CApp
= CApp
+ 'Initialize_%s_%s_%s_%s(\n' % (SkuName
, DefaultStoreName
, Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
)
2273 CApp
= CApp
+ ' void\n'
2274 CApp
= CApp
+ ' )\n'
2276 CApp
= CApp
+ ' UINT32 Size;\n'
2277 CApp
= CApp
+ ' UINT32 FieldSize;\n'
2278 CApp
= CApp
+ ' CHAR8 *Value;\n'
2279 CApp
= CApp
+ ' UINT32 OriginalSize;\n'
2280 CApp
= CApp
+ ' VOID *OriginalPcd;\n'
2282 CApp
= CApp
+ ' %s *Pcd; // From %s Line %d \n' % (Pcd
.BaseDatumType
,Pcd
.PkgPath
, Pcd
.PcdDefineLineNo
)
2286 PcdDefaultValue
= StringToArray(Pcd
.DefaultValueFromDec
.strip())
2288 InitByteValue
+= '%s.%s.%s.%s|%s|%s\n' % (SkuName
, DefaultStoreName
, Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
, Pcd
.DatumType
, PcdDefaultValue
)
2291 # Get current PCD value and size
2293 CApp
= CApp
+ ' OriginalPcd = PcdGetPtr (%s, %s, %s, %s, &OriginalSize);\n' % (SkuName
, DefaultStoreName
, Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
)
2296 # Determine the size of the PCD. For simple structures, sizeof(TYPE) provides
2297 # the correct value. For structures with a flexible array member, the flexible
2298 # array member is detected, and the size is based on the highest index used with
2299 # the flexible array member. The flexible array member must be the last field
2300 # in a structure. The size formula for this case is:
2301 # OFFSET_OF(FlexbleArrayField) + sizeof(FlexibleArray[0]) * (HighestIndex + 1)
2303 CApp
= CApp
+ DscBuildData
.GenerateSizeStatments(Pcd
,SkuName
,DefaultStoreName
)
2306 # Allocate and zero buffer for the PCD
2307 # Must handle cases where current value is smaller, larger, or same size
2308 # Always keep that larger one as the current size
2310 CApp
= CApp
+ ' Size = (OriginalSize > Size ? OriginalSize : Size);\n'
2311 CApp
= CApp
+ ' Pcd = (%s *)malloc (Size);\n' % (Pcd
.BaseDatumType
,)
2312 CApp
= CApp
+ ' memset (Pcd, 0, Size);\n'
2315 # Copy current PCD value into allocated buffer.
2317 CApp
= CApp
+ ' memcpy (Pcd, OriginalPcd, OriginalSize);\n'
2320 # Assign field values in PCD
2322 CApp
= CApp
+ DscBuildData
.GenerateDefaultValueAssignStatement(Pcd
)
2323 if Pcd
.Type
not in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_FIXED_AT_BUILD
],
2324 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_PATCHABLE_IN_MODULE
]]:
2325 for skuname
in self
.SkuIdMgr
.GetSkuChain(SkuName
):
2326 storeset
= [DefaultStoreName
] if DefaultStoreName
== TAB_DEFAULT_STORES_DEFAULT
else [TAB_DEFAULT_STORES_DEFAULT
, DefaultStoreName
]
2327 for defaultstorenameitem
in storeset
:
2328 CApp
= CApp
+ "// SkuName: %s, DefaultStoreName: %s \n" % (skuname
, defaultstorenameitem
)
2329 CApp
= CApp
+ DscBuildData
.GenerateInitValueStatement(Pcd
, skuname
, defaultstorenameitem
)
2330 if skuname
== SkuName
:
2333 CApp
= CApp
+ "// SkuName: %s, DefaultStoreName: STANDARD \n" % self
.SkuIdMgr
.SystemSkuId
2334 CApp
= CApp
+ DscBuildData
.GenerateInitValueStatement(Pcd
, self
.SkuIdMgr
.SystemSkuId
, TAB_DEFAULT_STORES_DEFAULT
)
2335 CApp
= CApp
+ DscBuildData
.GenerateFdfValueStatement(Pcd
)
2336 CApp
= CApp
+ DscBuildData
.GenerateCommandLineValueStatement(Pcd
)
2338 # Set new PCD value and size
2340 CApp
= CApp
+ ' PcdSetPtr (%s, %s, %s, %s, Size, (void *)Pcd);\n' % (SkuName
, DefaultStoreName
, Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
)
2345 CApp
= CApp
+ ' free (Pcd);\n'
2348 return InitByteValue
, CApp
2350 def GenerateArrayAssignment(self
, Pcd
):
2354 if not Pcd
.IsArray():
2357 for d
in Pcd
.Capacity
:
2360 Value
= Pcd
.DefaultValueFromDec
2361 if "{CODE(" in Pcd
.DefaultValueFromDec
:
2362 realvalue
= Pcd
.DefaultValueFromDec
.strip()[6:-2] # "{CODE(").rstrip(")}"
2363 CApp
+= "static %s %s_%s_INIT_Value%s = %s;\n" % (Pcd
.BaseDatumType
,Pcd
.TokenSpaceGuidCName
,Pcd
.TokenCName
,Demesion
,realvalue
)
2365 if Pcd
.Type
in PCD_DYNAMIC_TYPE_SET | PCD_DYNAMIC_EX_TYPE_SET
:
2366 for skuname
in Pcd
.SkuInfoList
:
2367 skuinfo
= Pcd
.SkuInfoList
[skuname
]
2368 if skuinfo
.VariableName
:
2369 for defaultstore
in skuinfo
.DefaultStoreDict
:
2370 pcddscrawdefaultvalue
= self
.GetPcdDscRawDefaultValue(Pcd
, skuname
, defaultstore
)
2371 if pcddscrawdefaultvalue
:
2372 Value
= skuinfo
[defaultstore
]
2373 if "{CODE(" in Value
:
2374 realvalue
= Value
.strip()[6:-2] # "{CODE(").rstrip(")}"
2375 CApp
+= "static %s %s_%s_%s_%s_Value%s = %s;\n" % (Pcd
.BaseDatumType
,Pcd
.TokenSpaceGuidCName
,Pcd
.TokenCName
,skuname
,defaultstore
,Demesion
,realvalue
)
2377 pcddscrawdefaultvalue
= self
.GetPcdDscRawDefaultValue(Pcd
, skuname
, TAB_DEFAULT_STORES_DEFAULT
)
2378 if pcddscrawdefaultvalue
:
2379 Value
= skuinfo
.DefaultValue
2380 if "{CODE(" in Value
:
2381 realvalue
= Value
.strip()[6:-2] # "{CODE(").rstrip(")}"
2382 CApp
+= "static %s %s_%s_%s_%s_Value%s = %s;\n" % (Pcd
.BaseDatumType
,Pcd
.TokenSpaceGuidCName
,Pcd
.TokenCName
,skuname
,TAB_DEFAULT_STORES_DEFAULT
,Demesion
,realvalue
)
2384 pcddscrawdefaultvalue
= self
.GetPcdDscRawDefaultValue(Pcd
, TAB_DEFAULT
, TAB_DEFAULT_STORES_DEFAULT
)
2385 if pcddscrawdefaultvalue
:
2386 if "{CODE(" in Pcd
.DefaultValue
:
2387 realvalue
= Pcd
.DefaultValue
.strip()[6:-2] # "{CODE(").rstrip(")}"
2388 CApp
+= "static %s %s_%s_DEFAULT_STANDARD_Value%s = %s;\n" % (Pcd
.BaseDatumType
,Pcd
.TokenSpaceGuidCName
,Pcd
.TokenCName
,Demesion
,realvalue
)
2392 def SkuOverrideValuesEmpty(self
,OverrideValues
):
2393 if not OverrideValues
:
2395 for key
in OverrideValues
:
2396 if OverrideValues
[key
]:
2400 def ParseCCFlags(self
, ccflag
):
2402 ccflaglist
= ccflag
.split(" ")
2404 while i
< len(ccflaglist
):
2405 item
= ccflaglist
[i
].strip()
2406 if item
in (r
"/D", r
"/U","-D","-U"):
2407 ccflags
.add(" ".join((ccflaglist
[i
],ccflaglist
[i
+1])))
2409 elif item
.startswith((r
"/D", r
"/U","-D","-U")):
2413 def GenerateByteArrayValue (self
, StructuredPcds
):
2415 # Generate/Compile/Run C application to determine if there are any flexible array members
2417 if not StructuredPcds
:
2421 CApp
= PcdMainCHeader
2423 IncludeFiles
= set()
2424 for PcdName
in StructuredPcds
:
2425 Pcd
= StructuredPcds
[PcdName
]
2426 for IncludeFile
in Pcd
.StructuredPcdIncludeFile
:
2427 if IncludeFile
not in IncludeFiles
:
2428 IncludeFiles
.add(IncludeFile
)
2429 CApp
= CApp
+ '#include <%s>\n' % (IncludeFile
)
2431 for Pcd
in StructuredPcds
.values():
2432 CApp
= CApp
+ self
.GenerateArrayAssignment(Pcd
)
2433 for PcdName
in StructuredPcds
:
2434 Pcd
= StructuredPcds
[PcdName
]
2435 CApp
= CApp
+ self
.GenerateSizeFunction(Pcd
)
2436 CApp
= CApp
+ self
.GenerateDefaultValueAssignFunction(Pcd
)
2437 CApp
= CApp
+ self
.GenerateFdfValue(Pcd
)
2438 CApp
= CApp
+ self
.GenerateCommandLineValue(Pcd
)
2439 if self
.SkuOverrideValuesEmpty(Pcd
.SkuOverrideValues
) or Pcd
.Type
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_FIXED_AT_BUILD
],
2440 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_PATCHABLE_IN_MODULE
]]:
2441 CApp
= CApp
+ self
.GenerateInitValueFunction(Pcd
, self
.SkuIdMgr
.SystemSkuId
, TAB_DEFAULT_STORES_DEFAULT
)
2443 for SkuName
in self
.SkuIdMgr
.SkuOverrideOrder():
2444 if SkuName
not in Pcd
.SkuOverrideValues
:
2446 for DefaultStoreName
in Pcd
.SkuOverrideValues
[SkuName
]:
2447 CApp
= CApp
+ self
.GenerateInitValueFunction(Pcd
, SkuName
, DefaultStoreName
)
2448 if self
.SkuOverrideValuesEmpty(Pcd
.SkuOverrideValues
) or Pcd
.Type
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_FIXED_AT_BUILD
],
2449 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_PATCHABLE_IN_MODULE
]]:
2450 InitByteValue
, CApp
= self
.GenerateInitializeFunc(self
.SkuIdMgr
.SystemSkuId
, TAB_DEFAULT_STORES_DEFAULT
, Pcd
, InitByteValue
, CApp
)
2452 for SkuName
in self
.SkuIdMgr
.SkuOverrideOrder():
2453 if SkuName
not in Pcd
.SkuOverrideValues
:
2455 for DefaultStoreName
in Pcd
.DefaultStoreName
:
2456 Pcd
= StructuredPcds
[PcdName
]
2457 InitByteValue
, CApp
= self
.GenerateInitializeFunc(SkuName
, DefaultStoreName
, Pcd
, InitByteValue
, CApp
)
2459 CApp
= CApp
+ 'VOID\n'
2460 CApp
= CApp
+ 'PcdEntryPoint(\n'
2461 CApp
= CApp
+ ' VOID\n'
2462 CApp
= CApp
+ ' )\n'
2464 for Pcd
in StructuredPcds
.values():
2465 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
]]:
2466 CApp
= CApp
+ ' Initialize_%s_%s_%s_%s();\n' % (self
.SkuIdMgr
.SystemSkuId
, TAB_DEFAULT_STORES_DEFAULT
, Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
)
2468 for SkuName
in self
.SkuIdMgr
.SkuOverrideOrder():
2469 if SkuName
not in self
.SkuIdMgr
.AvailableSkuIdSet
:
2471 for DefaultStoreName
in Pcd
.SkuOverrideValues
[SkuName
]:
2472 CApp
= CApp
+ ' Initialize_%s_%s_%s_%s();\n' % (SkuName
, DefaultStoreName
, Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
)
2475 CApp
= CApp
+ PcdMainCEntry
+ '\n'
2477 if not os
.path
.exists(self
.OutputPath
):
2478 os
.makedirs(self
.OutputPath
)
2479 CAppBaseFileName
= os
.path
.join(self
.OutputPath
, PcdValueInitName
)
2480 SaveFileOnChange(CAppBaseFileName
+ '.c', CApp
, False)
2482 MakeApp
= PcdMakefileHeader
2483 if sys
.platform
== "win32":
2484 MakeApp
= MakeApp
+ 'APPFILE = %s\%s.exe\n' % (self
.OutputPath
, PcdValueInitName
) + 'APPNAME = %s\n' % (PcdValueInitName
) + 'OBJECTS = %s\%s.obj\n' % (self
.OutputPath
, PcdValueInitName
) + 'INC = '
2486 MakeApp
= MakeApp
+ PcdGccMakefile
2487 MakeApp
= MakeApp
+ 'APPFILE = %s/%s\n' % (self
.OutputPath
, PcdValueInitName
) + 'APPNAME = %s\n' % (PcdValueInitName
) + 'OBJECTS = %s/%s.o\n' % (self
.OutputPath
, PcdValueInitName
) + \
2488 'include $(MAKEROOT)/Makefiles/app.makefile\n' + 'INCLUDE +='
2491 PlatformInc
= OrderedDict()
2492 for Cache
in self
._Bdb
._CACHE
_.values():
2493 if Cache
.MetaFile
.Ext
.lower() != '.dec':
2496 if str(Cache
.MetaFile
.Path
) not in PlatformInc
:
2497 PlatformInc
[str(Cache
.MetaFile
.Path
)] = []
2498 PlatformInc
[str(Cache
.MetaFile
.Path
)].append (os
.path
.dirname(Cache
.MetaFile
.Path
))
2499 PlatformInc
[str(Cache
.MetaFile
.Path
)].extend (Cache
.CommonIncludes
)
2502 for Pcd
in StructuredPcds
.values():
2503 for PackageDec
in Pcd
.PackageDecs
:
2504 Package
= os
.path
.normpath(mws
.join(GlobalData
.gWorkspace
, PackageDec
))
2505 if not os
.path
.exists(Package
):
2506 EdkLogger
.error('Build', RESOURCE_NOT_AVAILABLE
, "The dependent Package %s of PCD %s.%s is not exist." % (PackageDec
, Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
))
2507 if Package
not in PcdDependDEC
:
2508 PcdDependDEC
.append(Package
)
2510 if PlatformInc
and PcdDependDEC
:
2511 for pkg
in PcdDependDEC
:
2512 if pkg
in PlatformInc
:
2513 for inc
in PlatformInc
[pkg
]:
2514 MakeApp
+= '-I' + str(inc
) + ' '
2515 IncSearchList
.append(inc
)
2516 MakeApp
= MakeApp
+ '\n'
2518 CC_FLAGS
= LinuxCFLAGS
2519 if sys
.platform
== "win32":
2520 CC_FLAGS
= WindowsCFLAGS
2521 BuildOptions
= OrderedDict()
2522 for Options
in self
.BuildOptions
:
2523 if Options
[2] != EDKII_NAME
:
2526 if Family
and Family
!= self
.ToolChainFamily
:
2528 Target
, Tag
, Arch
, Tool
, Attr
= Options
[1].split("_")
2533 if Target
== TAB_STAR
or Target
== self
._Target
:
2534 if Tag
== TAB_STAR
or Tag
== self
._Toolchain
:
2535 if 'COMMON' not in BuildOptions
:
2536 BuildOptions
['COMMON'] = set()
2537 if Arch
== TAB_STAR
:
2538 BuildOptions
['COMMON']|
= self
.ParseCCFlags(self
.BuildOptions
[Options
])
2539 if Arch
in self
.SupArchList
:
2540 if Arch
not in BuildOptions
:
2541 BuildOptions
[Arch
] = set()
2542 BuildOptions
[Arch
] |
= self
.ParseCCFlags(self
.BuildOptions
[Options
])
2545 ArchBuildOptions
= {arch
:flags
for arch
,flags
in BuildOptions
.items() if arch
!= 'COMMON'}
2546 if len(ArchBuildOptions
.keys()) == 1:
2547 BuildOptions
['COMMON'] |
= (ArchBuildOptions
.values()[0])
2548 elif len(ArchBuildOptions
.keys()) > 1:
2549 CommonBuildOptions
= reduce(lambda x
,y
: x
&y
, ArchBuildOptions
.values())
2550 BuildOptions
['COMMON'] |
= CommonBuildOptions
2551 ValueList
= list(BuildOptions
['COMMON'])
2552 CC_FLAGS
+= " ".join(ValueList
)
2555 if sys
.platform
== "win32":
2556 MakeApp
= MakeApp
+ PcdMakefileEnd
2557 MakeApp
= MakeApp
+ AppTarget
% ("""\tcopy $(APPLICATION) $(APPFILE) /y """)
2559 MakeApp
= MakeApp
+ AppTarget
% ("""\tcp $(APPLICATION) $(APPFILE) """)
2560 MakeApp
= MakeApp
+ '\n'
2561 IncludeFileFullPaths
= []
2562 for includefile
in IncludeFiles
:
2563 for includepath
in IncSearchList
:
2564 includefullpath
= os
.path
.join(str(includepath
), includefile
)
2565 if os
.path
.exists(includefullpath
):
2566 IncludeFileFullPaths
.append(os
.path
.normpath(includefullpath
))
2569 SearchPathList
.append(os
.path
.normpath(mws
.join(GlobalData
.gWorkspace
, "BaseTools/Source/C/Include")))
2570 SearchPathList
.append(os
.path
.normpath(mws
.join(GlobalData
.gWorkspace
, "BaseTools/Source/C/Common")))
2571 SearchPathList
.extend(str(item
) for item
in IncSearchList
)
2572 IncFileList
= GetDependencyList(IncludeFileFullPaths
, SearchPathList
)
2573 for include_file
in IncFileList
:
2574 MakeApp
+= "$(OBJECTS) : %s\n" % include_file
2575 MakeFileName
= os
.path
.join(self
.OutputPath
, 'Makefile')
2576 MakeApp
+= "$(OBJECTS) : %s\n" % MakeFileName
2577 SaveFileOnChange(MakeFileName
, MakeApp
, False)
2579 InputValueFile
= os
.path
.join(self
.OutputPath
, 'Input.txt')
2580 OutputValueFile
= os
.path
.join(self
.OutputPath
, 'Output.txt')
2581 SaveFileOnChange(InputValueFile
, InitByteValue
, False)
2583 Dest_PcdValueInitExe
= PcdValueInitName
2584 if not sys
.platform
== "win32":
2585 Dest_PcdValueInitExe
= os
.path
.join(self
.OutputPath
, PcdValueInitName
)
2587 Dest_PcdValueInitExe
= os
.path
.join(self
.OutputPath
, PcdValueInitName
) +".exe"
2589 if sys
.platform
== "win32":
2590 MakeCommand
= 'nmake -f %s' % (MakeFileName
)
2591 returncode
, StdOut
, StdErr
= DscBuildData
.ExecuteCommand (MakeCommand
)
2594 MakeCommand
= 'make -f %s' % (MakeFileName
)
2595 returncode
, StdOut
, StdErr
= DscBuildData
.ExecuteCommand (MakeCommand
)
2598 Messages
= Messages
.split('\n')
2601 CAppBaseFileName
= os
.path
.join(self
.OutputPath
, PcdValueInitName
)
2602 File
= open (CAppBaseFileName
+ '.c', 'r')
2603 FileData
= File
.readlines()
2605 for Message
in Messages
:
2606 if " error" in Message
or "warning" in Message
:
2607 FileInfo
= Message
.strip().split('(')
2608 if len (FileInfo
) > 1:
2609 FileName
= FileInfo
[0]
2610 FileLine
= FileInfo
[1].split (')')[0]
2612 FileInfo
= Message
.strip().split(':')
2613 if len(FileInfo
) < 2:
2615 FileName
= FileInfo
[0]
2616 FileLine
= FileInfo
[1]
2617 if FileLine
.isdigit():
2618 error_line
= FileData
[int (FileLine
) - 1]
2619 if r
"//" in error_line
:
2620 c_line
, dsc_line
= error_line
.split(r
"//")
2622 dsc_line
= error_line
2623 message_itmes
= Message
.split(":")
2625 if "PcdValueInit.c" not in Message
:
2626 if not MessageGroup
:
2627 MessageGroup
.append(Message
)
2630 for item
in message_itmes
:
2631 if "PcdValueInit.c" in item
:
2632 Index
= message_itmes
.index(item
)
2633 message_itmes
[Index
] = dsc_line
.strip()
2635 MessageGroup
.append(":".join(message_itmes
[Index
:]).strip())
2638 MessageGroup
.append(Message
)
2640 EdkLogger
.error("build", PCD_STRUCTURE_PCD_ERROR
, "\n".join(MessageGroup
) )
2642 EdkLogger
.error('Build', COMMAND_FAILURE
, 'Can not execute command: %s' % MakeCommand
)
2644 if DscBuildData
.NeedUpdateOutput(OutputValueFile
, Dest_PcdValueInitExe
, InputValueFile
):
2645 Command
= Dest_PcdValueInitExe
+ ' -i %s -o %s' % (InputValueFile
, OutputValueFile
)
2646 returncode
, StdOut
, StdErr
= DscBuildData
.ExecuteCommand (Command
)
2648 EdkLogger
.warn('Build', COMMAND_FAILURE
, 'Can not collect output from command: %s' % Command
)
2650 File
= open (OutputValueFile
, 'r')
2651 FileBuffer
= File
.readlines()
2654 StructurePcdSet
= []
2655 for Pcd
in FileBuffer
:
2656 PcdValue
= Pcd
.split ('|')
2657 PcdInfo
= PcdValue
[0].split ('.')
2658 StructurePcdSet
.append((PcdInfo
[0], PcdInfo
[1], PcdInfo
[2], PcdInfo
[3], PcdValue
[2].strip()))
2659 return StructurePcdSet
2662 def NeedUpdateOutput(OutputFile
, ValueCFile
, StructureInput
):
2663 if not os
.path
.exists(OutputFile
):
2665 if os
.stat(OutputFile
).st_mtime
<= os
.stat(ValueCFile
).st_mtime
:
2667 if os
.stat(OutputFile
).st_mtime
<= os
.stat(StructureInput
).st_mtime
:
2671 ## Retrieve dynamic PCD settings
2673 # @param Type PCD type
2675 # @retval a dict object contains settings of given PCD type
2677 def _GetDynamicPcd(self
, Type
):
2680 Pcds
= OrderedDict()
2682 # tdict is a special dict kind of type, used for selecting correct
2683 # PCD settings for certain ARCH and SKU
2685 PcdDict
= tdict(True, 4)
2687 # Find out all possible PCD candidates for self._Arch
2688 RecordList
= self
._RawData
[Type
, self
._Arch
]
2689 AvailableSkuIdSet
= copy
.copy(self
.SkuIds
)
2692 for TokenSpaceGuid
, PcdCName
, Setting
, Arch
, SkuName
, Dummy3
, Dummy4
, Dummy5
in RecordList
:
2693 SkuName
= SkuName
.upper()
2694 SkuName
= TAB_DEFAULT
if SkuName
== TAB_COMMON
else SkuName
2695 if SkuName
not in AvailableSkuIdSet
:
2696 EdkLogger
.error('build', PARAMETER_INVALID
, 'Sku %s is not defined in [SkuIds] section' % SkuName
,
2697 File
=self
.MetaFile
, Line
=Dummy5
)
2698 if "." not in TokenSpaceGuid
and "[" not in PcdCName
:
2699 PcdList
.append((PcdCName
, TokenSpaceGuid
, SkuName
, Dummy5
))
2700 PcdDict
[Arch
, SkuName
, PcdCName
, TokenSpaceGuid
] = Setting
2702 # Remove redundant PCD candidates, per the ARCH and SKU
2703 for PcdCName
, TokenSpaceGuid
, SkuName
, Dummy4
in PcdList
:
2705 Setting
= PcdDict
[self
._Arch
, SkuName
, PcdCName
, TokenSpaceGuid
]
2709 PcdValue
, DatumType
, MaxDatumSize
= self
._ValidatePcd
(PcdCName
, TokenSpaceGuid
, Setting
, Type
, Dummy4
)
2711 if int(MaxDatumSize
, 0) > 0xFFFF:
2712 EdkLogger
.error('build', FORMAT_INVALID
, "The size value must not exceed the maximum value of 0xFFFF (UINT16) for %s." % ".".join((TokenSpaceGuid
, PcdCName
)),
2713 File
=self
.MetaFile
, Line
=Dummy4
)
2714 if int(MaxDatumSize
, 0) < 0:
2715 EdkLogger
.error('build', FORMAT_INVALID
, "The size value can't be set to negative value for %s." % ".".join((TokenSpaceGuid
, PcdCName
)),
2716 File
=self
.MetaFile
, Line
=Dummy4
)
2717 SkuInfo
= SkuInfoClass(SkuName
, self
.SkuIds
[SkuName
][0], '', '', '', '', '', PcdValue
)
2718 if (PcdCName
, TokenSpaceGuid
) in Pcds
:
2719 pcdObject
= Pcds
[PcdCName
, TokenSpaceGuid
]
2720 pcdObject
.SkuInfoList
[SkuName
] = SkuInfo
2721 if MaxDatumSize
.strip():
2722 CurrentMaxSize
= int(MaxDatumSize
.strip(), 0)
2725 if pcdObject
.MaxDatumSize
:
2726 PcdMaxSize
= int(pcdObject
.MaxDatumSize
, 0)
2729 if CurrentMaxSize
> PcdMaxSize
:
2730 pcdObject
.MaxDatumSize
= str(CurrentMaxSize
)
2732 Pcds
[PcdCName
, TokenSpaceGuid
] = PcdClassObject(
2735 self
._PCD
_TYPE
_STRING
_[Type
],
2740 OrderedDict({SkuName
: SkuInfo
}),
2745 if SkuName
not in Pcds
[PcdCName
, TokenSpaceGuid
].DscRawValue
:
2746 Pcds
[PcdCName
, TokenSpaceGuid
].DscRawValue
[SkuName
] = {}
2747 Pcds
[PcdCName
, TokenSpaceGuid
].DscRawValue
[SkuName
][TAB_DEFAULT_STORES_DEFAULT
] = PcdValue
2749 for pcd
in Pcds
.values():
2750 pcdDecObject
= self
._DecPcds
[pcd
.TokenCName
, pcd
.TokenSpaceGuidCName
]
2751 # Only fix the value while no value provided in DSC file.
2752 for sku
in pcd
.SkuInfoList
.values():
2753 if not sku
.DefaultValue
:
2754 sku
.DefaultValue
= pcdDecObject
.DefaultValue
2755 if TAB_DEFAULT
not in pcd
.SkuInfoList
and TAB_COMMON
not in pcd
.SkuInfoList
:
2756 valuefromDec
= pcdDecObject
.DefaultValue
2757 SkuInfo
= SkuInfoClass(TAB_DEFAULT
, '0', '', '', '', '', '', valuefromDec
)
2758 pcd
.SkuInfoList
[TAB_DEFAULT
] = SkuInfo
2759 elif TAB_DEFAULT
not in pcd
.SkuInfoList
and TAB_COMMON
in pcd
.SkuInfoList
:
2760 pcd
.SkuInfoList
[TAB_DEFAULT
] = pcd
.SkuInfoList
[TAB_COMMON
]
2761 del pcd
.SkuInfoList
[TAB_COMMON
]
2762 elif TAB_DEFAULT
in pcd
.SkuInfoList
and TAB_COMMON
in pcd
.SkuInfoList
:
2763 del pcd
.SkuInfoList
[TAB_COMMON
]
2765 map(self
.FilterSkuSettings
, Pcds
.values())
2769 def FilterSkuSettings(self
, PcdObj
):
2771 if self
.SkuIdMgr
.SkuUsageType
== self
.SkuIdMgr
.SINGLE
:
2772 if TAB_DEFAULT
in PcdObj
.SkuInfoList
and self
.SkuIdMgr
.SystemSkuId
not in PcdObj
.SkuInfoList
:
2773 PcdObj
.SkuInfoList
[self
.SkuIdMgr
.SystemSkuId
] = PcdObj
.SkuInfoList
[TAB_DEFAULT
]
2774 PcdObj
.SkuInfoList
= {TAB_DEFAULT
:PcdObj
.SkuInfoList
[self
.SkuIdMgr
.SystemSkuId
]}
2775 PcdObj
.SkuInfoList
[TAB_DEFAULT
].SkuIdName
= TAB_DEFAULT
2776 PcdObj
.SkuInfoList
[TAB_DEFAULT
].SkuId
= '0'
2778 elif self
.SkuIdMgr
.SkuUsageType
== self
.SkuIdMgr
.DEFAULT
:
2779 PcdObj
.SkuInfoList
= {TAB_DEFAULT
:PcdObj
.SkuInfoList
[TAB_DEFAULT
]}
2784 def CompareVarAttr(Attr1
, Attr2
):
2785 if not Attr1
or not Attr2
: # for empty string
2787 Attr1s
= [attr
.strip() for attr
in Attr1
.split(",")]
2788 Attr1Set
= set(Attr1s
)
2789 Attr2s
= [attr
.strip() for attr
in Attr2
.split(",")]
2790 Attr2Set
= set(Attr2s
)
2791 if Attr2Set
== Attr1Set
:
2796 def CompletePcdValues(self
, PcdSet
):
2797 Pcds
= OrderedDict()
2798 DefaultStoreObj
= DefaultStore(self
._GetDefaultStores
())
2799 SkuIds
= {skuname
:skuid
for skuname
, skuid
in self
.SkuIdMgr
.AvailableSkuIdSet
.items() if skuname
!= TAB_COMMON
}
2800 DefaultStores
= set(storename
for pcdobj
in PcdSet
.values() for skuobj
in pcdobj
.SkuInfoList
.values() for storename
in skuobj
.DefaultStoreDict
)
2801 for PcdCName
, TokenSpaceGuid
in PcdSet
:
2802 PcdObj
= PcdSet
[(PcdCName
, TokenSpaceGuid
)]
2804 if PcdObj
.Type
not in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_DEFAULT
],
2805 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_HII
],
2806 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_VPD
],
2807 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_DEFAULT
],
2808 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_HII
],
2809 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_VPD
]]:
2810 Pcds
[PcdCName
, TokenSpaceGuid
]= PcdObj
2812 PcdType
= PcdObj
.Type
2813 if PcdType
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_HII
], self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_HII
]]:
2814 for skuid
in PcdObj
.SkuInfoList
:
2815 skuobj
= PcdObj
.SkuInfoList
[skuid
]
2816 mindefaultstorename
= DefaultStoreObj
.GetMin(set(defaultstorename
for defaultstorename
in skuobj
.DefaultStoreDict
))
2817 for defaultstorename
in DefaultStores
:
2818 if defaultstorename
not in skuobj
.DefaultStoreDict
:
2819 skuobj
.DefaultStoreDict
[defaultstorename
] = skuobj
.DefaultStoreDict
[mindefaultstorename
]
2820 skuobj
.HiiDefaultValue
= skuobj
.DefaultStoreDict
[mindefaultstorename
]
2821 for skuname
, skuid
in SkuIds
.items():
2822 if skuname
not in PcdObj
.SkuInfoList
:
2823 nextskuid
= self
.SkuIdMgr
.GetNextSkuId(skuname
)
2824 while nextskuid
not in PcdObj
.SkuInfoList
:
2825 nextskuid
= self
.SkuIdMgr
.GetNextSkuId(nextskuid
)
2826 PcdObj
.SkuInfoList
[skuname
] = copy
.deepcopy(PcdObj
.SkuInfoList
[nextskuid
])
2827 PcdObj
.SkuInfoList
[skuname
].SkuId
= skuid
2828 PcdObj
.SkuInfoList
[skuname
].SkuIdName
= skuname
2829 if PcdType
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_HII
], self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_HII
]]:
2830 PcdObj
.DefaultValue
= PcdObj
.SkuInfoList
.values()[0].HiiDefaultValue
if self
.SkuIdMgr
.SkuUsageType
== self
.SkuIdMgr
.SINGLE
else PcdObj
.SkuInfoList
[TAB_DEFAULT
].HiiDefaultValue
2831 Pcds
[PcdCName
, TokenSpaceGuid
]= PcdObj
2833 ## Retrieve dynamic HII PCD settings
2835 # @param Type PCD type
2837 # @retval a dict object contains settings of given PCD type
2839 def _GetDynamicHiiPcd(self
, Type
):
2843 Pcds
= OrderedDict()
2844 UserDefinedDefaultStores
= []
2846 # tdict is a special dict kind of type, used for selecting correct
2847 # PCD settings for certain ARCH and SKU
2849 PcdDict
= tdict(True, 5)
2851 RecordList
= self
._RawData
[Type
, self
._Arch
]
2852 # Find out all possible PCD candidates for self._Arch
2853 AvailableSkuIdSet
= copy
.copy(self
.SkuIds
)
2854 DefaultStoresDefine
= self
._GetDefaultStores
()
2856 for TokenSpaceGuid
, PcdCName
, Setting
, Arch
, SkuName
, DefaultStore
, Dummy4
, Dummy5
in RecordList
:
2857 SkuName
= SkuName
.upper()
2858 SkuName
= TAB_DEFAULT
if SkuName
== TAB_COMMON
else SkuName
2859 DefaultStore
= DefaultStore
.upper()
2860 if DefaultStore
== TAB_COMMON
:
2861 DefaultStore
= TAB_DEFAULT_STORES_DEFAULT
2863 #The end user define [DefaultStores] and [SKUID_IDENTIFIER.Menufacturing] in DSC
2864 UserDefinedDefaultStores
.append((PcdCName
, TokenSpaceGuid
))
2865 if SkuName
not in AvailableSkuIdSet
:
2866 EdkLogger
.error('build', PARAMETER_INVALID
, 'Sku %s is not defined in [SkuIds] section' % SkuName
,
2867 File
=self
.MetaFile
, Line
=Dummy5
)
2868 if DefaultStore
not in DefaultStoresDefine
:
2869 EdkLogger
.error('build', PARAMETER_INVALID
, 'DefaultStores %s is not defined in [DefaultStores] section' % DefaultStore
,
2870 File
=self
.MetaFile
, Line
=Dummy5
)
2871 if "." not in TokenSpaceGuid
and "[" not in PcdCName
:
2872 PcdSet
.add((PcdCName
, TokenSpaceGuid
, SkuName
, DefaultStore
, Dummy5
))
2873 PcdDict
[Arch
, SkuName
, PcdCName
, TokenSpaceGuid
, DefaultStore
] = Setting
2876 # Remove redundant PCD candidates, per the ARCH and SKU
2877 for PcdCName
, TokenSpaceGuid
, SkuName
, DefaultStore
, Dummy4
in PcdSet
:
2879 Setting
= PcdDict
[self
._Arch
, SkuName
, PcdCName
, TokenSpaceGuid
, DefaultStore
]
2882 VariableName
, VariableGuid
, VariableOffset
, DefaultValue
, VarAttribute
= self
._ValidatePcd
(PcdCName
, TokenSpaceGuid
, Setting
, Type
, Dummy4
)
2884 rt
, Msg
= VariableAttributes
.ValidateVarAttributes(VarAttribute
)
2886 EdkLogger
.error("build", PCD_VARIABLE_ATTRIBUTES_ERROR
, "Variable attributes settings for %s is incorrect.\n %s" % (".".join((TokenSpaceGuid
, PcdCName
)), Msg
),
2887 ExtraData
="[%s]" % VarAttribute
)
2889 FormatCorrect
= True
2890 if VariableOffset
.isdigit():
2891 if int(VariableOffset
, 10) > 0xFFFF:
2893 elif variablePattern
.match(VariableOffset
):
2894 if int(VariableOffset
, 16) > 0xFFFF:
2896 # For Offset written in "A.B"
2897 elif VariableOffset
.find('.') > -1:
2898 VariableOffsetList
= VariableOffset
.split(".")
2899 if not (len(VariableOffsetList
) == 2
2900 and IsValidWord(VariableOffsetList
[0])
2901 and IsValidWord(VariableOffsetList
[1])):
2902 FormatCorrect
= False
2904 FormatCorrect
= False
2905 if not FormatCorrect
:
2906 EdkLogger
.error('Build', FORMAT_INVALID
, "Invalid syntax or format of the variable offset value is incorrect for %s." % ".".join((TokenSpaceGuid
, PcdCName
)))
2909 EdkLogger
.error('Build', OPTION_VALUE_INVALID
, "The variable offset value must not exceed the maximum value of 0xFFFF (UINT16) for %s." % ".".join((TokenSpaceGuid
, PcdCName
)))
2910 if (VariableName
, VariableGuid
) not in VariableAttrs
:
2911 VariableAttrs
[(VariableName
, VariableGuid
)] = VarAttribute
2913 if not DscBuildData
.CompareVarAttr(VariableAttrs
[(VariableName
, VariableGuid
)], VarAttribute
):
2914 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
)]))
2916 pcdDecObject
= self
._DecPcds
[PcdCName
, TokenSpaceGuid
]
2917 if (PcdCName
, TokenSpaceGuid
) in Pcds
:
2918 pcdObject
= Pcds
[PcdCName
, TokenSpaceGuid
]
2919 if SkuName
in pcdObject
.SkuInfoList
:
2920 Skuitem
= pcdObject
.SkuInfoList
[SkuName
]
2921 Skuitem
.DefaultStoreDict
.update({DefaultStore
:DefaultValue
})
2923 SkuInfo
= SkuInfoClass(SkuName
, self
.SkuIds
[SkuName
][0], VariableName
, VariableGuid
, VariableOffset
, DefaultValue
, VariableAttribute
=VarAttribute
, DefaultStore
={DefaultStore
:DefaultValue
})
2924 pcdObject
.SkuInfoList
[SkuName
] = SkuInfo
2926 SkuInfo
= SkuInfoClass(SkuName
, self
.SkuIds
[SkuName
][0], VariableName
, VariableGuid
, VariableOffset
, DefaultValue
, VariableAttribute
=VarAttribute
, DefaultStore
={DefaultStore
:DefaultValue
})
2927 PcdClassObj
= PcdClassObject(
2930 self
._PCD
_TYPE
_STRING
_[Type
],
2935 OrderedDict({SkuName
: SkuInfo
}),
2938 pcdDecObject
.validateranges
,
2939 pcdDecObject
.validlists
,
2940 pcdDecObject
.expressions
,
2942 if (PcdCName
, TokenSpaceGuid
) in UserDefinedDefaultStores
:
2943 PcdClassObj
.UserDefinedDefaultStoresFlag
= True
2944 Pcds
[PcdCName
, TokenSpaceGuid
] = PcdClassObj
2946 Pcds
[PcdCName
, TokenSpaceGuid
].CustomAttribute
['DscPosition'] = int(Dummy4
)
2947 if SkuName
not in Pcds
[PcdCName
, TokenSpaceGuid
].DscRawValue
:
2948 Pcds
[PcdCName
, TokenSpaceGuid
].DscRawValue
[SkuName
] = {}
2949 Pcds
[PcdCName
, TokenSpaceGuid
].DscRawValue
[SkuName
][DefaultStore
] = DefaultValue
2950 for pcd
in Pcds
.values():
2951 SkuInfoObj
= pcd
.SkuInfoList
.values()[0]
2952 pcdDecObject
= self
._DecPcds
[pcd
.TokenCName
, pcd
.TokenSpaceGuidCName
]
2953 pcd
.DatumType
= pcdDecObject
.DatumType
2954 # Only fix the value while no value provided in DSC file.
2955 for sku
in pcd
.SkuInfoList
.values():
2956 if (sku
.HiiDefaultValue
== "" or sku
.HiiDefaultValue
is None):
2957 sku
.HiiDefaultValue
= pcdDecObject
.DefaultValue
2958 for default_store
in sku
.DefaultStoreDict
:
2959 sku
.DefaultStoreDict
[default_store
]=pcdDecObject
.DefaultValue
2960 pcd
.DefaultValue
= pcdDecObject
.DefaultValue
2961 if TAB_DEFAULT
not in pcd
.SkuInfoList
and TAB_COMMON
not in pcd
.SkuInfoList
:
2962 valuefromDec
= pcdDecObject
.DefaultValue
2963 SkuInfo
= SkuInfoClass(TAB_DEFAULT
, '0', SkuInfoObj
.VariableName
, SkuInfoObj
.VariableGuid
, SkuInfoObj
.VariableOffset
, valuefromDec
, VariableAttribute
=SkuInfoObj
.VariableAttribute
, DefaultStore
={DefaultStore
:valuefromDec
})
2964 pcd
.SkuInfoList
[TAB_DEFAULT
] = SkuInfo
2965 elif TAB_DEFAULT
not in pcd
.SkuInfoList
and TAB_COMMON
in pcd
.SkuInfoList
:
2966 pcd
.SkuInfoList
[TAB_DEFAULT
] = pcd
.SkuInfoList
[TAB_COMMON
]
2967 del pcd
.SkuInfoList
[TAB_COMMON
]
2968 elif TAB_DEFAULT
in pcd
.SkuInfoList
and TAB_COMMON
in pcd
.SkuInfoList
:
2969 del pcd
.SkuInfoList
[TAB_COMMON
]
2971 if pcd
.MaxDatumSize
.strip():
2972 MaxSize
= int(pcd
.MaxDatumSize
, 0)
2975 if pcd
.DatumType
not in TAB_PCD_NUMERIC_TYPES
:
2976 for (_
, skuobj
) in pcd
.SkuInfoList
.items():
2978 skuobj
.HiiDefaultValue
= StringToArray(skuobj
.HiiDefaultValue
)
2979 datalen
= len(skuobj
.HiiDefaultValue
.split(","))
2980 if datalen
> MaxSize
:
2982 for defaultst
in skuobj
.DefaultStoreDict
:
2983 skuobj
.DefaultStoreDict
[defaultst
] = StringToArray(skuobj
.DefaultStoreDict
[defaultst
])
2984 pcd
.DefaultValue
= StringToArray(pcd
.DefaultValue
)
2985 pcd
.MaxDatumSize
= str(MaxSize
)
2986 rt
, invalidhii
= DscBuildData
.CheckVariableNameAssignment(Pcds
)
2988 invalidpcd
= ",".join(invalidhii
)
2989 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
)
2991 map(self
.FilterSkuSettings
, Pcds
.values())
2996 def CheckVariableNameAssignment(Pcds
):
2998 for pcdname
in Pcds
:
3000 varnameset
= set(sku
.VariableName
for (skuid
, sku
) in pcd
.SkuInfoList
.items())
3001 if len(varnameset
) > 1:
3002 invalidhii
.append(".".join((pcdname
[1], pcdname
[0])))
3004 return False, invalidhii
3007 ## Retrieve dynamic VPD PCD settings
3009 # @param Type PCD type
3011 # @retval a dict object contains settings of given PCD type
3013 def _GetDynamicVpdPcd(self
, Type
):
3016 Pcds
= OrderedDict()
3018 # tdict is a special dict kind of type, used for selecting correct
3019 # PCD settings for certain ARCH and SKU
3021 PcdDict
= tdict(True, 4)
3024 # Find out all possible PCD candidates for self._Arch
3025 RecordList
= self
._RawData
[Type
, self
._Arch
]
3026 AvailableSkuIdSet
= copy
.copy(self
.SkuIds
)
3028 for TokenSpaceGuid
, PcdCName
, Setting
, Arch
, SkuName
, Dummy3
, Dummy4
, Dummy5
in RecordList
:
3029 SkuName
= SkuName
.upper()
3030 SkuName
= TAB_DEFAULT
if SkuName
== TAB_COMMON
else SkuName
3031 if SkuName
not in AvailableSkuIdSet
:
3032 EdkLogger
.error('build', PARAMETER_INVALID
, 'Sku %s is not defined in [SkuIds] section' % SkuName
,
3033 File
=self
.MetaFile
, Line
=Dummy5
)
3034 if "." not in TokenSpaceGuid
and "[" not in PcdCName
:
3035 PcdList
.append((PcdCName
, TokenSpaceGuid
, SkuName
, Dummy5
))
3036 PcdDict
[Arch
, SkuName
, PcdCName
, TokenSpaceGuid
] = Setting
3038 # Remove redundant PCD candidates, per the ARCH and SKU
3039 for PcdCName
, TokenSpaceGuid
, SkuName
, Dummy4
in PcdList
:
3040 Setting
= PcdDict
[self
._Arch
, SkuName
, PcdCName
, TokenSpaceGuid
]
3044 # For the VOID* type, it can have optional data of MaxDatumSize and InitialValue
3045 # For the Integer & Boolean type, the optional data can only be InitialValue.
3046 # At this point, we put all the data into the PcdClssObject for we don't know the PCD's datumtype
3047 # until the DEC parser has been called.
3049 VpdOffset
, MaxDatumSize
, InitialValue
= self
._ValidatePcd
(PcdCName
, TokenSpaceGuid
, Setting
, Type
, Dummy4
)
3051 if int(MaxDatumSize
, 0) > 0xFFFF:
3052 EdkLogger
.error('build', FORMAT_INVALID
, "The size value must not exceed the maximum value of 0xFFFF (UINT16) for %s." % ".".join((TokenSpaceGuid
, PcdCName
)),
3053 File
=self
.MetaFile
, Line
=Dummy4
)
3054 if int(MaxDatumSize
, 0) < 0:
3055 EdkLogger
.error('build', FORMAT_INVALID
, "The size value can't be set to negative value for %s." % ".".join((TokenSpaceGuid
, PcdCName
)),
3056 File
=self
.MetaFile
, Line
=Dummy4
)
3057 SkuInfo
= SkuInfoClass(SkuName
, self
.SkuIds
[SkuName
][0], '', '', '', '', VpdOffset
, InitialValue
)
3058 if (PcdCName
, TokenSpaceGuid
) in Pcds
:
3059 pcdObject
= Pcds
[PcdCName
, TokenSpaceGuid
]
3060 pcdObject
.SkuInfoList
[SkuName
] = SkuInfo
3061 if MaxDatumSize
.strip():
3062 CurrentMaxSize
= int(MaxDatumSize
.strip(), 0)
3065 if pcdObject
.MaxDatumSize
:
3066 PcdMaxSize
= int(pcdObject
.MaxDatumSize
, 0)
3069 if CurrentMaxSize
> PcdMaxSize
:
3070 pcdObject
.MaxDatumSize
= str(CurrentMaxSize
)
3072 Pcds
[PcdCName
, TokenSpaceGuid
] = PcdClassObject(
3075 self
._PCD
_TYPE
_STRING
_[Type
],
3080 OrderedDict({SkuName
: SkuInfo
}),
3085 if SkuName
not in Pcds
[PcdCName
, TokenSpaceGuid
].DscRawValue
:
3086 Pcds
[PcdCName
, TokenSpaceGuid
].DscRawValue
[SkuName
] = {}
3087 Pcds
[PcdCName
, TokenSpaceGuid
].DscRawValue
[SkuName
][TAB_DEFAULT_STORES_DEFAULT
] = InitialValue
3088 for pcd
in Pcds
.values():
3089 SkuInfoObj
= pcd
.SkuInfoList
.values()[0]
3090 pcdDecObject
= self
._DecPcds
[pcd
.TokenCName
, pcd
.TokenSpaceGuidCName
]
3091 pcd
.DatumType
= pcdDecObject
.DatumType
3092 # Only fix the value while no value provided in DSC file.
3093 for sku
in pcd
.SkuInfoList
.values():
3094 if not sku
.DefaultValue
:
3095 sku
.DefaultValue
= pcdDecObject
.DefaultValue
3096 if TAB_DEFAULT
not in pcd
.SkuInfoList
and TAB_COMMON
not in pcd
.SkuInfoList
:
3097 valuefromDec
= pcdDecObject
.DefaultValue
3098 SkuInfo
= SkuInfoClass(TAB_DEFAULT
, '0', '', '', '', '', SkuInfoObj
.VpdOffset
, valuefromDec
)
3099 pcd
.SkuInfoList
[TAB_DEFAULT
] = SkuInfo
3100 elif TAB_DEFAULT
not in pcd
.SkuInfoList
and TAB_COMMON
in pcd
.SkuInfoList
:
3101 pcd
.SkuInfoList
[TAB_DEFAULT
] = pcd
.SkuInfoList
[TAB_COMMON
]
3102 del pcd
.SkuInfoList
[TAB_COMMON
]
3103 elif TAB_DEFAULT
in pcd
.SkuInfoList
and TAB_COMMON
in pcd
.SkuInfoList
:
3104 del pcd
.SkuInfoList
[TAB_COMMON
]
3106 #For the same one VOID* pcd, if the default value type of one SKU is "Unicode string",
3107 #the other SKUs are "OtherVOID*"(ASCII string or byte array),Then convert "Unicode string" to "byte array".
3108 for pcd
in Pcds
.values():
3109 PcdValueTypeSet
= set()
3110 for sku
in pcd
.SkuInfoList
.values():
3111 PcdValueTypeSet
.add("UnicodeString" if sku
.DefaultValue
.startswith(('L"',"L'")) else "OtherVOID*")
3112 if len(PcdValueTypeSet
) > 1:
3113 for sku
in pcd
.SkuInfoList
.values():
3114 sku
.DefaultValue
= StringToArray(sku
.DefaultValue
) if sku
.DefaultValue
.startswith(('L"',"L'")) else sku
.DefaultValue
3116 map(self
.FilterSkuSettings
, Pcds
.values())
3119 ## Add external modules
3121 # The external modules are mostly those listed in FDF file, which don't
3124 # @param FilePath The path of module description file
3126 def AddModule(self
, FilePath
):
3127 FilePath
= NormPath(FilePath
)
3128 if FilePath
not in self
.Modules
:
3129 Module
= ModuleBuildClassObject()
3130 Module
.MetaFile
= FilePath
3131 self
.Modules
.append(Module
)
3134 def ToolChainFamily(self
):
3135 self
._ToolChainFamily
= TAB_COMPILER_MSFT
3136 BuildConfigurationFile
= os
.path
.normpath(os
.path
.join(GlobalData
.gConfDirectory
, "target.txt"))
3137 if os
.path
.isfile(BuildConfigurationFile
) == True:
3138 TargetTxt
= TargetTxtClassObject()
3139 TargetTxt
.LoadTargetTxtFile(BuildConfigurationFile
)
3140 ToolDefinitionFile
= TargetTxt
.TargetTxtDictionary
[DataType
.TAB_TAT_DEFINES_TOOL_CHAIN_CONF
]
3141 if ToolDefinitionFile
== '':
3142 ToolDefinitionFile
= "tools_def.txt"
3143 ToolDefinitionFile
= os
.path
.normpath(mws
.join(self
.WorkspaceDir
, 'Conf', ToolDefinitionFile
))
3144 if os
.path
.isfile(ToolDefinitionFile
) == True:
3145 ToolDef
= ToolDefClassObject()
3146 ToolDef
.LoadToolDefFile(ToolDefinitionFile
)
3147 ToolDefinition
= ToolDef
.ToolsDefTxtDatabase
3148 if TAB_TOD_DEFINES_FAMILY
not in ToolDefinition \
3149 or self
._Toolchain
not in ToolDefinition
[TAB_TOD_DEFINES_FAMILY
] \
3150 or not ToolDefinition
[TAB_TOD_DEFINES_FAMILY
][self
._Toolchain
]:
3151 self
._ToolChainFamily
= TAB_COMPILER_MSFT
3153 self
._ToolChainFamily
= ToolDefinition
[TAB_TOD_DEFINES_FAMILY
][self
._Toolchain
]
3154 return self
._ToolChainFamily
3156 ## Add external PCDs
3158 # The external PCDs are mostly those listed in FDF file to specify address
3159 # or offset information.
3161 # @param Name Name of the PCD
3162 # @param Guid Token space guid of the PCD
3163 # @param Value Value of the PCD
3165 def AddPcd(self
, Name
, Guid
, Value
):
3166 if (Name
, Guid
) not in self
.Pcds
:
3167 self
.Pcds
[Name
, Guid
] = PcdClassObject(Name
, Guid
, '', '', '', '', '', {}, False, None)
3168 self
.Pcds
[Name
, Guid
].DefaultValue
= Value
3172 if self
._DecPcds
is None:
3174 if GlobalData
.gFdfParser
:
3175 FdfInfList
= GlobalData
.gFdfParser
.Profile
.InfList
3177 for Inf
in FdfInfList
:
3178 ModuleFile
= PathClass(NormPath(Inf
), GlobalData
.gWorkspace
, Arch
=self
._Arch
)
3179 if ModuleFile
in self
._Modules
:
3181 ModuleData
= self
._Bdb
[ModuleFile
, self
._Arch
, self
._Target
, self
._Toolchain
]
3182 PkgSet
.update(ModuleData
.Packages
)
3183 self
._DecPcds
, self
._GuidDict
= GetDeclaredPcd(self
, self
._Bdb
, self
._Arch
, self
._Target
, self
._Toolchain
, PkgSet
)
3184 self
._GuidDict
.update(GlobalData
.gPlatformPcds
)
3185 return self
._DecPcds