Skip to content

Commit b8c0567

Browse files
adrianimbodenerenon
authored andcommitted
add support for toolchains with hermetic clang-tidy
1 parent 41d3033 commit b8c0567

File tree

3 files changed

+44
-7
lines changed

3 files changed

+44
-7
lines changed

BUILD

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,27 @@ label_flag(
1111
build_setting_default = ":clang_tidy_config_default",
1212
visibility = ["//visibility:public"],
1313
)
14+
15+
16+
filegroup(
17+
name = "clang_tidy_executable_default",
18+
srcs = [], # empty list: system clang-tidy
19+
)
20+
21+
label_flag(
22+
name = "clang_tidy_executable",
23+
build_setting_default = ":clang_tidy_executable_default",
24+
visibility = ["//visibility:public"],
25+
)
26+
27+
28+
filegroup(
29+
name = "clang_tidy_additional_deps_default",
30+
srcs = [],
31+
)
32+
33+
label_flag(
34+
name = "clang_tidy_additional_deps",
35+
build_setting_default = ":clang_tidy_additional_deps_default",
36+
visibility = ["//visibility:public"],
37+
)

clang_tidy/clang_tidy.bzl

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
load("@bazel_tools//tools/cpp:toolchain_utils.bzl", "find_cpp_toolchain")
22

3-
def _run_tidy(ctx, exe, config, flags, compilation_context, infile, discriminator):
4-
inputs = depset(direct = [infile, config], transitive = [compilation_context.headers])
3+
def _run_tidy(ctx, wrapper, exe, additional_deps, config, flags, compilation_context, infile, discriminator):
4+
inputs = depset(direct = [infile, config] + additional_deps.files.to_list() + ([exe.files_to_run.executable] if exe.files_to_run.executable else []), transitive = [compilation_context.headers])
55

66
args = ctx.actions.args()
77

@@ -10,6 +10,12 @@ def _run_tidy(ctx, exe, config, flags, compilation_context, infile, discriminato
1010
"bazel_clang_tidy_" + infile.path + "." + discriminator + ".clang-tidy.yaml",
1111
)
1212

13+
# this is consumed by the wrapper script
14+
if len(exe.files.to_list()) == 0:
15+
args.add("clang-tidy")
16+
else:
17+
args.add(exe.files_to_run.executable)
18+
1319
args.add(outfile.path) # this is consumed by the wrapper script
1420
args.add("--export-fixes", outfile.path)
1521

@@ -43,7 +49,7 @@ def _run_tidy(ctx, exe, config, flags, compilation_context, infile, discriminato
4349
ctx.actions.run(
4450
inputs = inputs,
4551
outputs = [outfile],
46-
executable = exe,
52+
executable = wrapper,
4753
arguments = [args],
4854
mnemonic = "ClangTidy",
4955
use_default_shell_env = True,
@@ -92,14 +98,16 @@ def _clang_tidy_aspect_impl(target, ctx):
9298
if not CcInfo in target:
9399
return []
94100

95-
exe = ctx.attr._clang_tidy.files_to_run
101+
wrapper = ctx.attr._clang_tidy_wrapper.files_to_run
102+
exe = ctx.attr._clang_tidy_executable
103+
additional_deps = ctx.attr._clang_tidy_additional_deps
96104
config = ctx.attr._clang_tidy_config.files.to_list()[0]
97105
toolchain_flags = _toolchain_flags(ctx)
98106
rule_flags = ctx.rule.attr.copts if hasattr(ctx.rule.attr, "copts") else []
99107
safe_flags = _safe_flags(toolchain_flags + rule_flags)
100108
compilation_context = target[CcInfo].compilation_context
101109
srcs = _rule_sources(ctx)
102-
outputs = [_run_tidy(ctx, exe, config, safe_flags, compilation_context, src, target.label.name) for src in srcs]
110+
outputs = [_run_tidy(ctx, wrapper, exe, additional_deps, config, safe_flags, compilation_context, src, target.label.name) for src in srcs]
103111

104112
return [
105113
OutputGroupInfo(report = depset(direct = outputs)),
@@ -110,7 +118,9 @@ clang_tidy_aspect = aspect(
110118
fragments = ["cpp"],
111119
attrs = {
112120
"_cc_toolchain": attr.label(default = Label("@bazel_tools//tools/cpp:current_cc_toolchain")),
113-
"_clang_tidy": attr.label(default = Label("//clang_tidy:clang_tidy")),
121+
"_clang_tidy_wrapper": attr.label(default = Label("//clang_tidy:clang_tidy")),
122+
"_clang_tidy_executable": attr.label(default = Label("//:clang_tidy_executable")),
123+
"_clang_tidy_additional_deps": attr.label(default = Label("//:clang_tidy_additional_deps")),
114124
"_clang_tidy_config": attr.label(default = Label("//:clang_tidy_config")),
115125
},
116126
toolchains = ["@bazel_tools//tools/cpp:toolchain_type"],

clang_tidy/run_clang_tidy.sh

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
# Usage: run_clang_tidy <OUTPUT> [ARGS...]
33
set -ue
44

5+
CLANG_TIDY_BIN=$1
6+
shift
7+
58
OUTPUT=$1
69
shift
710

@@ -11,4 +14,4 @@ shift
1114
touch $OUTPUT
1215
truncate -s 0 $OUTPUT
1316

14-
clang-tidy "$@"
17+
"${CLANG_TIDY_BIN}" "$@"

0 commit comments

Comments
 (0)