cmake ignoriert -D CMAKE_BUILD_TYPE=Debug

Lesezeit: 3 Minuten

Benutzeravatar von ma0ho
ma0ho

Ich versuche nur, ein cmake-Projekt im Debug-Modus zu erstellen, um Asserts zu aktivieren. Folgende Versionen habe ich ausprobiert:

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

Leider hat keines davon den gewünschten Effekt – nämlich CMAKE_BUILD_TYPE ist eingestellt auf Debug (und damit die NDEBUG-flag wird nicht an gcc übergeben).

Zusätzlich habe ich hinzugefügt variable_watch(CMAKE_BUILD_TYPE) zu meiner Hauptsache CMakeLists.txt um zu prüfen, ob der Wert irgendwo überschrieben wird. Aber die erste Ausgabe ist a READ_ACCESS in meiner Hauptsache Zusätzlich habe ich hinzugefügt variable_watch(CMAKE_BUILD_TYPE) zu meiner Hauptsache CMakeLists.txt und der Wert ist bereits vorhanden Release.

Hat jemand eine Idee, warum cmake die Konfiguration ignoriert?

Ich verwende cmake Version 2.8.7.

  • Haben Sie den Inhalt von überprüft CMakeCache.txt?

    – Drew McGowen

    28. Mai 2014 um 9:35 Uhr

  • Ja, es ist eingestellt CMAKE_BUILD_TYPE=Release – und dies sogar manuell ändern und dann erneut ausführen cmake hat keine Wirkung (der Wert in CMakeCache.txt wird wieder überschrieben).

    – ma0ho

    28. Mai 2014 um 9:38 Uhr

  • Hängt es damit zusammen? comments.gmane.org/gmane.comp.kde.devel.general/46310

    –Martin G

    28. Mai 2014 um 9:55 Uhr

  • Nein nicht wirklich. Mein Problem ist das nicht CMAKE_BUILD_TYPE=Debug hat nicht die Wirkung, die es haben sollte, sondern die ich nicht einstellen kann CMAKE_BUILD_TYPE zu Debug..

    – ma0ho

    28. Mai 2014 um 10:04 Uhr

  • Ich habe bereits das Build-Verzeichnis bereinigt und es erneut versucht, was auch keine Wirkung hatte. Und: Sie haben recht. Ich verwende Unix-Makefiles.

    – ma0ho

    28. Mai 2014 um 10:40 Uhr

OK, fgrep -R "CMAKE_BUILD_TYPE" endlich das Problem bei mir gefunden. In einigen CMakeLists.txt-Datei habe ich so etwas gefunden:

SET( CMAKE_BUILD_TYPE Release ... FORCE )

Das überschreibt alle benutzerdefinierten Parameter (wegen der FORCE).

Was für mich funktioniert, ist Folgendes:

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

Danke für eure Hinweise!

  • Funktioniert es für Sie? Wenn ich Ninja als Ziel von CMake verwende, scheint es nicht zu funktionieren. Welche CMake-Version verwendest du?

    – Royi

    18. September 2018 um 17:51 Uhr

  • Auf modernem CMake (z. B. 3.10 und höher) siehe KitWare-Blog – CMake und der Standard-Build-Typ.

    – Royi

    18. September 2018 um 18:35 Uhr

  • Wozu dient das …? Auslassungspunkte ersetzen ausgelassenen Text. Oder ist es wörtlich …?

    – Ben Schlüssel

    9. Juli 2020 um 7:11 Uhr

Ich vermute, dass mit deiner Konfiguration etwas nicht stimmt..

Ich habe hier ein vollständiges, einfaches Beispiel geschrieben:
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)

Wenn Sie cmake mit ausführen

cmake -DCMAKE_BUILD_TYPE=Debug ../../

Es gibt die folgende Ausgabe:

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

Es zeigt, dass CMAKE_BUILD_TYPE über die Befehlszeile festgelegt und in der CMakeLists.txt-Konfiguration erkannt wird.

Was passiert, wenn Sie es mit Ihrer Version von CMake auf Ihrem System ausführen?

  • Was ist, wenn jemand dies macht cmake -DCMAKE_BUILD_TYPE=DEBUG?

    – Sergej Krivonos

    27. März 2015 um 12:37 Uhr


Das funktioniert bei mir:

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

1432380cookie-checkcmake ignoriert -D CMAKE_BUILD_TYPE=Debug

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy