]> git.proxmox.com Git - mirror_edk2.git/blobdiff - Tools/Python/buildgen/SurfaceAreaElement.py
Retiring the ANT/JAVA build and removing the older EDK II packages that required...
[mirror_edk2.git] / Tools / Python / buildgen / SurfaceAreaElement.py
diff --git a/Tools/Python/buildgen/SurfaceAreaElement.py b/Tools/Python/buildgen/SurfaceAreaElement.py
deleted file mode 100644 (file)
index ec84582..0000000
+++ /dev/null
@@ -1,1555 +0,0 @@
-#!/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 SurfaceArea Elemments"""\r
-#\r
-# TODO: FFS layout, Flash, FV, PCD\r
-#\r
-import os, sys, re, getopt, string, glob, xml.dom.minidom, pprint, time, copy, shelve, pickle\r
-from XmlRoutines import *\r
-import FrameworkElement\r
-import BuildConfig\r
-\r
-################################################################################\r
-##\r
-## Convert given list to a string in the format like: [a, b, c]\r
-##\r
-################################################################################\r
-def ListString(lst):\r
-    return "[%s]" % ",".join(lst)\r
-\r
-class SurfaceAreaElement:\r
-    """Base class for Surface Area XML element"""\r
-    _ModuleTypes = ('BASE', 'SEC', 'PEI_CORE', 'PEIM', 'DXE_CORE', 'DXE_DRIVER',\r
-                    'DXE_RUNTIME_DRIVER', 'DXE_SAL_DRIVER', 'DXE_SMM_DRIVER',\r
-                    'TOOL', 'UEFI_DRIVER', 'UEFI_APPLICATION', 'USER_DEFINED')\r
-    _GuidTypes = ('DATA_HUB_RECORD', 'EFI_EVENT', 'EFI_SYSTEM_CONFIGURATION_TABLE',\r
-                  'EFI_VARIABLE', 'GUID', 'HII_PACKAGE_LIST', 'HOB', 'TOKEN_SPACE_GUID')\r
-    _Archs = ('EBC', 'IA32', 'X64', 'IPF', 'ARM', 'PPC')\r
-    _Usages = ('ALWAYS_CONSUMED', 'SOMETIMES_CONSUMED', 'ALWAYS_PRODUCED',\r
-               'SOMETIMES_PRODUCED', 'TO_START', 'BY_START', 'PRIVATE')\r
-    _FileTypes = {\r
-                    ".c"    :   "CCode",\r
-                    ".C"    :   "CCode",\r
-                    ".cpp"  :   "CCode",\r
-                    ".Cpp"  :   "CCode",\r
-                    ".CPP"  :   "CCode",\r
-                    ".h"    :   "CHeader",\r
-                    ".H"    :   "CHeader",\r
-                    ".asm"  :   "ASM",\r
-                    ".Asm"  :   "Assembly",\r
-                    ".ASM"  :   "Assembly",\r
-                    ".s"    :   "IpfAssembly",\r
-                    ".S"    :   "GccAssembly",\r
-                    ".uni"  :   "UNI",\r
-                    ".Uni"  :   "Unicode",\r
-                    ".UNI"  :   "Unicode",\r
-                    ".vfr"  :   "VFR",\r
-                    ".Vfr"  :   "VFR",\r
-                    ".VFR"  :   "VFR",\r
-                    ".dxs"  :   "DPX",\r
-                    ".Dxs"  :   "DPX",\r
-                    ".DXS"  :   "DPX",\r
-                    ".fv"   :   "FirmwareVolume",\r
-                    ".Fv"   :   "FirmwareVolume",\r
-                    ".FV"   :   "FirmwareVolume",\r
-                    ".efi"  :   "EFI",\r
-                    ".Efi"  :   "EFI",\r
-                    ".EFI"  :   "EFI",\r
-                    ".SEC"  :   "FFS",\r
-                    ".PEI"  :   "FFS",\r
-                    ".DXE"  :   "FFS",\r
-                    ".APP"  :   "FFS",\r
-                    ".FYI"  :   "FFS",\r
-                    ".FFS"  :   "FFS",\r
-                    ".bmp"  :   "BMP",\r
-                    ".i"    :   "PPCode",\r
-                    ".asl"  :   "ASL",\r
-                    ".Asl"  :   "ASL",\r
-                    ".ASL"  :   "ASL",\r
-                 }\r
-    _ToolMapping = {\r
-                    "CCode"             :   "CC",\r
-                    "CHeader"           :   "",\r
-                    "ASM"               :   "ASM",\r
-                    "Assembly"          :   "ASM",\r
-                    "IpfAssembly"       :   "ASM",\r
-                    "GccAssembly"       :   "ASM",\r
-                    "UNI"               :   "",\r
-                    "Unicode"           :   "",\r
-                    "VFR"               :   "",\r
-                    "DPX"               :   "",\r
-                    "FirmwareVolume"    :   "",\r
-                    "EFI"               :   "",\r
-                    "FFS"               :   "",\r
-                    "PPCode"            :   "PP",\r
-                    "BMP"               :   "",\r
-                   }\r
-\r
-    _BuildableFileTypes = ("CCode", "ASM", "Assembly", "IpfAssembly", "GccAssembly", "UNI", "Unicode", "VFR", "DPX", "EFI")\r
-    \r
-    def __init__(self, workspace, owner=None, dom=None, parse=True, postprocess=True):\r
-        self._Workspace = workspace\r
-        \r
-        if owner == None: self._Owner = ""\r
-        else:             self._Owner = owner\r
-            \r
-        if dom == None: self._Root = ""\r
-        else:           self._Root = dom\r
-            \r
-        self._Elements = {}\r
-        \r
-        if parse: self.Parse()\r
-        if postprocess: self.Postprocess()\r
-    \r
-    def Parse(self):\r
-        """Parse the XML element in DOM form"""\r
-        pass\r
-    \r
-    def Postprocess(self):\r
-        """Re-organize the original information form XML DOM into a format which can be used directly"""\r
-        pass\r
-    \r
-    def GetArchList(self, dom):\r
-        """Parse the SupArchList attribute. If not spcified, return all ARCH supported"""\r
-        archs = XmlAttribute(dom, "SupArchList").split()\r
-        if archs == []:\r
-            if self._Owner.Archs != []:\r
-                archs = self._Owner.Archs\r
-            elif self._Workspace.ActiveArchs != []:\r
-                archs = self._Workspace.ActiveArchs\r
-            elif self._Workspace.ActivePlatform != "" and self._Workspace.ActivePlatform.Archs != []:\r
-                archs = self._Workspace.ActivePlatform.Archs\r
-            else:\r
-                archs = self._Archs\r
-        return archs\r
-    \r
-    def GetModuleTypeList(self, dom):\r
-        """Parse the SupModuleList attribute. If not specified, return all supported module types"""\r
-        moduleTypes = XmlAttribute(dom, "SupModuleList").split()\r
-        if moduleTypes == []:\r
-            moduleTypes = self._ModuleTypes\r
-        return moduleTypes\r
-    \r
-    def GetGuidTypeList(self, dom):\r
-        """Parse GuidTypeList attribute. Default to GUID if not specified"""\r
-        guidTypes = XmlAttribute(dom, "GuidTypeList")\r
-        if guidTypes == []:\r
-            guidTypes = ["GUID"]\r
-        return guidTypes\r
-\r
-    def GetFeatureList(self, dom):\r
-        """Parse FeatureFlag attribute"""\r
-        return XmlAttribute(dom, "FeatureFlag").split()\r
-    \r
-    def GetToolchainTagList(self, dom):\r
-        """Parse TagName attribute. Return all defined toolchains defined in tools_def.txt if not given"""\r
-        toolchainTagString = XmlAttribute(dom, "TagName")\r
-        if toolchainTagString == "":\r
-            return self._Workspace.ToolConfig.Toolchains\r
-        return toolchainTagString.split()\r
-    \r
-    def GetToolchainFamilyList(self, dom):\r
-        """Parse ToolChainFamily attribute. Return all defined toolchain families in tools_def.txt if not given"""\r
-        familyString = XmlAttribute(dom, "ToolChainFamily")\r
-        if familyString != "":\r
-            return familyString.split()\r
-        return self._Workspace.ToolConfig.Families\r
-    \r
-    def GetTargetList(self, dom):\r
-        """Parse BuildTargets attribute. Return all build targets defined in tools_def.txt if not given"""\r
-        targetList = XmlAttribute(dom, "BuildTargets").split()\r
-        if targetList == []:\r
-            targetList = self._Workspace.ToolConfig.Targets\r
-        return targetList\r
-    \r
-    def GetUsage(self, dom):\r
-        """Parse Usage attribute. Default to ALWAYS_CONSUMED if not given"""\r
-        usageString = XmlAttribute(dom, "Usage")\r
-        if usageString == "":\r
-            return "ALWAYS_CONSUMED"\r
-        return usageString\r
-    \r
-    def GetBuildOptionList(self, dom):\r
-        """Parse Options/Option element. Return a options dictionay with keys as (toolchain, target, arch, toolcode, attr)"""\r
-        optionList = XmlList(dom, "/Options/Option")\r
-        buildOptions = {}\r
-        for option in optionList:\r
-            targets = self.GetTargetList(option)\r
-            toolchainFamilies = self.GetToolchainFamilyList(option)\r
-            toolchainTags = self.GetToolchainTagList(option)\r
-            toolcode = XmlAttribute(option, "ToolCode")\r
-            archs = self.GetArchList(option)\r
-            flag = XmlElementData(option)\r
-            # print flag\r
-\r
-            toolchains = []\r
-            if toolchainTags != []:\r
-                toolchains = toolchainTags\r
-            elif toolchainFamilies != []:\r
-                toolchains = toolchainFamilies\r
-            else:\r
-                raise Exception("No toolchain specified for a build option: " + self._Owner.Name)\r
-\r
-            if targets == []: targets = self._Workspace.ActiveTargets\r
-            if archs == []: archs = self._Workspace.ActiveArchs\r
-\r
-            for toolchain in toolchains:\r
-                for target in targets:\r
-                    for arch in archs:\r
-                        buildOptions[(toolchain, target, arch, toolcode, "FLAGS")] = flag\r
-        return buildOptions\r
-\r
-    def GetFvBindingList(self, dom):\r
-        """Parse FvBinding element. If not specified, return NULL FV"""\r
-        fvBindingList = XmlElementData(dom).split()\r
-        if fvBindingList == []:\r
-            fvBindingList = ["NULL"]\r
-        return fvBindingList\r
-    \r
-    def IsBuildable(self, type):\r
-        """Test if a file with the type can be built by a tool"""\r
-        return type in self._BuildableFileTypes\r
-    \r
-    def GetToolCode(self, type):\r
-        """Get the toolcode which must be used to build files with the type"""\r
-        toolcode = ""\r
-        if type in self._ToolMapping:\r
-            toolcode = self._ToolMapping[type]\r
-        return toolcode\r
-        \r
-    def GetBoolean(self, dom):\r
-        """Transate true/false in string form to python's True/False value"""\r
-        boolString = XmlElementData(dom).upper()\r
-        if boolString == ""  or boolString == "FALSE"  or boolString == "NO":\r
-            return False\r
-        else:\r
-            return True\r
-        \r
-class LibraryDeclaration(FrameworkElement.LibraryInterface, SurfaceAreaElement):\r
-    def __init__(self, workspace, package, dom):\r
-        FrameworkElement.LibraryInterface.__init__(self)\r
-        self.Package = package\r
-        SurfaceAreaElement.__init__(self, workspace, package, dom)\r
-\r
-    def Parse(self):\r
-        dom = self._Root\r
-        self.Name = XmlAttribute(dom, "Name")\r
-        self.Path = os.path.normpath(XmlElementData(XmlNode(dom, "/LibraryClass/IncludeHeader")))\r
-        self.Dir  = os.path.dirname(self.Path)\r
-        \r
-        attribute = XmlAttribute(dom, "RecommendedInstanceGuid")\r
-        if attribute is not '':\r
-            self.FavoriteIntance = FrameworkElement.Module()\r
-            self.FavoriteIntance.Guid = attribute\r
-\r
-        attribute = XmlAttribute(dom, "RecommendedInstanceVersion")\r
-        if attribute is not '':\r
-            if self.FavoriteIntance == "":\r
-                raise "No GUID for the recommened library instance"\r
-            self.FavoriteIntance.Version = attribute\r
-\r
-        self.Archs = self.GetArchList(dom)\r
-        self.ModuleTypes = self.GetModuleTypeList(dom)\r
-\r
-class LibraryClass(FrameworkElement.LibraryClass, SurfaceAreaElement):\r
-    def __init__(self, workspace, module, dom):\r
-        FrameworkElement.LibraryClass.__init__(self)\r
-        SurfaceAreaElement.__init__(self, workspace, module, dom)\r
-\r
-    def Parse(self):\r
-        dom = self._Root\r
-        \r
-        self.Name = XmlElementData(XmlNode(dom, "/LibraryClass/Keyword"))\r
-        self.Usage = self.GetUsage(dom)\r
-        self.Features = self.GetFeatureList(dom)\r
-        self.Archs  = self.GetArchList(dom)\r
-\r
-        attribute = XmlAttribute(dom, "RecommendedInstanceGuid")\r
-        if attribute is not '':\r
-            self.FavoriteIntance = FrameworkElement.Module()\r
-            self.FavoriteIntance.Guid = attribute\r
-\r
-        attribute = XmlAttribute(dom, "RecommendedInstanceVersion")\r
-        if attribute is not '':\r
-            if self.FavoriteIntance == "":\r
-                self.FavoriteIntance = FrameworkElement.Module()\r
-            self.FavoriteIntance.Version = attribute\r
-\r
-class SourceFile(FrameworkElement.SourceFile, SurfaceAreaElement):\r
-    def __init__(self, workspace, module, dom):\r
-        FrameworkElement.SourceFile.__init__(self)\r
-        SurfaceAreaElement.__init__(self, workspace, module, dom)\r
-\r
-    def Parse(self):\r
-        dom = self._Root\r
-        self.Path = os.path.normpath(XmlElementData(dom))\r
-        self.Dir  = os.path.dirname(self.Path)\r
-        self.Type = self.GetFileType()\r
-        self.Toolchains = self.GetToolchainTagList(dom)\r
-        self.Families = self.GetToolchainFamilyList(dom)\r
-        self.Archs = self.GetArchList(dom)\r
-        self.Features = self.GetFeatureList(dom)\r
-\r
-    def GetFileType(self):\r
-        type = XmlAttribute(self._Root, "ToolCode")\r
-        if type == "":\r
-            fileName = os.path.basename(self.Path)\r
-            self.BaseName,self.Ext = os.path.splitext(fileName)\r
-            if self.Ext in self._FileTypes:\r
-                type = self._FileTypes[self.Ext]\r
-            else:\r
-                type = ""\r
-        return type\r
-            \r
-class PackageDependency(FrameworkElement.PackageDependency, SurfaceAreaElement):\r
-    def __init__(self, workspace, module, dom):\r
-        FrameworkElement.PackageDependency.__init__(self)\r
-        SurfaceAreaElement.__init__(self, workspace, module, dom)\r
-\r
-    def Parse(self):\r
-        dom = self._Root\r
-        self.GuidValue = XmlAttribute(dom, "PackageGuid").upper()\r
-        self.Version = XmlAttribute(dom, "PackageVersion")\r
-        self.Archs = self.GetArchList(dom)\r
-        self.Features = self.GetFeatureList(dom)\r
-\r
-    def Postprocess(self):\r
-        self.Package = self._Workspace.GetPackage(self.GuidValue, self.Version)\r
-        if self.Package == "": raise "No package with GUID=" + self.GuidValue + "VERSION=" + self.Version\r
-\r
-class Protocol(FrameworkElement.Protocol, SurfaceAreaElement):\r
-    def __init__(self, workspace, module, dom):\r
-        FrameworkElement.Protocol.__init__(self)\r
-        SurfaceAreaElement.__init__(self, workspace, module, dom)\r
-\r
-    def Parse(self):\r
-        dom = self._Root\r
-        self.CName = XmlElementData(XmlNode(dom, "/Protocol/ProtocolCName"))\r
-        self.Usage = self.GetUsage(dom)\r
-        self.Archs = self.GetArchList(dom)\r
-        self.Features = self.GetFeatureList(dom)\r
-\r
-    def Postprocess(self):\r
-        for pd in self._Owner._Elements["PackageDependencies"]:\r
-            if self.CName not in pd.Package.Protocols: continue\r
-            self.GuidValue = pd.Package.Protocols[self.CName]\r
-\r
-class ProtocolNotify(FrameworkElement.ProtocolNotify, SurfaceAreaElement):\r
-    def __init__(self, workspace, module, dom):\r
-        FrameworkElement.ProtocolNotify.__init__(self)\r
-        SurfaceAreaElement.__init__(self, workspace, module, dom)\r
-\r
-    def Parse(self):\r
-        dom = self._Root\r
-        \r
-        self.CName = XmlElementData(XmlNode(dom, "/ProtocolNotify/ProtocolCName"))\r
-        self.Usage = self.GetUsage(dom)\r
-        self.Archs = self.GetArchList(dom)\r
-        self.Features = self.GetFeatureList(dom)\r
-\r
-    def Postprocess(self):\r
-        for pd in self._Owner._Elements["PackageDependencies"]:\r
-            if self.CName not in pd.Package.Protocols: continue\r
-            self.GuidValue = pd.Package.Protocols[self.CName]\r
-\r
-class Ppi(FrameworkElement.Ppi, SurfaceAreaElement):\r
-    def __init__(self, workspace, module, dom):\r
-        FrameworkElement.Ppi.__init__(self)\r
-        SurfaceAreaElement.__init__(self, workspace, module, dom)\r
-\r
-    def Parse(self):\r
-        dom = self._Root\r
-        self.CName = XmlElementData(XmlNode(dom, "/Ppi/PpiCName"))\r
-        self.Usage = self.GetUsage(dom)\r
-        self.Archs = self.GetArchList(dom)\r
-        self.Features = self.GetFeatureList(dom)\r
-\r
-    def Postprocess(self):\r
-        for pd in self._Owner._Elements["PackageDependencies"]:\r
-            if self.CName not in pd.Package.Ppis: continue\r
-            self.GuidValue = pd.Package.Ppis[self.CName]\r
-\r
-class PpiNotify(FrameworkElement.PpiNotify, SurfaceAreaElement):\r
-    def __init__(self, workspace, module, dom):\r
-        FrameworkElement.PpiNotify.__init__(self)\r
-        SurfaceAreaElement.__init__(self, workspace, module, dom)\r
-\r
-    def Parse(self):\r
-        dom = self._Root\r
-        self.CName = XmlElementData(XmlNode(dom, "/PpiNotify/PpiCName"))\r
-        self.Usage = self.GetUsage(dom)\r
-        self.Archs = self.GetArchList(dom)\r
-        self.Features = self.GetFeatureList(dom)\r
-\r
-    def Postprocess(self):\r
-        for pd in self._Owner._Elements["PackageDependencies"]:\r
-            if self.CName not in pd.Package.Ppis: continue\r
-            self.GuidValue = pd.Package.Ppis[self.CName]\r
-\r
-class Guid(FrameworkElement.Guid, SurfaceAreaElement):\r
-    def __init__(self, workspace, module, dom):\r
-        FrameworkElement.Guid.__init__(self)\r
-        SurfaceAreaElement.__init__(self, workspace, module, dom)\r
-\r
-    def Parse(self):\r
-        dom = self._Root\r
-        self.CName = XmlElementData(XmlNode(dom, "/GuidCNames/GuidCName"))\r
-        self.Usage = self.GetUsage(dom)\r
-        self.Archs = self.GetArchList(dom)\r
-        self.Features = self.GetFeatureList(dom)\r
-\r
-    def Postprocess(self):\r
-        for pd in self._Owner._Elements["PackageDependencies"]:\r
-            if self.CName not in pd.Package.Guids: continue\r
-            self.GuidValue = pd.Package.Guids[self.CName]\r
-\r
-class Extern(FrameworkElement.Extern, SurfaceAreaElement):\r
-    def __init__(self, workspace, module, dom):\r
-        FrameworkElement.Extern.__init__(self)\r
-        SurfaceAreaElement.__init__(self, workspace, module, dom)\r
-\r
-    def Parse(self):\r
-        dom = self._Root\r
-        self.Archs = self.GetArchList(dom)\r
-        self.Features = self.GetFeatureList(dom)\r
-        \r
-        extern = XmlNode(dom, "/Extern/ModuleEntryPoint")\r
-        if extern is not None and extern is not '':\r
-            self.ModuleEntryPoints.append(XmlElementData(extern))\r
-            \r
-        extern = XmlNode(dom, "/Extern/ModuleUnloadImage")\r
-        if extern is not None and extern is not '':\r
-            self.ModuleUnloadImages.append(XmlElementData(extern))\r
-            \r
-        extern = XmlNode(dom, "/Extern/Constructor")\r
-        if extern is not None and extern is not '':\r
-            self.Constructors.append(XmlElementData(extern))\r
-            \r
-        extern = XmlNode(dom, "/Extern/Destructor")\r
-        if extern is not None and extern is not '':\r
-            self.Destructors.append(XmlElementData(extern))\r
-            \r
-        extern = XmlNode(dom, "/Extern/DriverBinding")\r
-        if extern is not None and extern is not '':\r
-            self.DriverBindings.append(XmlElementData(extern))\r
-            \r
-        extern = XmlNode(dom, "/Extern/ComponentName")\r
-        if extern is not None and extern is not '':\r
-            self.ComponentNames.append(XmlElementData(extern))\r
-            \r
-        extern = XmlNode(dom, "/Extern/DriverConfig")\r
-        if extern is not None and extern is not '':\r
-            self.DriverConfigs.append(XmlElementData(extern))\r
-            \r
-        extern = XmlNode(dom, "/Extern/DriverDiag")\r
-        if extern is not None and extern is not '':\r
-            self.DriverDiags.append(XmlElementData(extern))\r
-\r
-        extern = XmlNode(dom, "/Extern/SetVirtualAddressMapCallBacks")\r
-        if extern is not None and extern is not '':\r
-            self.SetVirtualAddressMapCallBacks.append(XmlElementData(extern))\r
-\r
-        extern = XmlNode(dom, "/Extern/ExitBootServicesCallBack")\r
-        if extern is not None and extern is not '':\r
-            self.ExitBootServicesCallBacks.append(XmlElementData(extern))\r
-\r
-class IndustryStdHeader(FrameworkElement.IncludeFile, SurfaceAreaElement):\r
-    def __init__(self, workspace, package, dom):\r
-        FrameworkElement.IncludeFile.__init__(self)\r
-        SurfaceAreaElement.__init__(self, workspace, package, dom)\r
-\r
-    def Parse(self):\r
-        dom = self._Root\r
-        self.Path = os.path.normpath(XmlElementData(XmlNode(dom, "/IndustryStdHeader/IncludeHeader")))\r
-        self.Dir  = os.path.dirname(self.Path)\r
-        self.Archs = self.GetArchList(dom)\r
-        self.ModuleTypes = self.GetModuleTypeList(dom)\r
-\r
-class PackageHeader(FrameworkElement.IncludeFile, SurfaceAreaElement):\r
-    def __init__(self, workspace, package, dom):\r
-        FrameworkElement.IncludeFile.__init__(self)\r
-        SurfaceAreaElement.__init__(self, workspace, package, dom)\r
-\r
-    def Parse(self):\r
-        dom = self._Root\r
-        self.Path = os.path.normpath(XmlElementData(dom))\r
-        self.Dir  = os.path.dirname(self.Path)\r
-        self.ModuleType = XmlAttribute(dom, "ModuleType")\r
-\r
-class GuidDeclaration(FrameworkElement.Guid, SurfaceAreaElement):\r
-    def __init__(self, workspace, package, dom):\r
-        FrameworkElement.Guid.__init__(self)\r
-        SurfaceAreaElement.__init__(self, workspace, package, dom)\r
-\r
-    def Parse(self):\r
-        dom = self._Root\r
-        self.CName = XmlElementData(XmlNode(dom, "/Entry/C_Name"))\r
-        self.GuidValue = XmlElementData(XmlNode(dom, "/Entry/GuidValue")).upper()\r
-        self.Name = XmlAttribute(dom, "Name")\r
-        self.Types = self.GetGuidTypeList(dom)\r
-        self.Archs = self.GetArchList(dom)\r
-        self.ModuleTypes = self.GetModuleTypeList(dom)\r
-\r
-    def Postprocess(self):\r
-        pass\r
-    \r
-class ProtocolDeclaration(GuidDeclaration, SurfaceAreaElement):\r
-    pass\r
-\r
-class PpiDeclaration(GuidDeclaration, SurfaceAreaElement):\r
-    pass\r
-\r
-class PcdDeclaration(FrameworkElement.Pcd, SurfaceAreaElement):\r
-    def __init__(self, workspace, package, dom):\r
-        FrameworkElement.Pcd.__init__(self)\r
-        SurfaceAreaElement.__init__(self, workspace, package, dom)\r
-\r
-    def Parse(self):\r
-        dom = self._Root\r
-        self.Types      = XmlElementData(XmlNode(dom, "/PcdEntry/ValidUsage")).split()\r
-        self.CName      = XmlElementData(XmlNode(dom, "/PcdEntry/C_Name"))\r
-        self.Token      = XmlElementData(XmlNode(dom, "/PcdEntry/Token"))\r
-        self.TokenSpace = XmlElementData(XmlNode(dom, "/PcdEntry/TokenSpaceGuidCName"))\r
-        self.DatumType  = XmlElementData(XmlNode(dom, "/PcdEntry/DatumType"))\r
-        self.Default    = XmlElementData(XmlNode(dom, "/PcdEntry/DefaultValue"))\r
-        self.Archs      = self.GetArchList(dom)\r
-        self.ModuleTypes= self.GetModuleTypeList(dom)\r
-\r
-class LibraryInstance(FrameworkElement.PlatformModule, SurfaceAreaElement):\r
-    def __init__(self, workspace, platformModule, dom):\r
-        FrameworkElement.PlatformModule.__init__(self)\r
-        SurfaceAreaElement.__init__(self, workspace, platformModule, dom)\r
-\r
-    def Parse(self):\r
-        dom = self._Root\r
-        self.GuidValue = XmlAttribute(dom, "ModuleGuid").upper()\r
-        self.Version = XmlAttribute(dom, "ModuleVersion")\r
-        self._Elements["PackageGuid"] = XmlAttribute(dom, "PackageGuid").upper()\r
-        self._Elements["PackageVersion"] = XmlAttribute(dom, "PackageVersion")\r
-        \r
-    def Postprocess(self):\r
-        self.Module = self._Workspace.GetModule(self.GuidValue, self.Version,\r
-                        self._Elements["PackageGuid"], self._Elements["PackageVersion"])\r
-        self.Platform = self._Owner.Platform\r
-        self.Archs = self._Owner.Archs\r
-        self.Pcds = self._Owner.Pcds\r
-        self.BuildType = "lib"\r
-\r
-class PlatformModule(FrameworkElement.PlatformModule, SurfaceAreaElement):\r
-    def __init__(self, workspace, platform, dom):\r
-        FrameworkElement.PlatformModule.__init__(self)\r
-        self.Platform = platform\r
-        SurfaceAreaElement.__init__(self, workspace, platform, dom)\r
-\r
-    def Parse(self):\r
-        dom = self._Root\r
-        self.GuidValue = XmlAttribute(dom, "ModuleGuid").upper()\r
-        self.Version = XmlAttribute(dom, "ModuleVersion")\r
-        self.Archs = self.GetArchList(dom)\r
-\r
-        self._Elements["PackageGuid"] = XmlAttribute(dom, "PackageGuid").upper()\r
-        self._Elements["PackageVersion"] = XmlAttribute(dom, "PackageVersion")\r
-\r
-        libraryList = XmlList(dom, "/ModuleSA/Libraries/Instance")\r
-        for lib in libraryList:\r
-            self.Libraries.append(LibraryInstance(self._Workspace, self, lib))\r
-            \r
-        dom = XmlNode(dom, "/ModuleSA/ModuleSaBuildOptions")\r
-        self.FvBindings = self.GetFvBindingList(XmlNode(dom, "/ModuleSaBuildOptions/FvBinding"))\r
-        self.FfsLayouts = XmlElementData(XmlNode(dom, "/ModuleSaBuildOptions/FfsFormatKey")).split()\r
-        self.BuildOptions = self.GetBuildOptionList(XmlNode(dom, "/ModuleSaBuildOptions/Options"))\r
-\r
-    def Postprocess(self):\r
-        self.Module = self._Workspace.GetModule(self.GuidValue, self.Version,\r
-                        self._Elements["PackageGuid"], self._Elements["PackageVersion"])\r
-        if self.Module == "":\r
-            raise Exception("No module found: \n\t\tGUID=%s \n\t\tVERSION=%s \n\t\tPACKAGE_GUID=%s \n\t\tPACKAGE_VERSION=%s" % (\r
-                  self.GuidValue, self.Version, self._Elements["PackageGuid"], self._Elements["PackageVersion"]))\r
-    \r
-##    def SetupEnvironment(self):\r
-##        self.Environment    = {\r
-##            "ARCH"                  :   "",\r
-##            "MODULE_BUILD_TARGET"   :   "",\r
-##            "SINGLE_MODULE_BUILD"   :   "",\r
-##            "PLATFORM_PREBUILD"     :   "",\r
-##            "PLATFORM_POSTBUILD"    :   "",\r
-##            "LIBS"                  :   "",\r
-##            "SOURCE_FILES"          :   "",\r
-##            "ENTRYPOINT"            :   "_ModuleEntryPoint",\r
-##        }    # name/value pairs\r
-##        self.Environment["MODULE_BUILD_TARGET"] = "platform_module_build"\r
-\r
-class ModuleSurfaceArea(FrameworkElement.Module, SurfaceAreaElement):\r
-    def __init__(self, workspace, package, path):\r
-        FrameworkElement.Module.__init__(self)\r
-\r
-        self.Path = os.path.normpath(path)\r
-        self.Dir  = os.path.dirname(self.Path)\r
-        self.FileBaseName,_ext = os.path.splitext(os.path.basename(self.Path))\r
-        self.Package = package\r
-        SurfaceAreaElement.__init__(self, workspace, package)\r
-\r
-    def _MsaHeader(self, xpath):\r
-        dom = XmlNode(self._Root, xpath)\r
-        if dom == '': return\r
-        self.Name = XmlElementData(XmlNode(dom, "/MsaHeader/ModuleName"))\r
-        self.Type = XmlElementData(XmlNode(dom, "/MsaHeader/ModuleType"))\r
-        self.GuidValue = XmlElementData(XmlNode(dom, "/MsaHeader/GuidValue")).upper()\r
-        self.Version = XmlElementData(XmlNode(dom, "/MsaHeader/Version"))\r
-        \r
-    def _ModuleDefinitions(self, xpath):\r
-        dom = XmlNode(self._Root, xpath)\r
-        if dom == '': return\r
-        self.Archs = XmlElementData(XmlNode(dom, "/ModuleDefinitions/SupportedArchitectures")).split()\r
-        self.IsBinary = self.GetBoolean(XmlNode(dom, "/ModuleDefinitions/BinaryModule"))\r
-        self.BaseName = XmlElementData(XmlNode(dom, "/ModuleDefinitions/OutputFileBasename"))\r
-        \r
-    def _LibraryClassDefinitions(self, xpath):\r
-        dom = XmlNode(self._Root, xpath)\r
-        if dom == '': return\r
-        lcList = []\r
-        for lc in XmlList(dom, "/LibraryClassDefinitions/LibraryClass"):\r
-            lcList.append(LibraryClass(self._Workspace, self, lc))\r
-        self._Elements["LibraryClassDefinitions"] = lcList\r
-\r
-    def _SourceFiles(self, xpath):\r
-        dom = XmlNode(self._Root, xpath)\r
-        if dom == '': return\r
-        srcList = []\r
-        for f in XmlList(dom, "/SourceFiles/Filename"):\r
-            srcList.append(SourceFile(self._Workspace, self, f))\r
-        self._Elements["SourceFiles"] = srcList\r
-\r
-    def _NonProcessedFiles(self, xpath):\r
-        dom = XmlNode(self._Root, xpath)\r
-        if dom == '': return\r
-        for f in XmlList(dom, "/NonProcessedFiles/Filename"):\r
-            self.NonProcessedFiles.append(SourceFile(self._Workspace, self, f))\r
-\r
-    def _PackageDependencies(self, xpath):\r
-        dom = XmlNode(self._Root, xpath)\r
-        if dom == '': return\r
-        pdList = []\r
-        for pkg in XmlList(dom, "/PackageDependencies/Package"):\r
-            pdList.append(PackageDependency(self._Workspace, self, pkg))\r
-        self._Elements["PackageDependencies"] = pdList\r
-\r
-    def _Protocols(self, xpath):\r
-        dom = XmlNode(self._Root, xpath)\r
-        if dom == '': return\r
-    \r
-        protocolList = []\r
-        for p in XmlList(dom, "/Protocols/Protocol"):\r
-            protocolList.append(Protocol(self._Workspace, self, p))\r
-        for p in XmlList(dom, "/Protocols/ProtocolNotify"):\r
-            protocolList.append(ProtocolNotify(self._Workspace, self, p))\r
-            \r
-        self._Elements["Protocols"] = protocolList\r
-\r
-    def _Ppis(self, xpath):\r
-        dom = XmlNode(self._Root, xpath)\r
-        if dom == '': return\r
-    \r
-        ppiList = []\r
-        for p in XmlList(dom, "/PPIs/Ppi"):\r
-            ppiList.append(Ppi(self._Workspace, self, p))\r
-        for p in XmlList(dom, "/PPIs/PpiNotify"):\r
-            ppiList.append(PpiNotify(self._Workspace, self, p))\r
-            \r
-        self._Elements["PPIs"] = ppiList\r
-\r
-    def _Guids(self, xpath):\r
-        dom = XmlNode(self._Root, xpath)\r
-        if dom == '': return\r
-        guidList = []\r
-        for g in XmlList(dom, "/Guids/GuidCNames"):\r
-            guidList.append(Guid(self._Workspace, self, g))\r
-        self._Elements["Guids"] = guidList\r
-\r
-    def _Externs(self, xpath):\r
-        dom = XmlNode(self._Root, xpath)\r
-        if dom == '': return\r
-        self.PcdIsDriver = self.GetBoolean(XmlNode(dom, "/Externs/PcdIsDriver"))\r
-        self.NeedsFlashMap_h = self.GetBoolean(XmlNode(dom, "/Externs/TianoR8FlashMap_h"))\r
-\r
-        externList = []\r
-        specs = FrameworkElement.Extern()\r
-        specs.Archs = self._Archs\r
-        externList.append(specs)\r
-        for spec in XmlList(dom, "/Externs/Specification"):\r
-            specs.Specifications.append(XmlElementData(spec))\r
-        for ext in XmlList(dom, "/Externs/Extern"):\r
-            externList.append(Extern(self._Workspace, self, ext))\r
-        self._Elements["Externs"] = externList\r
-\r
-    def _ModuleBuildOptions(self, xpath):\r
-        dom = XmlNode(self._Root, xpath)\r
-        if dom == '': return\r
-        self.BuildOptions = self.GetBuildOptionList(XmlNode(dom, "/ModuleBuildOptions/Options"))\r
-\r
-    def _UserExtensions(self, xpath):\r
-        domList = XmlList(self._Root, xpath)\r
-        if domList == []: return\r
-        for extension in domList:\r
-            userId = XmlAttribute(extension, "UserID")\r
-            identifier = XmlAttribute(extension, "Identifier")\r
-            if userId == '' or identifier == '':\r
-                raise Exception("No UserId or Identifier specified")\r
-            if userId != "TianoCore": continue\r
-            if identifier not in self.UserExtensions:\r
-                self.UserExtensions[identifier] = []\r
-\r
-            contentList = self.UserExtensions[identifier]\r
-            for node in extension.childNodes:\r
-                #print node.nodeType\r
-                contentList.append(node.cloneNode(True))\r
-\r
-    def Parse(self):\r
-        fileFullPath = self._Workspace.SubPath(os.path.dirname(self.Package.Path), self.Path)\r
-        self._Root = xml.dom.minidom.parse(fileFullPath)\r
-        assert self._Root.documentElement.tagName == "ModuleSurfaceArea"\r
-\r
-        # print "  Parsing...",self.Path\r
-        self._MsaHeader("/ModuleSurfaceArea/MsaHeader")\r
-        self._ModuleDefinitions("/ModuleSurfaceArea/ModuleDefinitions")\r
-        self._PackageDependencies("/ModuleSurfaceArea/PackageDependencies")\r
-        self._LibraryClassDefinitions("/ModuleSurfaceArea/LibraryClassDefinitions")\r
-        self._SourceFiles("/ModuleSurfaceArea/SourceFiles")\r
-        self._NonProcessedFiles("/ModuleSurfaceArea/NonProcessedFiles")\r
-        self._Protocols("/ModuleSurfaceArea/Protocols")\r
-        self._Ppis("/ModuleSurfaceArea/Ppis")\r
-        self._Guids("/ModuleSurfaceArea/Guids")\r
-        self._Externs("/ModuleSurfaceArea/Externs")\r
-        self._ModuleBuildOptions("/ModuleSurfaceArea/ModuleBuildOptions")\r
-        self._UserExtensions("/ModuleSurfaceArea/UserExtensions")\r
-\r
-    def Postprocess(self):\r
-        # resolve package dependency\r
-        if self._Elements.has_key("PackageDependencies"):\r
-            for pd in self._Elements["PackageDependencies"]:\r
-                package = pd.Package\r
-                if self.Type not in package.PackageIncludes:\r
-                    print "! Module type %s is not supported in the package %s" % (self.Type, package.Name)\r
-\r
-                for arch in pd.Archs:\r
-                    if arch not in self.IncludePaths:\r
-                        self.IncludePaths[arch] = []\r
-                    self.IncludePaths[arch].append(package.SubPath("Include"))\r
-                    self.IncludePaths[arch].append(package.SubPath("Include", arch.capitalize()))\r
-\r
-                    if arch not in self.IncludeFiles:\r
-                        self.IncludeFiles[arch] = []\r
-                    if self.Type in package.PackageIncludes:\r
-                        for path in package.PackageIncludes[self.Type]:\r
-                            self.IncludeFiles[arch].append(package.SubPath(path))\r
-\r
-        # resolve library class\r
-        if self._Elements.has_key("LibraryClassDefinitions"):\r
-            for lc in self._Elements["LibraryClassDefinitions"]:\r
-                lc.Interface = self.GetLibraryInterface(lc.Name)\r
-                if "ALWAYS_PRODUCED" in lc.Usage:\r
-                    self.IsLibrary = True\r
-                    lc.Interface.Instances.append(self)\r
-                else:\r
-                    lc.Interface.Consumers.append(self)\r
-\r
-                for arch in lc.Archs:\r
-                    if arch not in self.LibraryClasses:\r
-                        self.LibraryClasses[arch] = []\r
-                    self.LibraryClasses[arch].append(lc)\r
-            \r
-        # expand source files\r
-        if self._Elements.has_key("SourceFiles"):\r
-            for src in self._Elements["SourceFiles"]:\r
-                for arch in src.Archs:\r
-                    if arch not in self.SourceFiles:\r
-                        self.SourceFiles[arch] = {}\r
-                    if src.Type not in self.SourceFiles[arch]:\r
-                        self.SourceFiles[arch][src.Type] = []\r
-                    self.SourceFiles[arch][src.Type].append(src)\r
-                \r
-        # expand guids\r
-        if self._Elements.has_key("Guids"):\r
-            for guid in self._Elements["Guids"]:\r
-                for arch in guid.Archs:\r
-                    if arch not in self.Guids:\r
-                        self.Guids[arch] = []\r
-                    self.Guids[arch].append(guid)\r
-                \r
-        # expand protocol\r
-        if self._Elements.has_key("Protocols"):\r
-            for protocol in self._Elements["Protocols"]:\r
-                for arch in protocol.Archs:\r
-                    if arch not in self.Protocols:\r
-                        self.Protocols[arch] = []\r
-                    self.Protocols[arch].append(protocol)\r
-\r
-        # expand ppi\r
-        if self._Elements.has_key("PPIs"):\r
-            for ppi in self._Elements["PPIs"]:\r
-                for arch in ppi.Archs:\r
-                    if arch not in self.Ppis:\r
-                        self.Ppis[arch] = []\r
-                    self.Ppis[arch].append(ppi)\r
-                \r
-        # expand extern\r
-        if self._Elements.has_key("Externs"):\r
-            for extern in self._Elements["Externs"]:\r
-                for arch in extern.Archs:\r
-                    if arch not in self.Externs:\r
-                        self.Externs[arch] = []\r
-                    self.Externs[arch].append(extern)\r
-                    \r
-    def GetLibraryInterface(self, name):\r
-        if name in self.Package.LibraryInterfaces:\r
-            return self.Package.LibraryInterfaces[name]\r
-        for pd in self._Elements["PackageDependencies"]:\r
-            if name in pd.Package.LibraryInterfaces:\r
-                return pd.Package.LibraryInterfaces[name]\r
-        return ""\r
-##    def SetupEnvironment(self):\r
-##        self.Environment["MODULE"] = self.Name\r
-##        self.Environment["MODULE_GUID"] = self.GuidValue\r
-##        self.Environment["MODULE_VERSION"] = self.Version\r
-##        self.Environment["MODULE_TYPE"] = self.Type\r
-##        self.Environment["MODULE_FILE_BASE_NAME"] = os.path.basename(self.Path).split(".")[0]\r
-##        self.Environment["MODULE_RELATIVE_DIR"] = os.path.dirname(self.Path)\r
-##        self.Environment["BASE_NAME"] = self.OutputName\r
-\r
-class Workspace(FrameworkElement.Workspace, SurfaceAreaElement):\r
-    _Db = "Tools/Conf/FrameworkDatabase.db"\r
-    _Target = "Tools/Conf/Target.txt"\r
-    _PlatformBuildPath = "Tools/Conf/platform_build_path.txt"\r
-    _ModuleBuildPath = "Tools/Conf/module_build_path.txt"\r
-    \r
-    def __init__(self, path, fpdList=None, msaList=None):\r
-        FrameworkElement.Workspace.__init__(self)\r
-        SurfaceAreaElement.__init__(self, self, None, None, False, False)\r
-        self.Path = os.path.normpath(path)\r
-        self.Dir  = os.path.dirname(self.Path)\r
-        self._Elements["PlatformList"] = fpdList\r
-        self._Elements["ModuleList"] = msaList\r
-        self.Parse()\r
-        self.Postprocess()\r
-\r
-    def _FdbHeader(self, xpath):\r
-        dom = XmlNode(self._Root, xpath)\r
-        if dom == '': return\r
-        self.Name = XmlElementData(XmlNode(dom, "/FdbHeader/DatabaseName"))\r
-        self.GuidValue = XmlElementData(XmlNode(dom, "/FdbHeader/GuidValue")).upper()\r
-        self.Version = XmlElementData(XmlNode(dom, "/FdbHeader/Version"))\r
-\r
-    def _PackageList(self, xpath):\r
-        dom = XmlNode(self._Root, xpath)\r
-        if dom == '': return\r
-    \r
-        fileList = XmlList(dom, "/PackageList/Filename")\r
-        packages = []\r
-        for f in fileList:\r
-            packages.append(os.path.normpath(XmlElementData(f)))\r
-        self._Elements["PackageList"] = packages\r
-            \r
-    def _PlatformList(self, xpath):\r
-        if len(self._Elements["PlatformList"]) > 0:\r
-            return\r
-        \r
-        dom = XmlNode(self._Root, xpath)\r
-        if dom == '': return\r
-    \r
-        fileList = XmlList(dom, "/PlatformList/Filename")\r
-        platforms = []\r
-        for f in fileList:\r
-            platforms.append(os.path.normpath(XmlElementData(f)))\r
-        self._Elements["PlatformList"] = platforms\r
-\r
-    def _FarList(self, xpath):\r
-        dom = XmlNode(self._Root, xpath)\r
-        if dom == '': return\r
-    \r
-        fileList = XmlList(dom, "/FarList/Filename")\r
-        fars = []\r
-        for f in fileList:\r
-            fars.append(os.path.normpath(XmlElementData(f)))\r
-        self._Elements["FarList"] = fars\r
-\r
-    def ParseWorkspaceDatabase(self):\r
-        # parse frameworkdatabase.db\r
-        self._Root = xml.dom.minidom.parse(self.SubPath(self._Db))\r
-        assert self._Root.documentElement.tagName == "FrameworkDatabase"\r
-\r
-        self._FdbHeader("/FrameworkDatabase/FdbHeader")\r
-        self._PackageList("/FrameworkDatabase/PackageList")\r
-        self._PlatformList("/FrameworkDatabase/PlatformList")\r
-        self._FarList("/FrameworkDatabase/FarList")\r
-\r
-    def ParseConfig(self):\r
-        # parse target.txt\r
-        self.ParseTargetConfig()\r
-        # parse tools_def.txt\r
-        self.ParseToolConfig()\r
-        # parse platform/module_build_path.txt\r
-        \r
-        # active toolchain\r
-        # print self.TargetConfig\r
-        self.ActiveToolchain = self.TargetConfig["TOOL_CHAIN_TAG"]\r
-        if self.ActiveToolchain not in self.ToolConfig.Toolchains:\r
-            raise "Not supported tool chain tag %s" % self.ActiveToolchain\r
-\r
-        # active toolchain family\r
-        self.ActiveFamilies = []\r
-        for key in self.ToolConfig:\r
-            if self.ActiveToolchain in key and  "FAMILY" in key:\r
-                family = self.ToolConfig[key]\r
-                if family not in self.ActiveFamilies:\r
-                    self.ActiveFamilies.append(family)\r
-\r
-\r
-    def ParsePackage(self, packagePaths=None):\r
-        if packagePaths == None:\r
-            return\r
-        \r
-        for packagePath in packagePaths:\r
-            self.Packages.append(PackageSurfaceArea(self, packagePath))\r
-    \r
-    def ParsePlatform(self, platformPaths=None):\r
-        # Only one active platform is allowed\r
-        activePlatformPath = ""\r
-        if self.TargetConfig["ACTIVE_PLATFORM"] == "":\r
-            if platformPaths != None and len(platformPaths) == 1:\r
-                activePlatformPath = platformPaths[0]\r
-            else:\r
-                raise Exception("No active platform specified or implied!")\r
-        else:\r
-            activePlatformPath = os.path.normpath(self.TargetConfig["ACTIVE_PLATFORM"])\r
-\r
-        self.ActivePlatform = PlatformSurfaceArea(self, activePlatformPath)\r
-        self.Platforms.append(self.ActivePlatform)\r
-        \r
-    def ParseTargetConfig(self):\r
-        self.TargetConfig = BuildConfig.TargetConfig(self.SubPath(self._Target))\r
-        # print self.TargetConfig\r
-\r
-    def ParseToolConfig(self):\r
-        self.ToolConfig = BuildConfig.ToolConfig(self.SubPath(self.TargetConfig["TOOL_CHAIN_CONF"]))\r
-\r
-    def GetModule(self, guid, version, packageGuid, packageVersion):\r
-        moduleGuidIndex = self.ModuleXref["GUID"]\r
-        if guid not in moduleGuidIndex:\r
-            print "! No module has GUID=" + guid\r
-            return ""\r
-\r
-        moduleVersionList = moduleGuidIndex[guid]\r
-        # print moduleVersionList\r
-        moduleList = []\r
-        module = ""\r
-        if version != "":\r
-            if version in moduleVersionList:\r
-                moduleList = moduleVersionList[version]\r
-            else:\r
-                return ""\r
-        else:\r
-            ## no version given, return the first one\r
-            version = "0.0"\r
-            for ver in moduleVersionList:\r
-                if ver > version: version = ver\r
-            moduleList = moduleVersionList[version]\r
-\r
-        if packageGuid == "":\r
-            ## if no package GUID given, just return the latest one\r
-            version = "0.0"\r
-            for m in moduleList:\r
-                if m.Package.Version > version:\r
-                    version = m.Package.Version\r
-                    module = m\r
-        else:\r
-            version = "0.0"\r
-            for m in moduleList:\r
-                if m.Package.GuidValue != packageGuid: continue\r
-                if packageVersion == "":\r
-                    ## if no version given, just return the latest\r
-                    if m.Package.Version > version:\r
-                        version = m.Package.Version\r
-                        module = m\r
-                elif packageVersion == m.Package.Version:\r
-                    module = m\r
-                    break;\r
-\r
-        return module\r
-\r
-    def GetModuleByPath(self, path):\r
-        ownerPackage = ""\r
-        ownerPackageFullPath = ""\r
-        for package in self.Packages:\r
-            ownerPackageFullPath = self.SubPath(package.Path)\r
-            if path.startswith(packageFullPath): break\r
-\r
-        if ownerPackage == "":\r
-            return ""\r
-        \r
-        for module in ownerPackage.Modules:\r
-            moduleFullPath = os.path.join(ownerPackageFullPath, module.Path)\r
-            if moduleFullPath == path:\r
-                return module\r
-            \r
-        return ""\r
-            \r
-    def GetPackage(self, guid, version):\r
-        packageGuidIndex = self.PackageXref["GUID"]\r
-        if guid not in packageGuidIndex:\r
-            # raise Exception("No package has GUID=" + guid)\r
-            return ""\r
-        \r
-        packageList = packageGuidIndex[guid]\r
-        package = ""\r
-        if version != "":\r
-            if version in packageList:\r
-                package = packageList[version]\r
-        else:\r
-            ## no version given, return the latest one\r
-            version = "0.0"\r
-            for ver in packageList:\r
-                if ver > version: version = ver\r
-            package = packageList[version]\r
-\r
-        return package\r
-\r
-    def GetPlatform(self, guid, version):\r
-        pass\r
-    \r
-    def GetPlatformByPath(self, path):\r
-        for platform in self.Platforms:\r
-            platformFullPath = self.SubPath(platform.Path)\r
-            if platformFullPath == path:\r
-                return platform\r
-        return ""\r
-\r
-    def GetLibraryInterface(self, name, package):\r
-        if name not in self.LibraryInterfaceXref["NAME"]:\r
-            return ""\r
-        liList = self.LibraryInterfaceXref["NAME"][name]\r
-        for li in liList:\r
-            if li.Package == package:\r
-                return li\r
-        return ""\r
-    \r
-    def SubPath(self, *relativePathList):\r
-        return os.path.normpath(os.path.join(self.Path, *relativePathList))\r
-        \r
-    def SetupCrossRef(self):\r
-        ##\r
-        ## setup platform cross reference as nest-dict\r
-        ##      guid -> {version -> platform}\r
-        ##\r
-        ##        platformList = self.Platforms\r
-        ##        for p in platformList:\r
-        ##            guid = p.GuidValue\r
-        ##            version = p.Version\r
-        ##            if guid not in self.PlatformIndex:\r
-        ##                self.PlatformIndex[guid] = {}\r
-        ##            if version in self.PlatformIndex[guid]:\r
-        ##                raise Exception("Duplicate platform")\r
-        ##            self.PlatformIndex[guid][version] = p\r
-\r
-        ##\r
-        ## setup package cross reference as nest-dict\r
-        ##      guid -> {version -> package}\r
-        ##      name -> [package list]\r
-        ##      path -> package\r
-        ##\r
-        packageList = self.Packages\r
-        for p in packageList:\r
-            guid = p.GuidValue\r
-            version = p.Version\r
-            packageGuidIndex = self.PackageXref["GUID"]\r
-            if guid not in packageGuidIndex:\r
-                packageGuidIndex[guid] = {}\r
-            if version in packageGuidIndex[guid]:\r
-                raise Exception("Duplicate package: %s-%s [%s]" % p.Name, version, guid)\r
-            packageGuidIndex[guid][version] = p\r
-            \r
-            packageNameIndex = self.PackageXref["NAME"]\r
-            name = p.Name\r
-            if name not in packageNameIndex:\r
-                packageNameIndex[name] = []\r
-            packageNameIndex[name].append(p)\r
-            \r
-            packagePathIndex = self.PackageXref["PATH"]\r
-            path = p.Path\r
-            if path in packagePathIndex:\r
-                raise Exception("Duplicate package: %s %s" % p.Name, p.Path)\r
-            packagePathIndex[path] = p.Path\r
-\r
-            ##\r
-            ## setup library class cross reference as\r
-            ##      library class name -> library class object\r
-            ##\r
-            for lcname in p.LibraryInterfaces:\r
-                if lcname not in self.LibraryInterfaceXref["NAME"]:\r
-                    # raise Exception("Duplicate library class: %s in package %s" % (lcname, name))\r
-                    self.LibraryInterfaceXref["NAME"][lcname] = []\r
-                lcInterface = p.LibraryInterfaces[lcname]\r
-                self.LibraryInterfaceXref["NAME"][lcname].append(lcInterface)\r
-                \r
-                lcHeader = p.SubPath(lcInterface.Path)\r
-                if lcHeader not in self.LibraryInterfaceXref["PATH"]:\r
-                    # raise Exception("Duplicate library class interface: %s in package %s" % (lcInterface, name))\r
-                    self.LibraryInterfaceXref["PATH"][lcHeader] = []\r
-                self.LibraryInterfaceXref["PATH"][lcHeader].append(lcInterface)\r
-\r
-        ##\r
-        ## setup package cross reference as nest-dict\r
-        ##  guid -> {version -> [module list]}\r
-        ##  name -> [module list]\r
-        ##  path -> module\r
-        for p in packageList:\r
-            p.ParseMsaFile()\r
-            \r
-            moduleList = p.Modules\r
-            for m in moduleList:\r
-                name = m.Name\r
-                path = m.Path\r
-                guid = m.GuidValue\r
-                version = m.Version\r
-                moduleGuidIndex = self.ModuleXref["GUID"]\r
-                if guid not in moduleGuidIndex:\r
-                    moduleGuidIndex[guid] = {}\r
-                else:\r
-                    print "! Duplicate module GUID found:", guid, p.SubPath(path)\r
-                    dm = moduleGuidIndex[guid].values()[0][0]\r
-                    print "                              ", dm.GuidValue,\\r
-                                                    dm.Package.SubPath(dm.Path)\r
-\r
-                if version not in moduleGuidIndex[guid]:\r
-                    moduleGuidIndex[guid][version] = []\r
-                if m in moduleGuidIndex[guid][version]:\r
-                    raise Exception("Duplicate modules in the same package: %s-%s [%s]" % (name, version, guid))\r
-                moduleGuidIndex[guid][version].append(m)\r
-                \r
-                modulePathIndex = self.ModuleXref["PATH"]\r
-                path = p.SubPath(m.Path)\r
-                if path in modulePathIndex:\r
-                    raise Exception("Duplicate modules in the same package: %s %s" % (name, path))\r
-                modulePathIndex[path] = m\r
-                \r
-                moduleNameIndex = self.ModuleXref["NAME"]\r
-                if name not in moduleNameIndex:\r
-                    moduleNameIndex[name] = []\r
-                moduleNameIndex[name].append(m)\r
-\r
-    def GetToolDef(self, toolchain, target, arch, toolcode, attr):\r
-        return self.ToolConfig[(toolchain, target, arch, toolcode, attr)]\r
-    \r
-    def Parse(self):\r
-        self.ParseConfig()\r
-        self.ParseWorkspaceDatabase()\r
-\r
-    def SetupBuild(self):\r
-        # active archs\r
-        self.ActiveArchs = self.TargetConfig["TARGET_ARCH"].split()\r
-        if self.ActiveArchs == []:\r
-            self.ActiveArchs = self.ActivePlatform.Archs\r
-\r
-        # active targets\r
-        self.ActiveTargets = self.TargetConfig["TARGET"].split()\r
-        if self.ActiveTargets == []:\r
-            self.ActiveTargets = self.ActivePlatform.Targets\r
-\r
-\r
-        # active modules\r
-        for msa in self._Elements["ModuleList"]:\r
-            module = self.GetModuleByPath(msa)\r
-            if module == "":\r
-                raise Exception(msa + " is not in any package!")\r
-            self.ActiveModules.append(module)\r
-            self.IndividualModuleBuild = True\r
-        if self.TargetConfig["MULTIPLE_THREAD"].upper() == "ENABLE":\r
-            self.MultiThreadBuild = True\r
-            if "MAX_CONCURRENT_THREAD_NUMBER" in self.TargetConfig:\r
-                self.ThreadCount = self.TargetConfig["MAX_CONCURRENT_THREAD_NUMBER"]\r
-        else:\r
-            self.ThreadCount = "1"\r
-\r
-    def Postprocess(self):\r
-        self.ParsePackage(self._Elements["PackageList"])\r
-        self.SetupCrossRef()\r
-        self.ParsePlatform(self._Elements["PlatformList"])\r
-        self.SetupBuild()\r
-\r
-##    def SetupEnvironment(self):\r
-##        config = BuildConfig.Config(self.SubPath(self._PlatformBuildPath))\r
-##        for name in config:\r
-##            self.Environment[name] = config[name]\r
-##\r
-##        config = BuildConfig.Config(self.SubPath(self._ModuleBuildPath))\r
-##        for name in config:\r
-##            self.Environment[name] = config[name]\r
-##\r
-##        multiThread = self.TargetConfig["MULTIPLE_THREAD"].upper()\r
-##        threadNumber = self.TargetConfig["MAX_CONCURRENT_THREAD_NUMBER"]\r
-##        if multiThread == "" or multiThread == "FALSE":\r
-##            self.Environment["MULTIPLE_THREAD"] = False\r
-##            self.Environment["MAX_CONCURRENT_THREAD_NUMBER"] = 1\r
-##        else:\r
-##            self.Environment["MULTIPLE_THREAD"] = True\r
-##            if threadNumber != "":\r
-##                self.Environment["MAX_CONCURRENT_THREAD_NUMBER"] = threadNumber\r
-##            else:\r
-##                self.Environment["MAX_CONCURRENT_THREAD_NUMBER"] = 2\r
-\r
-class PackageSurfaceArea(FrameworkElement.Package, SurfaceAreaElement):\r
-    def __init__(self, workspace, path):\r
-        FrameworkElement.Package.__init__(self)\r
-        \r
-        self.Path = os.path.normpath(path)\r
-        self.Dir  = os.path.dirname(self.Path)\r
-        SurfaceAreaElement.__init__(self, workspace, workspace, None, True, True)\r
-        \r
-    def _SpdHeader(self, xpath):\r
-        dom = XmlNode(self._Root, xpath)\r
-        self.Name = XmlElementData(XmlNode(dom, "/SpdHeader/PackageName"))\r
-        self.GuidValue = XmlElementData(XmlNode(dom, "/SpdHeader/GuidValue")).upper()\r
-        self.Version = XmlElementData(XmlNode(dom, "/SpdHeader/Version"))\r
-\r
-    def _PackageDefinitions(self, xpath):\r
-        dom = XmlNode(self._Root, xpath)\r
-        self.ReadOnly = XmlElementData(XmlNode(dom, "/PackageDefinitions/ReadOnly"))\r
-        self.Repackage = XmlElementData(XmlNode(dom, "/PackageDefinitions/RePackage"))\r
-\r
-    def _LibraryClassDeclarations(self, xpath):\r
-        dom = XmlNode(self._Root, xpath)\r
-        lcdList = XmlList(dom, "/LibraryClassDeclarations/LibraryClass")\r
-        lcds = []\r
-        for lc in lcdList:\r
-            lcds.append(LibraryDeclaration(self._Workspace, self, lc))\r
-        self._Elements["LibraryClassDeclarations"] = lcds\r
-        \r
-    def _IndustryStdIncludes(self, xpath):\r
-        dom = XmlNode(self._Root, xpath)\r
-        headerList = XmlList(dom, "/IndustryStdIncludes/IndustryStdHeader")\r
-        headers = []\r
-        for h in headerList:\r
-            headers.append(IndustryStdHeader(self._Workspace, self, h))\r
-        self._Elements["IndustryStdIncludes"] = headers\r
-        \r
-    def _MsaFiles(self, xpath):\r
-        dom = XmlNode(self._Root, xpath)\r
-        msaFileList = XmlList(dom, "/MsaFiles/Filename")\r
-        msaFiles = []\r
-        for msa in msaFileList:\r
-            filePath = os.path.normpath(XmlElementData(msa))\r
-            msaFiles.append(filePath)\r
-        self._Elements["MsaFiles"] = msaFiles\r
-\r
-    def _PackageHeaders(self, xpath):\r
-        dom = XmlNode(self._Root, xpath)\r
-        headerList = XmlList(dom, "/PackageHeaders/IncludePkgHeader")\r
-        headers = []\r
-        for h in headerList:\r
-            headers.append(PackageHeader(self._Workspace, self, h))\r
-        self._Elements["PackageHeaders"] = headers\r
-\r
-    def _GuidDeclarations(self, xpath):\r
-        dom = XmlNode(self._Root, xpath)\r
-        guidList = XmlList(dom, "/GuidDeclarations/Entry")\r
-        guids = []\r
-        for guid in guidList:\r
-            guids.append(GuidDeclaration(self._Workspace, self, guid))\r
-        self._Elements["GuidDeclarations"] = guids\r
-            \r
-    def _ProtocolDeclarations(self, xpath):\r
-        dom = XmlNode(self._Root, xpath)\r
-        protocolList = XmlList(dom, "/ProtocolDeclarations/Entry")\r
-        protocols = []\r
-        for p in protocolList:\r
-            protocols.append(ProtocolDeclaration(self._Workspace, self, p))\r
-        self._Elements["ProtocolDeclarations"] = protocols\r
-\r
-    def _PpiDeclarations(self, xpath):\r
-        dom = XmlNode(self._Root, xpath)\r
-        ppiList = XmlList(dom, "/PpiDeclarations/Entry")\r
-        ppis = []\r
-        for p in ppiList:\r
-            ppis.append(PpiDeclaration(self._Workspace, self, p))\r
-        self._Elements["PpiDeclarations"] = ppis\r
-\r
-    def _PcdDeclarations(self, xpath):\r
-        dom = XmlNode(self._Root, xpath)\r
-        pcdList = XmlList(dom, "/PcdDeclarations/PcdEntry")\r
-        pcds = []\r
-        for p in pcdList:\r
-            pcds.append(PcdDeclaration(self._Workspace, self, p))\r
-        self._Elements["PcdDeclarations"] = pcds\r
-\r
-    def SubPath(self, *relativePathList):\r
-        return os.path.normpath(os.path.join(self.Dir, *relativePathList))\r
-\r
-    def Parse(self):\r
-        self._Root = xml.dom.minidom.parse(self._Workspace.SubPath(self.Path))\r
-        assert self._Root.documentElement.tagName == "PackageSurfaceArea"\r
-\r
-        # print "Parsing...",self.Path\r
-        self._SpdHeader("/PackageSurfaceArea/SpdHeader")\r
-        self._PackageDefinitions("/PackageSurfaceArea/PackageDefinitions")\r
-        self._LibraryClassDeclarations("/PackageSurfaceArea/LibraryClassDeclarations")\r
-        self._IndustryStdIncludes("/PackageSurfaceArea/IndustryStdIncludes")\r
-        self._MsaFiles("/PackageSurfaceArea/MsaFiles")\r
-        self._PackageHeaders("/PackageSurfaceArea/PackageHeaders")\r
-        self._GuidDeclarations("/PackageSurfaceArea/GuidDeclarations")\r
-        self._ProtocolDeclarations("/PackageSurfaceArea/ProtocolDeclarations")\r
-        self._PpiDeclarations("/PackageSurfaceArea/PpiDeclarations")\r
-        self._PcdDeclarations("/PackageSurfaceArea/PcdDeclarations")\r
-        \r
-    def Postprocess(self):\r
-        # setup guid, protocol, ppi\r
-        for guid in self._Elements["GuidDeclarations"]:\r
-            if guid.CName in self.Guids:\r
-                print "! Duplicate GUID CName (%s) in package %s" % (guid.CName, self.Path)\r
-            self.Guids[guid.CName] = guid\r
-        \r
-        for protocol in self._Elements["ProtocolDeclarations"]:\r
-            if protocol.CName in self.Protocols:\r
-                print "! Duplicate Protocol CName (%s) in package %s" % (protocol.CName, self.Path)\r
-            self.Protocols[protocol.CName] = protocol\r
-\r
-        for ppi in self._Elements["PpiDeclarations"]:\r
-            if ppi.CName in self.Ppis:\r
-                print "! Duplicate PPI CName (%s) in package (%s)" % (ppi.CName, self.Path)\r
-            self.Ppis[ppi.CName] = ppi\r
-            \r
-        # package header\r
-        for inc in self._Elements["PackageHeaders"]:\r
-            if inc.ModuleType not in self.PackageIncludes:\r
-                self.PackageIncludes[inc.ModuleType] = []\r
-            self.PackageIncludes[inc.ModuleType].append(inc.Path)\r
-                \r
-        # library class\r
-        for lcd in self._Elements["LibraryClassDeclarations"]:\r
-            if lcd.Name in self.LibraryInterfaces:\r
-                raise "Duplicate library class: " + lcd.Name\r
-            self.LibraryInterfaces[lcd.Name] = lcd\r
-        \r
-        # parse mas files\r
-        # self.ParseMsaFile()\r
-        # resolve RecommendedInstance\r
-\r
-    def ParseMsaFile(self):\r
-        for msaFilePath in self._Elements["MsaFiles"]:\r
-            self.Modules.append(ModuleSurfaceArea(self._Workspace, self, msaFilePath))\r
-\r
-class PlatformSurfaceArea(FrameworkElement.Platform, SurfaceAreaElement):\r
-    def __init__(self, workspace, path):\r
-        FrameworkElement.Platform.__init__(self)\r
-\r
-        self.Path = os.path.normpath(path)\r
-        self.Dir  = os.path.dirname(self.Path)\r
-        SurfaceAreaElement.__init__(self, workspace)\r
-        \r
-    def _PlatformHeader(self, xpath):\r
-        dom = XmlNode(self._Root, xpath)\r
-        if dom == '': return\r
-        self.Name = XmlElementData(XmlNode(dom, "/PlatformHeader/PlatformName"))\r
-        self.GuidValue = XmlElementData(XmlNode(dom, "/PlatformHeader/GuidValue")).upper()\r
-        self.Version = XmlElementData(XmlNode(dom, "/PlatformHeader/Version"))\r
-\r
-    def _PlatformDefinitions(self, xpath):\r
-        dom = XmlNode(self._Root, xpath)\r
-        if dom == '': return\r
-        self.Archs = XmlElementData(XmlNode(dom, "/PlatformDefinitions/SupportedArchitectures")).split()\r
-        if self.Archs == []:\r
-            raise Exception("No ARCH specified in platform " + self.Path)\r
-        self.Targets = XmlElementData(XmlNode(dom, "/PlatformDefinitions/BuildTargets")).split()\r
-        self.OutputPath = os.path.normpath(XmlElementData(XmlNode(dom, "/PlatformDefinitions/OutputDirectory")))\r
-\r
-    def _Flash(self, xpath):\r
-        dom = XmlNode(self._Root, xpath)\r
-        if dom == '': return\r
-\r
-    def _FrameworkModules(self, xpath):\r
-        dom = XmlNode(self._Root, xpath)\r
-        if dom == '': return\r
-        moduleList = XmlList(dom, "/FrameworkModules/ModuleSA")\r
-        modules = []\r
-        for m in moduleList:\r
-            modules.append(PlatformModule(self._Workspace, self, m))\r
-        self._Elements["FrameworkModules"] = modules\r
-\r
-    def _DynamicPcdBuildDefinitions(self, xpath):\r
-        dom = XmlNode(self._Root, xpath)\r
-        if dom == '': return\r
-\r
-    def _BuildOptions(self, xpath):\r
-        dom = XmlNode(self._Root, xpath)\r
-        if dom == '': return\r
-        self.BuildOptions = self.GetBuildOptionList(XmlNode(dom, "/BuildOptions/Options"))\r
-        # print self.BuildOptions\r
-\r
-    def _UserExtensions(self, xpath):\r
-        domList = XmlList(self._Root, xpath)\r
-        if domList == []: return\r
-        for extension in domList:\r
-            userId = XmlAttribute(extension, "UserID")\r
-            identifier = XmlAttribute(extension, "Identifier")\r
-            \r
-            if userId == '' or identifier == '':\r
-                raise Exception("No UserId or Identifier specified")\r
-            if userId != "TianoCore": continue\r
-            if identifier not in self.UserExtensions:\r
-                self.UserExtensions[identifier] = []\r
-                \r
-            contentList = self.UserExtensions[identifier]\r
-            for node in extension.childNodes:\r
-                # print node.nodeType\r
-                contentList.append(node.cloneNode(True))\r
-\r
-    def Parse(self):\r
-        self._Root = xml.dom.minidom.parse(self._Workspace.SubPath(self.Path))\r
-        assert self._Root.documentElement.tagName == "PlatformSurfaceArea"\r
-\r
-        self._PlatformHeader("/PlatformSurfaceArea/PlatformHeader")\r
-        self._PlatformDefinitions("/PlatformSurfaceArea/PlatformDefinitions")\r
-        self._Flash("/PlatformSurfaceArea/Flash")\r
-        self._FrameworkModules("/PlatformSurfaceArea/FrameworkModules")\r
-        self._DynamicPcdBuildDefinitions("/PlatformSurfaceArea/DynamicPcdBuildDefinitions")\r
-        self._BuildOptions("/PlatformSurfaceArea/BuildOptions")\r
-        self._UserExtensions("/PlatformSurfaceArea/UserExtensions")\r
-\r
-    def Postprocess(self):\r
-        # summarize all library modules for build\r
-        for module in self._Elements["FrameworkModules"]:\r
-            for arch in module.Archs:\r
-                if arch not in self.Modules:\r
-                    self.Modules[arch] = []\r
-                self.Modules[arch].append(module)\r
-\r
-                if arch not in self.Libraries:\r
-                    self.Libraries[arch] = []\r
-                for li in module.Libraries:\r
-                    if li in self.Libraries[arch]: continue\r
-                    self.Libraries[arch].append(li)\r
-\r
-                # FV\r
-            for fvName in module.FvBindings:\r
-                if fvName not in self.Fvs:\r
-                    self.Fvs[fvName] = []\r
-                self.Fvs[fvName].append(module)\r
-        # build options\r
-        # user extension\r
-    \r
-##    def SetupEnvironment(self):\r
-##        self.Environment["PLATFORM"] = self.Name\r
-##        self.Environment["PLATFORM_GUID"] = self.GuidValue\r
-##        self.Environment["PLATFORM_VERSION"] = self.Version\r
-##        self.Environment["PLATFORM_RELATIVE_DIR"] = self.Path\r
-##        self.Environment["PLATFORM_OUTPUT_DIR"] = self.OutputPath\r
-\r
-def PrintWorkspace(ws):\r
-    print "\nPlatforms:\n"\r
-    for guid in ws.PlatformXref["GUID"]:\r
-        for ver in ws.PlatformXref["GUID"][guid]:\r
-            platform = ws.PlatformXref["GUID"][guid][ver]\r
-            print "  %s %s-%s" % (guid, platform.Name, ver)\r
-            for pm in platform.Modules:\r
-                print "     %-40s %-10s <%s-%s>" % (pm.Module.Name+"-"+pm.Module.Version,\r
-                ListString(pm.Archs), pm.Module.Package.Name,\r
-                pm.Module.Package.Version)\r
-                for li in pm.Libraries:\r
-                    print "         %-47s <%s-%s>" % (li.Module.Name+"-"+li.Module.Version,\r
-                        li.Module.Package.Name, li.Module.Package.Version)\r
-            print ""\r
-            \r
-    print "\nPackages:\n"\r
-    for guid in ws.PackageXref["GUID"]:\r
-        for ver in ws.PackageXref["GUID"][guid]:\r
-            print "  %s %s-%s" % (guid, ws.PackageXref["GUID"][guid][ver].Name, ver)\r
-\r
-    print "\nModules:\n"\r
-    for guid in ws.ModuleXref["GUID"]:\r
-        for ver in ws.ModuleXref["GUID"][guid]:\r
-            for module in ws.ModuleXref["GUID"][guid][ver]:\r
-                print "  %s %-40s [%s-%s]" % (guid, module.Name+"-"+ver, module.Package.Name, module.Package.Version)\r
-                print "      Depending on packages:"\r
-                for arch in module.IncludePaths:\r
-                    print "         ", arch, ":"\r
-                    for path in module.IncludePaths[arch]:\r
-                        print "          ", path\r
-                print "\n"\r
-\r
-                for arch in module.IncludeFiles:\r
-                    print "         ", arch, ":"\r
-                    for path in module.IncludeFiles[arch]:\r
-                        print "          ", path\r
-                print "\n"\r
-                \r
-                print "      Source files:"\r
-                for arch in module.SourceFiles:\r
-                    print "         ", arch, ":"\r
-                    for type in module.SourceFiles[arch]:\r
-                        for src in module.SourceFiles[arch][type]:\r
-                            print "            %-40s (%s)" % (src.Path, src.Type)\r
-                print "\n"\r
-    print "\nLibrary Classes:"\r
-    for name in ws.LibraryInterfaceXref["NAME"]:\r
-        lcList = ws.LibraryInterfaceXref["NAME"][name]\r
-        for lc in lcList:\r
-            pkgPath = os.path.dirname(lc.Package.Path)\r
-            print "\n  [%s] <%s>" % (lc.Name, pkgPath + os.path.sep + lc.Path)\r
-\r
-            print "    Produced By:"\r
-            for li in lc.Instances:\r
-                print "      %-40s <%s>" % (li.Name+"-"+li.Version, li.Package.SubPath(li.Path))\r
-\r
-            print "    Consumed By:"\r
-            for li in lc.Consumers:\r
-                print "      %-40s <%s>" % (li.Name+"-"+li.Version, li.Package.SubPath(li.Path))\r
-\r
-    print "\nActive Platform:"\r
-    for arch in ws.ActivePlatform.Libraries:\r
-        print "  Library Instances (%s) (%d libraries)" % (arch , len(ws.ActivePlatform.Libraries[arch]))\r
-        for li in ws.ActivePlatform.Libraries[arch]:\r
-            print "    %s-%s (%s-%s)" % (li.Module.Name, li.Module.Version,\r
-                li.Module.Package.Name, li.Module.Package.Version)\r
-\r
-    for arch in ws.ActivePlatform.Modules:\r
-        print "  Driver Modules (%s) (%d modules)" % (arch, len(ws.ActivePlatform.Modules[arch]))\r
-        for m in ws.ActivePlatform.Modules[arch]:\r
-            print "    %s-%s (%s-%s)" % (m.Module.Name, m.Module.Version,\r
-                m.Module.Package.Name, m.Module.Package.Version)\r
-\r
-    for fv in ws.ActivePlatform.Fvs:\r
-        print\r
-        print "  Firmware Volume (%s) (%d modules)" % (fv, len(ws.ActivePlatform.Fvs[fv]))\r
-        for m in ws.ActivePlatform.Fvs[fv]:\r
-            print "    %s-%s (%s-%s)" % (m.Module.Name, m.Module.Version,\r
-                m.Module.Package.Name, m.Module.Package.Version)\r
-\r
-# for test\r
-if __name__ == "__main__":\r
-    # os.environ["WORKSPACE"]\r
-    workspacePath = os.getenv("WORKSPACE", os.getcwd())\r
-    saFile = ""\r
-    if len(sys.argv) <= 1:\r
-        saFile = os.path.join(workspacePath, "Tools/Conf/FrameworkDatabase.db")\r
-    else:\r
-        saFile = sys.argv[1]\r
-\r
-    print "Parsing ... %s\n" % saFile\r
-\r
-    startTime = time.clock()\r
-    sa = Workspace(workspacePath, [], [])\r
-    # sa = PackageSurfaceArea(saFile)\r
-    # sa = PlatformSurfaceArea(saFile)\r
-    # sa = ModuleSurfaceArea(saFile)\r
-    # print sa\r
-    \r
-    PrintWorkspace(sa)\r
-    print "\n[Finished in %fs]" % (time.clock() - startTime)\r
-\r