brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.6 KiB · 4e8bae1 Raw
59 lines · python
1#!/usr/bin/env python2 3# ===- cindex-includes.py - cindex/Python Inclusion Graph -----*- python -*--===#4#5# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.6# See https://llvm.org/LICENSE.txt for license information.7# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception8#9# ===------------------------------------------------------------------------===#10 11"""12A simple command line tool for dumping a Graphviz description (dot) that13describes include dependencies.14"""15 16 17def main():18    import sys19    from clang.cindex import Index20 21    from optparse import OptionParser, OptionGroup22 23    parser = OptionParser("usage: %prog [options] {filename} [clang-args*]")24    parser.disable_interspersed_args()25    (opts, args) = parser.parse_args()26    if len(args) == 0:27        parser.error("invalid number arguments")28 29    # FIXME: Add an output file option30    out = sys.stdout31 32    index = Index.create()33    tu = index.parse(None, args)34    if not tu:35        parser.error("unable to load input")36 37    # A helper function for generating the node name.38    def name(f):39        if f:40            return '"' + f.name + '"'41 42    # Generate the include graph43    out.write("digraph G {\n")44    for i in tu.get_includes():45        line = "  "46        if i.is_input_file:47            # Always write the input file as a node just in case it doesn't48            # actually include anything. This would generate a 1 node graph.49            line += name(i.include)50        else:51            line += "%s->%s" % (name(i.source), name(i.include))52        line += "\n"53        out.write(line)54    out.write("}\n")55 56 57if __name__ == "__main__":58    main()59