如何创建一个CMake变量,除非显式重写,否则使用默认值
How to create a CMake variable that takes a default value unless explicitly overridden?
我有一个使用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)
在脚本的末尾,这样它就可以删除任何缓存的值,并依赖于默认值或提供的值。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 具有默认值的引用获取函数
- 当给定默认值时,为什么此模板参数推导失败
- 从具有默认值的部分指定模板类继承时发生SWIG错误,具有不带默认值的正向声明
- 格式化浮点值:返回默认值
- 如何将数组部分初始化为某个默认值?
- asn1c 不会从 asn.1 模块中提取八位字节字符串的默认值
- 创建一个包含 c++ 默认值的环境文件
- C++(和 ROS) - 包含与前向声明引用,设置默认值和类型定义
- Makefile g++ 使用命令行中的 -D 变量进行编译,默认值
- Switch 语句(字符串)一直选择默认值,除非其为零
- 如何使用默认值将枚举声明为 extern
- 如何在提升程序选项中设置矢量<矢量>的默认值<string>
- 如何使用默认值为构造函数中的枚举赋值?
- 变量始终在函数中重置为默认值
- 如何在C++中提供模板化函数作为另一个函数的参数,默认值?
- 函数不返回默认值
- 具有公共范围与专用范围的默认值的C++的不同行为
- 在 c++ 中,如果我创建一个接受一个具有默认值的参数的构造函数 - 它会用作默认(空)构造函数吗?
- 默认值-在c++中重写签名时更改签名