Discussion:
[cmake-developers] unset and cache variables
James Touton
2018-08-16 21:38:11 UTC
Permalink
I just recently came across this:

set(BLAH blah CACHE INTERNAL "")
unset(BLAH)
message("BLAH: ${BLAH}")

Surprisingly (to me), this prints out "blah". I had expected the unset
command to make the cached value inaccessible. The documentation just
states that the function "[r]emoves the specified variable causing it to
become undefined." Is this a bug? I would prefer for the function to
guarantee that ${BLAH} comes up empty.
Robert Maynard
2018-08-16 21:46:33 UTC
Permalink
Looking at the current docs (
https://cmake.org/cmake/help/v3.12/command/unset.html ) I think the
first paragraph needs to be read as a single statement to understand
the behavior.

"Removes the specified variable causing it to become undefined. If
CACHE is present then the variable is removed from the cache instead
of the current scope."

I think we can be more explicit by rephrasing as:

"Makes the local variable variable from the current scope be
undefined, If CACHE is present then instead the cache variable is
undefined."
Post by James Touton
set(BLAH blah CACHE INTERNAL "")
unset(BLAH)
message("BLAH: ${BLAH}")
Surprisingly (to me), this prints out "blah". I had expected the unset command to make the cached value inaccessible. The documentation just states that the function "[r]emoves the specified variable causing it to become undefined." Is this a bug? I would prefer for the function to guarantee that ${BLAH} comes up empty.
--
Powered by www.kitware.com
Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ
CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html
Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html
https://cmake.org/mailman/listinfo/cmake-developers
--
Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
https://cmake.org/mailman/listinfo/cmake-developers
James Touton
2018-08-16 22:00:19 UTC
Permalink
Fair enough, but I think that makes the command substantially less useful.
It means that I need to use set(BLAH "") if I want to empty a variable of
its contents, and I can never actually make it become undefined, counter to
the claim in the documentation:

set(BLAH blah CACHE INTERNAL "")
unset(BLAH)
if(DEFINED BLAH)
message("here") # this message gets printed!
endif()

I am now effectively subject to sabotage from above.

I had been operating under the assumption that there was only one active
lookup scope, constructed from the previous lookup scope and any new
sets/unsets at the current level. I therefore expected that if a variable
were removed from "the" current scope, it would be inaccessible.
Post by Robert Maynard
Looking at the current docs (
https://cmake.org/cmake/help/v3.12/command/unset.html ) I think the
first paragraph needs to be read as a single statement to understand
the behavior.
"Removes the specified variable causing it to become undefined. If
CACHE is present then the variable is removed from the cache instead
of the current scope."
"Makes the local variable variable from the current scope be
undefined, If CACHE is present then instead the cache variable is
undefined."
Post by James Touton
set(BLAH blah CACHE INTERNAL "")
unset(BLAH)
message("BLAH: ${BLAH}")
Surprisingly (to me), this prints out "blah". I had expected the unset
command to make the cached value inaccessible. The documentation just
states that the function "[r]emoves the specified variable causing it to
become undefined." Is this a bug? I would prefer for the function to
guarantee that ${BLAH} comes up empty.
Post by James Touton
--
Powered by www.kitware.com
http://www.cmake.org/Wiki/CMake_FAQ
Post by James Touton
Kitware offers various services to support the CMake community. For more
CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html
Visit other Kitware open-source projects at http://www.kitware.com/
opensource/opensource.html
Post by James Touton
https://cmake.org/mailman/listinfo/cmake-developers
Robert Maynard
2018-08-17 12:22:33 UTC
Permalink
Post by James Touton
I can never actually make it become undefined
You can, you are missing unset(BLAH CACHE) to tell CMake you want to
undefine the CACHE varibles
Post by James Touton
I had been operating under the assumption that there was only one active lookup scope
Nope CMake lookup is local scope, and than cache. That is how CMake
supports CACHE and local variables with the same name. The rules of
variable lookup are outlined at
https://cmake.org/cmake/help/latest/manual/cmake-language.7.html#variables
Post by James Touton
set(BLAH blah CACHE INTERNAL "")
unset(BLAH)
if(DEFINED BLAH)
message("here") # this message gets printed!
endif()
I am now effectively subject to sabotage from above.
I had been operating under the assumption that there was only one active lookup scope, constructed from the previous lookup scope and any new sets/unsets at the current level. I therefore expected that if a variable were removed from "the" current scope, it would be inaccessible.
Post by Robert Maynard
Looking at the current docs (
https://cmake.org/cmake/help/v3.12/command/unset.html ) I think the
first paragraph needs to be read as a single statement to understand
the behavior.
"Removes the specified variable causing it to become undefined. If
CACHE is present then the variable is removed from the cache instead
of the current scope."
"Makes the local variable variable from the current scope be
undefined, If CACHE is present then instead the cache variable is
undefined."
Post by James Touton
set(BLAH blah CACHE INTERNAL "")
unset(BLAH)
message("BLAH: ${BLAH}")
Surprisingly (to me), this prints out "blah". I had expected the unset command to make the cached value inaccessible. The documentation just states that the function "[r]emoves the specified variable causing it to become undefined." Is this a bug? I would prefer for the function to guarantee that ${BLAH} comes up empty.
--
Powered by www.kitware.com
Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ
CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html
Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html
https://cmake.org/mailman/listinfo/cmake-developers
--
Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
https://cmake.org/mailman/listinfo/cmake-developers
James Touton
2018-08-17 17:55:17 UTC
Permalink
The issue with unset(BLAH CACHE) is that it removes the cache entry. I
want to make BLAH undefined in the current scope, without impacting other
scopes.

Re: lookup, thanks; I get that now.
Post by Robert Maynard
Post by James Touton
I can never actually make it become undefined
You can, you are missing unset(BLAH CACHE) to tell CMake you want to
undefine the CACHE varibles
Post by James Touton
I had been operating under the assumption that there was only one active
lookup scope
Nope CMake lookup is local scope, and than cache. That is how CMake
supports CACHE and local variables with the same name. The rules of
variable lookup are outlined at
https://cmake.org/cmake/help/latest/manual/cmake-language.7.html#variables
Post by James Touton
Fair enough, but I think that makes the command substantially less
useful. It means that I need to use set(BLAH "") if I want to empty a
variable of its contents, and I can never actually make it become
Post by James Touton
set(BLAH blah CACHE INTERNAL "")
unset(BLAH)
if(DEFINED BLAH)
message("here") # this message gets printed!
endif()
I am now effectively subject to sabotage from above.
I had been operating under the assumption that there was only one active
lookup scope, constructed from the previous lookup scope and any new
sets/unsets at the current level. I therefore expected that if a variable
were removed from "the" current scope, it would be inaccessible.
Post by James Touton
On Thu, Aug 16, 2018 at 2:46 PM, Robert Maynard <
Post by Robert Maynard
Looking at the current docs (
https://cmake.org/cmake/help/v3.12/command/unset.html ) I think the
first paragraph needs to be read as a single statement to understand
the behavior.
"Removes the specified variable causing it to become undefined. If
CACHE is present then the variable is removed from the cache instead
of the current scope."
"Makes the local variable variable from the current scope be
undefined, If CACHE is present then instead the cache variable is
undefined."
Post by James Touton
set(BLAH blah CACHE INTERNAL "")
unset(BLAH)
message("BLAH: ${BLAH}")
Surprisingly (to me), this prints out "blah". I had expected the
unset command to make the cached value inaccessible. The documentation
just states that the function "[r]emoves the specified variable causing it
to become undefined." Is this a bug? I would prefer for the function to
guarantee that ${BLAH} comes up empty.
Post by James Touton
Post by Robert Maynard
Post by James Touton
--
Powered by www.kitware.com
http://www.cmake.org/Wiki/CMake_FAQ
Post by James Touton
Post by Robert Maynard
Post by James Touton
Kitware offers various services to support the CMake community. For
CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html
Visit other Kitware open-source projects at http://www.kitware.com/
opensource/opensource.html
Post by James Touton
Post by Robert Maynard
Post by James Touton
https://cmake.org/mailman/listinfo/cmake-developers
Loading...