如何创建一个CMake变量,除非显式重写,否则使用默认值

How to create a CMake variable that takes a default value unless explicitly overridden?

本文关键字:默认值 重写 变量 创建 何创建 CMake 一个      更新时间:2023-10-16

我有一个使用CMake构建的C++项目。我希望CMakeLists.txt中的构建配置在默认情况下以Release模式构建,只有在明确指定时才以Debug模式构建。

参考这个和这个,为了允许从命令行指定构建类型,我设置了如下变量:

set(CMAKE_BUILD_TYPE Release CACHE STRING "")

但是,这会缓存上一次生成的生成类型,因此如果上一次的生成是Debug,则需要在下一次生成中显式指定Release

我尝试使用FORCE,也尝试添加

unset(CMAKE_BUILD_TYPE CACHE)

set()之前,但这两种方法都将值固定为Release并覆盖用户指定的值。

有办法做到这一点吗?非常感谢。


以下是MCVE:

CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
set(CMAKE_CXX_STANDARD 11)
project(Test LANGUAGES CXX)
set(CMAKE_BUILD_TYPE Release CACHE STRING "")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DDEBUG")
file(GLOB SOURCES *.cpp)
add_executable(test ${SOURCES})

test.cpp

#include <iostream>
int main() {
#ifdef DEBUG
std::cout << "Debug defined" << std::endl;
#else
std::cout << "Debug not defined" << std::endl;
#endif
return 0;
}

为了构建,我使用

cmake .
make

对于Debug模式,第一步骤可以具有-DCMAKE_BUILD_TYPE=Debug

您可以使用这样的东西:

if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release)
endif()

这样,如果没有为CMake指定任何内容,它将使用您在此处设置的任何值,否则将使用提供的值。

为了防止它被用于所有后续构建,请添加

unset(CMAKE_BUILD_TYPE CACHE)

在脚本的末尾,这样它就可以删除任何缓存的值,并依赖于默认值或提供的值。