在命令行或CMake上为Visual Studio代码分析指定规则集

jes*_*rhh 9 c++ code-analysis cmake visual-studio visual-studio-2013

我正在尝试为我的CMake驱动项目启用代码分析.我生成Visual Studio 2013解决方案,并希望使用特定规则集启用代码分析.我知道我可以通过在我的CMake文件中指定add_definitions("/ analyze")来启用代码分析,但是如何控制使用哪个规则集?

据我所知,控制使用的规则集的唯一方法是通过项目文件中的xml元素CodeAnalysisRuleSet,但我无法从CMake访问它.

chw*_*arr 5

如果您尝试通过命令行构建解决此问题(通过cmake --build或直接调用msbuild),而不是在使用 Visual Studio 生成的解决方案时,则可以在调用构建时设置相关属性。

使用 cmake 驱动构建:

PS c:\build-dir> cmake --build . -- '/p:RunCodeAnalysis=true' `
                     '/p:CodeAnalysisRuleSet=NativeRecommendedRules.ruleset'
Run Code Online (Sandbox Code Playgroud)

使用 MSBuild 驱动构建:

PS c:\build-dir> msbuild ALL_BUILD.vcxproj '/p:RunCodeAnalysis=true' `
                     '/p:CodeAnalysisRuleSet=NativeRecommendedRules'
Run Code Online (Sandbox Code Playgroud)

如果自定义目录中有自定义规则集,则还需要设置属性CodeAnalysisRuleSetDirectories

PS c:\build-dir> cmake --build . -- '/p:RunCodeAnalysis=true' `
                     '/p:CodeAnalysisRuleSet=custom.ruleset' `
                     '/p:CodeAnalysisRuleSetDirectories=c:\src\ruletsets'
Run Code Online (Sandbox Code Playgroud)

(使用 CMake 3.8.0、MSBuild 15.3.409.57025 和 Visual C++ 2017 19.11.25506 进行测试。)


Hur*_*rix 3

我不确定这对于 VS2013 解决方案有多有效。在 Visual Studio 2015 中,我使用项目用户模板 (*.vcxproj.user) 以及以下内容:

C:\MyProject\Template.USERNAME.user

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
    <CodeAnalysisRuleSet>@CMAKE_SOURCE_DIR@\SecurityRecommended.ruleset</CodeAnalysisRuleSet>
    <RunCodeAnalysis>true</RunCodeAnalysis>
  </PropertyGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)

您可能需要更改一些内容,例如将 ToolsVersion 更改为 12.x。

当您使用该函数生成实际的PROJECT.vcxproj.user文件时,将@CMAKE_SOURCE_DIR@自动被 cmake 替换。我的项目的CMakeLists.txt中有以下行:CONFIGURE_FILE

SET(USER_NAME $ENV{USERNAME} CACHE STRING UserName)
SET(USER_FILE ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.vcxproj.user)
CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/Template.${USER_NAME}.user ${USER_FILE} @ONLY)
Run Code Online (Sandbox Code Playgroud)

最后,我假设您可以使用这些模板用户定义PROJECT.vcxproj中的任何内容。