如何创建一个采用默认值的 CMake 变量,除非显式覆盖?

2024-01-02

我有一个使用 CMake 构建的 C++ 项目。我希望 CMakeLists.txt 中的构建配置能够构建在Release默认模式,并内置Debug仅当明确指定时才模式。

参考this https://cmake.org/cmake/help/v3.11/command/set.html and this https://stackoverflow.com/a/19911494/5987698,为了允许从命令行指定构建类型,我将变量设置如下:

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

第一步可以有-DCMAKE_BUILD_TYPE=Debug for Debug mode.


你可以使用这样的东西:

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

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

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

unset(CMAKE_BUILD_TYPE CACHE)

在脚本末尾,这样它就会删除所有缓存的值并依赖默认值或提供的值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何创建一个采用默认值的 CMake 变量,除非显式覆盖? 的相关文章

随机推荐