]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/GenFds/DepexSection.py
Check In tool source code based on Build tool project revision r1655.
[mirror_edk2.git] / BaseTools / Source / Python / GenFds / DepexSection.py
diff --git a/BaseTools/Source/Python/GenFds/DepexSection.py b/BaseTools/Source/Python/GenFds/DepexSection.py
new file mode 100644 (file)
index 0000000..1c8c82a
--- /dev/null
@@ -0,0 +1,102 @@
+## @file\r
+# process depex section generation\r
+#\r
+#  Copyright (c) 2007, Intel Corporation\r
+#\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
+\r
+##\r
+# Import Modules\r
+#\r
+import Section\r
+from GenFdsGlobalVariable import GenFdsGlobalVariable\r
+import subprocess\r
+from Ffs import Ffs\r
+import os\r
+from CommonDataClass.FdfClass import DepexSectionClassObject\r
+from AutoGen.GenDepex import DependencyExpression\r
+import shutil\r
+from Common import EdkLogger\r
+from Common.BuildToolError import *\r
+\r
+## generate data section\r
+#\r
+#\r
+class DepexSection (DepexSectionClassObject):\r
+    ## The constructor\r
+    #\r
+    #   @param  self        The object pointer\r
+    #\r
+    def __init__(self):\r
+        DepexSectionClassObject.__init__(self)\r
+\r
+    def __FindGuidValue(self, CName):\r
+        for Arch in GenFdsGlobalVariable.ArchList:\r
+            for PkgDb in GenFdsGlobalVariable.WorkSpace.PackageList:\r
+                if CName in PkgDb.Ppis:\r
+                    return PkgDb.Ppis[CName]\r
+                if CName in PkgDb.Protocols:\r
+                    return PkgDb.Protocols[CName]\r
+                if CName in PkgDb.Guids:\r
+                    return PkgDb.Guids[CName]\r
+        return None\r
+\r
+    ## GenSection() method\r
+    #\r
+    #   Generate compressed section\r
+    #\r
+    #   @param  self        The object pointer\r
+    #   @param  OutputPath  Where to place output file\r
+    #   @param  ModuleName  Which module this section belongs to\r
+    #   @param  SecNum      Index of section\r
+    #   @param  KeyStringList  Filter for inputs of section generation\r
+    #   @param  FfsInf      FfsInfStatement object that contains this section data\r
+    #   @param  Dict        dictionary contains macro and its value\r
+    #   @retval tuple       (Generated file name list, section alignment)\r
+    #\r
+    def GenSection(self, OutputPath, ModuleName, SecNum, keyStringList, FfsFile = None, Dict = {}):\r
+\r
+        self.Expression = self.Expression.replace("\n", " ").replace("\r", " ")\r
+        ExpList = self.Expression.split()\r
+        ExpGuidDict = {}\r
+\r
+        for Exp in ExpList:\r
+            if Exp.upper() not in ('AND', 'OR', 'NOT', 'TRUE', 'FALSE', 'SOR', 'BEFORE', 'AFTER', 'END'):\r
+                GuidStr = self.__FindGuidValue(Exp)\r
+                if GuidStr == None:\r
+                    EdkLogger.error("GenFds", RESOURCE_NOT_AVAILABLE,\r
+                                    "Depex GUID %s could not be found in build DB! (ModuleName: %s)" % (Exp, ModuleName))\r
+\r
+                ExpGuidDict[Exp] = GuidStr\r
+\r
+        for Item in ExpGuidDict:\r
+            self.Expression = self.Expression.replace(Item, ExpGuidDict[Item])\r
+\r
+        self.Expression = self.Expression.strip()\r
+        ModuleType = (self.DepexType.startswith('PEI') and ['PEIM'] or ['DXE_DRIVER'])[0]\r
+        if self.DepexType.startswith('SMM'):\r
+            ModuleType = 'SMM_DRIVER'\r
+        InputFile = os.path.join (OutputPath, ModuleName + 'SEC' + SecNum + '.dpx')\r
+        InputFile = os.path.normpath(InputFile)\r
+\r
+        Dpx = DependencyExpression(self.Expression, ModuleType)\r
+        Dpx.Generate(InputFile)\r
+\r
+        OutputFile = os.path.join (OutputPath, ModuleName + 'SEC' + SecNum + '.depex')\r
+        if self.DepexType.startswith('SMM'):\r
+            OutputFile = os.path.join (OutputPath, ModuleName + 'SEC' + SecNum + '.smm')\r
+        OutputFile = os.path.normpath(OutputFile)\r
+        SecType = (self.DepexType.startswith('PEI') and ['PEI_DEPEX'] or ['DXE_DEPEX'])[0]\r
+        if self.DepexType.startswith('SMM'):\r
+            SecType = 'SMM_DEPEX'\r
+        \r
+        GenFdsGlobalVariable.GenerateSection(OutputFile, [InputFile], Section.Section.SectionType.get (SecType))\r
+        FileList = [OutputFile]\r
+        return FileList, self.Alignment\r