mirror of https://github.com/acidanthera/audk.git
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
|