除非明确覆盖,否则如何创建一个采用默认值的 CMake 变量?

Goo*_*eds 7 c++ default build cmake

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

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

set(CMAKE_BUILD_TYPE Release CACHE STRING "")
Run Code Online (Sandbox Code Playgroud)

但是,这会缓存上次构建的构建类型,因此如果上次构建是Debug,我需要Release在下一次构建中明确指定。

我尝试使用FORCE并尝试添加

unset(CMAKE_BUILD_TYPE CACHE)
Run Code Online (Sandbox Code Playgroud)

之前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})
Run Code Online (Sandbox Code Playgroud)

测试.cpp

#include <iostream>

int main() {
#ifdef DEBUG
    std::cout << "Debug defined" << std::endl;
#else
    std::cout << "Debug not defined" << std::endl;
#endif
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

要构建,我使用

cmake .
make
Run Code Online (Sandbox Code Playgroud)

第一步可能有-DCMAKE_BUILD_TYPE=DebugforDebug模式。

JBL*_*JBL 12

你可以使用这样的东西:

if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE Release)
endif()
Run Code Online (Sandbox Code Playgroud)

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

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

unset(CMAKE_BUILD_TYPE CACHE)
Run Code Online (Sandbox Code Playgroud)

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