通过命令行从 msbuild 生成 compile_commands.json -- 没有 cmake

Generate compile_commands.json from msbuild via command line -- no cmake

我正在寻找一种将 clang-tidy 集成到 CI 工作流程中的方法,但正在使用的构建系统是 MSBuild,其依赖项由清单模式下的 vcpkg 管理。

是否有一些高级命令行我可以通过 MSBuild(或其他一些完全理解 MSBuild 过程的工具)生成 compile_commands.json

我确定我不是第一个尝试这样做的人,我已经看到几个使用 SourceTrailClangPowerTools 的成功案例,但在我的情况是因为替代方案无法检测到 vcpkg 公开的包含路径。

事实证明,自从 Visual Studio 开始支持该 linter 以来,msbuild 有一个针对 clang-tidy 的内置目标。

调用它可以 运行 : msbuild /t:ClangTidy ....

不幸的是,clang-tidy 与 msbuild CLI 的集成暴露了很少的命令行选项:检查列表、header-filter、其他编译器选项、系统警告标志 headers 和刀具路径。

如果要导出由 clang-tidy 生成的修复文件,这是我的情况,它需要做一些额外的工作。

我通过在项目文件夹中添加一个 Directory.Build.props 文件来实现我的目标,该文件使用批处理脚本 (.bat) 覆盖原始 clang-tidy.exe 的路径,这会做一些准备工作步骤并将 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 脚本,并且 none 被接受为合适的 clang-tidy 可执行文件。我尝试创建一个与我的 Python 脚本功能相同的 C++ 程序,它也按预期工作。

所以,总而言之,食谱是:

  1. 在要覆盖 clang-tidy 路径的项目的根文件夹中创建 Directory.Build.props 文件。
  2. 一个自定义 .exe.bat 文件来替换 clang-tidy 能够转发 msbuild 传递的命令行选项以及您希望的任何自定义。
  3. 调用 msbuild /t:ClangTidy ... Bob 就是你的叔叔了!