Cmake FAQ
和
other
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
。
我应该如何区分当前的发电机是否支持多种配置?
答案 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.cmake
,findCUDA.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看到的更多详情:
CMAKE_CONFIGURATION_TYPES
设置的EnableLanguage()