]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Scripts/PackageDocumentTools/plugins/EdkPlugins/edk2/model/inf.py
BaseTools: Add PackageDocumentTools into Scripts folder
[mirror_edk2.git] / BaseTools / Scripts / PackageDocumentTools / plugins / EdkPlugins / edk2 / model / inf.py
diff --git a/BaseTools/Scripts/PackageDocumentTools/plugins/EdkPlugins/edk2/model/inf.py b/BaseTools/Scripts/PackageDocumentTools/plugins/EdkPlugins/edk2/model/inf.py
new file mode 100644 (file)
index 0000000..9d70fbc
--- /dev/null
@@ -0,0 +1,341 @@
+## @file\r
+#\r
+# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>\r
+#\r
+# This program and the accompanying materials are licensed and made available\r
+# under the terms and conditions of the BSD License which accompanies this\r
+# 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
+import plugins.EdkPlugins.basemodel.ini as ini\r
+import re, os\r
+from plugins.EdkPlugins.basemodel.message import *\r
+\r
+class INFFile(ini.BaseINIFile):\r
+    _libobjs = {}\r
+\r
+    def GetSectionInstance(self, parent, name, isCombined=False):\r
+        return INFSection(parent, name, isCombined)\r
+\r
+    def GetProduceLibraryClass(self):\r
+        obj = self.GetDefine("LIBRARY_CLASS")\r
+        if obj == None: return None\r
+\r
+        return obj.split('|')[0].strip()\r
+\r
+    def GetSectionObjectsByName(self, name, arch=None):\r
+        arr = []\r
+        sects = self.GetSectionByName(name)\r
+        for sect in sects:\r
+            # skip unmatched archtecture content\r
+            if not sect.IsArchMatch(arch):\r
+                continue\r
+\r
+            for obj in sect.GetObjects():\r
+                arr.append(obj)\r
+\r
+        return arr\r
+\r
+    def GetSourceObjects(self, arch=None, tool=None):\r
+        arr = []\r
+        sects = self.GetSectionByName('sources')\r
+        for sect in sects:\r
+            # skip unmatched archtecture content\r
+            if not sect.IsArchMatch(arch):\r
+                continue\r
+\r
+            for obj in sect.GetObjects():\r
+                if not obj.IsMatchFamily(tool):\r
+                    continue\r
+                arr.append(obj)\r
+\r
+        return arr\r
+\r
+    def Parse(self):\r
+        if not ini.BaseINIFile.Parse(self):\r
+            return False\r
+        classname = self.GetProduceLibraryClass()\r
+        if classname != None:\r
+            libobjdict = INFFile._libobjs\r
+            if libobjdict.has_key(classname):\r
+                if self not in libobjdict[classname]:\r
+                    libobjdict[classname].append(self)\r
+            else:\r
+                libobjdict[classname] = [self]\r
+\r
+        return True\r
+\r
+    def GetBaseName(self):\r
+        return self.GetDefine("BASE_NAME").strip()\r
+\r
+    def GetModuleRootPath(self):\r
+        return os.path.dirname(self.GetFilename())\r
+\r
+    def Clear(self):\r
+        classname = self.GetProduceLibraryClass()\r
+        if classname != None:\r
+            libobjdict = INFFile._libobjs\r
+            libobjdict[classname].remove(self)\r
+            if len(libobjdict[classname]) == 0:\r
+                del libobjdict[classname]\r
+        ini.BaseINIFile.Clear(self)\r
+\r
+\r
+class INFSection(ini.BaseINISection):\r
+    def GetSectionINIObject(self, parent):\r
+        type = self.GetType()\r
+\r
+        if type.lower() == 'libraryclasses':\r
+            return INFLibraryClassObject(self)\r
+        if type.lower() == 'sources':\r
+            return INFSourceObject(self)\r
+        if type.lower().find('pcd') != -1:\r
+            return INFPcdObject(self)\r
+        if type.lower() == 'packages':\r
+            return INFDependentPackageObject(self)\r
+        if type.lower() in ['guids', 'protocols', 'ppis']:\r
+            return INFGuidObject(self)\r
+        if type.lower() == 'defines':\r
+            return INFDefineSectionObject(self)\r
+        return INFSectionObject(self)\r
+\r
+    def GetType(self):\r
+        arr = self._name.split('.')\r
+        return arr[0].strip()\r
+\r
+    def GetArch(self):\r
+        arr = self._name.split('.')\r
+        if len(arr) == 1:\r
+            return 'common'\r
+        return arr[1]\r
+\r
+    def IsArchMatch(self, arch):\r
+        if arch == None or self.GetArch() == 'common':\r
+            return True\r
+\r
+        if self.GetArch().lower() != arch.lower():\r
+            return False\r
+\r
+        return True\r
+\r
+class INFSectionObject(ini.BaseINISectionObject):\r
+    def GetArch(self):\r
+        return self.GetParent().GetArch()\r
+\r
+class INFDefineSectionObject(INFSectionObject):\r
+    def __init__(self, parent):\r
+        INFSectionObject.__init__(self, parent)\r
+        self._key = None\r
+        self._value = None\r
+\r
+    def Parse(self):\r
+        assert (self._start == self._end), 'The object in define section must be in single line'\r
+\r
+        line = self.GetLineByOffset(self._start).strip()\r
+\r
+        line = line.split('#')[0]\r
+        arr  = line.split('=')\r
+        if len(arr) != 2:\r
+            ErrorMsg('Invalid define section object',\r
+                   self.GetFilename(),\r
+                   self._start\r
+                   )\r
+            return False\r
+\r
+        self._key   = arr[0].strip()\r
+        self._value = arr[1].strip()\r
+\r
+        return True\r
+\r
+    def GetKey(self):\r
+        return self._key\r
+\r
+    def GetValue(self):\r
+        return self._value\r
+\r
+class INFLibraryClassObject(INFSectionObject):\r
+    _objs = {}\r
+    def __init__(self, parent):\r
+        INFSectionObject.__init__(self, parent)\r
+        self._classname = None\r
+\r
+    def GetClass(self):\r
+        return self._classname\r
+\r
+    def Parse(self):\r
+        self._classname = self.GetLineByOffset(self._start).split('#')[0].strip()\r
+        objdict = INFLibraryClassObject._objs\r
+        if objdict.has_key(self._classname):\r
+            objdict[self._classname].append(self)\r
+        else:\r
+            objdict[self._classname] = [self]\r
+        return True\r
+\r
+    def Destroy(self):\r
+        objdict = INFLibraryClassObject._objs\r
+        objdict[self._classname].remove(self)\r
+        if len(objdict[self._classname]) == 0:\r
+            del objdict[self._classname]\r
+\r
+    def GetName(self):\r
+        return self._classname\r
+\r
+    @staticmethod\r
+    def GetObjectDict():\r
+        return INFLibraryClassObject._objs\r
+\r
+class INFDependentPackageObject(INFSectionObject):\r
+    def GetPath(self):\r
+        return self.GetLineByOffset(self._start).split('#')[0].strip()\r
+\r
+class INFSourceObject(INFSectionObject):\r
+    _objs = {}\r
+    def __init__(self, parent):\r
+        INFSectionObject.__init__(self, parent)\r
+\r
+        self.mSourcename  = None\r
+        self.mToolCode    = None\r
+        self.mFamily      = None\r
+        self.mTagName     = None\r
+        self.mFeaturePcd  = None\r
+        self.mFilename    = None\r
+\r
+    def GetSourcePath(self):\r
+        return self.mSourcename\r
+\r
+    def GetSourceFullPath(self):\r
+        path = os.path.dirname(self.GetFilename())\r
+        path = os.path.join(path, self.GetSourcePath())\r
+        return os.path.normpath(path)\r
+\r
+    def GetToolCode(self):\r
+        return self.mToolCode\r
+\r
+    def GetFamily(self):\r
+        return self.mFamily\r
+\r
+    def GetTagName(self):\r
+        return self.mTagName\r
+\r
+    def GetFeaturePcd(self):\r
+        return self.mFeaturePcd\r
+\r
+    def Parse(self):\r
+        line = self.GetLineByOffset(self._start).strip().split('#')[0]\r
+\r
+        arr = line.split('|')\r
+\r
+        self.mSourcename = arr[0].strip()\r
+        if len(arr) >= 2:\r
+            self.mFamily = arr[1].strip()\r
+        if len(arr) >= 3:\r
+            self.mTagName = arr[2].strip()\r
+        if len(arr) >= 4:\r
+            self.mToolCode = arr[3].strip()\r
+        if len(arr) >= 5:\r
+            self.mFeaturePcd = arr[4].strip()\r
+\r
+        self.mFilename = os.path.basename(self.GetSourceFullPath())\r
+        objdict = INFSourceObject._objs\r
+        if not objdict.has_key(self.mFilename):\r
+            objdict[self.mFilename] = [self]\r
+        else:\r
+            objdict[self.mFilename].append(self)\r
+\r
+        return True\r
+\r
+    def GetName(self):\r
+        return self.mFilename\r
+\r
+    def Destroy(self):\r
+        objdict = INFSourceObject._objs\r
+        objdict[self.mFilename].remove(self)\r
+        if len(objdict[self.mFilename]) == 0:\r
+            del objdict[self.mFilename]\r
+\r
+    def IsMatchFamily(self, family):\r
+        if family == None:\r
+            return True\r
+        if self.mFamily != None:\r
+            if family.strip().lower() == self.mFamily.lower():\r
+                return True\r
+            else:\r
+                return False\r
+        else:\r
+            fname = self.GetSourcePath()\r
+            if fname.endswith('.S') and family.lower() != 'gcc':\r
+                return False\r
+            if fname.endswith('.s') and (self.GetArch().lower() != 'ipf' and self.GetArch().lower() != 'common'):\r
+                return False\r
+            if fname.lower().endswith('.asm') and (family.lower() != 'msft' and family.lower() != 'intel'):\r
+                return False\r
+        return True\r
+\r
+    @staticmethod\r
+    def GetObjectDict():\r
+        return INFSourceObject._objs\r
+\r
+class INFPcdObject(INFSectionObject):\r
+    _objs = {}\r
+\r
+    def __init__(self, parent):\r
+        INFSectionObject.__init__(self, parent)\r
+\r
+        self.mPcdType      = None\r
+        self.mDefaultValue = None\r
+        self.mPcdName      = None\r
+\r
+    @staticmethod\r
+    def GetObjectDict():\r
+        return INFPcdObject._objs\r
+\r
+    def Parse(self):\r
+        line = self.GetLineByOffset(self._start).strip().split('#')[0]\r
+\r
+        arr = line.split('|')\r
+        self.mPcdName       = arr[0].strip()\r
+\r
+        if len(arr) >= 2:\r
+            self.mDefaultValue = arr[1].strip()\r
+\r
+        objdict = INFPcdObject._objs\r
+        if objdict.has_key(self.GetName()):\r
+            if self not in objdict[self.GetName()]:\r
+                objdict[self.GetName()].append(self)\r
+        else:\r
+            objdict[self.GetName()] = [self]\r
+        return True\r
+\r
+    def GetPcdName(self):\r
+        return self.mPcdName\r
+\r
+    def GetPcdType(self):\r
+        return self.GetParent().GetType()\r
+\r
+    def GetName(self):\r
+        return self.mPcdName.split('.')[1]\r
+\r
+    def Destroy(self):\r
+        objdict = INFPcdObject._objs\r
+        objdict[self.GetName()].remove(self)\r
+        if len(objdict[self.GetName()]) == 0:\r
+            del objdict[self.GetName()]\r
+\r
+class INFGuidObject(INFSectionObject):\r
+    def __init__(self, parent):\r
+        INFSectionObject.__init__(self, parent)\r
+        self._name = None\r
+\r
+    def Parse(self):\r
+        line = self.GetLineByOffset(self._start).strip().split('#')[0].split("|")[0]\r
+        self._name =  line.strip()\r
+        return True\r
+\r
+    def GetName(self):\r
+        return self._name\r
+\r
+\r