通过命令行从 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
?
我确定我不是第一个尝试这样做的人,我已经看到几个使用 SourceTrail
和 ClangPowerTools
的成功案例,但在我的情况是因为替代方案无法检测到 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++ 程序,它也按预期工作。
所以,总而言之,食谱是:
- 在要覆盖 clang-tidy 路径的项目的根文件夹中创建
Directory.Build.props
文件。
- 一个自定义
.exe
或 .bat
文件来替换 clang-tidy 能够转发 msbuild 传递的命令行选项以及您希望的任何自定义。
- 调用
msbuild /t:ClangTidy ...
Bob 就是你的叔叔了!
我正在寻找一种将 clang-tidy
集成到 CI 工作流程中的方法,但正在使用的构建系统是 MSBuild,其依赖项由清单模式下的 vcpkg 管理。
是否有一些高级命令行我可以通过 MSBuild(或其他一些完全理解 MSBuild 过程的工具)生成 compile_commands.json
?
我确定我不是第一个尝试这样做的人,我已经看到几个使用 SourceTrail
和 ClangPowerTools
的成功案例,但在我的情况是因为替代方案无法检测到 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++ 程序,它也按预期工作。
所以,总而言之,食谱是:
- 在要覆盖 clang-tidy 路径的项目的根文件夹中创建
Directory.Build.props
文件。 - 一个自定义
.exe
或.bat
文件来替换 clang-tidy 能够转发 msbuild 传递的命令行选项以及您希望的任何自定义。 - 调用
msbuild /t:ClangTidy ...
Bob 就是你的叔叔了!