除非明确重写,否则如何创建采用默认值的CMake变量?

时间:2018-11-05 17:32:18

标签: c++ build cmake default

我有一个使用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

第一步可以将-DCMAKE_BUILD_TYPE=Debug用于Debug模式。

1 个答案:

答案 0 :(得分:1)

您可以使用以下内容:

function myTcpipCallback(obj,evt)
    % Bufferize
    obj.UserData=[obj.UserData ; fread(obj,1,'char')]; %Read 1 byte

    % Check if the message if known
    msg = obj.UserData;
    if isComplete(msg)  % 
         obj.UserData=[]; % empty buffer
         processMessage(msg); % do something with message
    end
end

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

要防止将其用于以后的所有构建,请添加

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

在脚本的结尾处,以便它删除所有缓存的值并依靠默认值或提供的值。