# Environment variables and --warn-uninitialized

**URL:** <https://discourse.cmake.org/t/environment-variables-and-warn-uninitialized/3356>\
**Category:** Code\
**Created:** [May 18, 2021, 5:27am UTC](https://discourse.cmake.org/t/environment-variables-and-warn-uninitialized/3356 "2021-05-18T05:27:19Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![Panu](https://discourse.cmake.org/letter_avatar_proxy/v4/letter/p/e95f7d/32.png) [@Panu](https://discourse.cmake.org/u/Panu)\
**Post date:** [May 18, 2021, 5:27am UTC](https://discourse.cmake.org/t/environment-variables-and-warn-uninitialized/3356/1 "2021-05-18T05:27:19Z")

</div>

Environment variables can be used in `if` command:

> if ($ENV{FOO})  
> message(STATUS “bar”)  
> endif ()

This works as expected but produces a warning if cmake is executed with --warn-uninitialized and if FOO is not defined. Using DEFINED produces a syntax error because $ENV{FOO} is evaluated to nothing:

> if (DEFINED ENV{FOO} AND $ENV{FOO})  
> message(STATUS “bar”)  
> endif ()

Adding quotes makes the example work as expected but a warning about uninitialized variable is produced because $ENV{FOO} is evaluated before the `if` command even receives the arguments:

> if (DEFINED ENV{FOO} AND “$ENV{FOO}”)  
> message(STATUS “bar”)  
> endif ()

This works as expected and doesn’t produce a warning about uninitialized variable:

> if (DEFINED ENV{FOO})  
> if ($ENV{FOO})  
> message(STATUS “bar”)  
> endif ()  
> endif ()

But is there a way to use an environment variable in a single `if` command without producing warning about uninitialized variable?

---

<div class="post-metadata">

**Author:** ![marc.chevrier](https://discourse.cmake.org/letter_avatar_proxy/v4/letter/m/ecb155/32.png) [@marc.chevrier](https://discourse.cmake.org/u/marc.chevrier)\
**Post date:** [May 18, 2021, 1:04pm UTC](https://discourse.cmake.org/t/environment-variables-and-warn-uninitialized/3356/2 "2021-05-18T13:04:12Z")

</div>

No because in `CMake`, contrary to `C` or `C++`, both conditions of an `AND` are always evaluated.
