[CMake] Problem with option() when in subdirectory

Alexander Neundorf a.neundorf-work at gmx.net
Sun Sep 18 15:54:51 EDT 2011


On Sunday, September 18, 2011 02:42:49 PM Michael Wild wrote:
> On 09/18/2011 02:32 PM, Alexander Neundorf wrote:
> > On Sunday, September 18, 2011 02:15:54 PM David Demelier wrote:
> >> Hello,
> >> 
> >> I noticed that option() values are not checked when the option() command
> >> is under a add_subdirectory() target.
> >> 
> >> Example:
> >> 
> >> 
> >> -- a's CMakeLists.txt --
> >> project(a C)
> >> 
> >> set(BUILD_DEMOS OFF)
> >> add_subdirectory(extern/b)
> >> 
> >> -- extern/b's CMakeLists.txt --
> >> project(b C)
> >> 
> >> option(BUILD_DEMOS "Enable the demos build" ON)
> >> 
> >> if (BUILD_DEMOS)
> >> 
> >> 	...
> >> 
> >> endif ()
> >> 
> >> Then when building the project a it will also enter the if BUILD_DEMOS
> >> conditional.
> >> 
> >> What can I do now? :)
> > 
> > The values of options are stored in the cache.
> > In your toplevel file, OFF is put in the cache.
> > Then, in the subdir, the variable of BUILD_DEMOS is already in the cache,
> > so it is not overridden with ON, but keeps the value which is in the
> > cache.
> > 
> > Does that help ?
> > 
> > Alex
> 
> Alex, you mis-read his code. In the top-level CMakeLists.txt file
> BUILD_DEMOS is *not* put in the cache, which is why it is overridden by
> the option() call *the first time round*, but not afterwards which makes
> for very confusing behaviour.
> 
> In general, it is safe to override a cached variable with a uncached
> variable, but the other way round is asking for trouble...
> 
> It would be better to do in a/CMakeLists.txt:
> 
> set(BUILD_DEMOS OFF CACHE INTERNAL "Don't build demos")

Yes, you are completely right.

Alex


More information about the CMake mailing list