# This file is licensed under the Apache License v2.0 with LLVM Exceptions.
# See https://llvm.org/LICENSE.txt for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
load("@bazel_skylib//rules:common_settings.bzl", "bool_flag")
load("@bazel_skylib//rules:expand_template.bzl", "expand_template")
load("@bazel_skylib//rules:native_binary.bzl", "native_binary")
load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library")
load("defs.bzl", "clang_tidy_library")
package(
default_visibility = ["//visibility:public"],
features = ["layering_check"],
)
licenses(["notice"])
# Include static analyzer checks in clang-tidy. Usage:
# $ bazel build --@llvm-project//clang-tools-extra/clang-tidy:enable_static_analyzer=true //...
# $ bazel build --@llvm-project//clang-tools-extra/clang-tidy:enable_static_analyzer=false //...
bool_flag(
name = "enable_static_analyzer",
build_setting_default = True,
)
config_setting(
name = "static_analyzer_enabled",
flag_values = {
":enable_static_analyzer": "true",
},
)
expand_template(
name = "config",
out = "clang-tidy-config.h",
substitutions = select({
":static_analyzer_enabled": {
"#cmakedefine01 CLANG_TIDY_ENABLE_STATIC_ANALYZER": "#define CLANG_TIDY_ENABLE_STATIC_ANALYZER 1",
},
"//conditions:default": {
"#cmakedefine01 CLANG_TIDY_ENABLE_STATIC_ANALYZER": "#define CLANG_TIDY_ENABLE_STATIC_ANALYZER 0",
},
}),
template = "clang-tidy-config.h.cmake",
visibility = ["//visibility:private"],
)
cc_binary(
name = "confusable_table_builder",
srcs = ["misc/ConfusableTable/BuildConfusableTable.cpp"],
visibility = ["//visibility:private"],
deps = ["//llvm:Support"],
)
genrule(
name = "confusables_inc",
srcs = ["misc/ConfusableTable/confusables.txt"],
outs = ["Confusables.inc"],
cmd = "$(location :confusable_table_builder) $(SRCS) $(OUTS)",
tools = [":confusable_table_builder"],
visibility = ["//visibility:private"],
)
cc_library(
name = "confusables",
hdrs = [":confusables_inc"],
include_prefix = ".",
)
clang_tidy_library(
name = "lib",
srcs = glob(["*.cpp"]) + [":config"],
hdrs = glob(["*.h"]),
includes = ["."],
deps = [
"//clang:analysis",
"//clang:format",
"//clang:frontend_rewrite",
"//clang:rewrite",
"//clang:sema",
"//clang:serialization",
"//clang:static_analyzer_checkers_gen",
"//clang:tooling",
"//clang:tooling_core",
] + select({
":static_analyzer_enabled": [
"//clang:static_analyzer_core",
"//clang:static_analyzer_frontend",
],
"//conditions:default": [],
}),
)
clang_tidy_library(
name = "misc",
deps = [
":confusables",
":lib",
":utils",
"//clang:analysis",
"//clang:format",
"//clang:serialization",
"//clang:tooling",
"//clang:tooling_core",
"//clang:tooling_inclusions",
"//clang-tools-extra/include-cleaner:include_cleaner",
],
)
clang_tidy_library(
name = "portability",
deps = [
":lib",
"//llvm:TargetParser",
],
)
clang_tidy_library(
name = "utils",
deps = [
":lib",
"//clang:analysis",
"//clang:sema",
"//clang:tooling",
"//clang:transformer",
],
)
clang_tidy_library(
name = "readability",
deps = [
":lib",
":utils",
"//clang:analysis",
"//clang:tooling",
],
)
clang_tidy_library(
name = "google",
deps = [
":lib",
":readability",
":utils",
],
)
clang_tidy_library(
name = "fuchsia",
deps = [
":google",
":lib",
],
)
clang_tidy_library(
name = "llvm",
deps = [
":lib",
":readability",
":utils",
"//clang:tooling",
],
)
clang_tidy_library(
name = "llvmlibc",
deps = [
":lib",
":portability",
":utils",
],
)
clang_tidy_library(
name = "abseil",
deps = [
":lib",
":utils",
"//clang:tooling",
"//clang:transformer",
],
)
clang_tidy_library(
name = "altera",
deps = [":lib"],
)
clang_tidy_library(
name = "android",
deps = [
":lib",
":utils",
],
)
clang_tidy_library(
name = "boost",
deps = [
":lib",
":utils",
],
)
clang_tidy_library(
name = "concurrency",
deps = [":lib"],
)
clang_tidy_library(
name = "darwin",
deps = [":lib"],
)
clang_tidy_library(
name = "linuxkernel",
deps = [":lib"],
)
clang_tidy_library(
name = "modernize",
deps = [
":lib",
":utils",
"//clang:tooling",
],
)
clang_tidy_library(
name = "mpi",
deps = [
":lib",
"//clang:static_analyzer_checkers",
"//clang:static_analyzer_core",
"//clang:static_analyzer_frontend",
"//clang:tooling",
],
)
clang_tidy_library(
name = "objc",
deps = [
":lib",
":utils",
],
)
clang_tidy_library(
name = "openmp",
deps = [
":lib",
":utils",
],
)
clang_tidy_library(
name = "zircon",
deps = [
":lib",
":utils",
],
)
clang_tidy_library(
name = "cppcoreguidelines",
deps = [
":lib",
":misc",
":modernize",
":performance",
":readability",
":utils",
"//clang:analysis",
],
)
clang_tidy_library(
name = "bugprone",
deps = [
":cppcoreguidelines",
":lib",
":utils",
"//clang:analysis",
"//clang:tooling",
"//clang:transformer",
],
)
clang_tidy_library(
name = "performance",
deps = [
":lib",
":utils",
"//clang:analysis",
"//clang:tooling",
],
)
clang_tidy_library(
name = "cert",
deps = [
":bugprone",
":concurrency",
":google",
":lib",
":misc",
":performance",
":readability",
":utils",
],
)
clang_tidy_library(
name = "hicpp",
deps = [
":bugprone",
":cppcoreguidelines",
":google",
":lib",
":misc",
":modernize",
":performance",
":readability",
],
)
clang_tidy_library(
name = "plugin",
deps = [":lib"],
)
CHECKS = [
":abseil",
":altera",
":android",
":boost",
":bugprone",
":cert",
":concurrency",
":cppcoreguidelines",
":darwin",
":fuchsia",
":google",
":hicpp",
":linuxkernel",
":llvm",
":llvmlibc",
":misc",
":modernize",
":objc",
":openmp",
":performance",
":portability",
":readability",
":zircon",
] + select({
":static_analyzer_enabled": [":mpi"],
"//conditions:default": [],
})
cc_library(
name = "tool",
srcs = ["tool/ClangTidyMain.cpp"],
hdrs = ["tool/ClangTidyMain.h"],
deps = CHECKS + [
":lib",
":utils",
"//clang:tooling",
"//llvm:Support",
],
)
cc_binary(
name = "clang-tidy",
srcs = ["tool/ClangTidyToolMain.cpp"],
stamp = 0,
deps = [":tool"],
)
native_binary(
name = "run-clang-tidy",
src = "tool/run-clang-tidy.py",
out = "run-clang-tidy",
data = [":clang-tidy"],
)