xref: /llvm-project/utils/bazel/llvm-project-overlay/clang-tools-extra/clang-tidy/BUILD.bazel (revision 91c5de7fb8f95132043ed08056e58238383cfcb9)
1# This file is licensed under the Apache License v2.0 with LLVM Exceptions.
2# See https://llvm.org/LICENSE.txt for license information.
3# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
4
5load("@bazel_skylib//rules:common_settings.bzl", "bool_flag")
6load("@bazel_skylib//rules:expand_template.bzl", "expand_template")
7load("@bazel_skylib//rules:native_binary.bzl", "native_binary")
8load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library")
9load("defs.bzl", "clang_tidy_library")
10
11package(
12    default_visibility = ["//visibility:public"],
13    features = ["layering_check"],
14)
15
16licenses(["notice"])
17
18# Include static analyzer checks in clang-tidy. Usage:
19#   $ bazel build --@llvm-project//clang-tools-extra/clang-tidy:enable_static_analyzer=true //...
20#   $ bazel build --@llvm-project//clang-tools-extra/clang-tidy:enable_static_analyzer=false //...
21bool_flag(
22    name = "enable_static_analyzer",
23    build_setting_default = True,
24)
25
26config_setting(
27    name = "static_analyzer_enabled",
28    flag_values = {
29        ":enable_static_analyzer": "true",
30    },
31)
32
33expand_template(
34    name = "config",
35    out = "clang-tidy-config.h",
36    substitutions = select({
37        ":static_analyzer_enabled": {
38            "#cmakedefine01 CLANG_TIDY_ENABLE_STATIC_ANALYZER": "#define CLANG_TIDY_ENABLE_STATIC_ANALYZER 1",
39        },
40        "//conditions:default": {
41            "#cmakedefine01 CLANG_TIDY_ENABLE_STATIC_ANALYZER": "#define CLANG_TIDY_ENABLE_STATIC_ANALYZER 0",
42        },
43    }),
44    template = "clang-tidy-config.h.cmake",
45    visibility = ["//visibility:private"],
46)
47
48cc_binary(
49    name = "confusable_table_builder",
50    srcs = ["misc/ConfusableTable/BuildConfusableTable.cpp"],
51    visibility = ["//visibility:private"],
52    deps = ["//llvm:Support"],
53)
54
55genrule(
56    name = "confusables_inc",
57    srcs = ["misc/ConfusableTable/confusables.txt"],
58    outs = ["Confusables.inc"],
59    cmd = "$(location :confusable_table_builder) $(SRCS) $(OUTS)",
60    tools = [":confusable_table_builder"],
61    visibility = ["//visibility:private"],
62)
63
64cc_library(
65    name = "confusables",
66    hdrs = [":confusables_inc"],
67    include_prefix = ".",
68)
69
70clang_tidy_library(
71    name = "lib",
72    srcs = glob(["*.cpp"]) + [":config"],
73    hdrs = glob(["*.h"]),
74    includes = ["."],
75    deps = [
76        "//clang:analysis",
77        "//clang:format",
78        "//clang:frontend_rewrite",
79        "//clang:rewrite",
80        "//clang:sema",
81        "//clang:serialization",
82        "//clang:static_analyzer_checkers_gen",
83        "//clang:tooling",
84        "//clang:tooling_core",
85    ] + select({
86        ":static_analyzer_enabled": [
87            "//clang:static_analyzer_core",
88            "//clang:static_analyzer_frontend",
89        ],
90        "//conditions:default": [],
91    }),
92)
93
94clang_tidy_library(
95    name = "misc",
96    deps = [
97        ":confusables",
98        ":lib",
99        ":utils",
100        "//clang:analysis",
101        "//clang:format",
102        "//clang:serialization",
103        "//clang:tooling",
104        "//clang:tooling_core",
105        "//clang:tooling_inclusions",
106        "//clang-tools-extra/include-cleaner:include_cleaner",
107    ],
108)
109
110clang_tidy_library(
111    name = "portability",
112    deps = [
113        ":lib",
114        "//llvm:TargetParser",
115    ],
116)
117
118clang_tidy_library(
119    name = "utils",
120    deps = [
121        ":lib",
122        "//clang:analysis",
123        "//clang:sema",
124        "//clang:tooling",
125        "//clang:transformer",
126    ],
127)
128
129clang_tidy_library(
130    name = "readability",
131    deps = [
132        ":lib",
133        ":utils",
134        "//clang:analysis",
135        "//clang:tooling",
136    ],
137)
138
139clang_tidy_library(
140    name = "google",
141    deps = [
142        ":lib",
143        ":readability",
144        ":utils",
145    ],
146)
147
148clang_tidy_library(
149    name = "fuchsia",
150    deps = [
151        ":google",
152        ":lib",
153    ],
154)
155
156clang_tidy_library(
157    name = "llvm",
158    deps = [
159        ":lib",
160        ":readability",
161        ":utils",
162        "//clang:tooling",
163    ],
164)
165
166clang_tidy_library(
167    name = "llvmlibc",
168    deps = [
169        ":lib",
170        ":portability",
171        ":utils",
172    ],
173)
174
175clang_tidy_library(
176    name = "abseil",
177    deps = [
178        ":lib",
179        ":utils",
180        "//clang:tooling",
181        "//clang:transformer",
182    ],
183)
184
185clang_tidy_library(
186    name = "altera",
187    deps = [":lib"],
188)
189
190clang_tidy_library(
191    name = "android",
192    deps = [
193        ":lib",
194        ":utils",
195    ],
196)
197
198clang_tidy_library(
199    name = "boost",
200    deps = [
201        ":lib",
202        ":utils",
203    ],
204)
205
206clang_tidy_library(
207    name = "concurrency",
208    deps = [":lib"],
209)
210
211clang_tidy_library(
212    name = "darwin",
213    deps = [":lib"],
214)
215
216clang_tidy_library(
217    name = "linuxkernel",
218    deps = [":lib"],
219)
220
221clang_tidy_library(
222    name = "modernize",
223    deps = [
224        ":lib",
225        ":utils",
226        "//clang:tooling",
227    ],
228)
229
230clang_tidy_library(
231    name = "mpi",
232    deps = [
233        ":lib",
234        "//clang:static_analyzer_checkers",
235        "//clang:static_analyzer_core",
236        "//clang:static_analyzer_frontend",
237        "//clang:tooling",
238    ],
239)
240
241clang_tidy_library(
242    name = "objc",
243    deps = [
244        ":lib",
245        ":utils",
246    ],
247)
248
249clang_tidy_library(
250    name = "openmp",
251    deps = [
252        ":lib",
253        ":utils",
254    ],
255)
256
257clang_tidy_library(
258    name = "zircon",
259    deps = [
260        ":lib",
261        ":utils",
262    ],
263)
264
265clang_tidy_library(
266    name = "cppcoreguidelines",
267    deps = [
268        ":bugprone",
269        ":lib",
270        ":misc",
271        ":modernize",
272        ":performance",
273        ":readability",
274        ":utils",
275        "//clang:analysis",
276    ],
277)
278
279clang_tidy_library(
280    name = "bugprone",
281    deps = [
282        ":lib",
283        ":utils",
284        "//clang:analysis",
285        "//clang:tooling",
286        "//clang:transformer",
287    ],
288)
289
290clang_tidy_library(
291    name = "performance",
292    deps = [
293        ":lib",
294        ":utils",
295        "//clang:analysis",
296        "//clang:tooling",
297    ],
298)
299
300clang_tidy_library(
301    name = "cert",
302    deps = [
303        ":bugprone",
304        ":concurrency",
305        ":google",
306        ":lib",
307        ":misc",
308        ":performance",
309        ":readability",
310        ":utils",
311    ],
312)
313
314clang_tidy_library(
315    name = "hicpp",
316    deps = [
317        ":bugprone",
318        ":cppcoreguidelines",
319        ":google",
320        ":lib",
321        ":misc",
322        ":modernize",
323        ":performance",
324        ":readability",
325    ],
326)
327
328clang_tidy_library(
329    name = "plugin",
330    deps = [":lib"],
331)
332
333CHECKS = [
334    ":abseil",
335    ":altera",
336    ":android",
337    ":boost",
338    ":bugprone",
339    ":cert",
340    ":concurrency",
341    ":cppcoreguidelines",
342    ":darwin",
343    ":fuchsia",
344    ":google",
345    ":hicpp",
346    ":linuxkernel",
347    ":llvm",
348    ":llvmlibc",
349    ":misc",
350    ":modernize",
351    ":objc",
352    ":openmp",
353    ":performance",
354    ":portability",
355    ":readability",
356    ":zircon",
357] + select({
358    ":static_analyzer_enabled": [":mpi"],
359    "//conditions:default": [],
360})
361
362cc_library(
363    name = "tool",
364    srcs = ["tool/ClangTidyMain.cpp"],
365    hdrs = ["tool/ClangTidyMain.h"],
366    deps = CHECKS + [
367        ":lib",
368        ":utils",
369        "//clang:tooling",
370        "//llvm:Support",
371        "//llvm:TargetParser",
372    ],
373)
374
375cc_binary(
376    name = "clang-tidy",
377    srcs = ["tool/ClangTidyToolMain.cpp"],
378    stamp = 0,
379    deps = [":tool"],
380)
381
382native_binary(
383    name = "run-clang-tidy",
384    src = "tool/run-clang-tidy.py",
385    out = "run-clang-tidy",
386    data = [":clang-tidy"],
387)
388