#!/usr/bin/env python # Copyright (c) 2007, Intel Corporation # All rights reserved. This program and the accompanying materials # are licensed and made available under the terms and conditions of the BSD License # which accompanies this distribution. The full text of the license may be found at # http://opensource.org/licenses/bsd-license.php # # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. """Tools and build configuration""" from sets import Set class Config(dict): def __init__(self, file): """file (target configuration file)""" configFile = open(file) while True: line = configFile.readline() if line == "": break ## no more line line = line.strip() # skip blank line if line == "": continue # skip comment line if line[0] == '#': continue # skip invalid line if line[0] == '=': print "! invalid configuration:", line continue defStrings = line.split('=', 1) name = defStrings[0].strip() value = defStrings[1].strip() self[name] = value configFile.close() def __getitem__(self, attr): if attr not in self: return "" value = dict.__getitem__(self, attr) if value == None: value = "" return value class ToolConfig(dict): def __init__(self, file): """file (tools configuration file path)""" self.Targets = Set() self.Toolchains = Set() self.Archs = Set() self.ToolCodes = Set() self.Families = Set() self.Attributes = Set(["FAMILY", "NAME", "PATH", "FLAGS", "EXT", "DPATH", "SPATH", "LIBPATH", "INCLUDEPATH"]) configFile = open(file) while True: line = configFile.readline() if line == "": break line = line.strip() # skip blank line if line == "": continue # skip comment line if line[0] == '#': continue # skip invalid line if line[0] == '=': print "! invalid definition:", line continue # split the definition at the first "=" tool_def = line.split('=', 1) name = tool_def[0].strip() value = tool_def[1].strip() # the name of a tool definition must have five parts concatenated by "_" keys = name.split('_') # skip non-definition line if len(keys) < 5: continue keys = (keys[1], keys[0], keys[2], keys[3], keys[4]) self[keys] = value ############################################### ## statistics ############################################### if keys[0] != '*': self.Toolchains.add(keys[0]) if keys[1] != '*': self.Targets.add(keys[1]) if keys[2] != '*': self.Archs.add(keys[2]) if keys[3] != '*': self.ToolCodes.add(keys[3]) if keys[4] == "FAMILY": self.Families.add(value) elif keys[4] == '*': raise Exception("No * allowed in ATTRIBUTE field") configFile.close() # expand the "*" in each field self.expand() def __getitem__(self, attrs): if len(attrs) != 5: return "" if attrs not in self: return "" value = dict.__getitem__(self, attrs) if value == None: value = "" return value def expand(self): summary = {} toolchains = [] targets = [] archs = [] toolcodes = [] for key in self: value = self[key] if key[0] == '*': toolchains = self.Toolchains else: toolchains = [key[0]] for toolchain in toolchains: if key[1] == '*': targets = self.Targets else: targets = [key[1]] for target in targets: if key[2] == '*': archs = self.Archs else: archs = [key[2]] for arch in archs: if key[3] == '*': toolcodes = self.ToolCodes else: toolcodes = [key[3]] for toolcode in toolcodes: attribute = key[4] summary[(toolchain, target, arch, toolcode, attribute)] = value self.clear() for toolchain in self.Toolchains: for target in self.Targets: for arch in self.Archs: for toolcode in self.ToolCodes: key = (toolchain, target, arch, toolcode, "NAME") if key not in summary: continue for attr in self.Attributes: key = (toolchain, target, arch, toolcode, attr) if key not in summary: continue self[key] = summary[key] def __str__(self): s = "" for entry in self: s += entry[0] + "_" + entry[1] + "_" + entry[2] + "_" + entry[3] + "_" + entry[4] s += " = " + self[entry] + "\n" return s class TargetConfig(Config): pass ## for test if __name__ == "__main__": import os if "WORKSPACE" not in os.environ: raise "No WORKSPACE given" cfg = ToolConfig(os.path.join(os.environ["WORKSPACE"], "Tools", "Conf", "tools_def.txt")) tgt = TargetConfig(os.path.join(os.environ["WORKSPACE"], "Tools", "Conf", "target.txt")) for key in cfg: print key,"=",cfg[key] print for name in tgt: print name,"=",tgt[name]