From 89675239581fad0366f9159068fec3460bdca232 Mon Sep 17 00:00:00 2001 From: Joe Onorato Date: Fri, 18 May 2012 20:39:51 -0700 Subject: [PATCH] Add tool to parse make dependency info from new --deps flag. Change-Id: I59a88027d88cceee9f2933c84379612698952043 --- tools/parsedeps.py | 151 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100755 tools/parsedeps.py diff --git a/tools/parsedeps.py b/tools/parsedeps.py new file mode 100755 index 0000000000..32d8ad7d67 --- /dev/null +++ b/tools/parsedeps.py @@ -0,0 +1,151 @@ +#!/usr/bin/env python +# vim: ts=2 sw=2 + +import optparse +import re +import sys + + +class Dependency: + def __init__(self, tgt): + self.tgt = tgt + self.pos = "" + self.prereqs = set() + self.visit = 0 + + def add(self, prereq): + self.prereqs.add(prereq) + + +class Dependencies: + def __init__(self): + self.lines = {} + self.__visit = 0 + self.count = 0 + + def add(self, tgt, prereq): + t = self.lines.get(tgt) + if not t: + t = Dependency(tgt) + self.lines[tgt] = t + p = self.lines.get(prereq) + if not p: + p = Dependency(prereq) + self.lines[prereq] = p + t.add(p) + self.count = self.count + 1 + + def setPos(self, tgt, pos): + t = self.lines.get(tgt) + if not t: + t = Dependency(tgt) + self.lines[tgt] = t + t.pos = pos + + def get(self, tgt): + if self.lines.has_key(tgt): + return self.lines[tgt] + else: + return None + + def __iter__(self): + return self.lines.iteritems() + + def trace(self, tgt, prereq): + self.__visit = self.__visit + 1 + d = self.lines.get(tgt) + if not d: + return + return self.__trace(d, prereq) + + def __trace(self, d, prereq): + if d.visit == self.__visit: + return d.trace + if d.tgt == prereq: + return [ [ d ], ] + d.visit = self.__visit + result = [] + for pre in d.prereqs: + recursed = self.__trace(pre, prereq) + for r in recursed: + result.append([ d ] + r) + d.trace = result + return result + +def help(): + print "Commands:" + print " dep TARGET Print the prerequisites for TARGET" + print " trace TARGET PREREQ Print the paths from TARGET to PREREQ" + + +def main(argv): + opts = optparse.OptionParser() + opts.add_option("-i", "--interactive", action="store_true", dest="interactive", + help="Interactive mode") + (options, args) = opts.parse_args() + + deps = Dependencies() + + filename = args[0] + print "Reading %s" % filename + + if True: + f = open(filename) + for line in f: + line = line.strip() + if len(line) > 0: + if line[0] == '#': + pos,tgt = line.rsplit(":", 1) + pos = pos[1:].strip() + tgt = tgt.strip() + deps.setPos(tgt, pos) + else: + (tgt,prereq) = line.split(':', 1) + tgt = tgt.strip() + prereq = prereq.strip() + deps.add(tgt, prereq) + f.close() + + print "Read %d dependencies. %d targets." % (deps.count, len(deps.lines)) + while True: + line = raw_input("target> ") + if not line.strip(): + continue + split = line.split() + cmd = split[0] + if len(split) == 2 and cmd == "dep": + tgt = split[1] + d = deps.get(tgt) + if d: + for prereq in d.prereqs: + print prereq.tgt + elif len(split) == 3 and cmd == "trace": + tgt = split[1] + prereq = split[2] + if False: + print "from %s to %s" % (tgt, prereq) + trace = deps.trace(tgt, prereq) + if trace: + width = 0 + for g in trace: + for t in g: + if len(t.tgt) > width: + width = len(t.tgt) + for g in trace: + for t in g: + if t.pos: + print t.tgt, " " * (width-len(t.tgt)), " #", t.pos + else: + print t.tgt + print + else: + help() + +if __name__ == "__main__": + try: + main(sys.argv) + except KeyboardInterrupt: + print + except EOFError: + print +