1) Looks in Plugins and clang 2) Adds a mode to display the deps sorted by the number of times the deps occurs in a particular project llvm-svn: 297036
82 lines
2.5 KiB
Python
82 lines
2.5 KiB
Python
import argparse
|
|
import os
|
|
import re
|
|
|
|
from use_lldb_suite import lldb_root
|
|
|
|
parser = argparse.ArgumentParser(
|
|
description='Analyze LLDB project #include dependencies.')
|
|
parser.add_argument('--show-counts', default=False, action='store_true',
|
|
help='When true, show the number of dependencies from each subproject')
|
|
args = parser.parse_args()
|
|
|
|
src_dir = os.path.join(lldb_root, "source")
|
|
inc_dir = os.path.join(lldb_root, "include")
|
|
|
|
src_map = {}
|
|
|
|
include_regex = re.compile('#include \"((lldb|Plugins|clang)(.*/)+).*\"')
|
|
|
|
def normalize_host(str):
|
|
if str.startswith("lldb/Host"):
|
|
return "lldb/Host"
|
|
return str
|
|
|
|
def scan_deps(this_dir, file):
|
|
global src_map
|
|
deps = {}
|
|
this_dir = normalize_host(this_dir)
|
|
if this_dir in src_map:
|
|
deps = src_map[this_dir]
|
|
|
|
with open(file) as f:
|
|
for line in list(f):
|
|
m = include_regex.match(line)
|
|
if m is None:
|
|
continue
|
|
relative = m.groups()[0].rstrip("/")
|
|
if relative == this_dir:
|
|
continue
|
|
relative = normalize_host(relative)
|
|
if relative in deps:
|
|
deps[relative] += 1
|
|
else:
|
|
deps[relative] = 1
|
|
if this_dir not in src_map and len(deps) > 0:
|
|
src_map[this_dir] = deps
|
|
|
|
for (base, dirs, files) in os.walk(inc_dir):
|
|
dir = os.path.basename(base)
|
|
relative = os.path.relpath(base, inc_dir)
|
|
inc_files = filter(lambda x : os.path.splitext(x)[1] in [".h"], files)
|
|
relative = relative.replace("\\", "/")
|
|
for inc in inc_files:
|
|
inc_path = os.path.join(base, inc)
|
|
scan_deps(relative, inc_path)
|
|
|
|
for (base, dirs, files) in os.walk(src_dir):
|
|
dir = os.path.basename(base)
|
|
relative = os.path.relpath(base, src_dir)
|
|
src_files = filter(lambda x : os.path.splitext(x)[1] in [".cpp", ".h", ".mm"], files)
|
|
norm_base_path = os.path.normpath(os.path.join("lldb", relative))
|
|
norm_base_path = norm_base_path.replace("\\", "/")
|
|
for src in src_files:
|
|
src_path = os.path.join(base, src)
|
|
scan_deps(norm_base_path, src_path)
|
|
pass
|
|
|
|
items = list(src_map.iteritems())
|
|
items.sort(lambda A, B : cmp(A[0], B[0]))
|
|
|
|
for (path, deps) in items:
|
|
print path + ":"
|
|
sorted_deps = list(deps.iteritems())
|
|
if args.show_counts:
|
|
sorted_deps.sort(lambda A, B: cmp(A[1], B[1]))
|
|
for dep in sorted_deps:
|
|
print "\t{} [{}]".format(dep[0], dep[1])
|
|
else:
|
|
sorted_deps.sort(lambda A, B: cmp(A[0], B[0]))
|
|
for dep in sorted_deps:
|
|
print "\t{}".format(dep[0])
|
|
pass |