audk/Tools/Python/buildgen/BuildConfig.py

185 lines
6.2 KiB
Python
Raw Normal View History

#!/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]