--- /dev/null
+## @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