分解出设置依赖于配置的设置的代码。例如,SetUpConfigurations.cmake
使用以下内容创建一个文件:
if(NOT SET_UP_CONFIGURATIONS_DONE)
set(SET_UP_CONFIGURATIONS_DONE TRUE)
# No reason to set CMAKE_CONFIGURATION_TYPES if it's not a multiconfig generator
# Also no reason mess with CMAKE_BUILD_TYPE if it's a multiconfig generator.
get_property(isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
if(isMultiConfig)
set(CMAKE_CONFIGURATION_TYPES "Debug;Release;Profile" CACHE STRING "" FORCE)
else()
if(NOT CMAKE_BUILD_TYPE)
message("Defaulting to release build.")
set(CMAKE_BUILD_TYPE Release CACHE STRING "" FORCE)
endif()
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY HELPSTRING "Choose the type of build")
# set the valid options for cmake-gui drop-down list
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug;Release;Profile")
endif()
# now set up the Profile configuration
set(CMAKE_C_FLAGS_PROFILE "...")
set(CMAKE_CXX_FLAGS_PROFILE "...")
set(CMAKE_EXE_LINKER_FLAGS_PROFILE "...")
endif()
然后这个文件以'sinclude(..)
开头。CMakeLists.txt
关于放置位置,您有两种选择SetUpConfigurations.cmake
,这取决于您如何组织项目、存储库:
quick'n'dirty 方法:将此脚本复制并提交到每个需要它的项目中。相对于项目的位置,它的位置是固定CMakeLists.txt
的。所以你可以包括它,例如,include(${CMAKE_CURRENT_SOURCE_DIR}/<...>/SetUpConfigurations.cmake)
规范的方式:使用您的自定义 CMake 脚本维护一个存储库,例如这个。每次使用命令生成项目时,都会在变量cmake
中传递此存储库的路径:CMAKE_MODULE_PATH
cmake -DCMAKE_MODULE_PATH=<dir-of-cmake-script-repo> ...
include(SetUpConfigurations)
在这种情况下,包括带有(无.cmake
扩展名)的脚本。
关于什么是多配置生成器的注释:
Xcode
并且Visual Studio
是多配置生成器。它们尊重 的值CMAKE_CONFIGURATION_TYPES
但CMAKE_BUILD_TYPE
没有效果,因为在CMakeLists.txt
处理 时没有定义具体的配置。稍后将在 IDE 的用户界面上选择它。
另一方面,makefile 风格的生成器对CMAKE_CONFIGURATION_TYPES
. CMAKE_BUILD_TYPE
定义配置。这是处理文件时的具体值,CMakeLists.txt
但仍然:永远不要根据以下值做出任何决定CMAKE_BUILD_TYPE
:
if(CMAKE_BUILD_TYPE STREQUAL "Release") # WRONG!
....
endif()
您的项目将无法在多配置生成器中按预期工作。