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
と表示されますが、何が間違っていますか?
これは、オプションの値がキャッシュ(CMakeCache.txt
)。
CMakeListsのdefault値を変更したが、actual値が既にキャッシュに保存されている場合、キャッシュから値をロードするだけです。
したがって、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以降で使用可能です