web-dev-qa-db-fra.com

cmake ignore -D CMAKE_BUILD_TYPE = Déboguer

J'essaye juste de construire un projet cmake en mode debug pour permettre les assertions. J'ai essayé les versions suivantes:

cmake -D CMAKE_BUILD_TYPE:STRING=Debug -L ../../
cmake -DCMAKE_BUILD_TYPE:STRING=Debug -L ../../
cmake -DCMAKE_BUILD_TYPE=Debug -L ../../

Malheureusement, aucun de ceux-ci n'a l'effet escompté - CMAKE_BUILD_TYPE est défini sur Debug (et par conséquent, le NDEBUG- n'est pas passé à gcc).

De plus, j'ai ajouté variable_watch(CMAKE_BUILD_TYPE) à mon CMakeLists.txt principal pour vérifier si la valeur get est remplacée quelque part. Mais la première sortie est un READ_ACCESS dans mon Principal. En outre, j’ai ajouté variable_watch(CMAKE_BUILD_TYPE) à mon CMakeLists.txt principal et la valeur à cet endroit est déjà Release.

Quelqu'un a-t-il une idée de la raison pour laquelle cmake ignore la configuration?

J'utilise la version 2.8.7 de cmake.

Merci d'avance pour votre aide!

10
ma0ho

Ok, fgrep -R "CMAKE_BUILD_TYPE" a finalement trouvé le problème pour moi. Dans un fichier CMakeLists.txt- j'ai trouvé quelque chose comme ça:

SET( CMAKE_BUILD_TYPE Release ... FORCE )

Cela remplace tous les paramètres définis par l'utilisateur (à cause de la FORCE).

Ce qui fonctionne pour moi c'est que:

IF( NOT CMAKE_BUILD_TYPE )
   SET( CMAKE_BUILD_TYPE Release ... FORCE )
ENDIF()

Merci pour vos conseils!

14
ma0ho

Je suppose qu'il y a quelque chose qui ne va pas dans votre configuration ..

J'ai écrit un exemple simple et complet ici: 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)

Quand vous exécutez cmake avec 

cmake -DCMAKE_BUILD_TYPE=Debug ../../

Il donne la sortie suivante:

$ ./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

Cela montre que CMAKE_BUILD_TYPE est en cours de définition à partir de la ligne de commande et qu'il est reconnu dans la configuration CMakeLists.txt.

Que se passe-t-il lorsque vous l'exécutez sur votre système avec votre version de CMake?

1
wojciii