1.BaseTool add ATTRIBUTE (+/-RT, RO) support in PCD declaration in DSC file 2.BaseTool collect valid PCD value in DEC file and generate data base for runtime sanity check 3.BaseTool support SetPcd error. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: "Bob Feng" <bob.c.feng@intel.com> Reviewed-by: "Chen, Hesheng" <hesheng.chen@intel.com> Reviewed-by: "Liu, Yingke D" <yingke.d.liu@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17158 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			372 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			372 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| ## @file
 | |
| # This file is used to define each component of the build database
 | |
| #
 | |
| # Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.<BR>
 | |
| # This program and the accompanying materials
 | |
| # are licensed and made available under the terms and conditions of the BSD License
 | |
| # which accompanies this distribution.  The full text of the license may be found at
 | |
| # http://opensource.org/licenses/bsd-license.php
 | |
| #
 | |
| # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
 | |
| # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 | |
| #
 | |
| 
 | |
| import Common.LongFilePathOs as os
 | |
| 
 | |
| from Common.Misc import sdict
 | |
| from Common.Misc import RealPath2
 | |
| from Common.BuildToolError import *
 | |
| 
 | |
| ## PcdClassObject
 | |
| #
 | |
| # This Class is used for PcdObject
 | |
| #
 | |
| # @param object:             Inherited from object class
 | |
| # @param Name:               Input value for Name of Pcd, default is None
 | |
| # @param Guid:               Input value for Guid of Pcd, default is None
 | |
| # @param Type:               Input value for Type of Pcd, default is None
 | |
| # @param DatumType:          Input value for DatumType of Pcd, default is None
 | |
| # @param Value:              Input value for Value of Pcd, default is None
 | |
| # @param Token:              Input value for Token of Pcd, default is None
 | |
| # @param MaxDatumSize:       Input value for MaxDatumSize of Pcd, default is None
 | |
| # @param SkuInfoList:        Input value for SkuInfoList of Pcd, default is {}
 | |
| # @param IsOverrided:        Input value for IsOverrided of Pcd, default is False
 | |
| # @param GuidValue:          Input value for TokenSpaceGuidValue of Pcd, default is None
 | |
| #
 | |
| # @var TokenCName:           To store value for TokenCName
 | |
| # @var TokenSpaceGuidCName:  To store value for TokenSpaceGuidCName
 | |
| # @var Type:                 To store value for Type
 | |
| # @var DatumType:            To store value for DatumType
 | |
| # @var TokenValue:           To store value for TokenValue
 | |
| # @var MaxDatumSize:         To store value for MaxDatumSize
 | |
| # @var SkuInfoList:          To store value for SkuInfoList
 | |
| # @var IsOverrided:          To store value for IsOverrided
 | |
| # @var Phase:                To store value for Phase, default is "DXE"
 | |
| #
 | |
| class PcdClassObject(object):
 | |
|     def __init__(self, Name = None, Guid = None, Type = None, DatumType = None, Value = None, Token = None, MaxDatumSize = None, SkuInfoList = {}, IsOverrided = False, GuidValue = None, validateranges = [], validlists = [], expressions = []):
 | |
|         self.TokenCName = Name
 | |
|         self.TokenSpaceGuidCName = Guid
 | |
|         self.TokenSpaceGuidValue = GuidValue
 | |
|         self.Type = Type
 | |
|         self.DatumType = DatumType
 | |
|         self.DefaultValue = Value
 | |
|         self.TokenValue = Token
 | |
|         self.MaxDatumSize = MaxDatumSize
 | |
|         self.SkuInfoList = SkuInfoList
 | |
|         self.Phase = "DXE"
 | |
|         self.Pending = False
 | |
|         self.IsOverrided = IsOverrided
 | |
|         self.IsFromBinaryInf = False
 | |
|         self.IsFromDsc = False
 | |
|         self.validateranges = validateranges
 | |
|         self.validlists = validlists
 | |
|         self.expressions = expressions
 | |
|         
 | |
|     ## Convert the class to a string
 | |
|     #
 | |
|     #  Convert each member of the class to string
 | |
|     #  Organize to a signle line format string
 | |
|     #
 | |
|     #  @retval Rtn Formatted String
 | |
|     #
 | |
|     def __str__(self):
 | |
|         Rtn = '\tTokenCName=' + str(self.TokenCName) + ', ' + \
 | |
|               'TokenSpaceGuidCName=' + str(self.TokenSpaceGuidCName) + ', ' + \
 | |
|               'Type=' + str(self.Type) + ', ' + \
 | |
|               'DatumType=' + str(self.DatumType) + ', ' + \
 | |
|               'DefaultValue=' + str(self.DefaultValue) + ', ' + \
 | |
|               'TokenValue=' + str(self.TokenValue) + ', ' + \
 | |
|               'MaxDatumSize=' + str(self.MaxDatumSize) + ', '
 | |
|         for Item in self.SkuInfoList.values():
 | |
|             Rtn = Rtn + 'SkuId=' + Item.SkuId + ', ' + 'SkuIdName=' + Item.SkuIdName
 | |
|         Rtn = Rtn + ', IsOverrided=' + str(self.IsOverrided)
 | |
| 
 | |
|         return Rtn
 | |
| 
 | |
|     ## Override __eq__ function
 | |
|     #
 | |
|     # Check whether pcds are the same
 | |
|     #
 | |
|     # @retval False The two pcds are different
 | |
|     # @retval True  The two pcds are the same
 | |
|     #
 | |
|     def __eq__(self, Other):
 | |
|         return Other and self.TokenCName == Other.TokenCName and self.TokenSpaceGuidCName == Other.TokenSpaceGuidCName
 | |
| 
 | |
|     ## Override __hash__ function
 | |
|     #
 | |
|     # Use (TokenCName, TokenSpaceGuidCName) as key in hash table
 | |
|     #
 | |
|     # @retval truple() Key for hash table
 | |
|     #
 | |
|     def __hash__(self):
 | |
|         return hash((self.TokenCName, self.TokenSpaceGuidCName))
 | |
| 
 | |
| ## LibraryClassObject
 | |
| #
 | |
| # This Class defines LibraryClassObject used in BuildDatabase
 | |
| #
 | |
| # @param object:      Inherited from object class
 | |
| # @param Name:        Input value for LibraryClassName, default is None
 | |
| # @param SupModList:  Input value for SupModList, default is []
 | |
| # @param Type:        Input value for Type, default is None
 | |
| #
 | |
| # @var LibraryClass:  To store value for LibraryClass
 | |
| # @var SupModList:    To store value for SupModList
 | |
| # @var Type:          To store value for Type
 | |
| #
 | |
| class LibraryClassObject(object):
 | |
|     def __init__(self, Name = None, SupModList = [], Type = None):
 | |
|         self.LibraryClass = Name
 | |
|         self.SupModList = SupModList
 | |
|         if Type != None:
 | |
|             self.SupModList = CleanString(Type).split(DataType.TAB_SPACE_SPLIT)
 | |
| 
 | |
| ## ModuleBuildClassObject
 | |
| #
 | |
| # This Class defines ModuleBuildClass
 | |
| #
 | |
| # @param object:               Inherited from object class
 | |
| #
 | |
| # @var MetaFile:              To store value for module meta file path
 | |
| # @var BaseName:               To store value for BaseName
 | |
| # @var ModuleType:             To store value for ModuleType
 | |
| # @var Guid:                   To store value for Guid
 | |
| # @var Version:                To store value for Version
 | |
| # @var PcdIsDriver:            To store value for PcdIsDriver
 | |
| # @var BinaryModule:           To store value for BinaryModule
 | |
| # @var CustomMakefile:         To store value for CustomMakefile
 | |
| # @var Specification:          To store value for Specification
 | |
| # @var Shadow                  To store value for Shadow
 | |
| # @var LibraryClass:           To store value for LibraryClass, it is a list structure as
 | |
| #                              [ LibraryClassObject, ...]
 | |
| # @var ModuleEntryPointList:   To store value for ModuleEntryPointList
 | |
| # @var ModuleUnloadImageList:  To store value for ModuleUnloadImageList
 | |
| # @var ConstructorList:        To store value for ConstructorList
 | |
| # @var DestructorList:         To store value for DestructorList
 | |
| # @var Binaries:               To store value for Binaries, it is a list structure as
 | |
| #                              [ ModuleBinaryClassObject, ...]
 | |
| # @var Sources:                To store value for Sources, it is a list structure as
 | |
| #                              [ ModuleSourceFilesClassObject, ... ]
 | |
| # @var LibraryClasses:         To store value for LibraryClasses, it is a set structure as
 | |
| #                              { [LibraryClassName, ModuleType] : LibraryClassInfFile }
 | |
| # @var Protocols:              To store value for Protocols, it is a list structure as
 | |
| #                              [ ProtocolName, ... ]
 | |
| # @var Ppis:                   To store value for Ppis, it is a list structure as
 | |
| #                              [ PpiName, ... ]
 | |
| # @var Guids:                  To store value for Guids, it is a list structure as
 | |
| #                              [ GuidName, ... ]
 | |
| # @var Includes:               To store value for Includes, it is a list structure as
 | |
| #                              [ IncludePath, ... ]
 | |
| # @var Packages:               To store value for Packages, it is a list structure as
 | |
| #                              [ DecFileName, ... ]
 | |
| # @var Pcds:                   To store value for Pcds, it is a set structure as
 | |
| #                              { [(PcdCName, PcdGuidCName)] : PcdClassObject}
 | |
| # @var BuildOptions:           To store value for BuildOptions, it is a set structure as
 | |
| #                              { [BuildOptionKey] : BuildOptionValue}
 | |
| # @var Depex:                  To store value for Depex
 | |
| #
 | |
| class ModuleBuildClassObject(object):
 | |
|     def __init__(self):
 | |
|         self.AutoGenVersion          = 0
 | |
|         self.MetaFile                = ''
 | |
|         self.BaseName                = ''
 | |
|         self.ModuleType              = ''
 | |
|         self.Guid                    = ''
 | |
|         self.Version                 = ''
 | |
|         self.PcdIsDriver             = ''
 | |
|         self.BinaryModule            = ''
 | |
|         self.Shadow                  = ''
 | |
|         self.SourceOverridePath      = ''
 | |
|         self.CustomMakefile          = {}
 | |
|         self.Specification           = {}
 | |
|         self.LibraryClass            = []
 | |
|         self.ModuleEntryPointList    = []
 | |
|         self.ModuleUnloadImageList   = []
 | |
|         self.ConstructorList         = []
 | |
|         self.DestructorList          = []
 | |
| 
 | |
|         self.Binaries                = []
 | |
|         self.Sources                 = []
 | |
|         self.LibraryClasses          = sdict()
 | |
|         self.Libraries               = []
 | |
|         self.Protocols               = []
 | |
|         self.Ppis                    = []
 | |
|         self.Guids                   = []
 | |
|         self.Includes                = []
 | |
|         self.Packages                = []
 | |
|         self.Pcds                    = {}
 | |
|         self.BuildOptions            = {}
 | |
|         self.Depex                   = {}
 | |
| 
 | |
|     ## Convert the class to a string
 | |
|     #
 | |
|     #  Convert member MetaFile of the class to a string
 | |
|     #
 | |
|     #  @retval string Formatted String
 | |
|     #
 | |
|     def __str__(self):
 | |
|         return str(self.MetaFile)
 | |
| 
 | |
|     ## Override __eq__ function
 | |
|     #
 | |
|     # Check whether ModuleBuildClassObjects are the same
 | |
|     #
 | |
|     # @retval False The two ModuleBuildClassObjects are different
 | |
|     # @retval True  The two ModuleBuildClassObjects are the same
 | |
|     #
 | |
|     def __eq__(self, Other):
 | |
|         return self.MetaFile == Other
 | |
| 
 | |
|     ## Override __hash__ function
 | |
|     #
 | |
|     # Use MetaFile as key in hash table
 | |
|     #
 | |
|     # @retval string Key for hash table
 | |
|     #
 | |
|     def __hash__(self):
 | |
|         return hash(self.MetaFile)
 | |
| 
 | |
| ## PackageBuildClassObject
 | |
| #
 | |
| # This Class defines PackageBuildClass
 | |
| #
 | |
| # @param object:        Inherited from object class
 | |
| #
 | |
| # @var MetaFile:       To store value for package meta file path
 | |
| # @var PackageName:     To store value for PackageName
 | |
| # @var Guid:            To store value for Guid
 | |
| # @var Version:         To store value for Version
 | |
| # @var Protocols:       To store value for Protocols, it is a set structure as
 | |
| #                       { [ProtocolName] : Protocol Guid, ... }
 | |
| # @var Ppis:            To store value for Ppis, it is a set structure as
 | |
| #                       { [PpiName] : Ppi Guid, ... }
 | |
| # @var Guids:           To store value for Guids, it is a set structure as
 | |
| #                       { [GuidName] : Guid, ... }
 | |
| # @var Includes:        To store value for Includes, it is a list structure as
 | |
| #                       [ IncludePath, ... ]
 | |
| # @var LibraryClasses:  To store value for LibraryClasses, it is a set structure as
 | |
| #                       { [LibraryClassName] : LibraryClassInfFile }
 | |
| # @var Pcds:            To store value for Pcds, it is a set structure as
 | |
| #                       { [(PcdCName, PcdGuidCName)] : PcdClassObject}
 | |
| #
 | |
| class PackageBuildClassObject(object):
 | |
|     def __init__(self):
 | |
|         self.MetaFile                = ''
 | |
|         self.PackageName             = ''
 | |
|         self.Guid                    = ''
 | |
|         self.Version                 = ''
 | |
| 
 | |
|         self.Protocols               = {}
 | |
|         self.Ppis                    = {}
 | |
|         self.Guids                   = {}
 | |
|         self.Includes                = []
 | |
|         self.LibraryClasses          = {}
 | |
|         self.Pcds                    = {}
 | |
| 
 | |
|     ## Convert the class to a string
 | |
|     #
 | |
|     #  Convert member MetaFile of the class to a string
 | |
|     #
 | |
|     #  @retval string Formatted String
 | |
|     #
 | |
|     def __str__(self):
 | |
|         return str(self.MetaFile)
 | |
| 
 | |
|     ## Override __eq__ function
 | |
|     #
 | |
|     # Check whether PackageBuildClassObjects are the same
 | |
|     #
 | |
|     # @retval False The two PackageBuildClassObjects are different
 | |
|     # @retval True  The two PackageBuildClassObjects are the same
 | |
|     #
 | |
|     def __eq__(self, Other):
 | |
|         return self.MetaFile == Other
 | |
| 
 | |
|     ## Override __hash__ function
 | |
|     #
 | |
|     # Use MetaFile as key in hash table
 | |
|     #
 | |
|     # @retval string Key for hash table
 | |
|     #
 | |
|     def __hash__(self):
 | |
|         return hash(self.MetaFile)
 | |
| 
 | |
| ## PlatformBuildClassObject
 | |
| #
 | |
| # This Class defines PlatformBuildClass
 | |
| #
 | |
| # @param object:          Inherited from object class
 | |
| #
 | |
| # @var MetaFile:         To store value for platform meta-file path
 | |
| # @var PlatformName:      To store value for PlatformName
 | |
| # @var Guid:              To store value for Guid
 | |
| # @var Version:           To store value for Version
 | |
| # @var DscSpecification:  To store value for DscSpecification
 | |
| # @var OutputDirectory:   To store value for OutputDirectory
 | |
| # @var FlashDefinition:   To store value for FlashDefinition
 | |
| # @var BuildNumber:       To store value for BuildNumber
 | |
| # @var MakefileName:      To store value for MakefileName
 | |
| # @var SkuIds:            To store value for SkuIds, it is a set structure as
 | |
| #                         { 'SkuName' : SkuId, '!include' : includefilename, ...}
 | |
| # @var Modules:           To store value for Modules, it is a list structure as
 | |
| #                         [ InfFileName, ... ]
 | |
| # @var Libraries:         To store value for Libraries, it is a list structure as
 | |
| #                         [ InfFileName, ... ]
 | |
| # @var LibraryClasses:    To store value for LibraryClasses, it is a set structure as
 | |
| #                         { (LibraryClassName, ModuleType) : LibraryClassInfFile }
 | |
| # @var Pcds:              To store value for Pcds, it is a set structure as
 | |
| #                         { [(PcdCName, PcdGuidCName)] : PcdClassObject }
 | |
| # @var BuildOptions:      To store value for BuildOptions, it is a set structure as
 | |
| #                         { [BuildOptionKey] : BuildOptionValue }
 | |
| #
 | |
| class PlatformBuildClassObject(object):
 | |
|     def __init__(self):
 | |
|         self.MetaFile                = ''
 | |
|         self.PlatformName            = ''
 | |
|         self.Guid                    = ''
 | |
|         self.Version                 = ''
 | |
|         self.DscSpecification        = ''
 | |
|         self.OutputDirectory         = ''
 | |
|         self.FlashDefinition         = ''
 | |
|         self.BuildNumber             = ''
 | |
|         self.MakefileName            = ''
 | |
| 
 | |
|         self.SkuIds                  = {}
 | |
|         self.Modules                 = []
 | |
|         self.LibraryInstances        = []
 | |
|         self.LibraryClasses          = {}
 | |
|         self.Libraries               = {}
 | |
|         self.Pcds                    = {}
 | |
|         self.BuildOptions            = {}
 | |
| 
 | |
|     ## Convert the class to a string
 | |
|     #
 | |
|     #  Convert member MetaFile of the class to a string
 | |
|     #
 | |
|     #  @retval string Formatted String
 | |
|     #
 | |
|     def __str__(self):
 | |
|         return str(self.MetaFile)
 | |
| 
 | |
|     ## Override __eq__ function
 | |
|     #
 | |
|     # Check whether PlatformBuildClassObjects are the same
 | |
|     #
 | |
|     # @retval False The two PlatformBuildClassObjects are different
 | |
|     # @retval True  The two PlatformBuildClassObjects are the same
 | |
|     #
 | |
|     def __eq__(self, Other):
 | |
|         return self.MetaFile == Other
 | |
| 
 | |
|     ## Override __hash__ function
 | |
|     #
 | |
|     # Use MetaFile as key in hash table
 | |
|     #
 | |
|     # @retval string Key for hash table
 | |
|     #
 | |
|     def __hash__(self):
 | |
|         return hash(self.MetaFile)
 | |
| 
 |