Как создать переменную CMake, которая принимает значение по умолчанию, если явно не переопределено? - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть проект C ++, который построен с использованием CMake. Мне бы хотелось, чтобы конфигурация сборки в CMakeLists.txt была такой, чтобы по умолчанию она строилась в режиме Release, а в режиме Debug - только в случае явного указания.

Обращаясь к this и this , чтобы разрешить указание типа сборки из командной строки, я установил переменную следующим образом:

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 голосов
/ 05 ноября 2018

Вы можете использовать что-то вроде этого:

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

Таким образом, если для CMake ничего не указано, он будет использовать любое значение, установленное здесь, и предоставленное значение в противном случае.

Чтобы не использовать его для всех последующих сборок, добавьте

unset(CMAKE_BUILD_TYPE CACHE)

ближе к концу вашего скрипта, так что он удаляет любое кэшированное значение и полагается либо на значение по умолчанию, либо на предоставленное.

...