+++ /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