Similar to the "official" run-clang-tidy script. Defaults to run one thread
per core, making the tool more pleasant to use locally.
Signed-off-by: Tim Wiederhake <twiederh(a)redhat.com>
---
scripts/run-clang-tidy.py | 38 +++++++++++++++++++++++++++++---------
1 file changed, 29 insertions(+), 9 deletions(-)
diff --git a/scripts/run-clang-tidy.py b/scripts/run-clang-tidy.py
index 10c8b80fe0..79d9fb38b2 100755
--- a/scripts/run-clang-tidy.py
+++ b/scripts/run-clang-tidy.py
@@ -2,9 +2,12 @@
import argparse
import json
+import multiprocessing
import os
+import queue
import subprocess
import sys
+import threading
def parse_args():
@@ -14,6 +17,12 @@ def parse_args():
dest="build_dir",
default=".",
help="Path to build directory")
+ parser.add_argument(
+ "-j",
+ dest="thread_num",
+ default=multiprocessing.cpu_count(),
+ type=int,
+ help="Number of threads to run")
return parser.parse_args()
@@ -38,28 +47,39 @@ def run_clang_tidy(item):
def worker():
- for item in items:
+ while True:
+ item = items.get()
os.chdir(item["directory"])
print(item["file"])
result = run_clang_tidy(item)
- if result["returncode"] != 0:
- findings.append(item["file"])
- if result["stdout"]:
- print(result["stdout"])
- if result["stderr"]:
- print(result["stderr"])
+ with lock:
+ if result["returncode"] != 0:
+ findings.append(item["file"])
+ if result["stdout"]:
+ print(result["stdout"])
+ if result["stderr"]:
+ print(result["stderr"])
+
+ items.task_done()
args = parse_args()
+items = queue.Queue()
+lock = threading.Lock()
findings = list()
+for _ in range(args.thread_num):
+ threading.Thread(target=worker, daemon=True).start()
+
with open(os.path.join(args.build_dir, "compile_commands.json")) as f:
- items = json.load(f)
+ compile_commands = json.load(f)
+ for compile_command in compile_commands:
+ items.put(compile_command)
-worker()
+items.join()
if findings:
print("Findings in %s file(s):" % len(findings))
--
2.26.2