Visual Studio的Cmake生成器不设置CMAKE_CONFIGURATION_TYPES

时间:2015-07-27 19:05:43

标签: visual-studio cmake

Cmake FAQother places 建议检查CMAKE_CONFIGURATION_TYPES以识别多配置生成器。我发现了几个不起作用的问题(例如this one)。问题似乎是第一次调用cmake时没有设置变量。

我使用以下文件进行了测试

cmake_minimum_required(VERSION 2.6)

if(CMAKE_CONFIGURATION_TYPES)
    message("Multi-configuration generator")
else()
    message("Single-configuration generator")
endif()

project(foo)

并称之为

mkdir build
cd build
cmake -G "Visual Studio 12 2013" ..

得到Single-configuration generator

我应该如何区分当前的发电机是否支持多种配置?

1 个答案:

答案 0 :(得分:6)

已审核:添加了有关检查和更改 CMAKE_CONFIGURATION_TYPES的信息

检查并更改CMAKE_CONFIGURATION_TYPES

根据this question的建议,您可以检查并更改CMAKE_CONFIGURATION_TYPES,但请注意 CMake 3.2.2中存在错误0015577: The 'project' command overwrites CMAKE_CONFIGURATION_TYPES打破初始VS解决方案生成的这种行为(使用CMake 3.3.0修复):

cmake_minimum_required(VERSION 3.3)

project(foo NONE)

if(CMAKE_CONFIGURATION_TYPES)
    message("Multi-configuration generator")
    set(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING "My multi config types" FORCE)
else()
    message("Single-configuration generator")
endif()

enable_language(C CXX)

预设CMAKE_CONFIGURATION_TYPES

如果您只需要为多配置环境配置一组配置(感谢@Tsyvarev提供建议):

cmake_minimum_required(VERSION 2.8)

# NOTE: Only used in multi-configuration environments
set(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING "My multi config types" FORCE)

project(foo)

没有多配置环境会忽略它。但请注意其他CMake模块(如findBoost.cmakefindCUDA.cmake)可能依赖于CMAKE_CONFIGURATION_TYPES为空的单配置环境(再次感谢@Tsyvarev提示)

因此,更好的解决方案是为所有支持的生成器添加工具链文件。它们通常很有用,因为您可以处理所有工具链/发电机特定部件。

以下是我VSToolchain.txt的摘录:

# Reduce the config types to only Debug and Release
SET(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING "" FORCE)

# Standard is a console app. If you need a windows app, use WIN32 define in add_executable
set(CMAKE_WIN32_EXECUTABLE 0 CACHE INTERNAL "")

CMAKE_WIN32_EXECUTABLE就是为了显示我在Visual Studio工具链文件中添加了哪些设置。

此处建议使用另一个CMake命令行解决方案:How to create cmake build configuration without debug symbols and without optimizations?

仅检查CMAKE_CONFIGURATION_TYPES

如果您只想查看CMake在CMAKE_CONFIGURATION_TYPES中设置的内容:

我刚刚使用Visual Studio 2013和MinGW / GCC测试了您的上述代码(两者都带有空build目录)。您只需要一个小的更改并在project()命令后移动检查:

project(foo)

message("CMAKE_CONFIGURATION_TYPES ${CMAKE_CONFIGURATION_TYPES}")

if(CMAKE_CONFIGURATION_TYPES)
    message("Multi-configuration generator")
else()
    message("Single-configuration generator")
endif()

我得到了VS2013:

CMAKE_CONFIGURATION_TYPES Debug;Release;MinSizeRel;RelWithDebInfo
Multi-configuration generator

对于GCC:

CMAKE_CONFIGURATION_TYPES
Single-configuration generator

有关CMake看到的更多详情: