it-swarm.com.de

cmake wenn sonst mit Option

Ich habe Probleme, option zusammen if-else Im cmake zu verwenden.

project(test)

option(TESTE "isso é um teste" OFF)

if(TESTE)
  message("true")
else()
  message("false")
endif()

add_executable(test main.cpp)

Es wird immer true angezeigt, auch wenn ich diese Option deaktiviert habe. Was mache ich falsch?

26
Alex

Das liegt daran, dass der Wert der Option im Cache gespeichert wird (CMakeCache.txt).

Wenn Sie den Standard Wert in den CMakeLists ändern, der tatsächliche Wert jedoch bereits im Cache gespeichert ist, wird nur der Wert aus dem Cache geladen.

Um die Logik in Ihren CMakeLists zu testen, löschen Sie den Cache jedes Mal, bevor Sie CMake erneut ausführen.

32
Simon

Ich hatte ein ähnliches Problem und konnte es mit einem etwas anderen Ansatz lösen.

Es mussten einige Kompilierungsflags hinzugefügt werden, falls cmake mit einer Option über die Befehlszeile aufgerufen wurde (d. H. cmake -DUSE_MY_LIB=ON). Wenn die Option im Aufruf cmake fehlte, wollte ich zum Standardfall zurückkehren, in dem die Option deaktiviert wurde.

Ich bin auf dieselben Probleme gestoßen, bei denen der Wert für diese Option zwischen Aufrufen zwischengespeichert wurde:

cmake -DUSE_MY_LIB=ON .. #invokes cmake and puts USE_MY_LIB=ON in CMake's cache.
cmake ..                 #invokes cmake with the cached option ON, instead of OFF

Die Lösung, die ich gefunden habe, war das Löschen der Option von innen CMakeLists.txt , nachdem die Option verwendet wurde:

option(USE_MY_LIB "Use MY_LIB instead of THEIR_LIB" OFF) #OFF by default
if(USE_MY_LIB)
    #add some compilation flags
else()
    #add some other compilation flags
endif(USE_MY_LIB)
unset(USE_MY_LIB CACHE) # <---- this is the important!!

Hinweis: Die Option unset ist seit cmake v3.0.2 verfügbar

7
Daniel