diff --git a/.bazelrc b/.bazelrc index 2d2ed2b..e83c5da 100644 --- a/.bazelrc +++ b/.bazelrc @@ -1,2 +1,4 @@ build:clang-tidy --aspects @bazel_clang_tidy//clang_tidy:clang_tidy.bzl%clang_tidy_aspect -build:clang-tidy --output_groups=report \ No newline at end of file +build:clang-tidy --output_groups=report +build:clang-tidy --@bazel_clang_tidy//:clang_tidy_bazel_out_includes_are_system_includes=True +build:clang-tidy --@bazel_clang_tidy//:clang_tidy_virtual_includes_are_system_includes=True diff --git a/BUILD b/BUILD index eaec502..6be41aa 100644 --- a/BUILD +++ b/BUILD @@ -1,3 +1,5 @@ +load("@bazel_skylib//rules:common_settings.bzl", "bool_flag") + filegroup( name = "clang_tidy_config_default", srcs = [ @@ -33,3 +35,15 @@ label_flag( build_setting_default = ":clang_tidy_additional_deps_default", visibility = ["//visibility:public"], ) + +bool_flag( + name = "clang_tidy_bazel_out_includes_are_system_includes", + build_setting_default = False, + visibility = ["//visibility:public"], +) + +bool_flag( + name = "clang_tidy_virtual_includes_are_system_includes", + build_setting_default = False, + visibility = ["//visibility:public"], +) diff --git a/WORKSPACE b/WORKSPACE index adfd402..ec2d035 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -1 +1,15 @@ workspace(name = "bazel_clang_tidy") + +load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe") +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") + +maybe( + http_archive, + name = "bazel_skylib", + sha256 = "cd55a062e763b9349921f0f5db8c3933288dc8ba4f76dd9416aac68acee3cb94", + url = "https://github.com/bazelbuild/bazel-skylib/releases/download/1.5.0/bazel-skylib-1.5.0.tar.gz", +) + +load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace") + +bazel_skylib_workspace() diff --git a/clang_tidy/clang_tidy.bzl b/clang_tidy/clang_tidy.bzl index 4d515fc..a6bf7ef 100644 --- a/clang_tidy/clang_tidy.bzl +++ b/clang_tidy/clang_tidy.bzl @@ -59,12 +59,33 @@ def _run_tidy( for i in compilation_context.framework_includes.to_list(): args.add("-F" + i) - for i in compilation_context.includes.to_list(): - args.add("-I" + i) - - args.add_all(compilation_context.quote_includes.to_list(), before_each = "-iquote") + isystems = compilation_context.system_includes.to_list() + + if ctx.attr._clang_tidy_virtual_includes_are_system_includes: + # Include anything that uses include_prefix or strip_include_prefix as a system include + include_dirs = [] + for include in compilation_context.includes.to_list(): + if "/_virtual_includes/" in include: + isystems.append(include) + else: + include_dirs.append(include) + else: + include_dirs = compilation_context.includes.to_list() + + if ctx.attr._clang_tidy_bazel_out_includes_are_system_includes: + # Treat generated code in bazel-out/ as system include + iquotes = [] + for quote_include in compilation_context.quote_includes.to_list(): + if quote_include.startswith("bazel-out/"): + isystems.append(quote_include) + else: + iquotes.append(quote_include) + else: + iquotes = compilation_context.quote_includes.to_list() - args.add_all(compilation_context.system_includes.to_list(), before_each = "-isystem") + args.add_all(include_dirs, before_each = "-I") + args.add_all(iquotes, before_each = "-iquote") + args.add_all(isystems, before_each = "-isystem") ctx.actions.run( inputs = inputs, @@ -184,6 +205,8 @@ clang_tidy_aspect = aspect( "_clang_tidy_executable": attr.label(default = Label("//:clang_tidy_executable")), "_clang_tidy_additional_deps": attr.label(default = Label("//:clang_tidy_additional_deps")), "_clang_tidy_config": attr.label(default = Label("//:clang_tidy_config")), + "_clang_tidy_bazel_out_includes_are_system_includes": attr.label(default = Label("//:clang_tidy_bazel_out_includes_are_system_includes")), + "_clang_tidy_virtual_includes_are_system_includes": attr.label(default = Label("//:clang_tidy_virtual_includes_are_system_includes")), }, toolchains = ["@bazel_tools//tools/cpp:toolchain_type"], )