通过命令行从msbuild生成compile_commands.json——无需cmake

问题描述 投票:0回答:2

我正在寻找一种将

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

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

compile_commands.json

我确信我不是第一个尝试这一点的人,我已经看到了一些使用

SourceTrail
ClangPowerTools
成功的案例,但在我的案例中它特别痛苦,因为替代方案无法检测到包括 vcpkg 暴露的路径。

msbuild continuous-integration clang-tidy
2个回答
2
投票

事实证明,自从 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 脚本相同,并且它也按预期工作。

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

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

0
投票

请注意,Visual Studio 本身也支持 Clang,因此您也可以仅使用

clang-cl
进行构建并附加其他选项
-clang:-MJ -clang:compile_commands.json
来生成文件。
您可能还想使用
-fdriver-only
来防止实际构建文件。

© www.soinside.com 2019 - 2024. All rights reserved.