web-dev-qa-db-ja.com

他のオプションがある場合は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と表示されますが、何が間違っていますか?

26
Alex

これは、オプションの値がキャッシュ(CMakeCache.txt)。

CMakeListsのdefault値を変更したが、actual値が既にキャッシュに保存されている場合、キャッシュから値をロードするだけです。

したがって、CMakeListsのロジックをテストするには、CMakeを再実行する前に毎回キャッシュを削除します。

32
Simon

同様の問題があり、わずかに異なるアプローチを使用してそれを解決することができました。

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以降で使用可能です

7
Daniel