[CMake] Problem with option() when in subdirectory

Michael Wild themiwi at gmail.com
Sun Sep 18 08:42:49 EDT 2011


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")

this way



More information about the CMake mailing list