]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Scripts/PackageDocumentTools/plugins/EdkPlugins/edk2/model/dsc.py
BaseTools: Add PackageDocumentTools into Scripts folder
[mirror_edk2.git] / BaseTools / Scripts / PackageDocumentTools / plugins / EdkPlugins / edk2 / model / dsc.py
diff --git a/BaseTools/Scripts/PackageDocumentTools/plugins/EdkPlugins/edk2/model/dsc.py b/BaseTools/Scripts/PackageDocumentTools/plugins/EdkPlugins/edk2/model/dsc.py
new file mode 100644 (file)
index 0000000..f8ed531
--- /dev/null
@@ -0,0 +1,201 @@
+## @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 DSCFile(ini.BaseINIFile):\r
+    def GetSectionInstance(self, parent, name, isCombined=False):\r
+        return DSCSection(parent, name, isCombined)\r
+\r
+    def GetComponents(self):\r
+        return self.GetSectionObjectsByName('Components')\r
+\r
+class DSCSection(ini.BaseINISection):\r
+    def GetSectionINIObject(self, parent):\r
+        type = self.GetType()\r
+\r
+        if type.lower() == 'components':\r
+            return DSCComponentObject(self)\r
+        if type.lower() == 'libraryclasses':\r
+            return DSCLibraryClassObject(self)\r
+        if type.lower() == 'defines':\r
+            return ini.BaseINISectionObject(self)\r
+        if type.lower() == 'pcdsfeatureflag' or \\r
+           type.lower() == 'pcdsfixedatbuild' or \\r
+           type.lower() == 'pcdspatchableinmodule' or\\r
+           type.lower() == 'pcdsdynamicdefault' or \\r
+           type.lower() == 'pcdsdynamicex' or \\r
+           type.lower() == 'pcdsdynamichii' or \\r
+           type.lower() == 'pcdsdynamicvpd':\r
+            return DSCPcdObject(self)\r
+\r
+        return DSCSectionObject(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 GetModuleType(self):\r
+        arr = self._name.split('.')\r
+        if len(arr) < 3:\r
+            return 'common'\r
+        return arr[2]\r
+\r
+class DSCSectionObject(ini.BaseINISectionObject):\r
+    def GetArch(self):\r
+        return self.GetParent().GetArch()\r
+\r
+class DSCPcdObject(DSCSectionObject):\r
+\r
+    def __init__(self, parent):\r
+        ini.BaseINISectionObject.__init__(self, parent)\r
+        self._name = None\r
+\r
+    def Parse(self):\r
+        line = self.GetLineByOffset(self._start).strip().split('#')[0]\r
+        self._name   = line.split('|')[0]\r
+        self._value  = line.split('|')[1]\r
+        return True\r
+\r
+    def GetPcdName(self):\r
+        return self._name\r
+\r
+    def GetPcdType(self):\r
+        return self.GetParent().GetType()\r
+\r
+    def GetPcdValue(self):\r
+        return self._value\r
+\r
+class DSCLibraryClassObject(DSCSectionObject):\r
+    def __init__(self, parent):\r
+        ini.BaseINISectionObject.__init__(self, parent)\r
+\r
+    def GetClass(self):\r
+        line = self.GetLineByOffset(self._start)\r
+        return line.split('#')[0].split('|')[0].strip()\r
+\r
+    def GetInstance(self):\r
+        line = self.GetLineByOffset(self._start)\r
+        return line.split('#')[0].split('|')[1].strip()\r
+\r
+    def GetArch(self):\r
+        return self.GetParent().GetArch()\r
+\r
+    def GetModuleType(self):\r
+        return self.GetParent().GetModuleType()\r
+\r
+class DSCComponentObject(DSCSectionObject):\r
+\r
+    def __init__(self, parent):\r
+        ini.BaseINISectionObject.__init__(self, parent)\r
+        self._OveridePcds      = {}\r
+        self._OverideLibraries = {}\r
+        self._Filename         = ''\r
+\r
+    def __del__(self):\r
+        self._OverideLibraries.clear()\r
+        self._OverideLibraries.clear()\r
+        ini.BaseINISectionObject.__del__(self)\r
+\r
+    def AddOverideLib(self, libclass, libinstPath):\r
+        if libclass not in self._OverideLibraries.keys():\r
+            self._OverideLibraries[libclass] = libinstPath\r
+\r
+    def AddOveridePcd(self, name, type, value=None):\r
+        if type not in self._OveridePcds.keys():\r
+            self._OveridePcds[type] = []\r
+        self._OveridePcds[type].append((name, value))\r
+\r
+    def GetOverideLibs(self):\r
+        return self._OverideLibraries\r
+\r
+    def GetArch(self):\r
+        return self.GetParent().GetArch()\r
+\r
+    def GetOveridePcds(self):\r
+        return self._OveridePcds\r
+\r
+    def GetFilename(self):\r
+        return self.GetLineByOffset(self._start).split('#')[0].split('{')[0].strip()\r
+\r
+    def SetFilename(self, fName):\r
+        self._Filename = fName\r
+\r
+    def Parse(self):\r
+        if (self._start < self._end):\r
+            #\r
+            # The first line is inf path and could be ignored\r
+            # The end line is '}' and could be ignored\r
+            #\r
+            curr = self._start + 1\r
+            end  = self._end - 1\r
+            OverideName = ''\r
+            while (curr <= end):\r
+                line = self.GetLineByOffset(curr).strip()\r
+                if len(line) > 0 and line[0] != '#':\r
+                    line = line.split('#')[0].strip()\r
+                    if line[0] == '<':\r
+                        OverideName = line[1:len(line)-1]\r
+                    elif OverideName.lower() == 'libraryclasses':\r
+                        arr = line.split('|')\r
+                        self._OverideLibraries[arr[0].strip()] = arr[1].strip()\r
+                    elif OverideName.lower() == 'pcds':\r
+                        ErrorMsg('EDES does not support PCD overide',\r
+                                 self.GetFileName(),\r
+                                 self.GetParent().GetLinenumberByOffset(curr))\r
+                curr = curr + 1\r
+        return True\r
+\r
+    def GenerateLines(self):\r
+        lines = []\r
+        hasLib = False\r
+        hasPcd = False\r
+        if len(self._OverideLibraries) != 0:\r
+            hasLib = True\r
+        if len(self._OveridePcds) != 0:\r
+            hasPcd = True\r
+\r
+        if hasLib or hasPcd:\r
+            lines.append(('  %s {\n' % self._Filename))\r
+        else:\r
+            lines.append(('  %s \n' % self._Filename))\r
+            return lines\r
+\r
+        if hasLib:\r
+            lines.append('    <LibraryClasses>\n')\r
+            for libKey in self._OverideLibraries.keys():\r
+                lines.append('      %s|%s\n' % (libKey, self._OverideLibraries[libKey]))\r
+\r
+        if hasPcd:\r
+            for key in self._OveridePcds.keys():\r
+                lines.append('    <%s>\n' % key)\r
+\r
+                for name, value in self._OveridePcds[key]:\r
+                    if value != None:\r
+                        lines.append('      %s|%s\n' % (name, value))\r
+                    else:\r
+                        lines.append('      %s\n' % name)\r
+\r
+        if hasLib or hasPcd:\r
+            lines.append('  }\n')\r
+\r
+        return lines\r
+\r