Python script for generating build files for platform and modules, which uses the enhanced XmlRoutines.py written by Bruce.
The functionalities include: - parse all packages(.spd) and modules(.msa) - parse active platform(.fpd). You must set active platform in target.txt otherwise nothing will be parsed. - parse tools_def.txt and target.txt - generate Ant build files for active platform and its modules. The generated build file is re-designed and can be called separately once generated. - multi-thread build The functionalities which haven't been implemented include: - AutoGen. No AutoGen.h and AutoGen.c will be generated. If you want run the build file, you have to run the "build" command in advance to generate the AutoGen.h/.c files and remove the any other intermediate files. - generate FFS and FV files. Only compiling will be done by the generated build file. Usage: - type "python ${WORKSPACE}/Tools/Python/buildgen/BuildFile.py" in shell to generate build file - goto "${WORKSPACE}/Build/${platform}/${target}_${toolchaintag}/", type "ant" to run the build file git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2278 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
523
Tools/Python/buildgen/FrameworkElement.py
Normal file
523
Tools/Python/buildgen/FrameworkElement.py
Normal file
@ -0,0 +1,523 @@
|
||||
#!/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
|
Reference in New Issue
Block a user