How do I check if an environment variable is set in cmake

I did this but it doesn't work. CMake can't detect it.

export THING

But this one is works.

export THING=on

Maybe I should always give default value for environment variable.

By the way, you can check the environment string by following CMake code.

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

Just to be clear: as https://cmake.org/cmake/help/latest/command/if.html says:

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

is the right syntax, no $ anywhere.


Knowing perfectly well what export does and how environment works in general, I've still got a mouthful of WTFs with this form:

IF(DEFINED $ENV{THING})

but it worked fine in this form:

IF(DEFINED ENV{THING})

Notice the $ omission.


N.B. you can quickly test this using 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]--

The reason it behaves so weirdly, is legacy, as usual. IF used to do insane stuff in older CMake; they sort-of fixed this in CMake 3.1 — in a backward-compatible manner — with CMP0054, which you have to enable explicitly:

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 ..)

You CMake code is correct. The problem is most likely that you only set the environment variable in your shell but did not export it. Run the following before invoking cmake:

export THING