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