web-dev-qa-db-fra.com

cmake sinon avec option

Je rencontre un problème pour utiliser option ensemble if-else dans le cmake.

project(test)

option(TESTE "isso é um teste" OFF)

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

add_executable(test main.cpp)

Il affiche toujours true même si je mets OFF à l'option, qu'est-ce que je fais mal?

26
Alex

En effet, la valeur de l'option est stockée dans le cache (CMakeCache.txt).

Si vous modifiez la valeur par défaut dans les CMakeLists mais que la valeur réelle est déjà stockée dans le cache, il chargera simplement la valeur à partir du cache.

Donc, pour tester la logique dans vos CMakeLists, supprimez le cache à chaque fois avant de relancer CMake.

32
Simon

J'ai eu un problème similaire et j'ai pu le résoudre en utilisant une approche légèrement différente.

J'avais besoin d'ajouter des drapeaux de compilation au cas où cmake était invoqué avec une option de la ligne de commande (c'est-à-dire cmake -DUSE_MY_LIB=ON). Si l'option manquait dans l'invocation cmake , je voulais revenir au cas par défaut qui désactivait l'option.

J'ai rencontré les mêmes problèmes, où la valeur de cette option était mise en cache entre les invocations:

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

La solution que j'ai trouvée a été de supprimer l'option de l'intérieur CMakeLists.txt après avoir utilisé l'option:

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!!

Remarque: L'option unset est disponible depuis cmake v3.0.2

7
Daniel