我正在寻找一种将
clang-tidy
集成到 CI 工作流程中的方法,但正在使用的构建系统是 MSBuild,其依赖项由 vcpkg 在 manisfest 模式下管理。
是否有一些高级命令行可以通过 MSBuild(或其他完全理解 MSBuild 过程的工具)来生成
compile_commands.json
?
我确信我不是第一个尝试这一点的人,我已经看到了一些使用
SourceTrail
和 ClangPowerTools
成功的案例,但在我的案例中它特别痛苦,因为替代方案无法检测到包括 vcpkg 暴露的路径。
事实证明,自从 Visual Studio 开始支持该 linter 以来,msbuild 有一个内置的 clang-tidy 目标。
要调用它,可以运行:
msbuild /t:ClangTidy ...
。
不幸的是,clang-tidy 集成到 msbuild CLI 中暴露的命令行选项很少:检查列表、标头过滤器、其他编译器选项、系统标头和工具路径中的警告标志。
如果想导出由 clang-tidy 生成的修复文件(这就是我的情况),则需要做一些额外的工作。
我通过在项目文件夹中添加一个
Directory.Build.props
文件来实现我的目标,该文件使用批处理脚本 (clang-tidy.exe
) 覆盖原始 .bat
的路径,该脚本执行一些准备步骤并将 msbuild 目标命令行转发到python 脚本,可以通过其完整的命令行功能调用 clang-tidy。
道具文件:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ClangTidyToolPath>$(where_I_saved_the_bat_file)\</ClangTidyToolPath>
<ClangTidyToolExe>msbuild-clang-tidy-runner.bat</ClangTidyToolExe>
</PropertyGroup>
</Project>
批处理文件:
SET PYTHONPATH=...
REM and maybe other stuff
python3 -m my_custom_clang_tidy_runner %*
有趣的是,除了真正的可执行文件之外,批处理文件是我可以将其放入
Directory.Build.props
中且不会导致 msbuild 编译错误的唯一方法。我尝试了 python 和 powershell 脚本,但没有一个被接受为合适的 clang-tidy 可执行文件。我尝试创建一个 C++ 程序,其功能与我的 Python 脚本相同,并且它也按预期工作。
所以,总而言之,食谱是:
Directory.Build.props
文件。.exe
或 .bat
文件,能够转发 msbuild 传递的命令行选项以及您希望的任何自定义。msbuild /t:ClangTidy ...
,鲍勃就是你的叔叔!请注意,Visual Studio 本身也支持 Clang,因此您也可以仅使用
clang-cl
进行构建并附加其他选项 -clang:-MJ -clang:compile_commands.json
来生成文件。-fdriver-only
来防止实际构建文件。