xref: /openbsd-src/gnu/llvm/libcxx/utils/graph_header_deps.py (revision 4bdff4bed0e3d54e55670334c7d0077db4170f86)
1037e7968Spatrick#!/usr/bin/env python
2037e7968Spatrick# ===----------------------------------------------------------------------===##
3037e7968Spatrick#
4037e7968Spatrick# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5037e7968Spatrick# See https://llvm.org/LICENSE.txt for license information.
6037e7968Spatrick# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7037e7968Spatrick#
8037e7968Spatrick# ===----------------------------------------------------------------------===##
9037e7968Spatrick
1076d0caaeSpatrickimport argparse
1176d0caaeSpatrickimport sys
12037e7968Spatrick
13*4bdff4beSrobertif __name__ == "__main__":
14*4bdff4beSrobert    """Converts a header dependency CSV file to Graphviz dot file.
15037e7968Spatrick
16*4bdff4beSrobert    The header dependency CSV files are found on the directory
17*4bdff4beSrobert    libcxx/test/libcxx/transitive_includes
18*4bdff4beSrobert    """
19037e7968Spatrick
2076d0caaeSpatrick    parser = argparse.ArgumentParser(
21*4bdff4beSrobert        description="""Converts a libc++ dependency CSV file to a Graphviz dot file.
22*4bdff4beSrobertFor example:
23*4bdff4beSrobert  libcxx/utils/graph_header_deps.py libcxx/test/libcxx/transitive_includes/cxx20.csv | dot -Tsvg > graph.svg
24*4bdff4beSrobert""",
2576d0caaeSpatrick        formatter_class=argparse.RawDescriptionHelpFormatter,
2676d0caaeSpatrick    )
27*4bdff4beSrobert    parser.add_argument(
28*4bdff4beSrobert        "input",
29*4bdff4beSrobert        default=None,
30*4bdff4beSrobert        metavar="FILE",
31*4bdff4beSrobert        help="The header dependency CSV file.",
32*4bdff4beSrobert    )
3376d0caaeSpatrick    options = parser.parse_args()
3476d0caaeSpatrick
35*4bdff4beSrobert    print(
36*4bdff4beSrobert        """digraph includes {
37*4bdff4beSrobertgraph [nodesep=0.5, ranksep=1];
38*4bdff4beSrobertnode [shape=box, width=4];"""
39*4bdff4beSrobert    )
40*4bdff4beSrobert    with open(options.input, "r") as f:
41*4bdff4beSrobert        for line in f.readlines():
42*4bdff4beSrobert            elements = line.rstrip().split(" ")
43*4bdff4beSrobert            assert len(elements) == 2
4476d0caaeSpatrick
45*4bdff4beSrobert            print(f'\t"{elements[0]}" -> "{elements[1]}"')
4676d0caaeSpatrick
47*4bdff4beSrobert    print("}")
48