How to create a CMake variable that takes a default value unless explicitly overriden?(除非显式覆盖,否则如何创建接受默认值的CMake变量?)
问题描述
我有一个使用CMake构建的C++项目。我希望CMakeLists.txt中的生成配置在默认情况下以Release模式生成,并且仅在显式指定时才以Debug模式生成。
参考this和this,为了允许从命令行指定构建类型,我设置了如下变量:
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)
接近脚本末尾,以便它删除任何缓存值并依赖于默认值或提供的值。
这篇关于除非显式覆盖,否则如何创建接受默认值的CMake变量?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:除非显式覆盖,否则如何创建接受默认值的CMake变量?
基础教程推荐
- 提升 ASIO 流缓冲 2021-01-01
- 将不可复制的闭包对象传递给 std::function 参数 2021-01-01
- 随机插入/删除的综合向量与链表基准 2022-01-01
- 如何在 C++ 中正确使用命名空间? 2022-01-01
- C++:获取传递给函数的多维数组的行大小 2021-01-01
- 与 CAS 的原子交换(使用 gcc 同步内置函数) 2022-01-01
- 如何部分禁用 cmake C/C++ 自定义编译器检查 2021-01-01
- 为什么我们不能使用“虚拟继承"?在 COM 中? 2022-01-01
- c++ STL设置差异 2022-01-01
- 如何更改 SysDateTimePick32 或 CDateTimeCtrl 的背景颜色? 2022-01-01
