#!/usr/bin/env python # Copyright (c) 2007, Intel Corporation # All rights reserved. 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. """Framework Element Classes TODO """ ################################################################################ ## ## Element class: base class for representing framework elements ## ################################################################################ class Element: def __init__(self, **kwargs): """(Name, GuidValue, Version, Path, Dir, Archs, Usage, Features, Signature)""" ## The path and directory where the information of the element comes from self.Path = "." self.Dir = "." ## Element name, guid and version self.Name = "" self.GuidValue = "" self.Version = "" ## The element supported architecture self.Archs = [] ## Indiciate how the element is used self.Usage = "ALWAYS_CONSUMED" ## Indicate what kind of features this element is bound self.Features = [] ## Element signature, used to check the its integerity self.Signature = 0 def __str__(self): return self.Name + "-" + self.Version + " " + " [" + self.GuidValue + "]" def __eq__(self, other): if not isinstance(other, Element): return False if self.GuidValue != other.GuidValue: return False if self.Version != other.Version: return False return True def __hash__(self): return hash(self.GuidValue + self.Version) ################################################################################ ## ## ToolOption: build tool option ## ################################################################################ class ToolOption(Element): def __init__(self, **kwargs): """Prefix, Value, Tool, Toolchains, Families, Targets""" Element.__init__(self) self.Prefix = "/" self.Value = "" self.Tool = "" self.Toolchains = "" self.Families = "MSFT" self.Targets = "DEBUG" ################################################################################ ## ## BuildTool: build tool ## ################################################################################ class BuildTool(Element): def __init__(self, **kwargs): """Options, Toolchains, Families, Targets""" Element.__init__(self) self.Options = [] self.Toolchains = [] self.Families = [] self.Targets = [] ################################################################################ ## ## SourceFile: files in a module for build ## ################################################################################ class SourceFile(Element): def __init__(self, **kwargs): """BaseName, Ext, Type, Toolchains, Families, Targets""" Element.__init__(self) self.BaseName = "" self.Ext = "" self.Type = "" self.Toolchains = [] self.Families = [] self.Targets = [] ################################################################################ ## ## IncludeFile: header file ## ################################################################################ class IncludeFile(SourceFile): def __init__(self, **kwargs): """Type, Package, ModuleType""" SourceFile.__init__(self) self.Type = "HeaderFile" self.Package = "" self.ModuleType = "" ################################################################################ ## ## IncludePath: ## ################################################################################ class IncludePath(IncludeFile): pass ################################################################################ ## ## LibraryInterface: library class interface ## ################################################################################ class LibraryInterface(Element): def __init__(self, **kwargs): """Package, FavoriteInstance, Instances, ModuleTypes, Consumers""" Element.__init__(self) self.Package = "" self.FavoriteInstance = "" self.Instances = [] self.ModuleTypes = [] self.Consumers = [] def __eq__(self, other): if not isinstance(other, LibraryInterface): return False return self.Name == other.Name def __hash__(self): return hash(self.Name) ################################################################################ ## ## LibraryClass: library class ## ################################################################################ class LibraryClass(Element): def __init__(self, **kwargs): """ () """ Element.__init__(self) self.Interface = "" self.FavoriteInstance = "" def __eq__(self, other): if not isinstance(other, LibraryClass): return False return self.Name == other.Name def __hash__(self): return hash(self.Name) ################################################################################ ## ## Guid: ## ################################################################################ class Guid(Element): def __init__(self, **kwargs): """CName, Types, ModuleTypes""" Element.__init__(self) self.CName = "" self.Types = [] self.ModuleTypes= [] ################################################################################ ## ## Protocol: ## ################################################################################ class Protocol(Guid): pass ################################################################################ ## ## ProtocolNotify: ## ################################################################################ class ProtocolNotify(Protocol): pass ################################################################################ ## ## Ppi: ## ################################################################################ class Ppi(Guid): pass ################################################################################ ## ## PpiNotify: ## ################################################################################ class PpiNotify(Ppi): pass ################################################################################ ## ## Extern: ## ################################################################################ class Extern(Element): def __init__(self, **kwargs): """Specifications, ModuleEntryPoints, ModuleUnloadImages, Constructors, Destructors, DriverBindings, ComponentNames, DriverConfigs, DriverDiags, SetVirtualAddressMapCallBacks, ExitBootServicesCallBacks""" Element.__init__(self) self.Specifications = [] self.ModuleEntryPoints = [] self.ModuleUnloadImages = [] self.Constructors = [] self.Destructors = [] self.DriverBindings = [] self.ComponentNames = [] self.DriverConfigs = [] self.DriverDiags = [] self.SetVirtualAddressMapCallBacks = [] self.ExitBootServicesCallBacks = [] ################################################################################ ## ## Sku: ## ################################################################################ class Sku(Element): def __init__(self, **kwargs): """Id, Value""" Element.__init__(self) self.Id = 0 self.Value = "" ################################################################################ ## ## Pcd: ## ################################################################################ class Pcd(Element): def __init__(self, **kwargs): """Types, CName, Value, Token, TokenSpace, DatumType, Sku, ModuleTypes""" Element.__init__(self) self.Types = [] self.CName = "" self.Value = "" self.Token = "" self.TokenSpace = "" self.DatumType = "" self.Default = "" self.Sku = "" self.ModuleTypes= [] ################################################################################ ## ## Module: framework module ## ################################################################################ class Module(Element): def __init__(self, **kwargs): """Workspace, Package, Type, BaseName, FileBaseName, IsLibrary, PcdIsDriver, NeedsFlashMap_h, SourceFiles, IncludePaths, IncludeFiles, NonProcessedFiles, LibraryClasses, Guids, Protocols, Ppis, Externs, Pcds, UserExtensions, BuildOptions, Environment """ Element.__init__(self) self.Workspace = "" self.Package = "" self.Type = "" self.BaseName = "" self.FileBaseName = "" self.IsLibrary = False self.IsBinary = False self.PcdIsDriver = False self.NeedsFlashMap_h = False self.SourceFiles = {} # arch -> {file type -> [source file list]} self.IncludePaths = {} # arch -> [path list] self.IncludeFiles = {} self.NonProcessedFiles = [] self.LibraryClasses = {} # arch -> [library class list] self.Guids = {} # arch -> [guid object list] self.Protocols = {} # arch -> [] self.Ppis = {} # arch -> [] self.Externs = {} # arch -> [] self.Pcds = {} # arch -> [] self.UserExtensions = {} # identifier -> ... self.BuildOptions = {} # (toolchain, target, arch, toolcode, "FLAGS") -> flag self.Environment = {} def __eq__(self, other): if not isinstance(other, Module): return False if self.GuidValue != other.GuidValue: return False if self.Version != other.Version: return False if self.Package != other.Package: return False return True def __hash__(self): return hash(self.GuidValue + self.Version + hash(self.Package)) ################################################################################ ## ## PlatformModule: module for build ## ################################################################################ class PlatformModule(Element): def __init__(self, **kwargs): """Workspace, Platform, Module, Libraries, Pcds, FfsLayouts, FvBindings BuildOptions, BuildType, BuildFile, BuildPath, Sections, FfsFile, Environment """ Element.__init__(self) self.Workspace = "" self.Platform = "" self.Module = "" self.Libraries = [] self.Pcds = [] self.FfsLayouts = [] self.FvBindings = [] self.BuildOptions = {} self.BuildType = "efi" ## efi or lib self.BuildFile = "build.xml" self.BuildPath = "${MODULE_BUILD_DIR}" self.Sections = [] self.FfsFile = "" self.Environment = {} # name/value pairs def __eq__(self, other): if not isinstance(other, PlatformModule): if not isinstance(other, Module): return False elif self.Module != other: return False elif self.Module != other.Module: return False return True def __hash__(self): return hash(self.Module) ################################################################################ ## ## Package: framework package ## ################################################################################ class Package(Element): def __init__(self, **kwargs): """Workspace, ReadOnly, Repackage, Modules, PackageIncludes, StandardIncludes, LibraryInterfaces, Guids, Protocols, Ppis, Pcds, Environment """ Element.__init__(self) self.Workspace = "" self.ReadOnly = True self.Repackage = True self.Modules = [] self.PackageIncludes = {} # module type -> [include file list] self.StandardIncludes = [] self.LibraryInterfaces = {} # class name -> include file self.Guids = {} # cname -> guid object self.Protocols = {} # cname -> protocol object self.Ppis = {} # cname -> ppi object self.Pcds = {} # token -> pcd object self.Environment = {} ################################################################################ ## ## PackageDependency: ## ################################################################################ class PackageDependency(Element): def __init__(self, **kwargs): """Package""" Element.__init__(self) self.Package = "" ################################################################################ ## ## Platform: ## ################################################################################ class Platform(Element): def __init__(self, **kwargs): """Targets, OutputPath, Images, Modules, DynamicPcds, Fvs, Libraries BuildFile, BuildPath, BuildOptions, UserExtensions """ Element.__init__(self) self.Targets = [] self.OutputPath = "" self.Images = [] self.Modules = {} # arch -> [module list] self.DynamicPcds = [] self.FfsLayouts = {} self.Fvs = {} self.Libraries = {} # arch -> [library instance] self.BuildFile = "build.xml" self.BuildPath = "${PLATFORM_BUILD_DIR}" self.BuildOptions = {} self.UserExtensions = {} self.Environment = {} # name/value pairs ################################################################################ ## ## Workspace: ## ################################################################################ class Workspace(Element): def __init__(self, **kwargs): """Packages, Platforms, Fars, Modules, PlatformIndex, PackageIndex""" Element.__init__(self) self.Packages = [] self.Platforms = [] self.Fars = [] self.Modules = [] ## "GUID" : {guid : {version : platform}} ## "PATH" : {path : platform} ## "NAME" : {name : [platform]} self.PlatformXref = { "GUID" : {}, "PATH" : {}, "NAME" : {}, } ## "GUID" : {guid : {version : package}} ## "PATH" : {path : package} ## "NAME" : {name : package} self.PackageXref = { "GUID" : {}, "PATH" : {}, "NAME" : {}, } ## "GUID" : {guid : {version : [module]}} ## "PATH" : {path : module} ## "NAME" : {name : module} self.ModuleXref = { "GUID" : {}, "PATH" : {}, "NAME" : {}, } ## "NAME" : {name : [library interface]} ## "PATH" : {path : library interface} self.LibraryInterfaceXref = { "PATH" : {}, "NAME" : {}, } ## TODO self.FarIndex = {} # from target.txt self.TargetConfig = {} # from tools_def.txt self.ToolConfig = {} self.ActivePlatform = "" self.ActiveToolchain = "" self.ActiveFamilies = [] self.ActiveModules = [] self.ActiveTargets = [] self.ActiveArchs = [] self.IndividualModuleBuild = False self.MultiThreadBuild = False self.ThreadCount = "2" self.Environment = {} ################################################################################ ## ## For test: ## ################################################################################ if __name__ == "__main__": pass