]> git.proxmox.com Git - mirror_edk2.git/blobdiff - Tools/Python/buildgen/FrameworkElement.py
Python script for generating build files for platform and modules, which uses the...
[mirror_edk2.git] / Tools / Python / buildgen / FrameworkElement.py
diff --git a/Tools/Python/buildgen/FrameworkElement.py b/Tools/Python/buildgen/FrameworkElement.py
new file mode 100644 (file)
index 0000000..6fd8740
--- /dev/null
@@ -0,0 +1,523 @@
+#!/usr/bin/env python\r
+\r
+# Copyright (c) 2007, Intel Corporation\r
+# All rights reserved. This program and the accompanying materials\r
+# are licensed and made available under the terms and conditions of the BSD License\r
+# which accompanies this distribution.  The full text of the license may be found at\r
+# http://opensource.org/licenses/bsd-license.php\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+"""Framework Element Classes\r
+\r
+TODO\r
+"""\r
+\r
+################################################################################\r
+##\r
+## Element class: base class for representing framework elements\r
+##\r
+################################################################################\r
+class Element:\r
+    def __init__(self, **kwargs):\r
+        """(Name, GuidValue, Version, Path, Dir, Archs, Usage, Features, Signature)"""\r
+        ## The path and directory where the information of the element comes from\r
+        self.Path       = "."\r
+        self.Dir        = "."\r
+\r
+        ## Element name, guid and version\r
+        self.Name       = ""\r
+        self.GuidValue  = ""\r
+        self.Version    = ""\r
+\r
+        ## The element supported architecture\r
+        self.Archs      = []\r
+        \r
+        ## Indiciate how the element is used\r
+        self.Usage      = "ALWAYS_CONSUMED"\r
+        \r
+        ## Indicate what kind of features this element is bound\r
+        self.Features   = []\r
+        \r
+        ## Element signature, used to check the its integerity\r
+        self.Signature  = 0\r
+\r
+    def __str__(self):\r
+        return self.Name + "-" + self.Version + " " + " [" + self.GuidValue + "]"\r
+\r
+    def __eq__(self, other):\r
+        if not isinstance(other, Element):\r
+            return False\r
+        \r
+        if self.GuidValue != other.GuidValue:\r
+            return False\r
+\r
+        if self.Version != other.Version:\r
+            return False\r
+\r
+        return True\r
+\r
+    def __hash__(self):\r
+        return hash(self.GuidValue + self.Version)\r
+\r
+################################################################################\r
+##\r
+## ToolOption: build tool option\r
+## \r
+################################################################################\r
+class ToolOption(Element):\r
+    \r
+    def __init__(self, **kwargs):\r
+        """Prefix, Value, Tool, Toolchains, Families, Targets"""\r
+        Element.__init__(self)\r
+\r
+        self.Prefix     = "/"\r
+        self.Value      = ""\r
+        self.Tool       = ""\r
+        self.Toolchains = ""\r
+        self.Families   = "MSFT"\r
+        self.Targets    = "DEBUG"\r
+\r
+################################################################################\r
+##\r
+## BuildTool: build tool\r
+## \r
+################################################################################\r
+class BuildTool(Element):\r
+    def __init__(self, **kwargs):\r
+        """Options, Toolchains, Families, Targets"""\r
+        Element.__init__(self)\r
+\r
+        self.Options    = []\r
+        self.Toolchains = []\r
+        self.Families   = []\r
+        self.Targets    = []\r
+\r
+################################################################################\r
+##\r
+## SourceFile: files in a module for build\r
+## \r
+################################################################################\r
+class SourceFile(Element):\r
+    def __init__(self, **kwargs):\r
+        """BaseName, Ext, Type, Toolchains, Families, Targets"""\r
+        Element.__init__(self)\r
+\r
+        self.BaseName   = ""\r
+        self.Ext        = ""\r
+        self.Type       = ""\r
+        self.Toolchains = []\r
+        self.Families   = []\r
+        self.Targets    = []\r
+\r
+################################################################################\r
+## \r
+## IncludeFile: header file\r
+## \r
+################################################################################\r
+class IncludeFile(SourceFile):\r
+    def __init__(self, **kwargs):\r
+        """Type, Package, ModuleType"""\r
+        SourceFile.__init__(self)\r
+\r
+        self.Type       = "HeaderFile"\r
+        self.Package    = ""\r
+        self.ModuleType = ""\r
+\r
+################################################################################\r
+## \r
+## IncludePath:\r
+## \r
+################################################################################\r
+class IncludePath(IncludeFile):\r
+    pass\r
+\r
+################################################################################\r
+##\r
+## LibraryInterface: library class interface\r
+## \r
+################################################################################\r
+class LibraryInterface(Element):\r
+    def __init__(self, **kwargs):\r
+        """Package, FavoriteInstance, Instances, ModuleTypes, Consumers"""\r
+        Element.__init__(self)\r
+\r
+        self.Package            = ""\r
+        self.FavoriteInstance   = ""\r
+        self.Instances          = []\r
+        self.ModuleTypes        = []\r
+        self.Consumers          = []\r
+\r
+    def __eq__(self, other):\r
+        if not isinstance(other, LibraryInterface):\r
+            return False\r
+        return self.Name == other.Name\r
+               \r
+    def __hash__(self):\r
+        return hash(self.Name)\r
+    \r
+################################################################################\r
+##\r
+## LibraryClass: library class\r
+##\r
+################################################################################\r
+class LibraryClass(Element):\r
+    def __init__(self, **kwargs):\r
+        """\r
+        ()\r
+        """\r
+        Element.__init__(self)\r
+\r
+        self.Interface          = ""\r
+        self.FavoriteInstance   = ""\r
+\r
+    def __eq__(self, other):\r
+        if not isinstance(other, LibraryClass):\r
+            return False\r
+        return self.Name == other.Name\r
+\r
+    def __hash__(self):\r
+        return hash(self.Name)\r
+\r
+################################################################################\r
+##\r
+##  Guid:\r
+## \r
+################################################################################\r
+class Guid(Element):\r
+    def __init__(self, **kwargs):\r
+        """CName, Types, ModuleTypes"""\r
+        Element.__init__(self)\r
+\r
+        self.CName      = ""\r
+        self.Types      = []\r
+        self.ModuleTypes= []\r
+\r
+################################################################################\r
+##\r
+##  Protocol:\r
+## \r
+################################################################################\r
+class Protocol(Guid):\r
+    pass\r
+\r
+################################################################################\r
+##\r
+##  ProtocolNotify:\r
+## \r
+################################################################################\r
+class ProtocolNotify(Protocol):\r
+    pass\r
+\r
+################################################################################\r
+##\r
+##  Ppi:\r
+## \r
+################################################################################\r
+class Ppi(Guid):\r
+    pass\r
+\r
+################################################################################\r
+##\r
+##  PpiNotify:\r
+## \r
+################################################################################\r
+class PpiNotify(Ppi):\r
+    pass\r
+\r
+################################################################################\r
+##\r
+##  Extern:\r
+## \r
+################################################################################\r
+class Extern(Element):\r
+    def __init__(self, **kwargs):\r
+        """Specifications, ModuleEntryPoints, ModuleUnloadImages, Constructors, Destructors, DriverBindings, ComponentNames, DriverConfigs, DriverDiags, SetVirtualAddressMapCallBacks, ExitBootServicesCallBacks"""\r
+        Element.__init__(self)\r
+\r
+        self.Specifications                 = []\r
+        self.ModuleEntryPoints              = []\r
+        self.ModuleUnloadImages             = []\r
+        self.Constructors                   = []\r
+        self.Destructors                    = []\r
+        self.DriverBindings                 = []\r
+        self.ComponentNames                 = []\r
+        self.DriverConfigs                  = []\r
+        self.DriverDiags                    = []\r
+        self.SetVirtualAddressMapCallBacks  = []\r
+        self.ExitBootServicesCallBacks      = []\r
+\r
+################################################################################\r
+##\r
+##  Sku:\r
+## \r
+################################################################################\r
+class Sku(Element):\r
+    def __init__(self, **kwargs):\r
+        """Id, Value"""\r
+        Element.__init__(self)\r
+\r
+        self.Id     = 0\r
+        self.Value  = ""\r
+\r
+################################################################################\r
+##\r
+##  Pcd:\r
+## \r
+################################################################################\r
+class Pcd(Element):\r
+    def __init__(self, **kwargs):\r
+        """Types, CName, Value, Token, TokenSpace, DatumType, Sku, ModuleTypes"""\r
+        Element.__init__(self)\r
+\r
+        self.Types      = []\r
+        self.CName      = ""\r
+        self.Value      = ""\r
+        self.Token      = ""\r
+        self.TokenSpace = ""\r
+        self.DatumType  = ""\r
+        self.Default    = ""\r
+        self.Sku        = ""\r
+        self.ModuleTypes= []\r
+\r
+################################################################################\r
+##\r
+## Module: framework module\r
+## \r
+################################################################################\r
+class Module(Element):\r
+    def __init__(self, **kwargs):\r
+        """Workspace, Package, Type, BaseName, FileBaseName, IsLibrary, PcdIsDriver,\r
+           NeedsFlashMap_h, SourceFiles, IncludePaths, IncludeFiles, NonProcessedFiles,\r
+           LibraryClasses, Guids, Protocols, Ppis, Externs, Pcds,\r
+           UserExtensions, BuildOptions, Environment\r
+        """\r
+        Element.__init__(self)\r
+\r
+        self.Workspace              = ""\r
+        self.Package                = ""\r
+        self.Type                   = ""\r
+        self.BaseName               = ""\r
+        self.FileBaseName           = ""\r
+        self.IsLibrary              = False\r
+        self.IsBinary               = False\r
+        self.PcdIsDriver            = False\r
+        self.NeedsFlashMap_h        = False\r
+        self.SourceFiles            = {}    # arch -> {file type -> [source file list]}\r
+        self.IncludePaths           = {}    # arch -> [path list]\r
+        self.IncludeFiles           = {}\r
+        \r
+        self.NonProcessedFiles      = []\r
+        self.LibraryClasses         = {}    # arch -> [library class list]\r
+        \r
+        self.Guids                  = {}    # arch -> [guid object list]\r
+        self.Protocols              = {}    # arch -> []\r
+        self.Ppis                   = {}    # arch -> []\r
+        \r
+        self.Externs                = {}    # arch -> []\r
+        self.Pcds                   = {}    # arch -> []\r
+        \r
+        self.UserExtensions = {}    # identifier -> ...\r
+        self.BuildOptions   = {}    # (toolchain, target, arch, toolcode, "FLAGS") -> flag\r
+        self.Environment    = {}\r
+        \r
+    def __eq__(self, other):\r
+        if not isinstance(other, Module):\r
+            return False\r
+\r
+        if self.GuidValue != other.GuidValue:\r
+            return False\r
+\r
+        if self.Version != other.Version:\r
+            return False\r
+\r
+        if self.Package != other.Package:\r
+            return False\r
+        \r
+        return True\r
+\r
+    def __hash__(self):\r
+        return hash(self.GuidValue + self.Version + hash(self.Package))\r
+\r
+################################################################################\r
+##\r
+##  PlatformModule: module for build\r
+##\r
+################################################################################\r
+class PlatformModule(Element):\r
+    def __init__(self, **kwargs):\r
+        """Workspace, Platform, Module, Libraries, Pcds, FfsLayouts, FvBindings\r
+           BuildOptions, BuildType, BuildFile, BuildPath, Sections, FfsFile, Environment\r
+        """\r
+        Element.__init__(self)\r
+        self.Workspace      = ""\r
+        self.Platform       = ""\r
+        self.Module         = ""\r
+        self.Libraries      = []\r
+        self.Pcds           = []\r
+        self.FfsLayouts     = []\r
+        self.FvBindings     = []\r
+        self.BuildOptions   = {}\r
+\r
+        self.BuildType      = "efi"    ## efi or lib\r
+        self.BuildFile      = "build.xml"\r
+        self.BuildPath      = "${MODULE_BUILD_DIR}"\r
+        self.Sections       = []\r
+        self.FfsFile        = ""\r
+        \r
+        self.Environment    = {}    # name/value pairs\r
+        \r
+    def __eq__(self, other):\r
+        if not isinstance(other, PlatformModule):\r
+            if not isinstance(other, Module):\r
+                return False\r
+            elif self.Module != other:\r
+                return False\r
+        elif self.Module != other.Module:\r
+            return False\r
+\r
+        return True\r
+\r
+    def __hash__(self):\r
+        return hash(self.Module)\r
+\r
+################################################################################\r
+##\r
+## Package: framework package\r
+##\r
+################################################################################\r
+class Package(Element):\r
+    def __init__(self, **kwargs):\r
+        """Workspace, ReadOnly, Repackage, Modules, PackageIncludes, StandardIncludes,\r
+           LibraryInterfaces, Guids, Protocols, Ppis, Pcds, Environment\r
+        """\r
+        Element.__init__(self)\r
+\r
+        self.Workspace          = ""\r
+        self.ReadOnly           = True\r
+        self.Repackage          = True\r
+        self.Modules            = []\r
+        self.PackageIncludes    = {}    # module type -> [include file list]\r
+        self.StandardIncludes   = []\r
+        self.LibraryInterfaces  = {}    # class name -> include file\r
+        self.Guids              = {}    # cname -> guid object\r
+        self.Protocols          = {}    # cname -> protocol object\r
+        self.Ppis               = {}    # cname -> ppi object\r
+        self.Pcds               = {}    # token -> pcd object\r
+\r
+        self.Environment        = {}\r
+\r
+################################################################################\r
+##\r
+## PackageDependency:\r
+##\r
+################################################################################\r
+class PackageDependency(Element):\r
+    def __init__(self, **kwargs):\r
+        """Package"""\r
+        Element.__init__(self)\r
+\r
+        self.Package = ""\r
+\r
+################################################################################\r
+##\r
+## Platform:\r
+## \r
+################################################################################\r
+class Platform(Element):\r
+    def __init__(self, **kwargs):\r
+        """Targets, OutputPath, Images, Modules, DynamicPcds, Fvs, Libraries\r
+           BuildFile, BuildPath, BuildOptions, UserExtensions\r
+        """\r
+        Element.__init__(self)\r
+        \r
+        self.Targets        = []\r
+        self.OutputPath     = ""\r
+        self.Images         = []\r
+        self.Modules        = {}    # arch -> [module list]\r
+        self.DynamicPcds    = []\r
+        self.FfsLayouts     = {}\r
+        self.Fvs            = {}\r
+        \r
+        self.Libraries      = {}    # arch -> [library instance]\r
+        self.BuildFile      = "build.xml"\r
+        self.BuildPath      = "${PLATFORM_BUILD_DIR}"\r
+        self.BuildOptions   = {}\r
+        self.UserExtensions = {}\r
+        \r
+        self.Environment    = {}    # name/value pairs\r
+\r
+################################################################################\r
+##\r
+## Workspace:\r
+##\r
+################################################################################\r
+class Workspace(Element):\r
+    def __init__(self, **kwargs):\r
+        """Packages, Platforms, Fars, Modules, PlatformIndex, PackageIndex"""\r
+        Element.__init__(self)\r
+\r
+        self.Packages               = []\r
+        self.Platforms              = []\r
+        self.Fars                   = []\r
+        self.Modules                = []\r
+\r
+        ## "GUID" : {guid : {version : platform}}\r
+        ## "PATH" : {path : platform}\r
+        ## "NAME" : {name : [platform]}\r
+        self.PlatformXref           = {\r
+                                        "GUID"  : {},\r
+                                        "PATH"  : {},\r
+                                        "NAME"  : {},\r
+                                      }\r
+        ## "GUID" : {guid : {version : package}}\r
+        ## "PATH" : {path : package}\r
+        ## "NAME" : {name : package}\r
+        self.PackageXref            = {\r
+                                        "GUID"  : {},\r
+                                        "PATH"  : {},\r
+                                        "NAME"  : {},\r
+                                      }\r
+        ## "GUID" : {guid : {version : [module]}}\r
+        ## "PATH" : {path : module}\r
+        ## "NAME" : {name : module}\r
+        self.ModuleXref             = {\r
+                                        "GUID"  : {},\r
+                                        "PATH"  : {},\r
+                                        "NAME"  : {},\r
+                                      }\r
+        ## "NAME" : {name : library interface}\r
+        ## "PATH" : {path : library interface}\r
+        self.LibraryInterfaceXref   = {\r
+                                        "PATH"  : {},\r
+                                        "NAME"  : {},\r
+                                      }\r
+        ## TODO\r
+        self.FarIndex               = {}\r
+\r
+        # from target.txt\r
+        self.TargetConfig           = {}\r
+        # from tools_def.txt\r
+        self.ToolConfig             = {}\r
+\r
+        self.ActivePlatform         = ""\r
+        self.ActiveToolchain        = ""\r
+        self.ActiveFamilies         = []\r
+        self.ActiveModules          = []\r
+        self.ActiveTargets          = []\r
+        self.ActiveArchs            = []\r
+\r
+        self.IndividualModuleBuild  = False\r
+        self.MultiThreadBuild       = False\r
+        self.ThreadCount            = "2"\r
+\r
+        self.Environment            = {}\r
+\r
+################################################################################\r
+##\r
+## For test:\r
+## \r
+################################################################################\r
+if __name__ == "__main__":\r
+    pass\r