cmake если еще с опцией
Я с проблемой использовать option
все вместе if-else
в cmake.
project(test)
option(TESTE "isso é um teste" OFF)
if(TESTE)
message("true")
else()
message("false")
endif()
add_executable(test main.cpp)
Это всегда отображать true
даже если я отключу опцию, что я делаю не так?
2 ответа
Это потому, что значение параметра хранится в кэше (CMakeCache.txt
).
Если вы измените значение по умолчанию в CMakeLists, но фактическое значение уже сохранено в кэше, оно просто загрузит значение из кэша.
Поэтому, чтобы проверить логику в ваших CMakeLists, удаляйте кэш каждый раз перед повторным запуском CMake.
У меня была похожая проблема, и я смог решить ее, используя немного другой подход.
Мне нужно было добавить некоторые флаги компиляции в случае, если cmake был вызван с опцией из командной строки (т.е. cmake -DUSE_MY_LIB=ON
). Если опция отсутствовала в вызове cmake, я хотел бы вернуться к случаю по умолчанию, который отключал эту опцию.
Я столкнулся с теми же проблемами, когда значение для этой опции кэшировалось между вызовами:
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
Решением, которое я нашел, было удаление опции из CMakeLists.txt после ее использования:
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!!
Примечание:unset
опция доступна с версии cmake v3.0.2