2016-09-21 2 views
0

変数を指定して環境に存在させる必要があります。 建物が存在しない場合は、建物を停止する必要があります。設定する必要があり、cmakeに存在する変数を指定する方法

if ("${VARMUSTEXIST}" STREQUAL "ON") 
    message(STATUS is ON) 
elif ("${VARMUSTEXIST}" STREQUAL "OFF") 
    message(STATUS is OFF) 
endif() 

私は、スクリプトの中でどこでもif (defined VARMUSTEXIST)を入れたくありません。 bashには、その "set -u"のオプションがあります。

+0

逆参照の場合、CMakeはすべての未定義の変数を空の値として扱います。私が知る限り、この動作に影響を与える方法はありません。ところで、変数が定義されていなければ、単純な 'if(VARMUSTEXIST)'は* false *として扱われます。これらの文字列は[if](https://cmake.org/cmake/help/v3.0/command/if.html)コマンドで特別な意味を持ちます。 – Tsyvarev

答えて

1

いくつかの予備的な点:cmakeの中に通常

  • if ("${VARMUSTEXIST}" STREQUAL "ON") [...] elif(AGAIN LONG EXPRESSION) [...] endif()
    は単純である:
    if (VARMUSTEXIST) [...] else() [...] endif()
  • コマンドif (DEFINED VARMUSTEXIST)は大文字であることDEFINEDを必要とします。
  • あなたはbashの環境変数に言及:
    環境変数は、あなたがどうなるの環境変数について$ENV{VARIABLE_NAME}
  • を使用して読み込まれます:

    if(NOT DEFINED ENV{VARMUSTEXIST}) 
        message(FATAL_ERROR "You must set VARMUSTEXIST environment variable") 
    endif() 
    

をあなたが言う:

I don't want to put an if (defined VARMUSTEXIST) everywhere in the script

これは、私には分かりません。各変数については、CMakeLists.txtの主要な部分に1回だけチェックする必要があります。もちろん、NOTを追加する必要があります。if (NOT DEFINED VARMUSTEXIST) [stop]

問題をより正確にすることができれば、1つまたは変数のグループが定義されているかどうかを確認するマクロを設計できます。

+0

変数のリストをチェックするためにcmakeスクリプトの冒頭にマクロを置くという考えは本当に良いですが、開発者が間違いを犯して変数名のスペルが間違っている場合をキャッチできません。 Cmakeは静かに続けます。私がしたいのは、変数の値を読み込むときに常に変数が定義されているかどうかをチェックし、変数が定義されていない場合は失敗するということです。互換性のために、このオプションを現在のcmake-fileに対してのみ有効にする必要があります。そうしないと、既存のcmake-fileを壊さずにインクルードすることはできません。 –

+0

bashについては、すべての変数を定義する必要があるという特長があるため、私はそれを述べました。例として、次のbashスクリプトはエラーが発生します: 'VAR = Y' '持ってクールになる$ {VA} ' をエコー-u'設定 '#/ binに/ bash' を '! 'cmake_policy(SET READ_UNDEFINED_VARIABLES OFF)' 'メッセージ(ステータス$ {VA})メッセージ行は、現在失敗し' :のように記述する可能性。それを使用する前に 'if(DEFINED VA)'を使って存在を確認することができます。 –

+1

@ D.Alex開発者スペルミスのリスクについては、数年前と全く同じ問題が提起されました。[here](http://public.kitware.com/pipermail/cmake/2008-November/025421.html)を参照してください。残念ながら、回避策はありません。たぶんあなたは機能リクエストを出したいと思うかもしれません(Cでも、[回避策]があります(http://stackoverflow.com/questions/33759787/generating-an-error-if-checked-boolean-macro-is-not-定義された))。ところで、後方互換性のために導入されたポリシーは、この目的には適していません。 [doc](https://cmake.org/cmake/help/v3.5/manual/cmake-policies.7.html)を参照してください。 – Antonio

関連する問題