除非显式覆盖,否则如何创建接受默认值的CMake变量? [英] How to create a CMake variable that takes a default value unless explicitly overriden?

查看:0
本文介绍了除非显式覆盖,否则如何创建接受默认值的CMake变量?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

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变量?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆