Reputation: 16193
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
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
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
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
Reputation: 9
Replace
if(DEFINED ENV{THING})
with
if(DEFINED $ENV{THING})
You missed a '$' before the variable.
Upvotes: -13
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