1
+ import argparse
1
2
import os
2
3
import re
3
4
4
5
from use_lldb_suite import lldb_root
5
6
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
+
6
13
src_dir = os .path .join (lldb_root , "source" )
7
14
inc_dir = os .path .join (lldb_root , "include" )
8
15
9
16
src_map = {}
10
17
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
12
24
13
25
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
+
15
32
with open (file ) as f :
16
33
for line in list (f ):
17
34
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
32
47
33
48
for (base , dirs , files ) in os .walk (inc_dir ):
34
49
dir = os .path .basename (base )
35
50
relative = os .path .relpath (base , inc_dir )
36
51
inc_files = filter (lambda x : os .path .splitext (x )[1 ] in [".h" ], files )
37
- deps = set ()
38
52
relative = relative .replace ("\\ " , "/" )
39
53
for inc in inc_files :
40
54
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 )
43
56
44
57
for (base , dirs , files ) in os .walk (src_dir ):
45
58
dir = os .path .basename (base )
46
59
relative = os .path .relpath (base , src_dir )
47
60
src_files = filter (lambda x : os .path .splitext (x )[1 ] in [".cpp" , ".h" , ".mm" ], files )
48
- deps = set ()
49
61
norm_base_path = os .path .normpath (os .path .join ("lldb" , relative ))
50
62
norm_base_path = norm_base_path .replace ("\\ " , "/" )
51
63
for src in src_files :
52
64
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 )
55
66
pass
56
67
57
68
items = list (src_map .iteritems ())
58
69
items .sort (lambda A , B : cmp (A [0 ], B [0 ]))
59
70
60
71
for (path , deps ) in items :
61
72
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 ])
66
82
pass
0 commit comments