erenon / bazel_clang_tidy

Run clang-tidy on Bazel C++ targets directly, efficiently, with caching enabled
MIT License
96 stars 51 forks source link

Can't find system headers on Windows #44

Open e8y opened 1 year ago

e8y commented 1 year ago

My project builds with clang-cl, but when I use this aspect, it doesn't see certain system headers. Looking into the clang invocation with (-v), it seems the toolchain is slightly different and the system header dirs aren't right when invoked by the aspect.

My workspace .bazelrc file:

build --incompatible_enable_cc_toolchain_resolution
build --compiler=clang-cl
build --cxxopt=/std:c++20
build --cxxopt=-Wno-macro-redefined
build --cxxopt=-v

build:clang-tidy --aspects @bazel_clang_tidy//clang_tidy:clang_tidy.bzl%clang_tidy_aspect
build:clang-tidy --output_groups=report
build:clang-tidy --@bazel_clang_tidy//:clang_tidy_config=//:clang_tidy_config

When I build with bazel build, I see this coming from clang:

"C:\\Program Files\\LLVM\\bin\\clang-cl.exe"
-cc1
-triple
x86_64-pc-windows-msvc19.35.32215
[ ... omitted ... ]
-internal-isystem
"C:\\Program Files\\LLVM\\lib\\clang\\16\\include"
-internal-isystem
"C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\MSVC\\14.35.32215\\include"
-internal-isystem
"C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\MSVC\\14.35.32215\\ATLMFC\\include"
-internal-isystem
"C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Auxiliary\\VS\\include"
-internal-isystem
"C:\\Program Files (x86)\\Windows Kits\\10\\include\\10.0.19041.0\\ucrt"
-internal-isystem
"C:\\Program Files (x86)\\Windows Kits\\10\\\\include\\10.0.19041.0\\\\um"
-internal-isystem
"C:\\Program Files (x86)\\Windows Kits\\10\\\\include\\10.0.19041.0\\\\shared"
-internal-isystem
"C:\\Program Files (x86)\\Windows Kits\\10\\\\include\\10.0.19041.0\\\\winrt"
-internal-isystem
"C:\\Program Files (x86)\\Windows Kits\\10\\\\include\\10.0.19041.0\\\\cppwinrt"
-internal-isystem
"C:\\Program Files\\LLVM\\lib\\clang\\16.0.0\\include"

This is correct, and it builds without error.

But when I build with the aspect (bazel build --config=clang-tidy), I see a different triple and system header dirs that don't exist:

"C:\\work\\_bazel\\grcgufmr\\execroot\\__main__\\bazel-out\\x64_windows-fastbuild\\bin\\external\\ext\\llvm\\bin\\clang-tool"
"-cc1"
"-triple"
"x86_64-pc-windows-msvc19.20.0"
[ ... omitted ... ]
"-internal-isystem"
"C:\\work\\_bazel\\grcgufmr\\execroot\\__main__\\bazel-out\\x64_windows-fastbuild\\bin\\external\\ext\\llvm\\lib\\clang\\16\\include"
"-internal-isystem"
"C:/Program Files/Microsoft Visual Studio 10.0/VC/include"
"-internal-isystem"
"C:/Program Files/Microsoft Visual Studio 9.0/VC/include"
"-internal-isystem"
"C:/Program Files/Microsoft Visual Studio 9.0/VC/PlatformSDK/Include"
"-internal-isystem"
"C:/Program Files/Microsoft Visual Studio 8/VC/include"
"-internal-isystem"
"C:/Program Files/Microsoft Visual Studio 8/VC/PlatformSDK/Include"

I see that clang_tidy_aspect has an attribute _cc_toolchain but I'm not sure what to put there, or if/how it's being consumed. I gather that _toolchain_flags is where these flags come from.

Can anyone provide guidance? I'm unsure if this is a bug, or just an issue with my use case. Thanks!