我正在尝试为我的CMake驱动项目启用代码分析。我生成Visual Studio 2013解决方案,并希望使用特定规则集启用代码分析。我知道我可以通过在我的CMake文件中指定add_definitions(" / analyze")来启用代码分析,但是如何控制使用哪个规则集?
据我所知,控制使用的规则集的唯一方法是通过项目文件中的xml元素CodeAnalysisRuleSet,但我无法从CMake访问它。
答案 0 :(得分:3)
如果您尝试为命令行构建解决此问题 - 通过cmake --build
或直接调用msbuild
- 而不是在使用Visual Studio生成的解决方案时,您可以设置调用构建时的相关属性。
用cmake驱动构建:
PS c:\build-dir> cmake --build . -- '/p:RunCodeAnalysis=true' `
'/p:CodeAnalysisRuleSet=NativeRecommendedRules.ruleset'
使用MSBuild驱动构建:
PS c:\build-dir> msbuild ALL_BUILD.vcxproj '/p:RunCodeAnalysis=true' `
'/p:CodeAnalysisRuleSet=NativeRecommendedRules'
如果您在自定义目录中有自定义规则集,则还需要设置属性CodeAnalysisRuleSetDirectories
:
PS c:\build-dir> cmake --build . -- '/p:RunCodeAnalysis=true' `
'/p:CodeAnalysisRuleSet=custom.ruleset' `
'/p:CodeAnalysisRuleSetDirectories=c:\src\ruletsets'
(使用CMake 3.8.0测试,MSBuild 15.3.409.57025和Visual C ++ 2017 19.11.25506。)
答案 1 :(得分:2)
我不确定这对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>
您可能需要将ToolsVersion之类的内容更改为12.x。
当您使用@CMAKE_SOURCE_DIR@
函数生成实际的 PROJECT.vcxproj.user 文件时,CONFIGURE_FILE
将自动被cmake取代。我在项目的 CMakeLists.txt 中有以下行:
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)
最后,我假设您可以使用这些模板用户定义 PROJECT.vcxproj 中的任何内容。
答案 2 :(得分:1)
VS2017:在CMakeSettings.json部分的“配置”中添加参数“ codeAnalysisRuleset”:“ NativeRecommendedRules.ruleset” 。然后在解决方案资源管理器中,右键单击需要的文件.cpp,选择菜单“在文件上运行代码分析”。您可以从VS文件夹“ c:\ Program Files(x86)\ Microsoft Visual Studio \ 2017 \ Enterprise \ Team Tools \ Static Analysis Tools \ Rule Sets \ NativeRecommendedRules.ruleset”中的各种分析器中进行选择