web-dev-qa-db-ja.com

環境変数がcmakeで設定されているかどうかを確認する方法

Bashプロファイルで環境変数を設定したので、端末で問題なく表示できます。 。

blah/builds $ echo $ THING

ものすごい

Cmakeメッセージに表示して、設定されているかどうかを確認するにはどうすればよいですか?私は次のことを試しましたが、それは単に空白として表示され、ifステートメントの本体をスキップします

message("THING:" $ENV{THING})
if(DEFINED ENV{THING})
    message(STATUS "THING environment variable defined")
    # some more commands
endif()
22
learnvst

CMakeコードは正しいです。問題は、シェル内の環境変数setのみであり、exportではなかった可能性が高いです。 cmakeを呼び出す前に次を実行します。

export THING
9
kynan

exportが何をするのか、そして環境がどのように一般的に機能するのかを完全に知っているのですが、私はまだこの形式のWTFをたくさん持っています:

IF(DEFINED $ENV{THING})

しかし、この形式ではうまくいきました:

IF(DEFINED ENV{THING})

$省略に注意してください。


N.B. cmake -Pを使用してこれをすばやくテストできます。

[~] cat > test-env.cmake << 'EOF'
IF(DEFINED ENV{FOOBAR})
    MESSAGE(STATUS "FOOBAR env seen: --[$ENV{FOOBAR}]--")
ELSE()
    MESSAGE(STATUS "WTF")
ENDIF()
EOF
[~]
[~] FOOBAR=test cmake -P test-env.cmake
-- FOOBAR env seen: --[test]--

それがとても奇妙に振る舞う理由は、いつものようにレガシーです。 IFは以前のCMakeで非常識なことをしていました。 CMake 3.1では、下位互換性のある方法で CMP0054 を使用してこれを並べ替え、明示的に有効にする必要があります。

CMAKE_MINIMUM_REQUIRED(VERSION 3.1)
PROJECT(...)

CMAKE_POLICY(SET CMP0054 NEW) #-- fixes IF() with quoted args
CMAKE_POLICY(SET CMP0057 NEW) #-- enables IF(.. IN_LIST ..)
10
ulidtko

私はこれをしましたが、うまくいきません。 CMakeはそれを検出できません。

export THING

しかし、これは機能します。

export THING=on

環境変数のデフォルト値を常に指定する必要があります。

ところで、CMakeコードに従って環境文字列を確認できます。

if( $ENV{THING} STREQUAL "on")
    message(STATUS "THING = " $ENV{THING})
endif()
4
ToyAuthor X

明確にするために: https://cmake.org/cmake/help/latest/command/if.html のように:

if (DEFINED ENV{THING})
  # do stuff
endif()

は正しい構文であり、$はどこにもありません。

2
Jan Wilmans