learnvst
learnvst

Reputation: 16193

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

I set an environment variable in my bash profile, so I can see it in the terminal just fine . .

blah/builds$ echo $THING

thingy

How do I display it in a cmake message and check if it is set? I have tried the following, but it just displays thing as blank and skips the body of the if statement

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

Upvotes: 51

Views: 64687

Answers (5)

ulidtko
ulidtko

Reputation: 15634

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

Upvotes: 62

Jan Wilmans
Jan Wilmans

Reputation: 823

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.

Upvotes: 17

ToyAuthor X
ToyAuthor X

Reputation: 325

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

Upvotes: 4

Gaurav
Gaurav

Reputation: 9

Replace

if(DEFINED ENV{THING})

with

if(DEFINED $ENV{THING})

You missed a '$' before the variable.

Upvotes: -13

kynan
kynan

Reputation: 13643

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

Upvotes: 12

Related Questions