]> git.proxmox.com Git - mirror_edk2.git/blobdiff - Tools/Python/buildgen/BuildConfig.py
Python script for generating build files for platform and modules, which uses the...
[mirror_edk2.git] / Tools / Python / buildgen / BuildConfig.py
diff --git a/Tools/Python/buildgen/BuildConfig.py b/Tools/Python/buildgen/BuildConfig.py
new file mode 100644 (file)
index 0000000..e91bd29
--- /dev/null
@@ -0,0 +1,185 @@
+#!/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
+"""Tools and build configuration"""\r
+\r
+from sets import Set\r
+\r
+class Config(dict):\r
+    def __init__(self, file):\r
+        """file (target configuration file)"""\r
+        configFile = open(file)\r
+        while True:\r
+            line = configFile.readline()\r
+            if line == "": break    ## no more line\r
+\r
+            line = line.strip()\r
+            # skip blank line\r
+            if line == "": continue\r
+            # skip comment line\r
+            if line[0] == '#': continue\r
+            # skip invalid line\r
+            if line[0] == '=':\r
+                print "! invalid configuration:", line\r
+                continue\r
+\r
+            defStrings = line.split('=', 1)\r
+            name = defStrings[0].strip()\r
+            value = defStrings[1].strip()\r
+            self[name] = value\r
+\r
+        configFile.close()\r
+\r
+    def __getitem__(self, attr):\r
+        if attr not in self:\r
+            return ""\r
+\r
+        value = dict.__getitem__(self, attr)\r
+        if value == None:\r
+            value = ""\r
+        return value\r
+\r
+class ToolConfig(dict):\r
+    def __init__(self, file):\r
+        """file (tools configuration file path)"""\r
+        self.Targets = Set()\r
+        self.Toolchains = Set()\r
+        self.Archs = Set()\r
+        self.ToolCodes = Set()\r
+        self.Families = Set()\r
+        self.Attributes = Set(["FAMILY", "NAME", "PATH", "FLAGS", "EXT", "DPATH", "SPATH", "LIBPATH", "INCLUDEPATH"])\r
+        \r
+        configFile = open(file)\r
+        while True:\r
+            line = configFile.readline()\r
+            if line == "": break\r
+\r
+            line = line.strip()\r
+            # skip blank line\r
+            if line == "": continue\r
+            # skip comment line\r
+            if line[0] == '#': continue\r
+            # skip invalid line\r
+            if line[0] == '=':\r
+                print "! invalid definition:", line\r
+                continue\r
+\r
+            # split the definition at the first "="\r
+            tool_def = line.split('=', 1)\r
+            name = tool_def[0].strip()\r
+            value = tool_def[1].strip()\r
+            \r
+            # the name of a tool definition must have five parts concatenated by "_"\r
+            keys = name.split('_')\r
+            # skip non-definition line\r
+            if len(keys) < 5: continue\r
+        \r
+            keys = (keys[1], keys[0], keys[2], keys[3], keys[4])\r
+            self[keys] = value\r
+            \r
+            ###############################################\r
+            ## statistics\r
+            ###############################################\r
+            if keys[0] != '*': self.Toolchains.add(keys[0])\r
+            if keys[1] != '*': self.Targets.add(keys[1])\r
+            if keys[2] != '*': self.Archs.add(keys[2])\r
+            if keys[3] != '*': self.ToolCodes.add(keys[3])\r
+            if keys[4] == "FAMILY": self.Families.add(value)\r
+            elif keys[4] == '*': raise Exception("No * allowed in ATTRIBUTE field")\r
+\r
+        configFile.close()\r
+        # expand the "*" in each field\r
+        self.expand()\r
+\r
+    def __getitem__(self, attrs):\r
+        if len(attrs) != 5:\r
+            return ""\r
+        \r
+        if attrs not in self:\r
+            return ""\r
+        \r
+        value = dict.__getitem__(self, attrs)\r
+        if value == None:\r
+            value = ""\r
+        return value\r
+    \r
+    def expand(self):\r
+        summary = {}\r
+        toolchains = []\r
+        targets = []\r
+        archs = []\r
+        toolcodes = []\r
+        for key in self:\r
+            value = self[key]\r
+            if key[0] == '*':\r
+                toolchains = self.Toolchains\r
+            else:\r
+                toolchains = [key[0]]\r
+\r
+            for toolchain in toolchains:\r
+                if key[1] == '*':\r
+                    targets = self.Targets\r
+                else:\r
+                    targets = [key[1]]\r
+                    \r
+                for target in targets:\r
+                    if key[2] == '*':\r
+                        archs = self.Archs\r
+                    else:\r
+                        archs = [key[2]]\r
+                        \r
+                    for arch in archs:\r
+                        if key[3] == '*':\r
+                            toolcodes = self.ToolCodes\r
+                        else:\r
+                            toolcodes = [key[3]]\r
+                            \r
+                        for toolcode in toolcodes:\r
+                            attribute = key[4]\r
+                            summary[(toolchain, target, arch, toolcode, attribute)] = value\r
+        self.clear()\r
+        for toolchain in self.Toolchains:\r
+            for target in self.Targets:\r
+                for arch in self.Archs:\r
+                    for toolcode in self.ToolCodes:\r
+                        key = (toolchain, target, arch, toolcode, "NAME")\r
+                        if key not in summary: continue\r
+                        for attr in self.Attributes:\r
+                            key = (toolchain, target, arch, toolcode, attr)\r
+                            if key not in summary: continue\r
+                            self[key] = summary[key]\r
+\r
+\r
+    def __str__(self):\r
+        s = ""\r
+        for entry in self:\r
+            s += entry[0] + "_" + entry[1] + "_" + entry[2] + "_" + entry[3] + "_" + entry[4]\r
+            s += " = " + self[entry] + "\n"\r
+        return s\r
+\r
+class TargetConfig(Config):\r
+    pass\r
+\r
+## for test\r
+if __name__ == "__main__":\r
+    import os\r
+    if "WORKSPACE" not in os.environ:\r
+        raise "No WORKSPACE given"\r
+    cfg = ToolConfig(os.path.join(os.environ["WORKSPACE"], "Tools", "Conf", "tools_def.txt"))\r
+    tgt = TargetConfig(os.path.join(os.environ["WORKSPACE"], "Tools", "Conf", "target.txt"))\r
+\r
+    for key in cfg:\r
+        print key,"=",cfg[key]\r
+    \r
+    print\r
+    for name in tgt:\r
+        print name,"=",tgt[name]\r
+        
\ No newline at end of file