Skip to content

Commit 1d75297

Browse files
author
Zachary Turner
committed
A few improvements to deps analysis scripts.
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
1 parent e030d10 commit 1d75297

File tree

1 file changed

+42
-26
lines changed

1 file changed

+42
-26
lines changed

lldb/scripts/analyze-project-deps.py

Lines changed: 42 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,66 +1,82 @@
1+
import argparse
12
import os
23
import re
34

45
from use_lldb_suite import lldb_root
56

7+
parser = argparse.ArgumentParser(
8+
description='Analyze LLDB project #include dependencies.')
9+
parser.add_argument('--show-counts', default=False, action='store_true',
10+
help='When true, show the number of dependencies from each subproject')
11+
args = parser.parse_args()
12+
613
src_dir = os.path.join(lldb_root, "source")
714
inc_dir = os.path.join(lldb_root, "include")
815

916
src_map = {}
1017

11-
include_regex = re.compile('#include \"(lldb(.*/)+).*\"')
18+
include_regex = re.compile('#include \"((lldb|Plugins|clang)(.*/)+).*\"')
19+
20+
def normalize_host(str):
21+
if str.startswith("lldb/Host"):
22+
return "lldb/Host"
23+
return str
1224

1325
def scan_deps(this_dir, file):
14-
includes = set()
26+
global src_map
27+
deps = {}
28+
this_dir = normalize_host(this_dir)
29+
if this_dir in src_map:
30+
deps = src_map[this_dir]
31+
1532
with open(file) as f:
1633
for line in list(f):
1734
m = include_regex.match(line)
18-
if m is not None:
19-
relative = m.groups()[0].rstrip("/")
20-
if relative != this_dir:
21-
includes.add(relative)
22-
return includes
23-
24-
def insert_or_add_mapping(base, deps):
25-
global src_map
26-
if len(deps) > 0:
27-
if base in src_map:
28-
existing_deps = src_map[base]
29-
existing_deps.update(deps)
30-
else:
31-
src_map[base] = deps
35+
if m is None:
36+
continue
37+
relative = m.groups()[0].rstrip("/")
38+
if relative == this_dir:
39+
continue
40+
relative = normalize_host(relative)
41+
if relative in deps:
42+
deps[relative] += 1
43+
else:
44+
deps[relative] = 1
45+
if this_dir not in src_map and len(deps) > 0:
46+
src_map[this_dir] = deps
3247

3348
for (base, dirs, files) in os.walk(inc_dir):
3449
dir = os.path.basename(base)
3550
relative = os.path.relpath(base, inc_dir)
3651
inc_files = filter(lambda x : os.path.splitext(x)[1] in [".h"], files)
37-
deps = set()
3852
relative = relative.replace("\\", "/")
3953
for inc in inc_files:
4054
inc_path = os.path.join(base, inc)
41-
deps.update(scan_deps(relative, inc_path))
42-
insert_or_add_mapping(relative, deps)
55+
scan_deps(relative, inc_path)
4356

4457
for (base, dirs, files) in os.walk(src_dir):
4558
dir = os.path.basename(base)
4659
relative = os.path.relpath(base, src_dir)
4760
src_files = filter(lambda x : os.path.splitext(x)[1] in [".cpp", ".h", ".mm"], files)
48-
deps = set()
4961
norm_base_path = os.path.normpath(os.path.join("lldb", relative))
5062
norm_base_path = norm_base_path.replace("\\", "/")
5163
for src in src_files:
5264
src_path = os.path.join(base, src)
53-
deps.update(scan_deps(norm_base_path, src_path))
54-
insert_or_add_mapping(norm_base_path, deps)
65+
scan_deps(norm_base_path, src_path)
5566
pass
5667

5768
items = list(src_map.iteritems())
5869
items.sort(lambda A, B : cmp(A[0], B[0]))
5970

6071
for (path, deps) in items:
6172
print path + ":"
62-
sorted_deps = list(deps)
63-
sorted_deps.sort()
64-
for dep in sorted_deps:
65-
print "\t" + dep
73+
sorted_deps = list(deps.iteritems())
74+
if args.show_counts:
75+
sorted_deps.sort(lambda A, B: cmp(A[1], B[1]))
76+
for dep in sorted_deps:
77+
print "\t{} [{}]".format(dep[0], dep[1])
78+
else:
79+
sorted_deps.sort(lambda A, B: cmp(A[0], B[0]))
80+
for dep in sorted_deps:
81+
print "\t{}".format(dep[0])
6682
pass

0 commit comments

Comments
 (0)