Add a script to dump out all project inter-dependencies.
authorZachary Turner <zturner@google.com>
Fri, 3 Mar 2017 22:40:46 +0000 (22:40 +0000)
committerZachary Turner <zturner@google.com>
Fri, 3 Mar 2017 22:40:46 +0000 (22:40 +0000)
llvm-svn: 296920

lldb/scripts/analyze-project-deps.py [new file with mode: 0644]

diff --git a/lldb/scripts/analyze-project-deps.py b/lldb/scripts/analyze-project-deps.py
new file mode 100644 (file)
index 0000000..10a589b
--- /dev/null
@@ -0,0 +1,65 @@
+import os\r
+import re\r
+\r
+from use_lldb_suite import lldb_root\r
+\r
+src_dir = os.path.join(lldb_root, "source")\r
+inc_dir = os.path.join(lldb_root, "include")\r
+\r
+src_map = {}\r
+\r
+include_regex = re.compile('#include \"(lldb(.*/)+).*\"')\r
+\r
+def scan_deps(this_dir, file):\r
+    includes = set()\r
+    with open(file) as f:\r
+        for line in list(f):\r
+            m = include_regex.match(line)\r
+            if m is not None:\r
+                relative = m.groups()[0].rstrip("/")\r
+                if relative != this_dir:\r
+                    includes.add(relative)\r
+    return includes\r
+\r
+def insert_or_add_mapping(base, deps):\r
+    global src_map\r
+    if len(deps) > 0:\r
+        if base in src_map:\r
+            existing_deps = src_map[base]\r
+            existing_deps.update(deps)\r
+        else:\r
+            src_map[base] = deps\r
+\r
+for (base, dirs, files) in os.walk(inc_dir):\r
+    dir = os.path.basename(base)\r
+    relative = os.path.relpath(base, inc_dir)\r
+    inc_files = filter(lambda x : os.path.splitext(x)[1] in [".h"], files)\r
+    deps = set()\r
+    for inc in inc_files:\r
+        inc_path = os.path.join(base, inc)\r
+        deps.update(scan_deps(relative, inc_path))\r
+    insert_or_add_mapping(relative, deps)\r
+\r
+for (base, dirs, files) in os.walk(src_dir):\r
+    dir = os.path.basename(base)\r
+    relative = os.path.relpath(base, src_dir)\r
+    src_files = filter(lambda x : os.path.splitext(x)[1] in [".cpp", ".h", ".mm"], files)\r
+    deps = set()\r
+    norm_base_path = os.path.normpath(os.path.join("lldb", relative))\r
+    norm_base_path = norm_base_path.replace("\\", "/")\r
+    for src in src_files:\r
+        src_path = os.path.join(base, src)\r
+        deps.update(scan_deps(norm_base_path, src_path))\r
+    insert_or_add_mapping(norm_base_path, deps)\r
+    pass\r
+\r
+items = list(src_map.iteritems())\r
+items.sort(lambda A, B : cmp(A[0], B[0]))\r
+\r
+for (path, deps) in items:\r
+    print path + ":"\r
+    sorted_deps = list(deps)\r
+    sorted_deps.sort()\r
+    for dep in sorted_deps:\r
+        print "\t" + dep\r
+pass
\ No newline at end of file