Cmake игнорирует -D CMAKE_BUILD_TYPE = Отладка
Я просто пытаюсь собрать проект cmake в режиме отладки, чтобы включить подтверждения. Я пробовал следующие версии:
cmake -D CMAKE_BUILD_TYPE:STRING=Debug -L ../../
cmake -DCMAKE_BUILD_TYPE:STRING=Debug -L ../../
cmake -DCMAKE_BUILD_TYPE=Debug -L ../../
К сожалению, ни один из этих способов не имеет желаемого эффекта - для CMAKE_BUILD_TYPE
установлено значение Debug
(и поэтому NDEBUG
-flag не передается в gcc).
Кроме того, я добавил variable_watch(CMAKE_BUILD_TYPE)
в свой основной CMakeLists.txt
, чтобы проверить, не переопределено ли значение где-либо. Но первый вывод - это READ_ACCESS
в моем главном
Кроме того, я добавил variable_watch(CMAKE_BUILD_TYPE)
в свой основной CMakeLists.txt
, и там уже есть значение Release
.
У кого-то есть идея, почему cmake игнорирует конфигурацию?
Я использую cmake версии 2.8.7.
Ответы
Ответ 1
Хорошо, fgrep -R "CMAKE_BUILD_TYPE"
, наконец, нашел проблему для меня. В некотором CMakeLists.txt
-file я нашел что-то вроде этого:
SET( CMAKE_BUILD_TYPE Release ... FORCE )
Это переопределяет все пользовательские параметры (из-за FORCE
).
Что для меня работает:
IF( NOT CMAKE_BUILD_TYPE )
SET( CMAKE_BUILD_TYPE Release ... FORCE )
ENDIF()
Спасибо за ваши подсказки!
Ответ 2
Я предполагаю, что с вашей конфигурацией что-то не так.
Я написал полный, простой пример:
https://dl.dropboxusercontent.com/u/68798379/cmake-build-type.tar.bz2
cmake_minimum_required (VERSION 2.8)
project(playlib)
message("CMAKE_BUILD_TYPE = ${CMAKE_BUILD_TYPE}")
IF(CMAKE_BUILD_TYPE MATCHES Debug)
message("Debug build.")
ELSEIF(CMAKE_BUILD_TYPE MATCHES Release)
message("Release build.")
ELSE()
message("Some other build type.")
ENDIF()
add_library(TESTLIB SHARED src/test.c)
Когда вы выполняете cmake с помощью
cmake -DCMAKE_BUILD_TYPE=Debug ../../
Он дает следующий результат:
$ ./gen-linux.sh
-- The C compiler identification is GNU 4.8.2
-- The CXX compiler identification is GNU 4.8.2
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
CMAKE_BUILD_TYPE = Debug
Debug build.
-- Configuring done
-- Generating done
-- Build files have been written to: /home/wojci/stack-overflow/cmake-build-type/build/linux
Это показывает, что CMAKE_BUILD_TYPE задается из командной строки и распознается в конфигурации CMakeLists.txt.
Что происходит, когда вы запускаете его в своей системе, используя вашу версию CMake?