- Prefix the tool path to its name in ARCH_build.opt - Support the same library class in different package git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2325 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			524 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			524 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| #!/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
 |