summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSahnvour <sahnvour@pm.me>2025-06-22 11:58:22 +0200
committerDylan Baker <dylan@pnwbakers.com>2025-07-21 09:09:10 -0700
commit6b217e690f2e475363985bc0d074d4e644300d32 (patch)
tree116b9bac57cdcf64955071a9e4550c2f62169bf6
parent6e379f0090b606786d540001b4a2de52f57e5e47 (diff)
downloadmeson-6b217e690f2e475363985bc0d074d4e644300d32.tar.gz
clang-tidy: run tool only on source files participating in targets
clang-tidy can't be ran as is on every source file and header
-rw-r--r--docs/markdown/snippets/clang-tidy-improvement.md5
-rw-r--r--mesonbuild/scripts/clangtidy.py4
-rw-r--r--mesonbuild/scripts/run_tool.py20
3 files changed, 27 insertions, 2 deletions
diff --git a/docs/markdown/snippets/clang-tidy-improvement.md b/docs/markdown/snippets/clang-tidy-improvement.md
new file mode 100644
index 000000000..f79463ed3
--- /dev/null
+++ b/docs/markdown/snippets/clang-tidy-improvement.md
@@ -0,0 +1,5 @@
+## `clang-tidy`'s auto-generated targets correctly select source files
+
+In previous versions, the target would run `clang-tidy` on _every_ C-like source files (.c, .h, .cpp, .hpp). It did not work correctly because some files, especially headers, are not intended to be consumed as is.
+
+It will now run only on source files participating in targets.
diff --git a/mesonbuild/scripts/clangtidy.py b/mesonbuild/scripts/clangtidy.py
index 550faeef3..e5f702491 100644
--- a/mesonbuild/scripts/clangtidy.py
+++ b/mesonbuild/scripts/clangtidy.py
@@ -11,7 +11,7 @@ import os
import shutil
import sys
-from .run_tool import run_clang_tool, run_with_buffered_output
+from .run_tool import run_with_buffered_output, run_clang_tool_on_sources
from ..environment import detect_clangtidy, detect_clangapply
import typing as T
@@ -56,7 +56,7 @@ def run(args: T.List[str]) -> int:
fixesdir.unlink()
fixesdir.mkdir(parents=True)
- tidyret = run_clang_tool('clang-tidy', srcdir, builddir, run_clang_tidy, tidyexe, builddir, fixesdir)
+ tidyret = run_clang_tool_on_sources('clang-tidy', srcdir, builddir, run_clang_tidy, tidyexe, builddir, fixesdir)
if fixesdir is not None:
print('Applying fix-its...')
applyret = subprocess.run(applyexe + ['-format', '-style=file', '-ignore-insert-conflict', fixesdir]).returncode
diff --git a/mesonbuild/scripts/run_tool.py b/mesonbuild/scripts/run_tool.py
index e206ff7fe..6181c6d3c 100644
--- a/mesonbuild/scripts/run_tool.py
+++ b/mesonbuild/scripts/run_tool.py
@@ -128,6 +128,26 @@ def run_clang_tool(name: str, srcdir: Path, builddir: Path, fn: T.Callable[...,
yield fn(path, *args)
return asyncio.run(_run_workers(all_clike_files(name, srcdir, builddir), wrapper))
+def run_clang_tool_on_sources(name: str, srcdir: Path, builddir: Path, fn: T.Callable[..., T.Coroutine[None, None, int]], *args: T.Any) -> int:
+ if sys.platform == 'win32':
+ asyncio.set_event_loop_policy(asyncio.WindowsProactorEventLoopPolicy())
+
+ source_files = set()
+ with open('meson-info/intro-targets.json', encoding='utf-8') as fp:
+ targets = json.load(fp)
+
+ for target in targets:
+ for target_source in target.get('target_sources') or []:
+ for source in target_source.get('sources') or []:
+ source_files.add(Path(source))
+
+ clike_files = set(all_clike_files(name, srcdir, builddir))
+ source_files = source_files.intersection(clike_files)
+
+ def wrapper(path: Path) -> T.Iterable[T.Coroutine[None, None, int]]:
+ yield fn(path, *args)
+ return asyncio.run(_run_workers(source_files, wrapper))
+
def run_tool_on_targets(fn: T.Callable[[T.Dict[str, T.Any]],
T.Iterable[T.Coroutine[None, None, int]]]) -> int:
if sys.platform == 'win32':