2 # This file is used to create a database used by build tool
4 # Copyright (c) 2008 - 2018, Intel Corporation. All rights reserved.<BR>
5 # (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>
6 # This program and the accompanying materials
7 # are licensed and made available under the terms and conditions of the BSD License
8 # which accompanies this distribution. The full text of the license may be found at
9 # http://opensource.org/licenses/bsd-license.php
11 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15 ## Platform build information from DSC file
17 # This class is used to retrieve information stored in database and convert them
18 # into PlatformBuildClassObject form for easier use for AutoGen.
20 from Common
.String
import *
21 from Common
.DataType
import *
22 from Common
.Misc
import *
25 from CommonDataClass
.CommonClass
import SkuInfoClass
26 from Common
.TargetTxtClassObject
import *
27 from Common
.ToolDefClassObject
import *
28 from MetaDataTable
import *
29 from MetaFileTable
import *
30 from MetaFileParser
import *
32 from WorkspaceCommon
import GetDeclaredPcd
33 from Common
.Misc
import AnalyzeDscPcd
34 from Common
.Misc
import ProcessDuplicatedInf
36 from Common
.Parsing
import IsValidWord
37 from Common
.VariableAttributes
import VariableAttributes
38 import Common
.GlobalData
as GlobalData
40 from Common
.Misc
import SaveFileOnChange
41 from Workspace
.BuildClassObject
import PlatformBuildClassObject
, StructurePcd
, PcdClassObject
, ModuleBuildClassObject
42 from collections
import OrderedDict
45 # Treat CHAR16 as a synonym for UINT16. CHAR16 support is required for VFR C structs
47 PcdValueInitName
= 'PcdValueInit'
48 PcdSupportedBaseTypes
= ['BOOLEAN', 'UINT8', 'UINT16', 'UINT32', 'UINT64', 'CHAR16']
49 PcdSupportedBaseTypeWidth
= {'BOOLEAN':8, 'UINT8':8, 'UINT16':16, 'UINT32':32, 'UINT64':64}
50 PcdUnsupportedBaseTypes
= ['INT8', 'INT16', 'INT32', 'INT64', 'CHAR8', 'UINTN', 'INTN', 'VOID']
61 #include <PcdValueCommon.h>
71 return PcdValueMain (argc, argv);
75 PcdMakefileHeader
= '''
78 # This file is auto-generated by build utility
83 WindowsCFLAGS
= 'CFLAGS = $(CFLAGS) /wd4200 /wd4034 /wd4101 '
84 LinuxCFLAGS
= 'BUILD_CFLAGS += -Wno-pointer-to-int-cast -Wno-unused-variable '
86 !INCLUDE $(BASE_TOOLS_PATH)\Source\C\Makefiles\ms.common
88 LIBS = $(LIB_PATH)\Common.lib
90 !INCLUDE $(BASE_TOOLS_PATH)\Source\C\Makefiles\ms.app
94 MAKEROOT ?= $(EDK_TOOLS_PATH)/Source/C
98 class DscBuildData(PlatformBuildClassObject
):
99 # dict used to convert PCD type in database to string used by build tool
100 _PCD_TYPE_STRING_
= {
101 MODEL_PCD_FIXED_AT_BUILD
: "FixedAtBuild",
102 MODEL_PCD_PATCHABLE_IN_MODULE
: "PatchableInModule",
103 MODEL_PCD_FEATURE_FLAG
: "FeatureFlag",
104 MODEL_PCD_DYNAMIC
: "Dynamic",
105 MODEL_PCD_DYNAMIC_DEFAULT
: "Dynamic",
106 MODEL_PCD_DYNAMIC_HII
: "DynamicHii",
107 MODEL_PCD_DYNAMIC_VPD
: "DynamicVpd",
108 MODEL_PCD_DYNAMIC_EX
: "DynamicEx",
109 MODEL_PCD_DYNAMIC_EX_DEFAULT
: "DynamicEx",
110 MODEL_PCD_DYNAMIC_EX_HII
: "DynamicExHii",
111 MODEL_PCD_DYNAMIC_EX_VPD
: "DynamicExVpd",
114 # dict used to convert part of [Defines] to members of DscBuildData directly
119 TAB_DSC_DEFINES_PLATFORM_NAME
: "_PlatformName",
120 TAB_DSC_DEFINES_PLATFORM_GUID
: "_Guid",
121 TAB_DSC_DEFINES_PLATFORM_VERSION
: "_Version",
122 TAB_DSC_DEFINES_DSC_SPECIFICATION
: "_DscSpecification",
123 # TAB_DSC_DEFINES_OUTPUT_DIRECTORY : "_OutputDirectory",
124 # TAB_DSC_DEFINES_SUPPORTED_ARCHITECTURES : "_SupArchList",
125 # TAB_DSC_DEFINES_BUILD_TARGETS : "_BuildTargets",
126 TAB_DSC_DEFINES_SKUID_IDENTIFIER
: "_SkuName",
127 # TAB_DSC_DEFINES_FLASH_DEFINITION : "_FlashDefinition",
128 TAB_DSC_DEFINES_BUILD_NUMBER
: "_BuildNumber",
129 TAB_DSC_DEFINES_MAKEFILE_NAME
: "_MakefileName",
130 TAB_DSC_DEFINES_BS_BASE_ADDRESS
: "_BsBaseAddress",
131 TAB_DSC_DEFINES_RT_BASE_ADDRESS
: "_RtBaseAddress",
132 # TAB_DSC_DEFINES_RFC_LANGUAGES : "_RFCLanguages",
133 # TAB_DSC_DEFINES_ISO_LANGUAGES : "_ISOLanguages",
136 # used to compose dummy library class name for those forced library instances
137 _NullLibraryNumber
= 0
139 ## Constructor of DscBuildData
141 # Initialize object of DscBuildData
143 # @param FilePath The path of platform description file
144 # @param RawData The raw data of DSC file
145 # @param BuildDataBase Database used to retrieve module/package information
146 # @param Arch The target architecture
147 # @param Platform (not used for DscBuildData)
148 # @param Macros Macros used for replacement in DSC file
150 def __init__(self
, FilePath
, RawData
, BuildDataBase
, Arch
='COMMON', Target
=None, Toolchain
=None):
151 self
.MetaFile
= FilePath
152 self
._RawData
= RawData
153 self
._Bdb
= BuildDataBase
155 self
._Target
= Target
156 self
._Toolchain
= Toolchain
157 self
._ToolChainFamily
= None
159 self
._HandleOverridePath
()
160 self
.WorkspaceDir
= os
.getenv("WORKSPACE") if os
.getenv("WORKSPACE") else ""
161 self
.DefaultStores
= None
162 self
.SkuIdMgr
= SkuClass(self
.SkuName
, self
.SkuIds
)
164 def OutputPath(self
):
165 if os
.getenv("WORKSPACE"):
166 return os
.path
.join(os
.getenv("WORKSPACE"), self
.OutputDirectory
, self
._Target
+ "_" + self
._Toolchain
,PcdValueInitName
)
168 return os
.path
.dirname(self
.DscFile
)
171 def __setitem__(self
, key
, value
):
172 self
.__dict
__[self
._PROPERTY
_[key
]] = value
175 def __getitem__(self
, key
):
176 return self
.__dict
__[self
._PROPERTY
_[key
]]
179 def __contains__(self
, key
):
180 return key
in self
._PROPERTY
_
182 ## Set all internal used members of DscBuildData to None
185 self
._PlatformName
= None
188 self
._DscSpecification
= None
189 self
._OutputDirectory
= None
190 self
._SupArchList
= None
191 self
._BuildTargets
= None
193 self
._PcdInfoFlag
= None
194 self
._VarCheckFlag
= None
195 self
._FlashDefinition
= None
196 self
._Prebuild
= None
197 self
._Postbuild
= None
198 self
._BuildNumber
= None
199 self
._MakefileName
= None
200 self
._BsBaseAddress
= None
201 self
._RtBaseAddress
= None
204 self
._LibraryInstances
= None
205 self
._LibraryClasses
= None
208 self
._BuildOptions
= None
209 self
._ModuleTypeOptions
= None
210 self
._LoadFixAddress
= None
211 self
._RFCLanguages
= None
212 self
._ISOLanguages
= None
213 self
._VpdToolGuid
= None
215 self
.DefaultStores
= None
218 ## handle Override Path of Module
219 def _HandleOverridePath(self
):
220 RecordList
= self
._RawData
[MODEL_META_DATA_COMPONENT
, self
._Arch
]
221 Macros
= self
._Macros
222 Macros
["EDK_SOURCE"] = GlobalData
.gEcpSource
223 for Record
in RecordList
:
226 ModuleFile
= PathClass(NormPath(Record
[0]), GlobalData
.gWorkspace
, Arch
=self
._Arch
)
227 RecordList
= self
._RawData
[MODEL_META_DATA_COMPONENT_SOURCE_OVERRIDE_PATH
, self
._Arch
, None, ModuleId
]
229 SourceOverridePath
= mws
.join(GlobalData
.gWorkspace
, NormPath(RecordList
[0][0]))
231 # Check if the source override path exists
232 if not os
.path
.isdir(SourceOverridePath
):
233 EdkLogger
.error('build', FILE_NOT_FOUND
, Message
='Source override path does not exist:', File
=self
.MetaFile
, ExtraData
=SourceOverridePath
, Line
=LineNo
)
235 # Add to GlobalData Variables
236 GlobalData
.gOverrideDir
[ModuleFile
.Key
] = SourceOverridePath
238 ## Get current effective macros
239 def _GetMacros(self
):
240 if self
.__Macros
== None:
242 self
.__Macros
.update(GlobalData
.gPlatformDefines
)
243 self
.__Macros
.update(GlobalData
.gGlobalDefines
)
244 self
.__Macros
.update(GlobalData
.gCommandLineDefines
)
253 # Changing the default ARCH to another may affect all other information
254 # because all information in a platform may be ARCH-related. That's
255 # why we need to clear all internal used members, in order to cause all
256 # information to be re-retrieved.
258 # @param Value The value of ARCH
260 def _SetArch(self
, Value
):
261 if self
._Arch
== Value
:
266 ## Retrieve all information in [Defines] section
268 # (Retriving all [Defines] information in one-shot is just to save time.)
270 def _GetHeaderInfo(self
):
271 RecordList
= self
._RawData
[MODEL_META_DATA_HEADER
, self
._Arch
]
272 for Record
in RecordList
:
274 # items defined _PROPERTY_ don't need additional processing
276 # some special items in [Defines] section need special treatment
277 if Name
== TAB_DSC_DEFINES_OUTPUT_DIRECTORY
:
278 self
._OutputDirectory
= NormPath(Record
[2], self
._Macros
)
279 if ' ' in self
._OutputDirectory
:
280 EdkLogger
.error("build", FORMAT_NOT_SUPPORTED
, "No space is allowed in OUTPUT_DIRECTORY",
281 File
=self
.MetaFile
, Line
=Record
[-1],
282 ExtraData
=self
._OutputDirectory
)
283 elif Name
== TAB_DSC_DEFINES_FLASH_DEFINITION
:
284 self
._FlashDefinition
= PathClass(NormPath(Record
[2], self
._Macros
), GlobalData
.gWorkspace
)
285 ErrorCode
, ErrorInfo
= self
._FlashDefinition
.Validate('.fdf')
287 EdkLogger
.error('build', ErrorCode
, File
=self
.MetaFile
, Line
=Record
[-1],
289 elif Name
== TAB_DSC_PREBUILD
:
290 PrebuildValue
= Record
[2]
291 if Record
[2][0] == '"':
292 if Record
[2][-1] != '"':
293 EdkLogger
.error('build', FORMAT_INVALID
, 'Missing double quotes in the end of %s statement.' % TAB_DSC_PREBUILD
,
294 File
=self
.MetaFile
, Line
=Record
[-1])
295 PrebuildValue
= Record
[2][1:-1]
296 self
._Prebuild
= PrebuildValue
297 elif Name
== TAB_DSC_POSTBUILD
:
298 PostbuildValue
= Record
[2]
299 if Record
[2][0] == '"':
300 if Record
[2][-1] != '"':
301 EdkLogger
.error('build', FORMAT_INVALID
, 'Missing double quotes in the end of %s statement.' % TAB_DSC_POSTBUILD
,
302 File
=self
.MetaFile
, Line
=Record
[-1])
303 PostbuildValue
= Record
[2][1:-1]
304 self
._Postbuild
= PostbuildValue
305 elif Name
== TAB_DSC_DEFINES_SUPPORTED_ARCHITECTURES
:
306 self
._SupArchList
= GetSplitValueList(Record
[2], TAB_VALUE_SPLIT
)
307 elif Name
== TAB_DSC_DEFINES_BUILD_TARGETS
:
308 self
._BuildTargets
= GetSplitValueList(Record
[2])
309 elif Name
== TAB_DSC_DEFINES_SKUID_IDENTIFIER
:
310 if self
._SkuName
== None:
311 self
._SkuName
= Record
[2]
312 if GlobalData
.gSKUID_CMD
:
313 self
._SkuName
= GlobalData
.gSKUID_CMD
314 elif Name
== TAB_DSC_DEFINES_PCD_INFO_GENERATION
:
315 self
._PcdInfoFlag
= Record
[2]
316 elif Name
== TAB_DSC_DEFINES_PCD_VAR_CHECK_GENERATION
:
317 self
._VarCheckFlag
= Record
[2]
318 elif Name
== TAB_FIX_LOAD_TOP_MEMORY_ADDRESS
:
320 self
._LoadFixAddress
= int (Record
[2], 0)
322 EdkLogger
.error("build", PARAMETER_INVALID
, "FIX_LOAD_TOP_MEMORY_ADDRESS %s is not valid dec or hex string" % (Record
[2]))
323 elif Name
== TAB_DSC_DEFINES_RFC_LANGUAGES
:
324 if not Record
[2] or Record
[2][0] != '"' or Record
[2][-1] != '"' or len(Record
[2]) == 1:
325 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"',
326 File
=self
.MetaFile
, Line
=Record
[-1])
327 LanguageCodes
= Record
[2][1:-1]
328 if not LanguageCodes
:
329 EdkLogger
.error('build', FORMAT_NOT_SUPPORTED
, 'one or more RFC4646 format language code must be provided for RFC_LANGUAGES statement',
330 File
=self
.MetaFile
, Line
=Record
[-1])
331 LanguageList
= GetSplitValueList(LanguageCodes
, TAB_SEMI_COLON_SPLIT
)
332 # check whether there is empty entries in the list
333 if None in LanguageList
:
334 EdkLogger
.error('build', FORMAT_NOT_SUPPORTED
, 'one or more empty language code is in RFC_LANGUAGES statement',
335 File
=self
.MetaFile
, Line
=Record
[-1])
336 self
._RFCLanguages
= LanguageList
337 elif Name
== TAB_DSC_DEFINES_ISO_LANGUAGES
:
338 if not Record
[2] or Record
[2][0] != '"' or Record
[2][-1] != '"' or len(Record
[2]) == 1:
339 EdkLogger
.error('build', FORMAT_NOT_SUPPORTED
, 'language code for ISO_LANGUAGES must have double quotes around it, for example: ISO_LANGUAGES = "engchn"',
340 File
=self
.MetaFile
, Line
=Record
[-1])
341 LanguageCodes
= Record
[2][1:-1]
342 if not LanguageCodes
:
343 EdkLogger
.error('build', FORMAT_NOT_SUPPORTED
, 'one or more ISO639-2 format language code must be provided for ISO_LANGUAGES statement',
344 File
=self
.MetaFile
, Line
=Record
[-1])
345 if len(LanguageCodes
) % 3:
346 EdkLogger
.error('build', FORMAT_NOT_SUPPORTED
, 'bad ISO639-2 format for ISO_LANGUAGES',
347 File
=self
.MetaFile
, Line
=Record
[-1])
349 for i
in range(0, len(LanguageCodes
), 3):
350 LanguageList
.append(LanguageCodes
[i
:i
+ 3])
351 self
._ISOLanguages
= LanguageList
352 elif Name
== TAB_DSC_DEFINES_VPD_TOOL_GUID
:
354 # try to convert GUID to a real UUID value to see whether the GUID is format
355 # for VPD_TOOL_GUID is correct.
360 EdkLogger
.error("build", FORMAT_INVALID
, "Invalid GUID format for VPD_TOOL_GUID", File
=self
.MetaFile
)
361 self
._VpdToolGuid
= Record
[2]
363 self
[Name
] = Record
[2]
364 # set _Header to non-None in order to avoid database re-querying
365 self
._Header
= 'DUMMY'
367 ## Retrieve platform name
368 def _GetPlatformName(self
):
369 if self
._PlatformName
== None:
370 if self
._Header
== None:
371 self
._GetHeaderInfo
()
372 if self
._PlatformName
== None:
373 EdkLogger
.error('build', ATTRIBUTE_NOT_AVAILABLE
, "No PLATFORM_NAME", File
=self
.MetaFile
)
374 return self
._PlatformName
376 ## Retrieve file guid
377 def _GetFileGuid(self
):
378 if self
._Guid
== None:
379 if self
._Header
== None:
380 self
._GetHeaderInfo
()
381 if self
._Guid
== None:
382 EdkLogger
.error('build', ATTRIBUTE_NOT_AVAILABLE
, "No PLATFORM_GUID", File
=self
.MetaFile
)
385 ## Retrieve platform version
386 def _GetVersion(self
):
387 if self
._Version
== None:
388 if self
._Header
== None:
389 self
._GetHeaderInfo
()
390 if self
._Version
== None:
391 EdkLogger
.error('build', ATTRIBUTE_NOT_AVAILABLE
, "No PLATFORM_VERSION", File
=self
.MetaFile
)
394 ## Retrieve platform description file version
395 def _GetDscSpec(self
):
396 if self
._DscSpecification
== None:
397 if self
._Header
== None:
398 self
._GetHeaderInfo
()
399 if self
._DscSpecification
== None:
400 EdkLogger
.error('build', ATTRIBUTE_NOT_AVAILABLE
, "No DSC_SPECIFICATION", File
=self
.MetaFile
)
401 return self
._DscSpecification
403 ## Retrieve OUTPUT_DIRECTORY
404 def _GetOutpuDir(self
):
405 if self
._OutputDirectory
== None:
406 if self
._Header
== None:
407 self
._GetHeaderInfo
()
408 if self
._OutputDirectory
== None:
409 self
._OutputDirectory
= os
.path
.join("Build", self
._PlatformName
)
410 return self
._OutputDirectory
412 ## Retrieve SUPPORTED_ARCHITECTURES
413 def _GetSupArch(self
):
414 if self
._SupArchList
== None:
415 if self
._Header
== None:
416 self
._GetHeaderInfo
()
417 if self
._SupArchList
== None:
418 EdkLogger
.error('build', ATTRIBUTE_NOT_AVAILABLE
, "No SUPPORTED_ARCHITECTURES", File
=self
.MetaFile
)
419 return self
._SupArchList
421 ## Retrieve BUILD_TARGETS
422 def _GetBuildTarget(self
):
423 if self
._BuildTargets
== None:
424 if self
._Header
== None:
425 self
._GetHeaderInfo
()
426 if self
._BuildTargets
== None:
427 EdkLogger
.error('build', ATTRIBUTE_NOT_AVAILABLE
, "No BUILD_TARGETS", File
=self
.MetaFile
)
428 return self
._BuildTargets
430 def _GetPcdInfoFlag(self
):
431 if self
._PcdInfoFlag
== None or self
._PcdInfoFlag
.upper() == 'FALSE':
433 elif self
._PcdInfoFlag
.upper() == 'TRUE':
437 def _GetVarCheckFlag(self
):
438 if self
._VarCheckFlag
== None or self
._VarCheckFlag
.upper() == 'FALSE':
440 elif self
._VarCheckFlag
.upper() == 'TRUE':
445 # # Retrieve SKUID_IDENTIFIER
446 def _GetSkuName(self
):
447 if self
._SkuName
== None:
448 if self
._Header
== None:
449 self
._GetHeaderInfo
()
450 if self
._SkuName
== None:
451 self
._SkuName
= 'DEFAULT'
454 ## Override SKUID_IDENTIFIER
455 def _SetSkuName(self
, Value
):
456 self
._SkuName
= Value
458 def _GetFdfFile(self
):
459 if self
._FlashDefinition
== None:
460 if self
._Header
== None:
461 self
._GetHeaderInfo
()
462 if self
._FlashDefinition
== None:
463 self
._FlashDefinition
= ''
464 return self
._FlashDefinition
466 def _GetPrebuild(self
):
467 if self
._Prebuild
== None:
468 if self
._Header
== None:
469 self
._GetHeaderInfo
()
470 if self
._Prebuild
== None:
472 return self
._Prebuild
474 def _GetPostbuild(self
):
475 if self
._Postbuild
== None:
476 if self
._Header
== None:
477 self
._GetHeaderInfo
()
478 if self
._Postbuild
== None:
480 return self
._Postbuild
482 ## Retrieve FLASH_DEFINITION
483 def _GetBuildNumber(self
):
484 if self
._BuildNumber
== None:
485 if self
._Header
== None:
486 self
._GetHeaderInfo
()
487 if self
._BuildNumber
== None:
488 self
._BuildNumber
= ''
489 return self
._BuildNumber
491 ## Retrieve MAKEFILE_NAME
492 def _GetMakefileName(self
):
493 if self
._MakefileName
== None:
494 if self
._Header
== None:
495 self
._GetHeaderInfo
()
496 if self
._MakefileName
== None:
497 self
._MakefileName
= ''
498 return self
._MakefileName
500 ## Retrieve BsBaseAddress
501 def _GetBsBaseAddress(self
):
502 if self
._BsBaseAddress
== None:
503 if self
._Header
== None:
504 self
._GetHeaderInfo
()
505 if self
._BsBaseAddress
== None:
506 self
._BsBaseAddress
= ''
507 return self
._BsBaseAddress
509 ## Retrieve RtBaseAddress
510 def _GetRtBaseAddress(self
):
511 if self
._RtBaseAddress
== None:
512 if self
._Header
== None:
513 self
._GetHeaderInfo
()
514 if self
._RtBaseAddress
== None:
515 self
._RtBaseAddress
= ''
516 return self
._RtBaseAddress
518 ## Retrieve the top address for the load fix address
519 def _GetLoadFixAddress(self
):
520 if self
._LoadFixAddress
== None:
521 if self
._Header
== None:
522 self
._GetHeaderInfo
()
524 if self
._LoadFixAddress
== None:
525 self
._LoadFixAddress
= self
._Macros
.get(TAB_FIX_LOAD_TOP_MEMORY_ADDRESS
, '0')
528 self
._LoadFixAddress
= int (self
._LoadFixAddress
, 0)
530 EdkLogger
.error("build", PARAMETER_INVALID
, "FIX_LOAD_TOP_MEMORY_ADDRESS %s is not valid dec or hex string" % (self
._LoadFixAddress
))
533 # If command line defined, should override the value in DSC file.
535 if 'FIX_LOAD_TOP_MEMORY_ADDRESS' in GlobalData
.gCommandLineDefines
.keys():
537 self
._LoadFixAddress
= int(GlobalData
.gCommandLineDefines
['FIX_LOAD_TOP_MEMORY_ADDRESS'], 0)
539 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']))
541 if self
._LoadFixAddress
< 0:
542 EdkLogger
.error("build", PARAMETER_INVALID
, "FIX_LOAD_TOP_MEMORY_ADDRESS is set to the invalid negative value 0x%x" % (self
._LoadFixAddress
))
543 if self
._LoadFixAddress
!= 0xFFFFFFFFFFFFFFFF and self
._LoadFixAddress
% 0x1000 != 0:
544 EdkLogger
.error("build", PARAMETER_INVALID
, "FIX_LOAD_TOP_MEMORY_ADDRESS is set to the invalid unaligned 4K value 0x%x" % (self
._LoadFixAddress
))
546 return self
._LoadFixAddress
548 ## Retrieve RFCLanguage filter
549 def _GetRFCLanguages(self
):
550 if self
._RFCLanguages
== None:
551 if self
._Header
== None:
552 self
._GetHeaderInfo
()
553 if self
._RFCLanguages
== None:
554 self
._RFCLanguages
= []
555 return self
._RFCLanguages
557 ## Retrieve ISOLanguage filter
558 def _GetISOLanguages(self
):
559 if self
._ISOLanguages
== None:
560 if self
._Header
== None:
561 self
._GetHeaderInfo
()
562 if self
._ISOLanguages
== None:
563 self
._ISOLanguages
= []
564 return self
._ISOLanguages
565 ## Retrieve the GUID string for VPD tool
566 def _GetVpdToolGuid(self
):
567 if self
._VpdToolGuid
== None:
568 if self
._Header
== None:
569 self
._GetHeaderInfo
()
570 if self
._VpdToolGuid
== None:
571 self
._VpdToolGuid
= ''
572 return self
._VpdToolGuid
574 ## Retrieve [SkuIds] section information
575 def _GetSkuIds(self
):
576 if self
._SkuIds
== None:
577 self
._SkuIds
= sdict()
578 RecordList
= self
._RawData
[MODEL_EFI_SKU_ID
, self
._Arch
]
579 for Record
in RecordList
:
580 if Record
[0] in [None, '']:
581 EdkLogger
.error('build', FORMAT_INVALID
, 'No Sku ID number',
582 File
=self
.MetaFile
, Line
=Record
[-1])
583 if Record
[1] in [None, '']:
584 EdkLogger
.error('build', FORMAT_INVALID
, 'No Sku ID name',
585 File
=self
.MetaFile
, Line
=Record
[-1])
586 Pattern
= re
.compile('^[1-9]\d*|0$')
587 HexPattern
= re
.compile(r
'0[xX][0-9a-fA-F]+$')
588 if Pattern
.match(Record
[0]) == None and HexPattern
.match(Record
[0]) == None:
589 EdkLogger
.error('build', FORMAT_INVALID
, "The format of the Sku ID number is invalid. It only support Integer and HexNumber",
590 File
=self
.MetaFile
, Line
=Record
[-1])
591 if not IsValidWord(Record
[1]):
592 EdkLogger
.error('build', FORMAT_INVALID
, "The format of the Sku ID name is invalid. The correct format is '(a-zA-Z0-9_)(a-zA-Z0-9_-.)*'",
593 File
=self
.MetaFile
, Line
=Record
[-1])
594 self
._SkuIds
[Record
[1].upper()] = (str(self
.ToInt(Record
[0])), Record
[1].upper(), Record
[2].upper())
595 if 'DEFAULT' not in self
._SkuIds
:
596 self
._SkuIds
['DEFAULT'] = ("0","DEFAULT","DEFAULT")
597 if 'COMMON' not in self
._SkuIds
:
598 self
._SkuIds
['COMMON'] = ("0","DEFAULT","DEFAULT")
600 def ToInt(self
,intstr
):
601 return int(intstr
,16) if intstr
.upper().startswith("0X") else int(intstr
)
602 def _GetDefaultStores(self
):
603 if self
.DefaultStores
== None:
604 self
.DefaultStores
= sdict()
605 RecordList
= self
._RawData
[MODEL_EFI_DEFAULT_STORES
, self
._Arch
]
606 for Record
in RecordList
:
607 if Record
[0] in [None, '']:
608 EdkLogger
.error('build', FORMAT_INVALID
, 'No DefaultStores ID number',
609 File
=self
.MetaFile
, Line
=Record
[-1])
610 if Record
[1] in [None, '']:
611 EdkLogger
.error('build', FORMAT_INVALID
, 'No DefaultStores ID name',
612 File
=self
.MetaFile
, Line
=Record
[-1])
613 Pattern
= re
.compile('^[1-9]\d*|0$')
614 HexPattern
= re
.compile(r
'0[xX][0-9a-fA-F]+$')
615 if Pattern
.match(Record
[0]) == None and HexPattern
.match(Record
[0]) == None:
616 EdkLogger
.error('build', FORMAT_INVALID
, "The format of the DefaultStores ID number is invalid. It only support Integer and HexNumber",
617 File
=self
.MetaFile
, Line
=Record
[-1])
618 if not IsValidWord(Record
[1]):
619 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_-.)*'",
620 File
=self
.MetaFile
, Line
=Record
[-1])
621 self
.DefaultStores
[Record
[1].upper()] = (self
.ToInt(Record
[0]),Record
[1].upper())
622 if TAB_DEFAULT_STORES_DEFAULT
not in self
.DefaultStores
:
623 self
.DefaultStores
[TAB_DEFAULT_STORES_DEFAULT
] = (0,TAB_DEFAULT_STORES_DEFAULT
)
624 GlobalData
.gDefaultStores
= self
.DefaultStores
.keys()
625 if GlobalData
.gDefaultStores
:
626 GlobalData
.gDefaultStores
.sort()
627 return self
.DefaultStores
629 ## Retrieve [Components] section information
630 def _GetModules(self
):
631 if self
._Modules
!= None:
634 self
._Modules
= sdict()
635 RecordList
= self
._RawData
[MODEL_META_DATA_COMPONENT
, self
._Arch
]
636 Macros
= self
._Macros
637 Macros
["EDK_SOURCE"] = GlobalData
.gEcpSource
638 for Record
in RecordList
:
639 DuplicatedFile
= False
641 ModuleFile
= PathClass(NormPath(Record
[0], Macros
), GlobalData
.gWorkspace
, Arch
=self
._Arch
)
645 # check the file validation
646 ErrorCode
, ErrorInfo
= ModuleFile
.Validate('.inf')
648 EdkLogger
.error('build', ErrorCode
, File
=self
.MetaFile
, Line
=LineNo
,
651 # If arch is COMMON, no duplicate module is checked since all modules in all component sections are selected
652 if self
._Arch
!= 'COMMON' and ModuleFile
in self
._Modules
:
653 DuplicatedFile
= True
655 Module
= ModuleBuildClassObject()
656 Module
.MetaFile
= ModuleFile
658 # get module private library instance
659 RecordList
= self
._RawData
[MODEL_EFI_LIBRARY_CLASS
, self
._Arch
, None, ModuleId
]
660 for Record
in RecordList
:
661 LibraryClass
= Record
[0]
662 LibraryPath
= PathClass(NormPath(Record
[1], Macros
), GlobalData
.gWorkspace
, Arch
=self
._Arch
)
665 # check the file validation
666 ErrorCode
, ErrorInfo
= LibraryPath
.Validate('.inf')
668 EdkLogger
.error('build', ErrorCode
, File
=self
.MetaFile
, Line
=LineNo
,
671 if LibraryClass
== '' or LibraryClass
== 'NULL':
672 self
._NullLibraryNumber
+= 1
673 LibraryClass
= 'NULL%d' % self
._NullLibraryNumber
674 EdkLogger
.verbose("Found forced library for %s\n\t%s [%s]" % (ModuleFile
, LibraryPath
, LibraryClass
))
675 Module
.LibraryClasses
[LibraryClass
] = LibraryPath
676 if LibraryPath
not in self
.LibraryInstances
:
677 self
.LibraryInstances
.append(LibraryPath
)
679 # get module private PCD setting
680 for Type
in [MODEL_PCD_FIXED_AT_BUILD
, MODEL_PCD_PATCHABLE_IN_MODULE
, \
681 MODEL_PCD_FEATURE_FLAG
, MODEL_PCD_DYNAMIC
, MODEL_PCD_DYNAMIC_EX
]:
682 RecordList
= self
._RawData
[Type
, self
._Arch
, None, ModuleId
]
683 for TokenSpaceGuid
, PcdCName
, Setting
, Dummy1
, Dummy2
, Dummy3
, Dummy4
,Dummy5
in RecordList
:
684 TokenList
= GetSplitValueList(Setting
)
685 DefaultValue
= TokenList
[0]
686 # the format is PcdName| Value | VOID* | MaxDatumSize
687 if len(TokenList
) > 2:
688 MaxDatumSize
= TokenList
[2]
691 TypeString
= self
._PCD
_TYPE
_STRING
_[Type
]
692 Pcd
= PcdClassObject(
704 Module
.Pcds
[PcdCName
, TokenSpaceGuid
] = Pcd
706 # get module private build options
707 RecordList
= self
._RawData
[MODEL_META_DATA_BUILD_OPTION
, self
._Arch
, None, ModuleId
]
708 for ToolChainFamily
, ToolChain
, Option
, Dummy1
, Dummy2
, Dummy3
, Dummy4
,Dummy5
in RecordList
:
709 if (ToolChainFamily
, ToolChain
) not in Module
.BuildOptions
:
710 Module
.BuildOptions
[ToolChainFamily
, ToolChain
] = Option
712 OptionString
= Module
.BuildOptions
[ToolChainFamily
, ToolChain
]
713 Module
.BuildOptions
[ToolChainFamily
, ToolChain
] = OptionString
+ " " + Option
715 RecordList
= self
._RawData
[MODEL_META_DATA_HEADER
, self
._Arch
, None, ModuleId
]
716 if DuplicatedFile
and not RecordList
:
717 EdkLogger
.error('build', FILE_DUPLICATED
, File
=self
.MetaFile
, ExtraData
=str(ModuleFile
), Line
=LineNo
)
719 if len(RecordList
) != 1:
720 EdkLogger
.error('build', OPTION_UNKNOWN
, 'Only FILE_GUID can be listed in <Defines> section.',
721 File
=self
.MetaFile
, ExtraData
=str(ModuleFile
), Line
=LineNo
)
722 ModuleFile
= ProcessDuplicatedInf(ModuleFile
, RecordList
[0][2], GlobalData
.gWorkspace
)
723 ModuleFile
.Arch
= self
._Arch
725 self
._Modules
[ModuleFile
] = Module
728 ## Retrieve all possible library instances used in this platform
729 def _GetLibraryInstances(self
):
730 if self
._LibraryInstances
== None:
731 self
._GetLibraryClasses
()
732 return self
._LibraryInstances
734 ## Retrieve [LibraryClasses] information
735 def _GetLibraryClasses(self
):
736 if self
._LibraryClasses
== None:
737 self
._LibraryInstances
= []
739 # tdict is a special dict kind of type, used for selecting correct
740 # library instance for given library class and module type
742 LibraryClassDict
= tdict(True, 3)
743 # track all library class names
744 LibraryClassSet
= set()
745 RecordList
= self
._RawData
[MODEL_EFI_LIBRARY_CLASS
, self
._Arch
, None, -1]
746 Macros
= self
._Macros
747 for Record
in RecordList
:
748 LibraryClass
, LibraryInstance
, Dummy
, Arch
, ModuleType
, Dummy
,Dummy
, LineNo
= Record
749 if LibraryClass
== '' or LibraryClass
== 'NULL':
750 self
._NullLibraryNumber
+= 1
751 LibraryClass
= 'NULL%d' % self
._NullLibraryNumber
752 EdkLogger
.verbose("Found forced library for arch=%s\n\t%s [%s]" % (Arch
, LibraryInstance
, LibraryClass
))
753 LibraryClassSet
.add(LibraryClass
)
754 LibraryInstance
= PathClass(NormPath(LibraryInstance
, Macros
), GlobalData
.gWorkspace
, Arch
=self
._Arch
)
755 # check the file validation
756 ErrorCode
, ErrorInfo
= LibraryInstance
.Validate('.inf')
758 EdkLogger
.error('build', ErrorCode
, File
=self
.MetaFile
, Line
=LineNo
,
761 if ModuleType
!= 'COMMON' and ModuleType
not in SUP_MODULE_LIST
:
762 EdkLogger
.error('build', OPTION_UNKNOWN
, "Unknown module type [%s]" % ModuleType
,
763 File
=self
.MetaFile
, ExtraData
=LibraryInstance
, Line
=LineNo
)
764 LibraryClassDict
[Arch
, ModuleType
, LibraryClass
] = LibraryInstance
765 if LibraryInstance
not in self
._LibraryInstances
:
766 self
._LibraryInstances
.append(LibraryInstance
)
768 # resolve the specific library instance for each class and each module type
769 self
._LibraryClasses
= tdict(True)
770 for LibraryClass
in LibraryClassSet
:
771 # try all possible module types
772 for ModuleType
in SUP_MODULE_LIST
:
773 LibraryInstance
= LibraryClassDict
[self
._Arch
, ModuleType
, LibraryClass
]
774 if LibraryInstance
== None:
776 self
._LibraryClasses
[LibraryClass
, ModuleType
] = LibraryInstance
778 # for Edk style library instances, which are listed in different section
779 Macros
["EDK_SOURCE"] = GlobalData
.gEcpSource
780 RecordList
= self
._RawData
[MODEL_EFI_LIBRARY_INSTANCE
, self
._Arch
]
781 for Record
in RecordList
:
782 File
= PathClass(NormPath(Record
[0], Macros
), GlobalData
.gWorkspace
, Arch
=self
._Arch
)
784 # check the file validation
785 ErrorCode
, ErrorInfo
= File
.Validate('.inf')
787 EdkLogger
.error('build', ErrorCode
, File
=self
.MetaFile
, Line
=LineNo
,
789 if File
not in self
._LibraryInstances
:
790 self
._LibraryInstances
.append(File
)
792 # we need the module name as the library class name, so we have
793 # to parse it here. (self._Bdb[] will trigger a file parse if it
794 # hasn't been parsed)
796 Library
= self
._Bdb
[File
, self
._Arch
, self
._Target
, self
._Toolchain
]
797 self
._LibraryClasses
[Library
.BaseName
, ':dummy:'] = Library
798 return self
._LibraryClasses
800 def _ValidatePcd(self
, PcdCName
, TokenSpaceGuid
, Setting
, PcdType
, LineNo
):
801 if self
._DecPcds
== None:
804 if GlobalData
.gFdfParser
:
805 FdfInfList
= GlobalData
.gFdfParser
.Profile
.InfList
808 for Inf
in FdfInfList
:
809 ModuleFile
= PathClass(NormPath(Inf
), GlobalData
.gWorkspace
, Arch
=self
._Arch
)
810 if ModuleFile
in self
._Modules
:
812 ModuleData
= self
._Bdb
[ModuleFile
, self
._Arch
, self
._Target
, self
._Toolchain
]
813 PkgSet
.update(ModuleData
.Packages
)
815 self
._DecPcds
, self
._GuidDict
= GetDeclaredPcd(self
, self
._Bdb
, self
._Arch
, self
._Target
, self
._Toolchain
,PkgSet
)
816 self
._GuidDict
.update(GlobalData
.gPlatformPcds
)
818 if (PcdCName
, TokenSpaceGuid
) not in self
._DecPcds
:
819 EdkLogger
.error('build', PARSER_ERROR
,
820 "Pcd (%s.%s) defined in DSC is not declared in DEC files. Arch: ['%s']" % (TokenSpaceGuid
, PcdCName
, self
._Arch
),
821 File
=self
.MetaFile
, Line
=LineNo
)
822 ValueList
, IsValid
, Index
= AnalyzeDscPcd(Setting
, PcdType
, self
._DecPcds
[PcdCName
, TokenSpaceGuid
].DatumType
)
824 if PcdType
not in [MODEL_PCD_FEATURE_FLAG
, MODEL_PCD_FIXED_AT_BUILD
]:
825 EdkLogger
.error('build', FORMAT_INVALID
, "Pcd format incorrect.", File
=self
.MetaFile
, Line
=LineNo
,
826 ExtraData
="%s.%s|%s" % (TokenSpaceGuid
, PcdCName
, Setting
))
828 if ValueList
[2] == '-1':
829 EdkLogger
.error('build', FORMAT_INVALID
, "Pcd format incorrect.", File
=self
.MetaFile
, Line
=LineNo
,
830 ExtraData
="%s.%s|%s" % (TokenSpaceGuid
, PcdCName
, Setting
))
832 DatumType
= self
._DecPcds
[PcdCName
, TokenSpaceGuid
].DatumType
834 ValueList
[Index
] = ValueExpressionEx(ValueList
[Index
], DatumType
, self
._GuidDict
)(True)
835 except BadExpression
, Value
:
836 EdkLogger
.error('Parser', FORMAT_INVALID
, Value
, File
=self
.MetaFile
, Line
=LineNo
,
837 ExtraData
="PCD [%s.%s] Value \"%s\" " % (
838 TokenSpaceGuid
, PcdCName
, ValueList
[Index
]))
839 except EvaluationException
, Excpt
:
840 if hasattr(Excpt
, 'Pcd'):
841 if Excpt
.Pcd
in GlobalData
.gPlatformOtherPcds
:
842 EdkLogger
.error('Parser', FORMAT_INVALID
, "Cannot use this PCD (%s) in an expression as"
843 " it must be defined in a [PcdsFixedAtBuild] or [PcdsFeatureFlag] section"
844 " of the DSC file" % Excpt
.Pcd
,
845 File
=self
.MetaFile
, Line
=LineNo
)
847 EdkLogger
.error('Parser', FORMAT_INVALID
, "PCD (%s) is not defined in DSC file" % Excpt
.Pcd
,
848 File
=self
.MetaFile
, Line
=LineNo
)
850 EdkLogger
.error('Parser', FORMAT_INVALID
, "Invalid expression: %s" % str(Excpt
),
851 File
=self
.MetaFile
, Line
=LineNo
)
854 Valid
, ErrStr
= CheckPcdDatum(self
._DecPcds
[PcdCName
, TokenSpaceGuid
].DatumType
, ValueList
[Index
])
856 EdkLogger
.error('build', FORMAT_INVALID
, ErrStr
, File
=self
.MetaFile
, Line
=LineNo
,
857 ExtraData
="%s.%s" % (TokenSpaceGuid
, PcdCName
))
858 if PcdType
in (MODEL_PCD_DYNAMIC_DEFAULT
, MODEL_PCD_DYNAMIC_EX_DEFAULT
):
859 if self
._DecPcds
[PcdCName
, TokenSpaceGuid
].DatumType
.strip() != ValueList
[1].strip():
860 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
,
861 ExtraData
="%s.%s|%s" % (TokenSpaceGuid
, PcdCName
, Setting
))
862 if (TokenSpaceGuid
+ '.' + PcdCName
) in GlobalData
.gPlatformPcds
:
863 if GlobalData
.gPlatformPcds
[TokenSpaceGuid
+ '.' + PcdCName
] != ValueList
[Index
]:
864 GlobalData
.gPlatformPcds
[TokenSpaceGuid
+ '.' + PcdCName
] = ValueList
[Index
]
867 def _FilterPcdBySkuUsage(self
,Pcds
):
868 available_sku
= self
.SkuIdMgr
.AvailableSkuIdSet
869 sku_usage
= self
.SkuIdMgr
.SkuUsageType
870 if sku_usage
== SkuClass
.SINGLE
:
873 Pcds
[pcdname
].SkuInfoList
= {"DEFAULT":pcd
.SkuInfoList
[skuid
] for skuid
in pcd
.SkuInfoList
if skuid
in available_sku
}
874 if type(pcd
) is StructurePcd
and pcd
.SkuOverrideValues
:
875 Pcds
[pcdname
].SkuOverrideValues
= {"DEFAULT":pcd
.SkuOverrideValues
[skuid
] for skuid
in pcd
.SkuOverrideValues
if skuid
in available_sku
}
879 Pcds
[pcdname
].SkuInfoList
= {skuid
:pcd
.SkuInfoList
[skuid
] for skuid
in pcd
.SkuInfoList
if skuid
in available_sku
}
880 if type(pcd
) is StructurePcd
and pcd
.SkuOverrideValues
:
881 Pcds
[pcdname
].SkuOverrideValues
= {skuid
:pcd
.SkuOverrideValues
[skuid
] for skuid
in pcd
.SkuOverrideValues
if skuid
in available_sku
}
883 def CompleteHiiPcdsDefaultStores(self
,Pcds
):
884 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
]]]
885 DefaultStoreMgr
= DefaultStore(self
.DefaultStores
)
887 for skuid
in pcd
.SkuInfoList
:
888 skuobj
= pcd
.SkuInfoList
.get(skuid
)
889 if "STANDARD" not in skuobj
.DefaultStoreDict
:
890 PcdDefaultStoreSet
= set([defaultstorename
for defaultstorename
in skuobj
.DefaultStoreDict
])
891 mindefaultstorename
= DefaultStoreMgr
.GetMin(PcdDefaultStoreSet
)
892 skuobj
.DefaultStoreDict
['STANDARD'] = copy
.deepcopy(skuobj
.DefaultStoreDict
[mindefaultstorename
])
895 def RecoverCommandLinePcd(self
):
897 if GlobalData
.BuildOptionPcd
:
898 for pcd
in GlobalData
.BuildOptionPcd
:
900 pcdset
.append((pcd
[0],pcd
[1],pcd
[3]))
902 if (pcd
[1],pcd
[0]) not in self
._Pcds
:
903 pcdvalue
= pcd
[3] if len(pcd
) == 4 else pcd
[2]
904 pcdset
.append((pcd
[0],pcd
[1],pcdvalue
))
906 # remove the settings from command line since it has been handled.
907 GlobalData
.BuildOptionPcd
= pcdset
908 def GetFieldValueFromComm(self
,ValueStr
,TokenSpaceGuidCName
, TokenCName
, FieldName
):
909 PredictedFieldType
= "VOID*"
910 if ValueStr
.startswith('L'):
912 EdkLogger
.error("build", FORMAT_INVALID
, 'For Void* type PCD, when specify the Value in the command line, please use the following format: "string", L"string", H"{...}"')
913 ValueStr
= ValueStr
[0] + '"' + ValueStr
[1:] + '"'
914 PredictedFieldType
= "VOID*"
915 elif ValueStr
.startswith('H') or ValueStr
.startswith('{'):
916 EdkLogger
.error("build", FORMAT_INVALID
, 'Currently we do not support assign H"{...}" format for Pcd field.', ExtraData
="%s.%s.%s from command line" % (TokenSpaceGuidCName
, TokenCName
, FieldName
))
917 ValueStr
= ValueStr
[1:]
918 PredictedFieldType
= "VOID*"
919 elif ValueStr
.upper() in ['TRUE', '0X1', '0X01', '1', 'FALSE', '0X0', '0X00', '0']:
920 PredictedFieldType
= "BOOLEAN"
921 elif ValueStr
.isdigit() or ValueStr
.upper().startswith('0X'):
922 PredictedFieldType
= TAB_UINT16
925 EdkLogger
.error("build", FORMAT_INVALID
, 'For Void* type PCD, when specify the Value in the command line, please use the following format: "string", L"string", H"{...}"')
926 ValueStr
= '"' + ValueStr
+ '"'
927 PredictedFieldType
= "VOID*"
928 IsValid
, Cause
= CheckPcdDatum(PredictedFieldType
, ValueStr
)
930 EdkLogger
.error("build", FORMAT_INVALID
, Cause
, ExtraData
="%s.%s.%s from command line" % (TokenSpaceGuidCName
, TokenCName
, FieldName
))
931 if PredictedFieldType
== 'BOOLEAN':
932 ValueStr
= ValueStr
.upper()
933 if ValueStr
== 'TRUE' or ValueStr
== '1':
935 elif ValueStr
== 'FALSE' or ValueStr
== '0':
938 def __ParsePcdFromCommandLine(self
):
939 if GlobalData
.BuildOptionPcd
:
940 for i
, pcd
in enumerate(GlobalData
.BuildOptionPcd
):
941 if type(pcd
) is tuple:
943 (pcdname
, pcdvalue
) = pcd
.split('=')
945 EdkLogger
.error('build', AUTOGEN_ERROR
, "No Value specified for the PCD %s." % (pcdname
))
947 (Name1
, Name2
) = pcdname
.split('.',1)
949 (Name3
, FieldName
) = Name2
.split(".",1)
950 if ((Name3
,Name1
)) in self
.DecPcds
:
953 TokenSpaceGuidCName
= Name1
957 TokenSpaceGuidCName
= ''
958 HasTokenSpace
= False
960 if ((Name2
,Name1
)) in self
.DecPcds
:
963 TokenSpaceGuidCName
= Name1
968 TokenSpaceGuidCName
= ''
969 HasTokenSpace
= False
973 TokenSpaceGuidCName
= ''
974 HasTokenSpace
= False
975 TokenSpaceGuidCNameList
= []
979 if not HasTokenSpace
:
980 for key
in self
.DecPcds
:
981 if TokenCName
== key
[0]:
982 if TokenSpaceGuidCName
:
986 "The Pcd %s is found under multiple different TokenSpaceGuid: %s and %s." % (TokenCName
, TokenSpaceGuidCName
, key
[1])
989 TokenSpaceGuidCName
= key
[1]
992 if (TokenCName
, TokenSpaceGuidCName
) in self
.DecPcds
:
995 NewValue
= self
.GetFieldValueFromComm(pcdvalue
, TokenSpaceGuidCName
, TokenCName
, FieldName
)
996 GlobalData
.BuildOptionPcd
[i
] = (TokenSpaceGuidCName
, TokenCName
, FieldName
,NewValue
,("build command options",1))
998 # Replace \' to ', \\\' to \'
999 pcdvalue
= pcdvalue
.replace("\\\\\\'", '\\\\\\"').replace('\\\'', '\'').replace('\\\\\\"', "\\'")
1000 for key
in self
.DecPcds
:
1001 PcdItem
= self
.DecPcds
[key
]
1003 if (PcdItem
.TokenCName
, PcdItem
.TokenSpaceGuidCName
) == (TokenCName
, TokenSpaceGuidCName
):
1004 PcdDatumType
= PcdItem
.DatumType
1005 if pcdvalue
.startswith('H'):
1007 pcdvalue
= ValueExpressionEx(pcdvalue
[1:], PcdDatumType
, self
._GuidDict
)(True)
1008 except BadExpression
, Value
:
1009 EdkLogger
.error('Parser', FORMAT_INVALID
, 'PCD [%s.%s] Value "%s", %s' %
1010 (TokenSpaceGuidCName
, TokenCName
, pcdvalue
, Value
))
1011 if PcdDatumType
not in [TAB_UINT8
, TAB_UINT16
, TAB_UINT32
, TAB_UINT64
, 'BOOLEAN']:
1012 pcdvalue
= 'H' + pcdvalue
1013 elif pcdvalue
.startswith("L'"):
1015 pcdvalue
= ValueExpressionEx(pcdvalue
, PcdDatumType
, self
._GuidDict
)(True)
1016 except BadExpression
, Value
:
1017 EdkLogger
.error('Parser', FORMAT_INVALID
, 'PCD [%s.%s] Value "%s", %s' %
1018 (TokenSpaceGuidCName
, TokenCName
, pcdvalue
, Value
))
1019 if PcdDatumType
not in [TAB_UINT8
, TAB_UINT16
, TAB_UINT32
, TAB_UINT64
, 'BOOLEAN']:
1020 pcdvalue
= 'H' + pcdvalue
1021 elif pcdvalue
.startswith("'"):
1023 pcdvalue
= ValueExpressionEx(pcdvalue
, PcdDatumType
, self
._GuidDict
)(True)
1024 except BadExpression
, Value
:
1025 EdkLogger
.error('Parser', FORMAT_INVALID
, 'PCD [%s.%s] Value "%s", %s' %
1026 (TokenSpaceGuidCName
, TokenCName
, pcdvalue
, Value
))
1027 if PcdDatumType
not in [TAB_UINT8
, TAB_UINT16
, TAB_UINT32
, TAB_UINT64
, 'BOOLEAN']:
1028 pcdvalue
= 'H' + pcdvalue
1029 elif pcdvalue
.startswith('L'):
1030 pcdvalue
= 'L"' + pcdvalue
[1:] + '"'
1032 pcdvalue
= ValueExpressionEx(pcdvalue
, PcdDatumType
, self
._GuidDict
)(True)
1033 except BadExpression
, Value
:
1034 EdkLogger
.error('Parser', FORMAT_INVALID
, 'PCD [%s.%s] Value "%s", %s' %
1035 (TokenSpaceGuidCName
, TokenCName
, pcdvalue
, Value
))
1038 pcdvalue
= ValueExpressionEx(pcdvalue
, PcdDatumType
, self
._GuidDict
)(True)
1039 except BadExpression
, Value
:
1041 pcdvalue
= '"' + pcdvalue
+ '"'
1042 pcdvalue
= ValueExpressionEx(pcdvalue
, PcdDatumType
, self
._GuidDict
)(True)
1043 except BadExpression
, Value
:
1044 EdkLogger
.error('Parser', FORMAT_INVALID
, 'PCD [%s.%s] Value "%s", %s' %
1045 (TokenSpaceGuidCName
, TokenCName
, pcdvalue
, Value
))
1046 NewValue
= BuildOptionPcdValueFormat(TokenSpaceGuidCName
, TokenCName
, PcdDatumType
, pcdvalue
)
1049 if PcdItem
.TokenCName
== TokenCName
:
1050 if not PcdItem
.TokenSpaceGuidCName
in TokenSpaceGuidCNameList
:
1051 if len (TokenSpaceGuidCNameList
) < 1:
1052 TokenSpaceGuidCNameList
.append(PcdItem
.TokenSpaceGuidCName
)
1053 PcdDatumType
= PcdItem
.DatumType
1054 TokenSpaceGuidCName
= PcdItem
.TokenSpaceGuidCName
1055 if pcdvalue
.startswith('H'):
1057 pcdvalue
= ValueExpressionEx(pcdvalue
[1:], PcdDatumType
, self
._GuidDict
)(True)
1058 except BadExpression
, Value
:
1059 EdkLogger
.error('Parser', FORMAT_INVALID
, 'PCD [%s.%s] Value "%s", %s' %
1060 (TokenSpaceGuidCName
, TokenCName
, pcdvalue
, Value
))
1061 if PcdDatumType
not in [TAB_UINT8
, TAB_UINT16
, TAB_UINT32
, TAB_UINT64
,'BOOLEAN']:
1062 pcdvalue
= 'H' + pcdvalue
1063 elif pcdvalue
.startswith("L'"):
1065 pcdvalue
= ValueExpressionEx(pcdvalue
, PcdDatumType
, self
._GuidDict
)(
1067 except BadExpression
, Value
:
1068 EdkLogger
.error('Parser', FORMAT_INVALID
, 'PCD [%s.%s] Value "%s", %s' %
1069 (TokenSpaceGuidCName
, TokenCName
, pcdvalue
, Value
))
1070 if PcdDatumType
not in [TAB_UINT8
, TAB_UINT16
, TAB_UINT32
, TAB_UINT64
, 'BOOLEAN']:
1071 pcdvalue
= 'H' + pcdvalue
1072 elif pcdvalue
.startswith("'"):
1074 pcdvalue
= ValueExpressionEx(pcdvalue
, PcdDatumType
, self
._GuidDict
)(
1076 except BadExpression
, Value
:
1077 EdkLogger
.error('Parser', FORMAT_INVALID
, 'PCD [%s.%s] Value "%s", %s' %
1078 (TokenSpaceGuidCName
, TokenCName
, pcdvalue
, Value
))
1079 if PcdDatumType
not in [TAB_UINT8
, TAB_UINT16
, TAB_UINT32
, TAB_UINT64
, 'BOOLEAN']:
1080 pcdvalue
= 'H' + pcdvalue
1081 elif pcdvalue
.startswith('L'):
1082 pcdvalue
= 'L"' + pcdvalue
[1:] + '"'
1084 pcdvalue
= ValueExpressionEx(pcdvalue
, PcdDatumType
, self
._GuidDict
)(
1086 except BadExpression
, Value
:
1087 EdkLogger
.error('Parser', FORMAT_INVALID
, 'PCD [%s.%s] Value "%s", %s' %
1088 (TokenSpaceGuidCName
, TokenCName
, pcdvalue
, Value
))
1091 pcdvalue
= ValueExpressionEx(pcdvalue
, PcdDatumType
, self
._GuidDict
)(True)
1092 except BadExpression
, Value
:
1094 pcdvalue
= '"' + pcdvalue
+ '"'
1095 pcdvalue
= ValueExpressionEx(pcdvalue
, PcdDatumType
, self
._GuidDict
)(True)
1096 except BadExpression
, Value
:
1097 EdkLogger
.error('Parser', FORMAT_INVALID
, 'PCD [%s.%s] Value "%s", %s' %
1098 (TokenSpaceGuidCName
, TokenCName
, pcdvalue
, Value
))
1099 NewValue
= BuildOptionPcdValueFormat(TokenSpaceGuidCName
, TokenCName
, PcdDatumType
, pcdvalue
)
1105 "The Pcd %s is found under multiple different TokenSpaceGuid: %s and %s." % (TokenCName
, PcdItem
.TokenSpaceGuidCName
, TokenSpaceGuidCNameList
[0])
1107 GlobalData
.BuildOptionPcd
[i
] = (TokenSpaceGuidCName
, TokenCName
, FieldName
,NewValue
,("build command options",1))
1110 EdkLogger
.error('build', AUTOGEN_ERROR
, "The Pcd %s.%s is not found in the DEC file." % (TokenSpaceGuidCName
, TokenCName
))
1112 EdkLogger
.error('build', AUTOGEN_ERROR
, "The Pcd %s is not found in the DEC file." % (TokenCName
))
1113 for BuildData
in self
._Bdb
._CACHE
_.values():
1114 if BuildData
.MetaFile
.Ext
== '.dec' or BuildData
.MetaFile
.Ext
== '.dsc':
1116 for key
in BuildData
.Pcds
:
1117 PcdItem
= BuildData
.Pcds
[key
]
1118 if (TokenSpaceGuidCName
, TokenCName
) == (PcdItem
.TokenSpaceGuidCName
, PcdItem
.TokenCName
) and FieldName
=="":
1119 PcdItem
.DefaultValue
= NewValue
1120 ## Retrieve all PCD settings in platform
1122 if self
._Pcds
== None:
1123 self
._Pcds
= sdict()
1124 self
.__ParsePcdFromCommandLine
()
1125 self
._Pcds
.update(self
._GetPcd
(MODEL_PCD_FIXED_AT_BUILD
))
1126 self
._Pcds
.update(self
._GetPcd
(MODEL_PCD_PATCHABLE_IN_MODULE
))
1127 self
._Pcds
.update(self
._GetPcd
(MODEL_PCD_FEATURE_FLAG
))
1128 self
._Pcds
.update(self
._GetDynamicPcd
(MODEL_PCD_DYNAMIC_DEFAULT
))
1129 self
._Pcds
.update(self
._GetDynamicHiiPcd
(MODEL_PCD_DYNAMIC_HII
))
1130 self
._Pcds
.update(self
._GetDynamicVpdPcd
(MODEL_PCD_DYNAMIC_VPD
))
1131 self
._Pcds
.update(self
._GetDynamicPcd
(MODEL_PCD_DYNAMIC_EX_DEFAULT
))
1132 self
._Pcds
.update(self
._GetDynamicHiiPcd
(MODEL_PCD_DYNAMIC_EX_HII
))
1133 self
._Pcds
.update(self
._GetDynamicVpdPcd
(MODEL_PCD_DYNAMIC_EX_VPD
))
1135 self
._Pcds
= self
.CompletePcdValues(self
._Pcds
)
1136 self
._Pcds
= self
.OverrideByFdfCommOverAll(self
._Pcds
)
1137 self
._Pcds
= self
.UpdateStructuredPcds(MODEL_PCD_TYPE_LIST
, self
._Pcds
)
1138 self
._Pcds
= self
.CompleteHiiPcdsDefaultStores(self
._Pcds
)
1139 self
._Pcds
= self
._FilterPcdBySkuUsage
(self
._Pcds
)
1141 self
.RecoverCommandLinePcd()
1144 def _dumpPcdInfo(self
,Pcds
):
1147 if not pcdobj
.TokenCName
.startswith("Test"):
1149 for skuid
in pcdobj
.SkuInfoList
:
1150 if pcdobj
.Type
in (self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_HII
],self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_HII
]):
1151 for storename
in pcdobj
.SkuInfoList
[skuid
].DefaultStoreDict
:
1152 print "PcdCName: %s, SkuName: %s, StoreName: %s, Value: %s" % (".".join((pcdobj
.TokenSpaceGuidCName
, pcdobj
.TokenCName
)), skuid
,storename
,str(pcdobj
.SkuInfoList
[skuid
].DefaultStoreDict
[storename
]))
1154 print "PcdCName: %s, SkuName: %s, Value: %s" % (".".join((pcdobj
.TokenSpaceGuidCName
, pcdobj
.TokenCName
)), skuid
,str(pcdobj
.SkuInfoList
[skuid
].DefaultValue
))
1155 ## Retrieve [BuildOptions]
1156 def _GetBuildOptions(self
):
1157 if self
._BuildOptions
== None:
1158 self
._BuildOptions
= sdict()
1160 # Retrieve build option for EDKII and EDK style module
1162 for CodeBase
in (EDKII_NAME
, EDK_NAME
):
1163 RecordList
= self
._RawData
[MODEL_META_DATA_BUILD_OPTION
, self
._Arch
, CodeBase
]
1164 for ToolChainFamily
, ToolChain
, Option
, Dummy1
, Dummy2
, Dummy3
, Dummy4
,Dummy5
in RecordList
:
1165 if Dummy3
.upper() != 'COMMON':
1167 CurKey
= (ToolChainFamily
, ToolChain
, CodeBase
)
1169 # Only flags can be appended
1171 if CurKey
not in self
._BuildOptions
or not ToolChain
.endswith('_FLAGS') or Option
.startswith('='):
1172 self
._BuildOptions
[CurKey
] = Option
1174 if ' ' + Option
not in self
._BuildOptions
[CurKey
]:
1175 self
._BuildOptions
[CurKey
] += ' ' + Option
1176 return self
._BuildOptions
1178 def GetBuildOptionsByModuleType(self
, Edk
, ModuleType
):
1179 if self
._ModuleTypeOptions
== None:
1180 self
._ModuleTypeOptions
= sdict()
1181 if (Edk
, ModuleType
) not in self
._ModuleTypeOptions
:
1183 self
._ModuleTypeOptions
[Edk
, ModuleType
] = options
1184 DriverType
= '%s.%s' % (Edk
, ModuleType
)
1185 CommonDriverType
= '%s.%s' % ('COMMON', ModuleType
)
1186 RecordList
= self
._RawData
[MODEL_META_DATA_BUILD_OPTION
, self
._Arch
]
1187 for ToolChainFamily
, ToolChain
, Option
, Dummy1
, Dummy2
, Dummy3
, Dummy4
,Dummy5
in RecordList
:
1188 Type
= Dummy2
+ '.' + Dummy3
1189 if Type
.upper() == DriverType
.upper() or Type
.upper() == CommonDriverType
.upper():
1190 Key
= (ToolChainFamily
, ToolChain
, Edk
)
1191 if Key
not in options
or not ToolChain
.endswith('_FLAGS') or Option
.startswith('='):
1192 options
[Key
] = Option
1194 if ' ' + Option
not in options
[Key
]:
1195 options
[Key
] += ' ' + Option
1196 return self
._ModuleTypeOptions
[Edk
, ModuleType
]
1198 def GetStructurePcdInfo(self
, PcdSet
):
1199 structure_pcd_data
= {}
1201 if (item
[0],item
[1]) not in structure_pcd_data
:
1202 structure_pcd_data
[(item
[0],item
[1])] = []
1203 structure_pcd_data
[(item
[0],item
[1])].append(item
)
1205 return structure_pcd_data
1206 def OverrideByFdfComm(self
,StruPcds
):
1207 StructurePcdInCom
= OrderedDict()
1208 for item
in GlobalData
.BuildOptionPcd
:
1209 if len(item
) == 5 and (item
[1],item
[0]) in StruPcds
:
1210 StructurePcdInCom
[(item
[0],item
[1],item
[2] )] = (item
[3],item
[4])
1211 GlobalPcds
= set([(item
[0],item
[1]) for item
in StructurePcdInCom
.keys()])
1212 for Pcd
in StruPcds
.values():
1213 if (Pcd
.TokenSpaceGuidCName
,Pcd
.TokenCName
) not in GlobalPcds
:
1215 FieldValues
= OrderedDict()
1216 for item
in StructurePcdInCom
:
1217 if (Pcd
.TokenSpaceGuidCName
,Pcd
.TokenCName
) == (item
[0],item
[1]) and item
[2]:
1218 FieldValues
[item
[2]] = StructurePcdInCom
[item
]
1219 for field
in FieldValues
:
1220 if field
not in Pcd
.PcdFieldValueFromComm
:
1221 Pcd
.PcdFieldValueFromComm
[field
] = ["","",""]
1222 Pcd
.PcdFieldValueFromComm
[field
][0] = FieldValues
[field
][0]
1223 Pcd
.PcdFieldValueFromComm
[field
][1] = FieldValues
[field
][1][0]
1224 Pcd
.PcdFieldValueFromComm
[field
][2] = FieldValues
[field
][1][1]
1226 def OverrideByFdfCommOverAll(self
,AllPcds
):
1227 def CheckStructureInComm(commpcds
):
1230 if len(commpcds
[0]) == 5:
1234 if CheckStructureInComm(GlobalData
.BuildOptionPcd
):
1235 StructurePcdInCom
= {(item
[0],item
[1],item
[2] ):(item
[3],item
[4]) for item
in GlobalData
.BuildOptionPcd
} if GlobalData
.BuildOptionPcd
else {}
1236 NoFiledValues
= {(item
[0],item
[1]):StructurePcdInCom
[item
] for item
in StructurePcdInCom
if not item
[2]}
1238 NoFiledValues
= {(item
[0],item
[1]):[item
[2]] for item
in GlobalData
.BuildOptionPcd
}
1239 for Guid
,Name
in NoFiledValues
:
1240 if (Name
,Guid
) in AllPcds
:
1241 Pcd
= AllPcds
.get((Name
,Guid
))
1242 if isinstance(self
._DecPcds
.get((Pcd
.TokenCName
,Pcd
.TokenSpaceGuidCName
), None),StructurePcd
):
1243 self
._DecPcds
.get((Pcd
.TokenCName
,Pcd
.TokenSpaceGuidCName
)).PcdValueFromComm
= NoFiledValues
[(Pcd
.TokenSpaceGuidCName
,Pcd
.TokenCName
)][0]
1245 Pcd
.DefaultValue
= NoFiledValues
[(Pcd
.TokenSpaceGuidCName
,Pcd
.TokenCName
)][0]
1246 for sku
in Pcd
.SkuInfoList
:
1247 SkuInfo
= Pcd
.SkuInfoList
[sku
]
1248 if SkuInfo
.DefaultValue
:
1249 SkuInfo
.DefaultValue
= NoFiledValues
[(Pcd
.TokenSpaceGuidCName
,Pcd
.TokenCName
)][0]
1251 SkuInfo
.HiiDefaultValue
= NoFiledValues
[(Pcd
.TokenSpaceGuidCName
,Pcd
.TokenCName
)][0]
1252 for defaultstore
in SkuInfo
.DefaultStoreDict
:
1253 SkuInfo
.DefaultStoreDict
[defaultstore
] = NoFiledValues
[(Pcd
.TokenSpaceGuidCName
,Pcd
.TokenCName
)][0]
1254 if Pcd
.DatumType
== "VOID*":
1255 if Pcd
.MaxDatumSize
is None:
1256 Pcd
.MaxDatumSize
= '0'
1257 MaxSize
= int(Pcd
.MaxDatumSize
,10)
1258 if Pcd
.DefaultValue
.startswith("{") and Pcd
.DefaultValue
.endswith("}"):
1259 MaxSize
= max([len(Pcd
.DefaultValue
.split(",")),MaxSize
])
1260 elif Pcd
.DefaultValue
.startswith("\"") or Pcd
.DefaultValue
.startswith("\'"):
1261 MaxSize
= max([len(Pcd
.DefaultValue
)-2+1,MaxSize
])
1262 elif Pcd
.DefaultValue
.startswith("L\""):
1263 MaxSize
= max([2*(len(Pcd
.DefaultValue
)-3+1),MaxSize
])
1265 MaxSize
= max([len(Pcd
.DefaultValue
),MaxSize
])
1266 Pcd
.MaxDatumSize
= str(MaxSize
)
1268 PcdInDec
= self
.DecPcds
.get((Name
,Guid
))
1269 if isinstance(PcdInDec
,StructurePcd
):
1270 PcdInDec
.PcdValueFromComm
= NoFiledValues
[(Guid
,Name
)][0]
1272 if PcdInDec
.Type
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_FIXED_AT_BUILD
],
1273 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_PATCHABLE_IN_MODULE
]]:
1274 self
.Pcds
[Name
, Guid
] = copy
.deepcopy(PcdInDec
)
1275 self
.Pcds
[Name
, Guid
].DefaultValue
= NoFiledValues
[( Guid
,Name
)][0]
1277 def UpdateStructuredPcds(self
, TypeList
, AllPcds
):
1279 DynamicPcdType
= [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_DEFAULT
],
1280 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_HII
],
1281 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_VPD
],
1282 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_DEFAULT
],
1283 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_HII
],
1284 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_VPD
]]
1287 DefaultStoreMgr
= DefaultStore(self
.DefaultStores
)
1288 SkuIds
= self
.SkuIdMgr
.AvailableSkuIdSet
1289 SkuIds
.update({'DEFAULT':0})
1290 DefaultStores
= set([storename
for pcdobj
in AllPcds
.values() for skuobj
in pcdobj
.SkuInfoList
.values() for storename
in skuobj
.DefaultStoreDict
.keys()])
1293 # Find out all possible PCD candidates for self._Arch
1296 for Type
in TypeList
:
1297 RecordList
.extend(self
._RawData
[Type
, self
._Arch
])
1299 for TokenSpaceGuid
, PcdCName
, Setting
, Arch
, SkuName
, default_store
, Dummy4
,Dummy5
in RecordList
:
1300 SkuName
= SkuName
.upper()
1301 default_store
= default_store
.upper()
1302 SkuName
= 'DEFAULT' if SkuName
== 'COMMON' else SkuName
1303 if SkuName
not in SkuIds
:
1306 if SkuName
in SkuIds
and "." in TokenSpaceGuid
:
1307 S_PcdSet
.append([ TokenSpaceGuid
.split(".")[0],TokenSpaceGuid
.split(".")[1], PcdCName
,SkuName
, default_store
,Dummy5
, AnalyzePcdExpression(Setting
)[0]])
1309 # handle pcd value override
1310 StrPcdSet
= self
.GetStructurePcdInfo(S_PcdSet
)
1311 S_pcd_set
= OrderedDict()
1312 for str_pcd
in StrPcdSet
:
1313 str_pcd_obj
= Pcds
.get((str_pcd
[1], str_pcd
[0]), None)
1314 str_pcd_dec
= self
._DecPcds
.get((str_pcd
[1], str_pcd
[0]), None)
1315 if not isinstance (str_pcd_dec
, StructurePcd
):
1316 EdkLogger
.error('build', PARSER_ERROR
,
1317 "Pcd (%s.%s) is not declared as Structure PCD in DEC files. Arch: ['%s']" % (str_pcd
[0], str_pcd
[1], self
._Arch
),
1318 File
=self
.MetaFile
,Line
= StrPcdSet
[str_pcd
][0][5])
1320 str_pcd_obj_str
= StructurePcd()
1321 str_pcd_obj_str
.copy(str_pcd_dec
)
1323 str_pcd_obj_str
.copy(str_pcd_obj
)
1324 if str_pcd_obj
.Type
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_HII
], self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_HII
]]:
1325 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
}
1327 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
}
1328 for str_pcd_data
in StrPcdSet
[str_pcd
]:
1329 if str_pcd_data
[3] in SkuIds
:
1330 str_pcd_obj_str
.AddOverrideValue(str_pcd_data
[2], str(str_pcd_data
[6]), 'DEFAULT' if str_pcd_data
[3] == 'COMMON' else str_pcd_data
[3],'STANDARD' if str_pcd_data
[4] == 'COMMON' else str_pcd_data
[4], self
.MetaFile
.File
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
[5])
1331 S_pcd_set
[str_pcd
[1], str_pcd
[0]] = str_pcd_obj_str
1333 EdkLogger
.error('build', PARSER_ERROR
,
1334 "Pcd (%s.%s) defined in DSC is not declared in DEC files. Arch: ['%s']" % (str_pcd
[0], str_pcd
[1], self
._Arch
),
1335 File
=self
.MetaFile
,Line
= StrPcdSet
[str_pcd
][0][5])
1336 # Add the Structure PCD that only defined in DEC, don't have override in DSC file
1337 for Pcd
in self
.DecPcds
:
1338 if type (self
._DecPcds
[Pcd
]) is StructurePcd
:
1339 if Pcd
not in S_pcd_set
:
1340 str_pcd_obj_str
= StructurePcd()
1341 str_pcd_obj_str
.copy(self
._DecPcds
[Pcd
])
1342 str_pcd_obj
= Pcds
.get(Pcd
, None)
1344 str_pcd_obj_str
.copy(str_pcd_obj
)
1345 if str_pcd_obj
.Type
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_HII
], self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_HII
]]:
1346 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
}
1348 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
}
1349 S_pcd_set
[Pcd
] = str_pcd_obj_str
1351 GlobalData
.gStructurePcd
[self
.Arch
] = S_pcd_set
1352 for stru_pcd
in S_pcd_set
.values():
1353 for skuid
in SkuIds
:
1354 if skuid
in stru_pcd
.SkuOverrideValues
:
1356 nextskuid
= self
.SkuIdMgr
.GetNextSkuId(skuid
)
1358 if skuid
not in stru_pcd
.SkuOverrideValues
:
1359 while nextskuid
not in stru_pcd
.SkuOverrideValues
:
1360 if nextskuid
== "DEFAULT":
1363 nextskuid
= self
.SkuIdMgr
.GetNextSkuId(nextskuid
)
1364 stru_pcd
.SkuOverrideValues
[skuid
] = copy
.deepcopy(stru_pcd
.SkuOverrideValues
[nextskuid
]) if not NoDefault
else copy
.deepcopy({defaultstorename
: stru_pcd
.DefaultValues
for defaultstorename
in DefaultStores
} if DefaultStores
else {'STANDARD':stru_pcd
.DefaultValues
})
1366 stru_pcd
.ValueChain
[(skuid
,'')]= (nextskuid
,'')
1367 if stru_pcd
.Type
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_HII
], self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_HII
]]:
1368 for skuid
in SkuIds
:
1371 if skuid
not in stru_pcd
.SkuOverrideValues
:
1372 while nextskuid
not in stru_pcd
.SkuOverrideValues
:
1373 if nextskuid
== "DEFAULT":
1376 nextskuid
= self
.SkuIdMgr
.GetNextSkuId(nextskuid
)
1379 PcdDefaultStoreSet
= set([defaultstorename
for defaultstorename
in stru_pcd
.SkuOverrideValues
[nextskuid
]])
1380 mindefaultstorename
= DefaultStoreMgr
.GetMin(PcdDefaultStoreSet
)
1382 for defaultstoreid
in DefaultStores
:
1383 if defaultstoreid
not in stru_pcd
.SkuOverrideValues
[skuid
]:
1384 stru_pcd
.SkuOverrideValues
[skuid
][defaultstoreid
] = copy
.deepcopy(stru_pcd
.SkuOverrideValues
[nextskuid
][mindefaultstorename
])
1385 stru_pcd
.ValueChain
[(skuid
,defaultstoreid
)]= (nextskuid
,mindefaultstorename
)
1386 S_pcd_set
= self
.OverrideByFdfComm(S_pcd_set
)
1387 Str_Pcd_Values
= self
.GenerateByteArrayValue(S_pcd_set
)
1389 for (skuname
,StoreName
,PcdGuid
,PcdName
,PcdValue
) in Str_Pcd_Values
:
1390 str_pcd_obj
= S_pcd_set
.get((PcdName
, PcdGuid
))
1391 if str_pcd_obj
is None:
1392 print PcdName
, PcdGuid
1394 if str_pcd_obj
.Type
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_HII
],
1395 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_HII
]]:
1396 if skuname
not in str_pcd_obj
.SkuInfoList
:
1397 str_pcd_obj
.SkuInfoList
[skuname
] = SkuInfoClass(SkuIdName
=skuname
, SkuId
=self
.SkuIds
[skuname
][0], HiiDefaultValue
=PcdValue
, DefaultStore
= {StoreName
:PcdValue
})
1399 str_pcd_obj
.SkuInfoList
[skuname
].HiiDefaultValue
= PcdValue
1400 str_pcd_obj
.SkuInfoList
[skuname
].DefaultStoreDict
.update({StoreName
:PcdValue
})
1401 elif str_pcd_obj
.Type
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_FIXED_AT_BUILD
],
1402 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_PATCHABLE_IN_MODULE
]]:
1403 if skuname
in (self
.SkuIdMgr
.SystemSkuId
, 'DEFAULT', 'COMMON'):
1404 str_pcd_obj
.DefaultValue
= PcdValue
1406 if skuname
not in str_pcd_obj
.SkuInfoList
:
1407 nextskuid
= self
.SkuIdMgr
.GetNextSkuId(skuname
)
1409 while nextskuid
not in str_pcd_obj
.SkuInfoList
:
1410 if nextskuid
== "DEFAULT":
1413 nextskuid
= self
.SkuIdMgr
.GetNextSkuId(nextskuid
)
1414 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
)
1415 str_pcd_obj
.SkuInfoList
[skuname
].SkuId
= self
.SkuIds
[skuname
][0]
1416 str_pcd_obj
.SkuInfoList
[skuname
].SkuIdName
= skuname
1418 str_pcd_obj
.SkuInfoList
[skuname
].DefaultValue
= PcdValue
1419 for str_pcd_obj
in S_pcd_set
.values():
1420 if str_pcd_obj
.Type
not in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_HII
],
1421 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_HII
]]:
1423 PcdDefaultStoreSet
= set([defaultstorename
for skuobj
in str_pcd_obj
.SkuInfoList
.values() for defaultstorename
in skuobj
.DefaultStoreDict
])
1424 DefaultStoreObj
= DefaultStore(self
._GetDefaultStores
())
1425 mindefaultstorename
= DefaultStoreObj
.GetMin(PcdDefaultStoreSet
)
1426 str_pcd_obj
.SkuInfoList
[self
.SkuIdMgr
.SystemSkuId
].HiiDefaultValue
= str_pcd_obj
.SkuInfoList
[self
.SkuIdMgr
.SystemSkuId
].DefaultStoreDict
[mindefaultstorename
]
1428 for str_pcd_obj
in S_pcd_set
.values():
1430 str_pcd_obj
.MaxDatumSize
= self
.GetStructurePcdMaxSize(str_pcd_obj
)
1431 Pcds
[str_pcd_obj
.TokenCName
, str_pcd_obj
.TokenSpaceGuidCName
] = str_pcd_obj
1435 if 'DEFAULT' not in pcd
.SkuInfoList
.keys() and 'COMMON' in pcd
.SkuInfoList
.keys():
1436 pcd
.SkuInfoList
['DEFAULT'] = pcd
.SkuInfoList
['COMMON']
1437 del(pcd
.SkuInfoList
['COMMON'])
1438 elif 'DEFAULT' in pcd
.SkuInfoList
.keys() and 'COMMON' in pcd
.SkuInfoList
.keys():
1439 del(pcd
.SkuInfoList
['COMMON'])
1441 map(self
.FilterSkuSettings
,[Pcds
[pcdkey
] for pcdkey
in Pcds
if Pcds
[pcdkey
].Type
in DynamicPcdType
])
1444 ## Retrieve non-dynamic PCD settings
1446 # @param Type PCD type
1448 # @retval a dict object contains settings of given PCD type
1450 def _GetPcd(self
, Type
):
1453 # tdict is a special dict kind of type, used for selecting correct
1454 # PCD settings for certain ARCH
1456 AvailableSkuIdSet
= copy
.copy(self
.SkuIds
)
1458 PcdDict
= tdict(True, 3)
1460 # Find out all possible PCD candidates for self._Arch
1461 RecordList
= self
._RawData
[Type
, self
._Arch
]
1462 PcdValueDict
= sdict()
1463 for TokenSpaceGuid
, PcdCName
, Setting
, Arch
, SkuName
, Dummy3
, Dummy4
,Dummy5
in RecordList
:
1464 SkuName
= SkuName
.upper()
1465 SkuName
= 'DEFAULT' if SkuName
== 'COMMON' else SkuName
1466 if SkuName
not in AvailableSkuIdSet
:
1467 EdkLogger
.error('build ', PARAMETER_INVALID
, 'Sku %s is not defined in [SkuIds] section' % SkuName
,
1468 File
=self
.MetaFile
, Line
=Dummy5
)
1469 if SkuName
in (self
.SkuIdMgr
.SystemSkuId
, 'DEFAULT', 'COMMON'):
1470 if "." not in TokenSpaceGuid
:
1471 PcdSet
.add((PcdCName
, TokenSpaceGuid
, SkuName
, Dummy5
))
1472 PcdDict
[Arch
, PcdCName
, TokenSpaceGuid
, SkuName
] = Setting
1474 for PcdCName
, TokenSpaceGuid
, SkuName
, Dummy4
in PcdSet
:
1475 Setting
= PcdDict
[self
._Arch
, PcdCName
, TokenSpaceGuid
, SkuName
]
1478 PcdValue
, DatumType
, MaxDatumSize
= self
._ValidatePcd
(PcdCName
, TokenSpaceGuid
, Setting
, Type
, Dummy4
)
1479 if (PcdCName
, TokenSpaceGuid
) in PcdValueDict
:
1480 PcdValueDict
[PcdCName
, TokenSpaceGuid
][SkuName
] = (PcdValue
, DatumType
, MaxDatumSize
)
1482 PcdValueDict
[PcdCName
, TokenSpaceGuid
] = {SkuName
:(PcdValue
, DatumType
, MaxDatumSize
)}
1484 PcdsKeys
= PcdValueDict
.keys()
1485 for PcdCName
, TokenSpaceGuid
in PcdsKeys
:
1487 PcdSetting
= PcdValueDict
[PcdCName
, TokenSpaceGuid
]
1491 if 'COMMON' in PcdSetting
:
1492 PcdValue
, DatumType
, MaxDatumSize
= PcdSetting
['COMMON']
1493 if 'DEFAULT' in PcdSetting
:
1494 PcdValue
, DatumType
, MaxDatumSize
= PcdSetting
['DEFAULT']
1495 if self
.SkuIdMgr
.SystemSkuId
in PcdSetting
:
1496 PcdValue
, DatumType
, MaxDatumSize
= PcdSetting
[self
.SkuIdMgr
.SystemSkuId
]
1498 Pcds
[PcdCName
, TokenSpaceGuid
] = PcdClassObject(
1501 self
._PCD
_TYPE
_STRING
_[Type
],
1514 def __UNICODE2OCTList(self
,Value
):
1515 Value
= Value
.strip()
1519 Temp
= '%04X' % ord(Item
)
1520 List
.append('0x' + Temp
[2:4])
1521 List
.append('0x' + Temp
[0:2])
1525 def __STRING2OCTList(self
,Value
):
1527 Value
= Value
.strip('"')
1529 Temp
= '%02X' % ord(char
)
1530 OCTList
.append('0x' + Temp
)
1531 OCTList
.append('0x00')
1534 def GetStructurePcdMaxSize(self
, str_pcd
):
1535 pcd_default_value
= str_pcd
.DefaultValue
1536 sku_values
= [skuobj
.HiiDefaultValue
if str_pcd
.Type
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_HII
], self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_HII
]] else skuobj
.DefaultValue
for skuobj
in str_pcd
.SkuInfoList
.values()]
1537 sku_values
.append(pcd_default_value
)
1539 def get_length(value
):
1540 Value
= value
.strip()
1542 if Value
.startswith('GUID') and Value
.endswith(')'):
1544 if Value
.startswith('L"') and Value
.endswith('"'):
1545 return len(Value
[2:-1])
1546 if Value
[0] == '"' and Value
[-1] == '"':
1547 return len(Value
) - 2
1548 if Value
[0] == '{' and Value
[-1] == '}':
1549 return len(Value
.split(","))
1550 if Value
.startswith("L'") and Value
.endswith("'") and len(list(Value
[2:-1])) > 1:
1551 return len(list(Value
[2:-1]))
1552 if Value
[0] == "'" and Value
[-1] == "'" and len(list(Value
[1:-1])) > 1:
1553 return len(Value
) - 2
1556 return str(max([pcd_size
for pcd_size
in [get_length(item
) for item
in sku_values
]]))
1558 def IsFieldValueAnArray (self
, Value
):
1559 Value
= Value
.strip()
1560 if Value
.startswith('GUID') and Value
.endswith(')'):
1562 if Value
.startswith('L"') and Value
.endswith('"') and len(list(Value
[2:-1])) > 1:
1564 if Value
[0] == '"' and Value
[-1] == '"' and len(list(Value
[1:-1])) > 1:
1566 if Value
[0] == '{' and Value
[-1] == '}':
1568 if Value
.startswith("L'") and Value
.endswith("'") and len(list(Value
[2:-1])) > 1:
1570 if Value
[0] == "'" and Value
[-1] == "'" and len(list(Value
[1:-1])) > 1:
1574 def ExecuteCommand (self
, Command
):
1576 Process
= subprocess
.Popen(Command
, stdout
=subprocess
.PIPE
, stderr
=subprocess
.PIPE
, shell
=True)
1578 EdkLogger
.error('Build', COMMAND_FAILURE
, 'Can not execute command: %s' % Command
)
1579 Result
= Process
.communicate()
1580 return Process
.returncode
, Result
[0], Result
[1]
1582 def IntToCString(self
, Value
, ValueSize
):
1584 if not isinstance (Value
, str):
1585 for Index
in range(0, ValueSize
):
1586 Result
= Result
+ '\\x%02x' % (Value
& 0xff)
1588 Result
= Result
+ '"'
1591 def GetPcdMaxSize(self
,Pcd
):
1592 MaxSize
= int(Pcd
.MaxDatumSize
,10) if Pcd
.MaxDatumSize
else 0
1593 if Pcd
.DatumType
not in ['BOOLEAN','UINT8','UINT16','UINT32','UINT64']:
1594 if Pcd
.PcdValueFromComm
:
1595 if Pcd
.PcdValueFromComm
.startswith("{") and Pcd
.PcdValueFromComm
.endswith("}"):
1596 MaxSize
= max([len(Pcd
.PcdValueFromComm
.split(",")),MaxSize
])
1597 elif Pcd
.PcdValueFromComm
.startswith("\"") or Pcd
.PcdValueFromComm
.startswith("\'"):
1598 MaxSize
= max([len(Pcd
.PcdValueFromComm
)-2+1,MaxSize
])
1599 elif Pcd
.PcdValueFromComm
.startswith("L\""):
1600 MaxSize
= max([2*(len(Pcd
.PcdValueFromComm
)-3+1),MaxSize
])
1602 MaxSize
= max([len(Pcd
.PcdValueFromComm
),MaxSize
])
1603 elif Pcd
.DatumType
not in ['BOOLEAN','UINT8']:
1605 elif Pcd
.DatumType
== 'UINT16':
1607 elif Pcd
.DatumType
== 'UINT32':
1609 elif Pcd
.DatumType
== 'UINT64':
1612 def GenerateSizeFunction(self
,Pcd
):
1613 CApp
= "// Default Value in Dec \n"
1614 CApp
= CApp
+ "void Cal_%s_%s_Size(UINT32 *Size){\n" % (Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
)
1615 for FieldList
in [Pcd
.DefaultValues
]:
1618 for FieldName
in FieldList
:
1619 FieldName
= "." + FieldName
1620 IsArray
= self
.IsFieldValueAnArray(FieldList
[FieldName
.strip(".")][0])
1621 if IsArray
and not (FieldList
[FieldName
.strip(".")][0].startswith('{GUID') and FieldList
[FieldName
.strip(".")][0].endswith('}')):
1623 Value
= ValueExpressionEx(FieldList
[FieldName
.strip(".")][0], "VOID*", self
._GuidDict
)(True)
1624 except BadExpression
:
1625 EdkLogger
.error('Build', FORMAT_INVALID
, "Invalid value format for %s. From %s Line %d " %
1626 (".".join((Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
, FieldName
.strip('.'))), FieldList
[FieldName
.strip(".")][1], FieldList
[FieldName
.strip(".")][2]))
1627 Value
, ValueSize
= ParseFieldValue(Value
)
1628 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]);
1631 FieldName_ori
= FieldName
.strip('.')
1632 while '[' in FieldName
:
1633 NewFieldName
= NewFieldName
+ FieldName
.split('[', 1)[0] + '[0]'
1634 ArrayIndex
= int(FieldName
.split('[', 1)[1].split(']', 1)[0])
1635 FieldName
= FieldName
.split(']', 1)[1]
1636 FieldName
= NewFieldName
+ FieldName
1637 while '[' in FieldName
:
1638 FieldName
= FieldName
.rsplit('[', 1)[0]
1639 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])
1640 for skuname
in Pcd
.SkuOverrideValues
:
1641 if skuname
== "COMMON":
1643 for defaultstorenameitem
in Pcd
.SkuOverrideValues
[skuname
]:
1644 CApp
= CApp
+ "// SkuName: %s, DefaultStoreName: %s \n" % (skuname
, defaultstorenameitem
)
1645 for FieldList
in [Pcd
.SkuOverrideValues
[skuname
].get(defaultstorenameitem
)]:
1648 for FieldName
in FieldList
:
1649 FieldName
= "." + FieldName
1650 IsArray
= self
.IsFieldValueAnArray(FieldList
[FieldName
.strip(".")][0])
1651 if IsArray
and not (FieldList
[FieldName
.strip(".")][0].startswith('{GUID') and FieldList
[FieldName
.strip(".")][0].endswith('}')):
1653 Value
= ValueExpressionEx(FieldList
[FieldName
.strip(".")][0], "VOID*", self
._GuidDict
)(True)
1654 except BadExpression
:
1655 EdkLogger
.error('Build', FORMAT_INVALID
, "Invalid value format for %s. From %s Line %d " %
1656 (".".join((Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
, FieldName
.strip('.'))), FieldList
[FieldName
.strip(".")][1], FieldList
[FieldName
.strip(".")][2]))
1657 Value
, ValueSize
= ParseFieldValue(Value
)
1658 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]);
1661 FieldName_ori
= FieldName
.strip('.')
1662 while '[' in FieldName
:
1663 NewFieldName
= NewFieldName
+ FieldName
.split('[', 1)[0] + '[0]'
1664 ArrayIndex
= int(FieldName
.split('[', 1)[1].split(']', 1)[0])
1665 FieldName
= FieldName
.split(']', 1)[1]
1666 FieldName
= NewFieldName
+ FieldName
1667 while '[' in FieldName
:
1668 FieldName
= FieldName
.rsplit('[', 1)[0]
1669 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])
1670 if Pcd
.PcdFieldValueFromComm
:
1671 CApp
= CApp
+ "// From Command Line \n"
1672 for FieldName
in Pcd
.PcdFieldValueFromComm
:
1673 FieldName
= "." + FieldName
1674 IsArray
= self
.IsFieldValueAnArray(Pcd
.PcdFieldValueFromComm
[FieldName
.strip(".")][0])
1675 if IsArray
and not (Pcd
.PcdFieldValueFromComm
[FieldName
.strip(".")][0].startswith('{GUID') and Pcd
.PcdFieldValueFromComm
[FieldName
.strip(".")][0].endswith('}')):
1677 Value
= ValueExpressionEx(Pcd
.PcdFieldValueFromComm
[FieldName
.strip(".")][0], "VOID*", self
._GuidDict
)(True)
1678 except BadExpression
:
1679 EdkLogger
.error('Build', FORMAT_INVALID
, "Invalid value format for %s. From %s Line %d " %
1680 (".".join((Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
, FieldName
.strip('.'))), Pcd
.PcdFieldValueFromComm
[FieldName
.strip(".")][1], Pcd
.PcdFieldValueFromComm
[FieldName
.strip(".")][2]))
1681 Value
, ValueSize
= ParseFieldValue(Value
)
1682 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]);
1685 FieldName_ori
= FieldName
.strip('.')
1686 while '[' in FieldName
:
1687 NewFieldName
= NewFieldName
+ FieldName
.split('[', 1)[0] + '[0]'
1688 ArrayIndex
= int(FieldName
.split('[', 1)[1].split(']', 1)[0])
1689 FieldName
= FieldName
.split(']', 1)[1]
1690 FieldName
= NewFieldName
+ FieldName
1691 while '[' in FieldName
:
1692 FieldName
= FieldName
.rsplit('[', 1)[0]
1693 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])
1694 CApp
= CApp
+ " *Size = (%d > *Size ? %d : *Size); // The Pcd maxsize is %d \n" % (self
.GetPcdMaxSize(Pcd
),self
.GetPcdMaxSize(Pcd
),self
.GetPcdMaxSize(Pcd
))
1697 def GenerateSizeStatments(self
,Pcd
):
1698 CApp
= ' Size = sizeof(%s);\n' % (Pcd
.DatumType
)
1699 CApp
= CApp
+ ' Cal_%s_%s_Size(&Size);\n' % (Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
)
1701 def GenerateDefaultValueAssignFunction(self
,Pcd
):
1702 CApp
= "// Default value in Dec \n"
1703 CApp
= CApp
+ "void Assign_%s_%s_Default_Value(%s *Pcd){\n" % (Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
,Pcd
.DatumType
)
1704 CApp
= CApp
+ ' UINT32 FieldSize;\n'
1705 CApp
= CApp
+ ' CHAR8 *Value;\n'
1706 DefaultValueFromDec
= Pcd
.DefaultValueFromDec
1707 IsArray
= self
.IsFieldValueAnArray(Pcd
.DefaultValueFromDec
)
1710 DefaultValueFromDec
= ValueExpressionEx(Pcd
.DefaultValueFromDec
, "VOID*")(True)
1711 except BadExpression
:
1712 EdkLogger
.error("Build", FORMAT_INVALID
, "Invalid value format for %s.%s, from DEC: %s" %
1713 (Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
, DefaultValueFromDec
))
1714 Value
, ValueSize
= ParseFieldValue (DefaultValueFromDec
)
1715 if isinstance(Value
, str):
1716 CApp
= CApp
+ ' Pcd = %s; // From DEC Default Value %s\n' % (Value
, Pcd
.DefaultValueFromDec
)
1719 # Use memcpy() to copy value into field
1721 CApp
= CApp
+ ' Value = %s; // From DEC Default Value %s\n' % (self
.IntToCString(Value
, ValueSize
), Pcd
.DefaultValueFromDec
)
1722 CApp
= CApp
+ ' memcpy (Pcd, Value, %d);\n' % (ValueSize
)
1723 for FieldList
in [Pcd
.DefaultValues
]:
1726 for FieldName
in FieldList
:
1727 IsArray
= self
.IsFieldValueAnArray(FieldList
[FieldName
][0])
1730 FieldList
[FieldName
][0] = ValueExpressionEx(FieldList
[FieldName
][0], "VOID*", self
._GuidDict
)(True)
1731 except BadExpression
:
1732 EdkLogger
.error('Build', FORMAT_INVALID
, "Invalid value format for %s. From %s Line %d " %
1733 (".".join((Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
, FieldName
)), FieldList
[FieldName
][1],FieldList
[FieldName
][2]))
1736 Value
, ValueSize
= ParseFieldValue (FieldList
[FieldName
][0])
1738 EdkLogger
.error('Build', FORMAT_INVALID
, "Invalid value format for %s. From %s Line %d " % (".".join((Pcd
.TokenSpaceGuidCName
,Pcd
.TokenCName
,FieldName
)),FieldList
[FieldName
][1], FieldList
[FieldName
][2]))
1739 if isinstance(Value
, str):
1740 CApp
= CApp
+ ' Pcd->%s = %s; // From %s Line %d Value %s\n' % (FieldName
, Value
, FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
1743 # Use memcpy() to copy value into field
1745 CApp
= CApp
+ ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd
.DatumType
, FieldName
)
1746 CApp
= CApp
+ ' Value = %s; // From %s Line %d Value %s\n' % (self
.IntToCString(Value
, ValueSize
), FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
1747 CApp
= CApp
+ ' memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName
, ValueSize
, ValueSize
)
1750 CApp
= CApp
+ ' Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName
, Value
, FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
1752 CApp
= CApp
+ ' Pcd->%s = %d; // From %s Line %d Value %s\n' % (FieldName
, Value
, FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
1755 def GenerateDefaultValueAssignStatement(self
,Pcd
):
1756 CApp
= ' Assign_%s_%s_Default_Value(Pcd);\n' % (Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
)
1758 def GenerateInitValueFunction(self
,Pcd
,SkuName
,DefaultStoreName
):
1759 CApp
= "// Value in Dsc for Sku: %s, DefaultStore %s\n" % (SkuName
,DefaultStoreName
)
1760 CApp
= CApp
+ "void Assign_%s_%s_%s_%s_Value(%s *Pcd){\n" % (Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
,SkuName
,DefaultStoreName
,Pcd
.DatumType
)
1761 CApp
= CApp
+ ' UINT32 FieldSize;\n'
1762 CApp
= CApp
+ ' CHAR8 *Value;\n'
1764 CApp
= CApp
+ "// SkuName: %s, DefaultStoreName: %s \n" % ('DEFAULT', 'STANDARD')
1765 inherit_OverrideValues
= Pcd
.SkuOverrideValues
[SkuName
]
1766 if (SkuName
,DefaultStoreName
) == ('DEFAULT','STANDARD'):
1767 pcddefaultvalue
= Pcd
.DefaultFromDSC
.get('DEFAULT',{}).get('STANDARD', Pcd
.DefaultValue
) if Pcd
.DefaultFromDSC
else Pcd
.DefaultValue
1769 if not Pcd
.DscRawValue
:
1770 # handle the case that structure pcd is not appear in DSC
1771 self
.CopyDscRawValue(Pcd
)
1772 pcddefaultvalue
= Pcd
.DscRawValue
.get(SkuName
,{}).get(DefaultStoreName
)
1773 for FieldList
in [pcddefaultvalue
,inherit_OverrideValues
.get(DefaultStoreName
)]:
1776 if pcddefaultvalue
and FieldList
== pcddefaultvalue
:
1777 IsArray
= self
.IsFieldValueAnArray(FieldList
)
1780 FieldList
= ValueExpressionEx(FieldList
, "VOID*")(True)
1781 except BadExpression
:
1782 EdkLogger
.error("Build", FORMAT_INVALID
, "Invalid value format for %s.%s, from DSC: %s" %
1783 (Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
, FieldList
))
1784 Value
, ValueSize
= ParseFieldValue (FieldList
)
1786 if (SkuName
,DefaultStoreName
) == ('DEFAULT','STANDARD'):
1787 if isinstance(Value
, str):
1788 CApp
= CApp
+ ' Pcd = %s; // From DSC Default Value %s\n' % (Value
, Pcd
.DefaultFromDSC
.get('DEFAULT',{}).get('STANDARD', Pcd
.DefaultValue
) if Pcd
.DefaultFromDSC
else Pcd
.DefaultValue
)
1791 # Use memcpy() to copy value into field
1793 CApp
= CApp
+ ' Value = %s; // From DSC Default Value %s\n' % (self
.IntToCString(Value
, ValueSize
), Pcd
.DefaultFromDSC
.get('DEFAULT',{}).get('STANDARD', Pcd
.DefaultValue
) if Pcd
.DefaultFromDSC
else Pcd
.DefaultValue
)
1794 CApp
= CApp
+ ' memcpy (Pcd, Value, %d);\n' % (ValueSize
)
1796 if isinstance(Value
, str):
1797 CApp
= CApp
+ ' Pcd = %s; // From DSC Default Value %s\n' % (Value
, Pcd
.DscRawValue
.get(SkuName
,{}).get(DefaultStoreName
))
1800 # Use memcpy() to copy value into field
1802 CApp
= CApp
+ ' Value = %s; // From DSC Default Value %s\n' % (self
.IntToCString(Value
, ValueSize
), Pcd
.DscRawValue
.get(SkuName
,{}).get(DefaultStoreName
))
1803 CApp
= CApp
+ ' memcpy (Pcd, Value, %d);\n' % (ValueSize
)
1805 if (SkuName
,DefaultStoreName
) == ('DEFAULT','STANDARD') or (( (SkuName
,'') not in Pcd
.ValueChain
) and ( (SkuName
,DefaultStoreName
) not in Pcd
.ValueChain
)):
1806 for FieldName
in FieldList
:
1807 IsArray
= self
.IsFieldValueAnArray(FieldList
[FieldName
][0])
1810 FieldList
[FieldName
][0] = ValueExpressionEx(FieldList
[FieldName
][0], "VOID*", self
._GuidDict
)(True)
1811 except BadExpression
:
1812 EdkLogger
.error('Build', FORMAT_INVALID
, "Invalid value format for %s. From %s Line %d " %
1813 (".".join((Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
, FieldName
)), FieldList
[FieldName
][1], FieldList
[FieldName
][2]))
1815 Value
, ValueSize
= ParseFieldValue (FieldList
[FieldName
][0])
1817 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]))
1818 if isinstance(Value
, str):
1819 CApp
= CApp
+ ' Pcd->%s = %s; // From %s Line %d Value %s\n' % (FieldName
, Value
, FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
1822 # Use memcpy() to copy value into field
1824 CApp
= CApp
+ ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd
.DatumType
, FieldName
)
1825 CApp
= CApp
+ ' Value = %s; // From %s Line %d Value %s\n' % (self
.IntToCString(Value
, ValueSize
), FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
1826 CApp
= CApp
+ ' memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName
, ValueSize
, ValueSize
)
1829 CApp
= CApp
+ ' Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName
, Value
, FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
1831 CApp
= CApp
+ ' Pcd->%s = %d; // From %s Line %d Value %s\n' % (FieldName
, Value
, FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
1834 def GenerateInitValueStatement(self
,Pcd
,SkuName
,DefaultStoreName
):
1835 CApp
= ' Assign_%s_%s_%s_%s_Value(Pcd);\n' % (Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
,SkuName
,DefaultStoreName
)
1837 def GenerateCommandLineValue(self
,Pcd
):
1838 CApp
= "// Value in CommandLine\n"
1839 CApp
= CApp
+ "void Assign_%s_%s_CommandLine_Value(%s *Pcd){\n" % (Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
,Pcd
.DatumType
)
1840 CApp
= CApp
+ ' UINT32 FieldSize;\n'
1841 CApp
= CApp
+ ' CHAR8 *Value;\n'
1843 pcddefaultvalue
= Pcd
.PcdValueFromComm
1844 for FieldList
in [pcddefaultvalue
,Pcd
.PcdFieldValueFromComm
]:
1847 if pcddefaultvalue
and FieldList
== pcddefaultvalue
:
1848 IsArray
= self
.IsFieldValueAnArray(FieldList
)
1851 FieldList
= ValueExpressionEx(FieldList
, "VOID*")(True)
1852 except BadExpression
:
1853 EdkLogger
.error("Build", FORMAT_INVALID
, "Invalid value format for %s.%s, from DSC: %s" %
1854 (Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
, FieldList
))
1855 Value
, ValueSize
= ParseFieldValue (FieldList
)
1857 if isinstance(Value
, str):
1858 CApp
= CApp
+ ' Pcd = %s; // From Command Line \n' % (Value
)
1861 # Use memcpy() to copy value into field
1863 CApp
= CApp
+ ' Value = %s; // From Command Line.\n' % (self
.IntToCString(Value
, ValueSize
))
1864 CApp
= CApp
+ ' memcpy (Pcd, Value, %d);\n' % (ValueSize
)
1866 for FieldName
in FieldList
:
1867 IsArray
= self
.IsFieldValueAnArray(FieldList
[FieldName
][0])
1870 FieldList
[FieldName
][0] = ValueExpressionEx(FieldList
[FieldName
][0], "VOID*", self
._GuidDict
)(True)
1871 except BadExpression
:
1872 EdkLogger
.error('Build', FORMAT_INVALID
, "Invalid value format for %s. From %s Line %d " %
1873 (".".join((Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
, FieldName
)), FieldList
[FieldName
][1], FieldList
[FieldName
][2]))
1877 Value
, ValueSize
= ParseFieldValue (FieldList
[FieldName
][0])
1879 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]))
1880 if isinstance(Value
, str):
1881 CApp
= CApp
+ ' Pcd->%s = %s; // From %s Line %d Value %s\n' % (FieldName
, Value
, FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
1884 # Use memcpy() to copy value into field
1886 CApp
= CApp
+ ' FieldSize = __FIELD_SIZE(%s, %s);\n' % (Pcd
.DatumType
, FieldName
)
1887 CApp
= CApp
+ ' Value = %s; // From %s Line %d Value %s\n' % (self
.IntToCString(Value
, ValueSize
), FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
1888 CApp
= CApp
+ ' memcpy (&Pcd->%s, Value, (FieldSize > 0 && FieldSize < %d) ? FieldSize : %d);\n' % (FieldName
, ValueSize
, ValueSize
)
1891 CApp
= CApp
+ ' Pcd->%s = %dULL; // From %s Line %d Value %s\n' % (FieldName
, Value
, FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
1893 CApp
= CApp
+ ' Pcd->%s = %d; // From %s Line %d Value %s\n' % (FieldName
, Value
, FieldList
[FieldName
][1], FieldList
[FieldName
][2], FieldList
[FieldName
][0])
1896 def GenerateCommandLineValueStatement(self
,Pcd
):
1897 CApp
= ' Assign_%s_%s_CommandLine_Value(Pcd);\n' % (Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
)
1899 def GenerateInitializeFunc(self
, SkuName
, DefaultStore
, Pcd
, InitByteValue
, CApp
):
1900 OverrideValues
= {DefaultStore
:""}
1901 if Pcd
.SkuOverrideValues
:
1902 OverrideValues
= Pcd
.SkuOverrideValues
[SkuName
]
1903 for DefaultStoreName
in OverrideValues
.keys():
1904 CApp
= CApp
+ 'void\n'
1905 CApp
= CApp
+ 'Initialize_%s_%s_%s_%s(\n' % (SkuName
, DefaultStoreName
, Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
)
1906 CApp
= CApp
+ ' void\n'
1907 CApp
= CApp
+ ' )\n'
1909 CApp
= CApp
+ ' UINT32 Size;\n'
1910 CApp
= CApp
+ ' UINT32 FieldSize;\n'
1911 CApp
= CApp
+ ' CHAR8 *Value;\n'
1912 CApp
= CApp
+ ' UINT32 OriginalSize;\n'
1913 CApp
= CApp
+ ' VOID *OriginalPcd;\n'
1914 CApp
= CApp
+ ' %s *Pcd; // From %s Line %d \n' % (Pcd
.DatumType
, Pcd
.PkgPath
, Pcd
.PcdDefineLineNo
)
1917 if SkuName
in Pcd
.SkuInfoList
:
1918 DefaultValue
= Pcd
.SkuInfoList
[SkuName
].DefaultStoreDict
.get(DefaultStoreName
,Pcd
.SkuInfoList
[SkuName
].HiiDefaultValue
if Pcd
.SkuInfoList
[SkuName
].HiiDefaultValue
else Pcd
.SkuInfoList
[SkuName
].DefaultValue
)
1920 DefaultValue
= Pcd
.DefaultValue
1921 PcdDefaultValue
= StringToArray(DefaultValue
.strip())
1923 InitByteValue
+= '%s.%s.%s.%s|%s|%s\n' % (SkuName
, DefaultStoreName
, Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
, Pcd
.DatumType
, PcdDefaultValue
)
1926 # Get current PCD value and size
1928 CApp
= CApp
+ ' OriginalPcd = PcdGetPtr (%s, %s, %s, %s, &OriginalSize);\n' % (SkuName
, DefaultStoreName
, Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
)
1931 # Determine the size of the PCD. For simple structures, sizeof(TYPE) provides
1932 # the correct value. For structures with a flexible array member, the flexible
1933 # array member is detected, and the size is based on the highest index used with
1934 # the flexible array member. The flexible array member must be the last field
1935 # in a structure. The size formula for this case is:
1936 # OFFSET_OF(FlexbleArrayField) + sizeof(FlexibleArray[0]) * (HighestIndex + 1)
1938 CApp
= CApp
+ self
.GenerateSizeStatments(Pcd
)
1941 # Allocate and zero buffer for the PCD
1942 # Must handle cases where current value is smaller, larger, or same size
1943 # Always keep that larger one as the current size
1945 CApp
= CApp
+ ' Size = (OriginalSize > Size ? OriginalSize : Size);\n'
1946 CApp
= CApp
+ ' Pcd = (%s *)malloc (Size);\n' % (Pcd
.DatumType
)
1947 CApp
= CApp
+ ' memset (Pcd, 0, Size);\n'
1950 # Copy current PCD value into allocated buffer.
1952 CApp
= CApp
+ ' memcpy (Pcd, OriginalPcd, OriginalSize);\n'
1955 # Assign field values in PCD
1957 CApp
= CApp
+ self
.GenerateDefaultValueAssignStatement(Pcd
)
1958 if Pcd
.Type
not in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_FIXED_AT_BUILD
],
1959 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_PATCHABLE_IN_MODULE
]]:
1960 for skuname
in self
.SkuIdMgr
.GetSkuChain(SkuName
):
1961 storeset
= [DefaultStoreName
] if DefaultStoreName
== 'STANDARD' else ['STANDARD', DefaultStoreName
]
1962 for defaultstorenameitem
in storeset
:
1963 CApp
= CApp
+ "// SkuName: %s, DefaultStoreName: %s \n" % (skuname
, defaultstorenameitem
)
1964 CApp
= CApp
+ self
.GenerateInitValueStatement(Pcd
,skuname
,defaultstorenameitem
)
1965 if skuname
== SkuName
:
1968 CApp
= CApp
+ "// SkuName: %s, DefaultStoreName: STANDARD \n" % self
.SkuIdMgr
.SystemSkuId
1969 CApp
= CApp
+ self
.GenerateInitValueStatement(Pcd
,self
.SkuIdMgr
.SystemSkuId
,"STANDARD")
1970 CApp
= CApp
+ self
.GenerateCommandLineValueStatement(Pcd
)
1972 # Set new PCD value and size
1974 CApp
= CApp
+ ' PcdSetPtr (%s, %s, %s, %s, Size, (UINT8 *)Pcd);\n' % (SkuName
, DefaultStoreName
, Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
)
1979 CApp
= CApp
+ ' free (Pcd);\n'
1982 return InitByteValue
, CApp
1984 def GenerateByteArrayValue (self
, StructuredPcds
):
1986 # Generate/Compile/Run C application to determine if there are any flexible array members
1988 if not StructuredPcds
:
1992 CApp
= PcdMainCHeader
1995 for PcdName
in StructuredPcds
:
1996 Pcd
= StructuredPcds
[PcdName
]
1997 for IncludeFile
in Pcd
.StructuredPcdIncludeFile
:
1998 if IncludeFile
not in Includes
:
1999 Includes
[IncludeFile
] = True
2000 CApp
= CApp
+ '#include <%s>\n' % (IncludeFile
)
2002 for PcdName
in StructuredPcds
:
2003 Pcd
= StructuredPcds
[PcdName
]
2004 CApp
= CApp
+ self
.GenerateSizeFunction(Pcd
)
2005 CApp
= CApp
+ self
.GenerateDefaultValueAssignFunction(Pcd
)
2006 CApp
= CApp
+ self
.GenerateCommandLineValue(Pcd
)
2007 if not Pcd
.SkuOverrideValues
or Pcd
.Type
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_FIXED_AT_BUILD
],
2008 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_PATCHABLE_IN_MODULE
]]:
2009 CApp
= CApp
+ self
.GenerateInitValueFunction(Pcd
,self
.SkuIdMgr
.SystemSkuId
, 'STANDARD')
2011 for SkuName
in self
.SkuIdMgr
.SkuOverrideOrder():
2012 if SkuName
not in Pcd
.SkuOverrideValues
:
2014 for DefaultStoreName
in Pcd
.SkuOverrideValues
[SkuName
]:
2015 CApp
= CApp
+ self
.GenerateInitValueFunction(Pcd
,SkuName
,DefaultStoreName
)
2016 if not Pcd
.SkuOverrideValues
or Pcd
.Type
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_FIXED_AT_BUILD
],
2017 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_PATCHABLE_IN_MODULE
]]:
2018 InitByteValue
, CApp
= self
.GenerateInitializeFunc(self
.SkuIdMgr
.SystemSkuId
, 'STANDARD', Pcd
, InitByteValue
, CApp
)
2020 for SkuName
in self
.SkuIdMgr
.SkuOverrideOrder():
2021 if SkuName
not in Pcd
.SkuOverrideValues
:
2023 for DefaultStoreName
in Pcd
.DefaultStoreName
:
2024 Pcd
= StructuredPcds
[PcdName
]
2025 InitByteValue
, CApp
= self
.GenerateInitializeFunc(SkuName
, DefaultStoreName
, Pcd
, InitByteValue
, CApp
)
2027 CApp
= CApp
+ 'VOID\n'
2028 CApp
= CApp
+ 'PcdEntryPoint(\n'
2029 CApp
= CApp
+ ' VOID\n'
2030 CApp
= CApp
+ ' )\n'
2032 for Pcd
in StructuredPcds
.values():
2033 if not Pcd
.SkuOverrideValues
or Pcd
.Type
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_FIXED_AT_BUILD
],self
._PCD
_TYPE
_STRING
_[MODEL_PCD_PATCHABLE_IN_MODULE
]]:
2034 CApp
= CApp
+ ' Initialize_%s_%s_%s_%s();\n' % (self
.SkuIdMgr
.SystemSkuId
, 'STANDARD', Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
)
2036 for SkuName
in self
.SkuIdMgr
.SkuOverrideOrder():
2037 if SkuName
not in Pcd
.SkuOverrideValues
:
2039 for DefaultStoreName
in Pcd
.SkuOverrideValues
[SkuName
]:
2040 CApp
= CApp
+ ' Initialize_%s_%s_%s_%s();\n' % (SkuName
, DefaultStoreName
, Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
)
2043 CApp
= CApp
+ PcdMainCEntry
+ '\n'
2045 if not os
.path
.exists(self
.OutputPath
):
2046 os
.makedirs(self
.OutputPath
)
2047 CAppBaseFileName
= os
.path
.join(self
.OutputPath
, PcdValueInitName
)
2048 SaveFileOnChange(CAppBaseFileName
+ '.c', CApp
, False)
2050 MakeApp
= PcdMakefileHeader
2051 if sys
.platform
== "win32":
2052 MakeApp
= MakeApp
+ 'APPNAME = %s\n' % (PcdValueInitName
) + 'OBJECTS = %s\%s.obj\n' % (self
.OutputPath
, PcdValueInitName
) + 'INC = '
2054 MakeApp
= MakeApp
+ PcdGccMakefile
2055 MakeApp
= MakeApp
+ 'APPNAME = %s\n' % (PcdValueInitName
) + 'OBJECTS = %s/%s.o\n' % (self
.OutputPath
, PcdValueInitName
) + \
2056 'include $(MAKEROOT)/Makefiles/app.makefile\n' + 'INCLUDE +='
2059 for Cache
in self
._Bdb
._CACHE
_.values():
2060 if Cache
.MetaFile
.Ext
.lower() != '.dec':
2063 if str(Cache
.MetaFile
.Path
) not in PlatformInc
:
2064 PlatformInc
[str(Cache
.MetaFile
.Path
)] = Cache
.CommonIncludes
2067 for Pcd
in StructuredPcds
.values():
2068 for PackageDec
in Pcd
.PackageDecs
:
2069 Package
= os
.path
.normpath(mws
.join(GlobalData
.gWorkspace
, PackageDec
))
2070 if not os
.path
.exists(Package
):
2071 EdkLogger
.error('Build', RESOURCE_NOT_AVAILABLE
, "The dependent Package %s of PCD %s.%s is not exist." % (PackageDec
, Pcd
.TokenSpaceGuidCName
, Pcd
.TokenCName
))
2072 if Package
not in PcdDependDEC
:
2073 PcdDependDEC
.append(Package
)
2075 if PlatformInc
and PcdDependDEC
:
2076 for pkg
in PcdDependDEC
:
2077 if pkg
in PlatformInc
:
2078 for inc
in PlatformInc
[pkg
]:
2079 MakeApp
+= '-I' + str(inc
) + ' '
2080 MakeApp
= MakeApp
+ '\n'
2082 CC_FLAGS
= LinuxCFLAGS
2083 if sys
.platform
== "win32":
2084 CC_FLAGS
= WindowsCFLAGS
2086 for Options
in self
.BuildOptions
:
2087 if Options
[2] != EDKII_NAME
:
2090 if Family
and Family
!= self
.ToolChainFamily
:
2092 Target
, Tag
, Arch
, Tool
, Attr
= Options
[1].split("_")
2096 if Target
== "*" or Target
== self
._Target
:
2097 if Tag
== "*" or Tag
== self
._Toolchain
:
2098 if Arch
== "*" or Arch
== self
.Arch
:
2099 if Tool
not in BuildOptions
:
2100 BuildOptions
[Tool
] = {}
2101 if Attr
!= "FLAGS" or Attr
not in BuildOptions
[Tool
] or self
.BuildOptions
[Options
].startswith('='):
2102 BuildOptions
[Tool
][Attr
] = self
.BuildOptions
[Options
]
2104 # append options for the same tool except PATH
2106 BuildOptions
[Tool
][Attr
] += " " + self
.BuildOptions
[Options
]
2108 BuildOptions
[Tool
][Attr
] = self
.BuildOptions
[Options
]
2110 for Tool
in BuildOptions
:
2111 for Attr
in BuildOptions
[Tool
]:
2113 Value
= BuildOptions
[Tool
][Attr
]
2114 ValueList
= Value
.split()
2116 for Id
, Item
in enumerate(ValueList
):
2117 if Item
== '-D' or Item
== '/D':
2118 CC_FLAGS
+= ' ' + Item
2119 if Id
+ 1 < len(ValueList
):
2120 CC_FLAGS
+= ' ' + ValueList
[Id
+ 1]
2121 elif Item
.startswith('/D') or Item
.startswith('-D'):
2122 CC_FLAGS
+= ' ' + Item
2125 if sys
.platform
== "win32":
2126 MakeApp
= MakeApp
+ PcdMakefileEnd
2127 MakeFileName
= os
.path
.join(self
.OutputPath
, 'Makefile')
2128 SaveFileOnChange(MakeFileName
, MakeApp
, False)
2130 InputValueFile
= os
.path
.join(self
.OutputPath
, 'Input.txt')
2131 OutputValueFile
= os
.path
.join(self
.OutputPath
, 'Output.txt')
2132 SaveFileOnChange(InputValueFile
, InitByteValue
, False)
2134 PcdValueInitExe
= PcdValueInitName
2135 if not sys
.platform
== "win32":
2136 PcdValueInitExe
= os
.path
.join(os
.getenv("EDK_TOOLS_PATH"), 'Source', 'C', 'bin', PcdValueInitName
)
2138 PcdValueInitExe
= os
.path
.join(os
.getenv("EDK_TOOLS_PATH"), 'Bin', 'Win32', PcdValueInitName
) +".exe"
2139 if not os
.path
.exists(PcdValueInitExe
) or self
.NeedUpdateOutput(OutputValueFile
, CAppBaseFileName
+ '.c',MakeFileName
,InputValueFile
):
2141 if sys
.platform
== "win32":
2142 MakeCommand
= 'nmake clean & nmake -f %s' % (MakeFileName
)
2143 returncode
, StdOut
, StdErr
= self
.ExecuteCommand (MakeCommand
)
2146 MakeCommand
= 'make clean & make -f %s' % (MakeFileName
)
2147 returncode
, StdOut
, StdErr
= self
.ExecuteCommand (MakeCommand
)
2149 Messages
= Messages
.split('\n')
2152 CAppBaseFileName
= os
.path
.join(self
.OutputPath
, PcdValueInitName
)
2153 File
= open (CAppBaseFileName
+ '.c', 'r')
2154 FileData
= File
.readlines()
2156 for Message
in Messages
:
2157 if " error" in Message
or "warning" in Message
:
2158 FileInfo
= Message
.strip().split('(')
2159 if len (FileInfo
) > 1:
2160 FileName
= FileInfo
[0]
2161 FileLine
= FileInfo
[1].split (')')[0]
2163 FileInfo
= Message
.strip().split(':')
2164 FileName
= FileInfo
[0]
2165 FileLine
= FileInfo
[1]
2166 if FileLine
.isdigit():
2167 error_line
= FileData
[int (FileLine
) - 1]
2168 if r
"//" in error_line
:
2169 c_line
,dsc_line
= error_line
.split(r
"//")
2171 dsc_line
= error_line
2172 message_itmes
= Message
.split(":")
2174 if "PcdValueInit.c" not in Message
:
2175 if not MessageGroup
:
2176 MessageGroup
.append(Message
)
2179 for item
in message_itmes
:
2180 if "PcdValueInit.c" in item
:
2181 Index
= message_itmes
.index(item
)
2182 message_itmes
[Index
] = dsc_line
.strip()
2184 MessageGroup
.append(":".join(message_itmes
[Index
:]).strip())
2187 MessageGroup
.append(Message
)
2189 EdkLogger
.error("build", PCD_STRUCTURE_PCD_ERROR
, "\n".join(MessageGroup
) )
2191 EdkLogger
.error('Build', COMMAND_FAILURE
, 'Can not execute command: %s' % MakeCommand
)
2192 Command
= PcdValueInitExe
+ ' -i %s -o %s' % (InputValueFile
, OutputValueFile
)
2193 returncode
, StdOut
, StdErr
= self
.ExecuteCommand (Command
)
2195 EdkLogger
.warn('Build', COMMAND_FAILURE
, 'Can not collect output from command: %s' % Command
)
2197 File
= open (OutputValueFile
, 'r')
2198 FileBuffer
= File
.readlines()
2201 StructurePcdSet
= []
2202 for Pcd
in FileBuffer
:
2203 PcdValue
= Pcd
.split ('|')
2204 PcdInfo
= PcdValue
[0].split ('.')
2205 StructurePcdSet
.append((PcdInfo
[0],PcdInfo
[1], PcdInfo
[2], PcdInfo
[3], PcdValue
[2].strip()))
2206 return StructurePcdSet
2208 def NeedUpdateOutput(self
,OutputFile
, ValueCFile
, MakeFile
, StructureInput
):
2209 if not os
.path
.exists(OutputFile
):
2211 if os
.stat(OutputFile
).st_mtime
<= os
.stat(ValueCFile
).st_mtime
:
2213 if os
.stat(OutputFile
).st_mtime
<= os
.stat(MakeFile
).st_mtime
:
2215 if os
.stat(OutputFile
).st_mtime
<= os
.stat(StructureInput
).st_mtime
:
2219 ## Retrieve dynamic PCD settings
2221 # @param Type PCD type
2223 # @retval a dict object contains settings of given PCD type
2225 def _GetDynamicPcd(self
, Type
):
2230 # tdict is a special dict kind of type, used for selecting correct
2231 # PCD settings for certain ARCH and SKU
2233 PcdDict
= tdict(True, 4)
2235 # Find out all possible PCD candidates for self._Arch
2236 RecordList
= self
._RawData
[Type
, self
._Arch
]
2237 AvailableSkuIdSet
= copy
.copy(self
.SkuIds
)
2240 for TokenSpaceGuid
, PcdCName
, Setting
, Arch
, SkuName
, Dummy3
, Dummy4
,Dummy5
in RecordList
:
2241 SkuName
= SkuName
.upper()
2242 SkuName
= 'DEFAULT' if SkuName
== 'COMMON' else SkuName
2243 if SkuName
not in AvailableSkuIdSet
:
2244 EdkLogger
.error('build', PARAMETER_INVALID
, 'Sku %s is not defined in [SkuIds] section' % SkuName
,
2245 File
=self
.MetaFile
, Line
=Dummy5
)
2246 if "." not in TokenSpaceGuid
:
2247 PcdList
.append((PcdCName
, TokenSpaceGuid
, SkuName
, Dummy5
))
2248 PcdDict
[Arch
, SkuName
, PcdCName
, TokenSpaceGuid
] = Setting
2250 # Remove redundant PCD candidates, per the ARCH and SKU
2251 for PcdCName
, TokenSpaceGuid
, SkuName
, Dummy4
in PcdList
:
2253 Setting
= PcdDict
[self
._Arch
, SkuName
, PcdCName
, TokenSpaceGuid
]
2257 PcdValue
, DatumType
, MaxDatumSize
= self
._ValidatePcd
(PcdCName
, TokenSpaceGuid
, Setting
, Type
, Dummy4
)
2258 SkuInfo
= SkuInfoClass(SkuName
, self
.SkuIds
[SkuName
][0], '', '', '', '', '', PcdValue
)
2259 if (PcdCName
, TokenSpaceGuid
) in Pcds
.keys():
2260 pcdObject
= Pcds
[PcdCName
, TokenSpaceGuid
]
2261 pcdObject
.SkuInfoList
[SkuName
] = SkuInfo
2262 if MaxDatumSize
.strip():
2263 CurrentMaxSize
= int(MaxDatumSize
.strip(), 0)
2266 if pcdObject
.MaxDatumSize
:
2267 PcdMaxSize
= int(pcdObject
.MaxDatumSize
, 0)
2270 if CurrentMaxSize
> PcdMaxSize
:
2271 pcdObject
.MaxDatumSize
= str(CurrentMaxSize
)
2273 Pcds
[PcdCName
, TokenSpaceGuid
] = PcdClassObject(
2276 self
._PCD
_TYPE
_STRING
_[Type
],
2281 {SkuName
: SkuInfo
},
2286 for pcd
in Pcds
.values():
2287 pcdDecObject
= self
._DecPcds
[pcd
.TokenCName
, pcd
.TokenSpaceGuidCName
]
2288 # Only fix the value while no value provided in DSC file.
2289 for sku
in pcd
.SkuInfoList
.values():
2290 if (sku
.DefaultValue
== "" or sku
.DefaultValue
==None):
2291 sku
.DefaultValue
= pcdDecObject
.DefaultValue
2292 if 'DEFAULT' not in pcd
.SkuInfoList
.keys() and 'COMMON' not in pcd
.SkuInfoList
.keys():
2293 valuefromDec
= pcdDecObject
.DefaultValue
2294 SkuInfo
= SkuInfoClass('DEFAULT', '0', '', '', '', '', '', valuefromDec
)
2295 pcd
.SkuInfoList
['DEFAULT'] = SkuInfo
2296 elif 'DEFAULT' not in pcd
.SkuInfoList
.keys() and 'COMMON' in pcd
.SkuInfoList
.keys():
2297 pcd
.SkuInfoList
['DEFAULT'] = pcd
.SkuInfoList
['COMMON']
2298 del(pcd
.SkuInfoList
['COMMON'])
2299 elif 'DEFAULT' in pcd
.SkuInfoList
.keys() and 'COMMON' in pcd
.SkuInfoList
.keys():
2300 del(pcd
.SkuInfoList
['COMMON'])
2302 map(self
.FilterSkuSettings
,Pcds
.values())
2306 def FilterSkuSettings(self
, PcdObj
):
2308 if self
.SkuIdMgr
.SkuUsageType
== self
.SkuIdMgr
.SINGLE
:
2309 if 'DEFAULT' in PcdObj
.SkuInfoList
.keys() and self
.SkuIdMgr
.SystemSkuId
not in PcdObj
.SkuInfoList
.keys():
2310 PcdObj
.SkuInfoList
[self
.SkuIdMgr
.SystemSkuId
] = PcdObj
.SkuInfoList
['DEFAULT']
2311 PcdObj
.SkuInfoList
= {'DEFAULT':PcdObj
.SkuInfoList
[self
.SkuIdMgr
.SystemSkuId
]}
2312 PcdObj
.SkuInfoList
['DEFAULT'].SkuIdName
= 'DEFAULT'
2313 PcdObj
.SkuInfoList
['DEFAULT'].SkuId
= '0'
2315 elif self
.SkuIdMgr
.SkuUsageType
== self
.SkuIdMgr
.DEFAULT
:
2316 PcdObj
.SkuInfoList
= {'DEFAULT':PcdObj
.SkuInfoList
['DEFAULT']}
2321 def CompareVarAttr(self
, Attr1
, Attr2
):
2322 if not Attr1
or not Attr2
: # for empty string
2324 Attr1s
= [attr
.strip() for attr
in Attr1
.split(",")]
2325 Attr1Set
= set(Attr1s
)
2326 Attr2s
= [attr
.strip() for attr
in Attr2
.split(",")]
2327 Attr2Set
= set(Attr2s
)
2328 if Attr2Set
== Attr1Set
:
2332 def CopyDscRawValue(self
,Pcd
):
2333 if Pcd
.DscRawValue
is None:
2334 Pcd
.DscRawValue
= dict()
2335 if Pcd
.Type
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_FIXED_AT_BUILD
], self
._PCD
_TYPE
_STRING
_[MODEL_PCD_PATCHABLE_IN_MODULE
]]:
2336 if self
.SkuIdMgr
.SystemSkuId
not in Pcd
.DscRawValue
:
2337 Pcd
.DscRawValue
[self
.SkuIdMgr
.SystemSkuId
] = {}
2338 Pcd
.DscRawValue
[self
.SkuIdMgr
.SystemSkuId
]['STANDARD'] = Pcd
.DefaultValue
2339 for skuname
in Pcd
.SkuInfoList
:
2340 Pcd
.DscRawValue
[skuname
] = {}
2341 if Pcd
.Type
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_HII
], self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_HII
]]:
2342 for defaultstore
in Pcd
.SkuInfoList
[skuname
].DefaultStoreDict
:
2343 Pcd
.DscRawValue
[skuname
][defaultstore
] = Pcd
.SkuInfoList
[skuname
].DefaultStoreDict
[defaultstore
]
2345 Pcd
.DscRawValue
[skuname
]['STANDARD'] = Pcd
.SkuInfoList
[skuname
].DefaultValue
2346 def CompletePcdValues(self
,PcdSet
):
2348 DefaultStoreObj
= DefaultStore(self
._GetDefaultStores
())
2349 SkuIds
= {skuname
:skuid
for skuname
,skuid
in self
.SkuIdMgr
.AvailableSkuIdSet
.items() if skuname
!='COMMON'}
2350 DefaultStores
= set([storename
for pcdobj
in PcdSet
.values() for skuobj
in pcdobj
.SkuInfoList
.values() for storename
in skuobj
.DefaultStoreDict
.keys()])
2351 for PcdCName
, TokenSpaceGuid
in PcdSet
:
2352 PcdObj
= PcdSet
[(PcdCName
, TokenSpaceGuid
)]
2353 self
.CopyDscRawValue(PcdObj
)
2354 if PcdObj
.Type
not in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_DEFAULT
],
2355 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_HII
],
2356 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_VPD
],
2357 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_DEFAULT
],
2358 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_HII
],
2359 self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_VPD
]]:
2360 Pcds
[PcdCName
, TokenSpaceGuid
]= PcdObj
2362 PcdType
= PcdObj
.Type
2363 if PcdType
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_HII
], self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_HII
]]:
2364 for skuid
in PcdObj
.SkuInfoList
:
2365 skuobj
= PcdObj
.SkuInfoList
[skuid
]
2366 mindefaultstorename
= DefaultStoreObj
.GetMin(set([defaultstorename
for defaultstorename
in skuobj
.DefaultStoreDict
]))
2367 for defaultstorename
in DefaultStores
:
2368 if defaultstorename
not in skuobj
.DefaultStoreDict
:
2369 skuobj
.DefaultStoreDict
[defaultstorename
] = copy
.deepcopy(skuobj
.DefaultStoreDict
[mindefaultstorename
])
2370 skuobj
.HiiDefaultValue
= skuobj
.DefaultStoreDict
[mindefaultstorename
]
2371 for skuname
,skuid
in SkuIds
.items():
2372 if skuname
not in PcdObj
.SkuInfoList
:
2373 nextskuid
= self
.SkuIdMgr
.GetNextSkuId(skuname
)
2374 while nextskuid
not in PcdObj
.SkuInfoList
:
2375 nextskuid
= self
.SkuIdMgr
.GetNextSkuId(nextskuid
)
2376 PcdObj
.SkuInfoList
[skuname
] = copy
.deepcopy(PcdObj
.SkuInfoList
[nextskuid
])
2377 PcdObj
.SkuInfoList
[skuname
].SkuId
= skuid
2378 PcdObj
.SkuInfoList
[skuname
].SkuIdName
= skuname
2379 if PcdType
in [self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_HII
], self
._PCD
_TYPE
_STRING
_[MODEL_PCD_DYNAMIC_EX_HII
]]:
2380 PcdObj
.DefaultValue
= PcdObj
.SkuInfoList
.values()[0].HiiDefaultValue
if self
.SkuIdMgr
.SkuUsageType
== self
.SkuIdMgr
.SINGLE
else PcdObj
.SkuInfoList
["DEFAULT"].HiiDefaultValue
2381 Pcds
[PcdCName
, TokenSpaceGuid
]= PcdObj
2383 ## Retrieve dynamic HII PCD settings
2385 # @param Type PCD type
2387 # @retval a dict object contains settings of given PCD type
2389 def _GetDynamicHiiPcd(self
, Type
):
2395 # tdict is a special dict kind of type, used for selecting correct
2396 # PCD settings for certain ARCH and SKU
2398 PcdDict
= tdict(True, 5)
2400 RecordList
= self
._RawData
[Type
, self
._Arch
]
2401 # Find out all possible PCD candidates for self._Arch
2402 AvailableSkuIdSet
= copy
.copy(self
.SkuIds
)
2403 DefaultStoresDefine
= self
._GetDefaultStores
()
2405 for TokenSpaceGuid
, PcdCName
, Setting
, Arch
, SkuName
, DefaultStore
, Dummy4
,Dummy5
in RecordList
:
2406 SkuName
= SkuName
.upper()
2407 SkuName
= 'DEFAULT' if SkuName
== 'COMMON' else SkuName
2408 DefaultStore
= DefaultStore
.upper()
2409 if DefaultStore
== "COMMON":
2410 DefaultStore
= "STANDARD"
2411 if SkuName
not in AvailableSkuIdSet
:
2412 EdkLogger
.error('build', PARAMETER_INVALID
, 'Sku %s is not defined in [SkuIds] section' % SkuName
,
2413 File
=self
.MetaFile
, Line
=Dummy5
)
2414 if DefaultStore
not in DefaultStoresDefine
:
2415 EdkLogger
.error('build', PARAMETER_INVALID
, 'DefaultStores %s is not defined in [DefaultStores] section' % DefaultStore
,
2416 File
=self
.MetaFile
, Line
=Dummy5
)
2417 if "." not in TokenSpaceGuid
:
2418 PcdSet
.add((PcdCName
, TokenSpaceGuid
, SkuName
,DefaultStore
, Dummy5
))
2419 PcdDict
[Arch
, SkuName
, PcdCName
, TokenSpaceGuid
,DefaultStore
] = Setting
2422 # Remove redundant PCD candidates, per the ARCH and SKU
2423 for PcdCName
, TokenSpaceGuid
, SkuName
,DefaultStore
, Dummy4
in PcdSet
:
2425 Setting
= PcdDict
[self
._Arch
, SkuName
, PcdCName
, TokenSpaceGuid
,DefaultStore
]
2428 VariableName
, VariableGuid
, VariableOffset
, DefaultValue
, VarAttribute
= self
._ValidatePcd
(PcdCName
, TokenSpaceGuid
, Setting
, Type
, Dummy4
)
2430 rt
, Msg
= VariableAttributes
.ValidateVarAttributes(VarAttribute
)
2432 EdkLogger
.error("build", PCD_VARIABLE_ATTRIBUTES_ERROR
, "Variable attributes settings for %s is incorrect.\n %s" % (".".join((TokenSpaceGuid
, PcdCName
)), Msg
),
2433 ExtraData
="[%s]" % VarAttribute
)
2435 FormatCorrect
= True
2436 if VariableOffset
.isdigit():
2437 if int(VariableOffset
, 10) > 0xFFFF:
2439 elif re
.match(r
'[\t\s]*0[xX][a-fA-F0-9]+$', VariableOffset
):
2440 if int(VariableOffset
, 16) > 0xFFFF:
2442 # For Offset written in "A.B"
2443 elif VariableOffset
.find('.') > -1:
2444 VariableOffsetList
= VariableOffset
.split(".")
2445 if not (len(VariableOffsetList
) == 2
2446 and IsValidWord(VariableOffsetList
[0])
2447 and IsValidWord(VariableOffsetList
[1])):
2448 FormatCorrect
= False
2450 FormatCorrect
= False
2451 if not FormatCorrect
:
2452 EdkLogger
.error('Build', FORMAT_INVALID
, "Invalid syntax or format of the variable offset value is incorrect for %s." % ".".join((TokenSpaceGuid
, PcdCName
)))
2455 EdkLogger
.error('Build', OPTION_VALUE_INVALID
, "The variable offset value must not exceed the maximum value of 0xFFFF (UINT16) for %s." % ".".join((TokenSpaceGuid
, PcdCName
)))
2456 if (VariableName
, VariableGuid
) not in VariableAttrs
:
2457 VariableAttrs
[(VariableName
, VariableGuid
)] = VarAttribute
2459 if not self
.CompareVarAttr(VariableAttrs
[(VariableName
, VariableGuid
)], VarAttribute
):
2460 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
)]))
2462 pcdDecObject
= self
._DecPcds
[PcdCName
, TokenSpaceGuid
]
2463 if (PcdCName
, TokenSpaceGuid
) in Pcds
.keys():
2464 pcdObject
= Pcds
[PcdCName
, TokenSpaceGuid
]
2465 if SkuName
in pcdObject
.SkuInfoList
:
2466 Skuitem
= pcdObject
.SkuInfoList
[SkuName
]
2467 Skuitem
.DefaultStoreDict
.update({DefaultStore
:DefaultValue
})
2469 SkuInfo
= SkuInfoClass(SkuName
, self
.SkuIds
[SkuName
][0], VariableName
, VariableGuid
, VariableOffset
, DefaultValue
, VariableAttribute
=VarAttribute
,DefaultStore
={DefaultStore
:DefaultValue
})
2470 pcdObject
.SkuInfoList
[SkuName
] = SkuInfo
2472 SkuInfo
= SkuInfoClass(SkuName
, self
.SkuIds
[SkuName
][0], VariableName
, VariableGuid
, VariableOffset
, DefaultValue
, VariableAttribute
=VarAttribute
,DefaultStore
={DefaultStore
:DefaultValue
})
2473 Pcds
[PcdCName
, TokenSpaceGuid
] = PcdClassObject(
2476 self
._PCD
_TYPE
_STRING
_[Type
],
2481 {SkuName
: SkuInfo
},
2484 pcdDecObject
.validateranges
,
2485 pcdDecObject
.validlists
,
2486 pcdDecObject
.expressions
,
2490 for pcd
in Pcds
.values():
2491 SkuInfoObj
= pcd
.SkuInfoList
.values()[0]
2492 pcdDecObject
= self
._DecPcds
[pcd
.TokenCName
, pcd
.TokenSpaceGuidCName
]
2493 pcd
.DatumType
= pcdDecObject
.DatumType
2494 # Only fix the value while no value provided in DSC file.
2495 for sku
in pcd
.SkuInfoList
.values():
2496 if (sku
.HiiDefaultValue
== "" or sku
.HiiDefaultValue
== None):
2497 sku
.HiiDefaultValue
= pcdDecObject
.DefaultValue
2498 for default_store
in sku
.DefaultStoreDict
:
2499 sku
.DefaultStoreDict
[default_store
]=pcdDecObject
.DefaultValue
2500 pcd
.DefaultValue
= pcdDecObject
.DefaultValue
2501 if 'DEFAULT' not in pcd
.SkuInfoList
.keys() and 'COMMON' not in pcd
.SkuInfoList
.keys():
2502 valuefromDec
= pcdDecObject
.DefaultValue
2503 SkuInfo
= SkuInfoClass('DEFAULT', '0', SkuInfoObj
.VariableName
, SkuInfoObj
.VariableGuid
, SkuInfoObj
.VariableOffset
, valuefromDec
,VariableAttribute
=SkuInfoObj
.VariableAttribute
,DefaultStore
={DefaultStore
:valuefromDec
})
2504 pcd
.SkuInfoList
['DEFAULT'] = SkuInfo
2505 elif 'DEFAULT' not in pcd
.SkuInfoList
.keys() and 'COMMON' in pcd
.SkuInfoList
.keys():
2506 pcd
.SkuInfoList
['DEFAULT'] = pcd
.SkuInfoList
['COMMON']
2507 del(pcd
.SkuInfoList
['COMMON'])
2508 elif 'DEFAULT' in pcd
.SkuInfoList
.keys() and 'COMMON' in pcd
.SkuInfoList
.keys():
2509 del(pcd
.SkuInfoList
['COMMON'])
2511 if pcd
.MaxDatumSize
.strip():
2512 MaxSize
= int(pcd
.MaxDatumSize
, 0)
2515 if pcd
.DatumType
not in ['BOOLEAN','UINT8','UINT16','UINT32','UINT64']:
2516 for (_
, skuobj
) in pcd
.SkuInfoList
.items():
2518 skuobj
.HiiDefaultValue
= StringToArray(skuobj
.HiiDefaultValue
)
2519 datalen
= len(skuobj
.HiiDefaultValue
.split(","))
2520 if datalen
> MaxSize
:
2522 for defaultst
in skuobj
.DefaultStoreDict
:
2523 skuobj
.DefaultStoreDict
[defaultst
] = StringToArray(skuobj
.DefaultStoreDict
[defaultst
])
2524 pcd
.DefaultValue
= StringToArray(pcd
.DefaultValue
)
2525 pcd
.MaxDatumSize
= str(MaxSize
)
2526 rt
, invalidhii
= self
.CheckVariableNameAssignment(Pcds
)
2528 invalidpcd
= ",".join(invalidhii
)
2529 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
)
2531 map(self
.FilterSkuSettings
,Pcds
.values())
2535 def CheckVariableNameAssignment(self
,Pcds
):
2537 for pcdname
in Pcds
:
2539 varnameset
= set([sku
.VariableName
for (skuid
,sku
) in pcd
.SkuInfoList
.items()])
2540 if len(varnameset
) > 1:
2541 invalidhii
.append(".".join((pcdname
[1],pcdname
[0])))
2543 return False,invalidhii
2546 ## Retrieve dynamic VPD PCD settings
2548 # @param Type PCD type
2550 # @retval a dict object contains settings of given PCD type
2552 def _GetDynamicVpdPcd(self
, Type
):
2557 # tdict is a special dict kind of type, used for selecting correct
2558 # PCD settings for certain ARCH and SKU
2560 PcdDict
= tdict(True, 4)
2563 # Find out all possible PCD candidates for self._Arch
2564 RecordList
= self
._RawData
[Type
, self
._Arch
]
2565 AvailableSkuIdSet
= copy
.copy(self
.SkuIds
)
2567 for TokenSpaceGuid
, PcdCName
, Setting
, Arch
, SkuName
, Dummy3
, Dummy4
,Dummy5
in RecordList
:
2568 SkuName
= SkuName
.upper()
2569 SkuName
= 'DEFAULT' if SkuName
== 'COMMON' else SkuName
2570 if SkuName
not in AvailableSkuIdSet
:
2571 EdkLogger
.error('build', PARAMETER_INVALID
, 'Sku %s is not defined in [SkuIds] section' % SkuName
,
2572 File
=self
.MetaFile
, Line
=Dummy5
)
2573 if "." not in TokenSpaceGuid
:
2574 PcdList
.append((PcdCName
, TokenSpaceGuid
, SkuName
, Dummy5
))
2575 PcdDict
[Arch
, SkuName
, PcdCName
, TokenSpaceGuid
] = Setting
2577 # Remove redundant PCD candidates, per the ARCH and SKU
2578 for PcdCName
, TokenSpaceGuid
, SkuName
, Dummy4
in PcdList
:
2579 Setting
= PcdDict
[self
._Arch
, SkuName
, PcdCName
, TokenSpaceGuid
]
2583 # For the VOID* type, it can have optional data of MaxDatumSize and InitialValue
2584 # For the Integer & Boolean type, the optional data can only be InitialValue.
2585 # At this point, we put all the data into the PcdClssObject for we don't know the PCD's datumtype
2586 # until the DEC parser has been called.
2588 VpdOffset
, MaxDatumSize
, InitialValue
= self
._ValidatePcd
(PcdCName
, TokenSpaceGuid
, Setting
, Type
, Dummy4
)
2589 SkuInfo
= SkuInfoClass(SkuName
, self
.SkuIds
[SkuName
][0], '', '', '', '', VpdOffset
, InitialValue
)
2590 if (PcdCName
, TokenSpaceGuid
) in Pcds
.keys():
2591 pcdObject
= Pcds
[PcdCName
, TokenSpaceGuid
]
2592 pcdObject
.SkuInfoList
[SkuName
] = SkuInfo
2593 if MaxDatumSize
.strip():
2594 CurrentMaxSize
= int(MaxDatumSize
.strip(), 0)
2597 if pcdObject
.MaxDatumSize
:
2598 PcdMaxSize
= int(pcdObject
.MaxDatumSize
, 0)
2601 if CurrentMaxSize
> PcdMaxSize
:
2602 pcdObject
.MaxDatumSize
= str(CurrentMaxSize
)
2604 Pcds
[PcdCName
, TokenSpaceGuid
] = PcdClassObject(
2607 self
._PCD
_TYPE
_STRING
_[Type
],
2612 {SkuName
: SkuInfo
},
2616 for pcd
in Pcds
.values():
2617 SkuInfoObj
= pcd
.SkuInfoList
.values()[0]
2618 pcdDecObject
= self
._DecPcds
[pcd
.TokenCName
, pcd
.TokenSpaceGuidCName
]
2619 pcd
.DatumType
= pcdDecObject
.DatumType
2620 # Only fix the value while no value provided in DSC file.
2621 for sku
in pcd
.SkuInfoList
.values():
2622 if (sku
.DefaultValue
== "" or sku
.DefaultValue
==None):
2623 sku
.DefaultValue
= pcdDecObject
.DefaultValue
2624 if 'DEFAULT' not in pcd
.SkuInfoList
.keys() and 'COMMON' not in pcd
.SkuInfoList
.keys():
2625 valuefromDec
= pcdDecObject
.DefaultValue
2626 SkuInfo
= SkuInfoClass('DEFAULT', '0', '', '', '', '', SkuInfoObj
.VpdOffset
, valuefromDec
)
2627 pcd
.SkuInfoList
['DEFAULT'] = SkuInfo
2628 elif 'DEFAULT' not in pcd
.SkuInfoList
.keys() and 'COMMON' in pcd
.SkuInfoList
.keys():
2629 pcd
.SkuInfoList
['DEFAULT'] = pcd
.SkuInfoList
['COMMON']
2630 del(pcd
.SkuInfoList
['COMMON'])
2631 elif 'DEFAULT' in pcd
.SkuInfoList
.keys() and 'COMMON' in pcd
.SkuInfoList
.keys():
2632 del(pcd
.SkuInfoList
['COMMON'])
2635 map(self
.FilterSkuSettings
,Pcds
.values())
2638 ## Add external modules
2640 # The external modules are mostly those listed in FDF file, which don't
2643 # @param FilePath The path of module description file
2645 def AddModule(self
, FilePath
):
2646 FilePath
= NormPath(FilePath
)
2647 if FilePath
not in self
.Modules
:
2648 Module
= ModuleBuildClassObject()
2649 Module
.MetaFile
= FilePath
2650 self
.Modules
.append(Module
)
2652 def _GetToolChainFamily(self
):
2653 self
._ToolChainFamily
= "MSFT"
2654 BuildConfigurationFile
= os
.path
.normpath(os
.path
.join(GlobalData
.gConfDirectory
, "target.txt"))
2655 if os
.path
.isfile(BuildConfigurationFile
) == True:
2656 TargetTxt
= TargetTxtClassObject()
2657 TargetTxt
.LoadTargetTxtFile(BuildConfigurationFile
)
2658 ToolDefinitionFile
= TargetTxt
.TargetTxtDictionary
[DataType
.TAB_TAT_DEFINES_TOOL_CHAIN_CONF
]
2659 if ToolDefinitionFile
== '':
2660 ToolDefinitionFile
= "tools_def.txt"
2661 ToolDefinitionFile
= os
.path
.normpath(mws
.join(self
.WorkspaceDir
, 'Conf', ToolDefinitionFile
))
2662 if os
.path
.isfile(ToolDefinitionFile
) == True:
2663 ToolDef
= ToolDefClassObject()
2664 ToolDef
.LoadToolDefFile(ToolDefinitionFile
)
2665 ToolDefinition
= ToolDef
.ToolsDefTxtDatabase
2666 if TAB_TOD_DEFINES_FAMILY
not in ToolDefinition \
2667 or self
._Toolchain
not in ToolDefinition
[TAB_TOD_DEFINES_FAMILY
] \
2668 or not ToolDefinition
[TAB_TOD_DEFINES_FAMILY
][self
._Toolchain
]:
2669 self
._ToolChainFamily
= "MSFT"
2671 self
._ToolChainFamily
= ToolDefinition
[TAB_TOD_DEFINES_FAMILY
][self
._Toolchain
]
2672 return self
._ToolChainFamily
2674 ## Add external PCDs
2676 # The external PCDs are mostly those listed in FDF file to specify address
2677 # or offset information.
2679 # @param Name Name of the PCD
2680 # @param Guid Token space guid of the PCD
2681 # @param Value Value of the PCD
2683 def AddPcd(self
, Name
, Guid
, Value
):
2684 if (Name
, Guid
) not in self
.Pcds
:
2685 self
.Pcds
[Name
, Guid
] = PcdClassObject(Name
, Guid
, '', '', '', '', '', {}, False, None)
2686 self
.Pcds
[Name
, Guid
].DefaultValue
= Value
2689 if self
._DecPcds
== None:
2691 if GlobalData
.gFdfParser
:
2692 FdfInfList
= GlobalData
.gFdfParser
.Profile
.InfList
2694 for Inf
in FdfInfList
:
2695 ModuleFile
= PathClass(NormPath(Inf
), GlobalData
.gWorkspace
, Arch
=self
._Arch
)
2696 if ModuleFile
in self
._Modules
:
2698 ModuleData
= self
._Bdb
[ModuleFile
, self
._Arch
, self
._Target
, self
._Toolchain
]
2699 PkgSet
.update(ModuleData
.Packages
)
2700 self
._DecPcds
, self
._GuidDict
= GetDeclaredPcd(self
, self
._Bdb
, self
._Arch
, self
._Target
, self
._Toolchain
,PkgSet
)
2701 return self
._DecPcds
2702 _Macros
= property(_GetMacros
)
2703 Arch
= property(_GetArch
, _SetArch
)
2704 Platform
= property(_GetPlatformName
)
2705 PlatformName
= property(_GetPlatformName
)
2706 Guid
= property(_GetFileGuid
)
2707 Version
= property(_GetVersion
)
2708 DscSpecification
= property(_GetDscSpec
)
2709 OutputDirectory
= property(_GetOutpuDir
)
2710 SupArchList
= property(_GetSupArch
)
2711 BuildTargets
= property(_GetBuildTarget
)
2712 SkuName
= property(_GetSkuName
, _SetSkuName
)
2713 PcdInfoFlag
= property(_GetPcdInfoFlag
)
2714 VarCheckFlag
= property(_GetVarCheckFlag
)
2715 FlashDefinition
= property(_GetFdfFile
)
2716 Prebuild
= property(_GetPrebuild
)
2717 Postbuild
= property(_GetPostbuild
)
2718 BuildNumber
= property(_GetBuildNumber
)
2719 MakefileName
= property(_GetMakefileName
)
2720 BsBaseAddress
= property(_GetBsBaseAddress
)
2721 RtBaseAddress
= property(_GetRtBaseAddress
)
2722 LoadFixAddress
= property(_GetLoadFixAddress
)
2723 RFCLanguages
= property(_GetRFCLanguages
)
2724 ISOLanguages
= property(_GetISOLanguages
)
2725 VpdToolGuid
= property(_GetVpdToolGuid
)
2726 SkuIds
= property(_GetSkuIds
)
2727 Modules
= property(_GetModules
)
2728 LibraryInstances
= property(_GetLibraryInstances
)
2729 LibraryClasses
= property(_GetLibraryClasses
)
2730 Pcds
= property(_GetPcds
)
2731 BuildOptions
= property(_GetBuildOptions
)
2732 ToolChainFamily
= property(_GetToolChainFamily
)