425 lines · plain
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-exception4 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 26bool_flag(27 name = "enable_custom_checks",28 build_setting_default = True,29)30 31config_setting(32 name = "static_analyzer_enabled",33 flag_values = {34 ":enable_static_analyzer": "true",35 },36)37 38config_setting(39 name = "custom_checks_enabled",40 flag_values = {41 ":enable_custom_checks": "true",42 },43)44 45expand_template(46 name = "config",47 out = "clang-tidy-config.h",48 substitutions =49 select({50 ":custom_checks_enabled": {51 "#cmakedefine01 CLANG_TIDY_ENABLE_QUERY_BASED_CUSTOM_CHECKS": "#define CLANG_TIDY_ENABLE_QUERY_BASED_CUSTOM_CHECKS 1",52 },53 "//conditions:default": {54 "#cmakedefine01 CLANG_TIDY_ENABLE_QUERY_BASED_CUSTOM_CHECKS": "#define CLANG_TIDY_ENABLE_QUERY_BASED_CUSTOM_CHECKS 0",55 },56 }) | select({57 ":static_analyzer_enabled": {58 "#cmakedefine01 CLANG_TIDY_ENABLE_STATIC_ANALYZER": "#define CLANG_TIDY_ENABLE_STATIC_ANALYZER 1",59 },60 "//conditions:default": {61 "#cmakedefine01 CLANG_TIDY_ENABLE_STATIC_ANALYZER": "#define CLANG_TIDY_ENABLE_STATIC_ANALYZER 0",62 },63 }),64 template = "clang-tidy-config.h.cmake",65 visibility = ["//visibility:private"],66)67 68cc_binary(69 name = "confusable_table_builder",70 srcs = ["misc/ConfusableTable/BuildConfusableTable.cpp"],71 visibility = ["//visibility:private"],72 deps = ["//llvm:Support"],73)74 75genrule(76 name = "confusables_inc",77 srcs = ["misc/ConfusableTable/confusables.txt"],78 outs = ["Confusables.inc"],79 cmd = "$(location :confusable_table_builder) $(SRCS) $(OUTS)",80 tools = [":confusable_table_builder"],81 visibility = ["//visibility:private"],82)83 84cc_library(85 name = "confusables",86 hdrs = [":confusables_inc"],87 include_prefix = ".",88)89 90clang_tidy_library(91 name = "lib",92 srcs = glob(["*.cpp"]) + [":config"],93 hdrs = glob(["*.h"]),94 includes = ["."],95 deps = [96 "//clang:analysis",97 "//clang:format",98 "//clang:frontend_rewrite",99 "//clang:rewrite",100 "//clang:sema",101 "//clang:serialization",102 "//clang:static_analyzer_checkers_gen",103 "//clang:tooling",104 "//clang:tooling_core",105 ] + select({106 ":static_analyzer_enabled": [107 "//clang:static_analyzer_core",108 "//clang:static_analyzer_frontend",109 ],110 "//conditions:default": [],111 }),112)113 114clang_tidy_library(115 name = "misc",116 deps = [117 ":confusables",118 ":lib",119 ":utils",120 "//clang:analysis",121 "//clang:format",122 "//clang:serialization",123 "//clang:tooling",124 "//clang:tooling_core",125 "//clang:tooling_inclusions",126 "//clang-tools-extra/include-cleaner:include_cleaner",127 ],128)129 130clang_tidy_library(131 name = "portability",132 deps = [133 ":lib",134 "//llvm:TargetParser",135 ],136)137 138clang_tidy_library(139 name = "utils",140 deps = [141 ":lib",142 "//clang:analysis",143 "//clang:sema",144 "//clang:tooling",145 "//clang:transformer",146 ],147)148 149clang_tidy_library(150 name = "readability",151 deps = [152 ":lib",153 ":utils",154 "//clang:analysis",155 "//clang:tooling",156 ],157)158 159clang_tidy_library(160 name = "google",161 deps = [162 ":lib",163 ":readability",164 ":utils",165 ],166)167 168clang_tidy_library(169 name = "fuchsia",170 deps = [171 ":google",172 ":lib",173 ":utils",174 ],175)176 177clang_tidy_library(178 name = "llvm",179 deps = [180 ":lib",181 ":readability",182 ":utils",183 "//clang:tooling",184 "//clang:transformer",185 ],186)187 188clang_tidy_library(189 name = "llvmlibc",190 deps = [191 ":lib",192 ":portability",193 ":utils",194 ],195)196 197clang_tidy_library(198 name = "abseil",199 deps = [200 ":lib",201 ":utils",202 "//clang:tooling",203 "//clang:transformer",204 ],205)206 207clang_tidy_library(208 name = "altera",209 deps = [":lib"],210)211 212clang_tidy_library(213 name = "android",214 deps = [215 ":lib",216 ":utils",217 ],218)219 220clang_tidy_library(221 name = "boost",222 deps = [223 ":lib",224 ":utils",225 ],226)227 228clang_tidy_library(229 name = "custom",230 deps = [231 ":lib",232 "//clang:ast_matchers_dynamic",233 "//clang-tools-extra/clang-query:lib",234 ],235)236 237clang_tidy_library(238 name = "concurrency",239 deps = [":lib"],240)241 242clang_tidy_library(243 name = "darwin",244 deps = [":lib"],245)246 247clang_tidy_library(248 name = "linuxkernel",249 deps = [":lib"],250)251 252clang_tidy_library(253 name = "modernize",254 deps = [255 ":lib",256 ":utils",257 "//clang:tooling",258 ],259)260 261clang_tidy_library(262 name = "mpi",263 deps = [264 ":lib",265 "//clang:static_analyzer_checkers",266 "//clang:static_analyzer_core",267 "//clang:static_analyzer_frontend",268 "//clang:tooling",269 ],270)271 272clang_tidy_library(273 name = "objc",274 deps = [275 ":lib",276 ":utils",277 ],278)279 280clang_tidy_library(281 name = "openmp",282 deps = [283 ":lib",284 ":utils",285 ],286)287 288clang_tidy_library(289 name = "zircon",290 deps = [291 ":fuchsia",292 ":lib",293 ":utils",294 ],295)296 297clang_tidy_library(298 name = "cppcoreguidelines",299 deps = [300 ":bugprone",301 ":lib",302 ":misc",303 ":modernize",304 ":performance",305 ":readability",306 ":utils",307 "//clang:analysis",308 ],309)310 311clang_tidy_library(312 name = "bugprone",313 deps = [314 ":lib",315 ":utils",316 "//clang:analysis",317 "//clang:sema",318 "//clang:tooling",319 "//clang:transformer",320 ],321)322 323clang_tidy_library(324 name = "performance",325 deps = [326 ":lib",327 ":utils",328 "//clang:analysis",329 "//clang:tooling",330 ],331)332 333clang_tidy_library(334 name = "cert",335 deps = [336 ":bugprone",337 ":concurrency",338 ":google",339 ":lib",340 ":misc",341 ":modernize",342 ":performance",343 ":readability",344 ":utils",345 ],346)347 348clang_tidy_library(349 name = "hicpp",350 deps = [351 ":bugprone",352 ":cppcoreguidelines",353 ":google",354 ":lib",355 ":misc",356 ":modernize",357 ":performance",358 ":readability",359 ],360)361 362clang_tidy_library(363 name = "plugin",364 deps = [":lib"],365)366 367CHECKS = [368 ":abseil",369 ":altera",370 ":android",371 ":boost",372 ":bugprone",373 ":cert",374 ":concurrency",375 ":cppcoreguidelines",376 ":darwin",377 ":fuchsia",378 ":google",379 ":hicpp",380 ":linuxkernel",381 ":llvm",382 ":llvmlibc",383 ":misc",384 ":modernize",385 ":objc",386 ":openmp",387 ":performance",388 ":portability",389 ":readability",390 ":zircon",391] + select({392 ":static_analyzer_enabled": [":mpi"],393 "//conditions:default": [],394}) + select({395 ":custom_checks_enabled": [":custom"],396 "//conditions:default": [],397})398 399cc_library(400 name = "tool",401 srcs = ["tool/ClangTidyMain.cpp"],402 hdrs = ["tool/ClangTidyMain.h"],403 deps = CHECKS + [404 ":lib",405 ":utils",406 "//clang:tooling",407 "//llvm:Support",408 "//llvm:TargetParser",409 ],410)411 412cc_binary(413 name = "clang-tidy",414 srcs = ["tool/ClangTidyToolMain.cpp"],415 stamp = 0,416 deps = [":tool"],417)418 419native_binary(420 name = "run-clang-tidy",421 src = "tool/run-clang-tidy.py",422 out = "run-clang-tidy",423 data = [":clang-tidy"],424)425