cmake ignora -D CMAKE_BUILD_TYPE=Depurar

3 minutos de lectura

avatar de usuario de ma0ho
ma0ho

Solo estoy tratando de construir un proyecto cmake en modo de depuración para habilitar afirmaciones. Probé las siguientes versiones:

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

Desafortunadamente, ninguno de estos tiene el efecto deseado: que CMAKE_BUILD_TYPE se establece en Debug (y por lo tanto el NDEBUG-la bandera no se pasa a gcc).

Además agregué variable_watch(CMAKE_BUILD_TYPE) a mi principal CMakeLists.txt para verificar si el valor se anula en alguna parte. Pero la primera salida es un READ_ACCESS en mi principal Además agregué variable_watch(CMAKE_BUILD_TYPE) a mi principal CMakeLists.txt y el valor ahí ya está Release.

¿Alguien tiene una idea de por qué cmake ignora la configuración?

Estoy usando cmake versión 2.8.7.

  • ¿Ha revisado el contenido de CMakeCache.txt?

    – Drew McGowen

    28 de mayo de 2014 a las 9:35

  • Sí, hay conjunto CMAKE_BUILD_TYPE=Release – e incluso cambiando esto manualmente y luego volviendo a ejecutar cmake no tiene efecto (el valor en CMakeCache.txt get se sobrescribe de nuevo).

    – ma0ho

    28 de mayo de 2014 a las 9:38

  • ¿Está relacionado con esto? comentarios.gmane.org/gmane.comp.kde.devel.general/46310

    – Martín G.

    28 de mayo de 2014 a las 9:55

  • No en realidad no. mi problema no es que el CMAKE_BUILD_TYPE=Debug no tiene el efecto que debería tener, sino que no puedo establecer CMAKE_BUILD_TYPE a Debug..

    – ma0ho

    28 de mayo de 2014 a las 10:04

  • Ya limpié el directorio de compilación y lo intenté de nuevo, lo que tampoco tuvo ningún efecto. Y: Tienes razón. Estoy usando Unix-Makefiles.

    – ma0ho

    28 mayo 2014 a las 10:40

OK, fgrep -R "CMAKE_BUILD_TYPE" finalmente encontré el problema para mí. En algunos CMakeLists.txt-archivo encontré algo así:

SET( CMAKE_BUILD_TYPE Release ... FORCE )

Eso anula todos los parámetros definidos por el usuario (debido a la FORCE).

Lo que funciona para mí es que:

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

¡Gracias por tus consejos!

  • ¿Funciona para ti? Para mí, usar Ninja como objetivo de CMake, no parece funcionar. ¿Qué versión de CMake usas?

    – Royi

    18/09/2018 a las 17:51

  • En CMake moderno (por ejemplo, 3.10 y superior), consulte Blog de KitWare: CMake y el tipo de compilación predeterminado.

    – Royi

    18/09/2018 a las 18:35

  • ¿Para qué es el…? Los puntos suspensivos reemplazan el texto que se omitió. ¿O es un literal…?

    –Ben clave

    9 de julio de 2020 a las 7:11

Supongo que hay algo mal con su configuración..

Escribí un ejemplo simple y completo aquí:
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)

Cuando ejecutas cmake con

cmake -DCMAKE_BUILD_TYPE=Debug ../../

Da el siguiente resultado:

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

Muestra que CMAKE_BUILD_TYPE se configura desde la línea de comando y se reconoce en la configuración de CMakeLists.txt.

¿Qué sucede cuando lo ejecuta en su sistema usando su versión de CMake?

  • ¿Qué pasa si alguien hace esto? cmake -DCMAKE_BUILD_TYPE=DEBUG?

    – Serguéi Krivonos

    27 de marzo de 2015 a las 12:37


Esto funciona para mí:

IF(${CMAKE_BUILD_TYPE} MATCHES Debug)
...
ENDIF()

¿Ha sido útil esta solución?