unset() doesn't unset CMake variable

With CMake 3.5.1 using catkin_make, which merges together lots of makefiles, I have:

message("${HDF5_FOUND}")
unset(HDF5_FOUND)
message("${HDF5_FOUND}")

I get the rather unexpected result in one place of:

1
1

And in another sub-CMakeLists.txt

TRUE
1

If I run the top-level make in isolation, I see the expected result of:

   <-- nothing
   <-- nothing

And in a sub-make:

TRUE
   <-- nothing

If I use set(HDF5_FOUND FALSE) instead, I get the expected result. What caching is CMake doing, and how do I get around it?