[CMake] Setting a value in a sub-project

Jakob van Bethlehem jsvanbethlehem at gmail.com
Fri May 20 07:03:51 EDT 2016


You don't have to create a cache variable for this. Put yourself in the
position of CMake;
* While scanning the CMakeLists.txt of Foo CMake encounters the set(OPT1 ON
FORCE) command, which tells CMake to create a *variable* called OPT1 with
value ON
* Then CMake is asked to include Bar
* While scanning Bar, CMake encounters the option() command, so it will
create an option called OPT1
* end then.... nothing, CMake finished scanning

Only the second time around, when CMake encounters the set(OPT1..) command,
it will have gained knowledge of the presence of the OPT1 option, and hence
it will realize it needs to change that option instead of creating a
variable with that name.

So to me, your output is exactly as expected. I suspect if you include Bar
before setting the option, you will get the behaviour you expected. This,
to me, makes perfect sense, as Bar is a dependency of Foo, and hence needs
to be setup before you start setting up Foo. You wouldn't compile Foo
before compiling Bar, so why would that be different for the configuration
step.

Sincerely,
Jakob

On Fri, May 20, 2016 at 11:24 AM, Doug Cuthbertson <
doug.cuthbertson at gmail.com> wrote:

>
> CMake (version 3.5.2) surprised me with how it's passing values to
> sub-projects, so I was wondering if this is expected behavior. Here's an
> example of what I mean. Let's say I have a project Foo in a directory of
> the same name. It contains a third-party library called Bar which has a
> CMakeLists.txt file that looks like:
>
>     cmake_minimum_required(VERSION 2.8.12)
>
>     option(OPT1
>       "Set to OFF|ON (default is OFF) to control build of Bar library" OFF)
>
>     if(OPT1)
>       message("Bar: OPT1 is on")
>     else(OPT1)
>       message("Bar: OPT1 is off")
>     endif(OPT1)
>
> I then create CMakeLists.txt for Foo that sets OPT1 to ON and includes Bar:
>
>     cmake_minimum_required(VERSION 2.8.12)
>
>     set(OPT1 ON FORCE)
>     if(OPT1)
>       message("Foo: OPT1 is on")
>     else(OPT1)
>       message("Foo: OPT1 is off")
>     endif(OPT1)
>     add_subdirectory(Bar)
>
> The first time I run cmake the message output is:
>
>     Foo: OPT1 is on
>     Bar: OPT1 is off
>
> If I run cmake again, I get:
>
>     Foo: OPT1 is on
>     Bar: OPT1 is on
>
> If this is expected behavior, is there any way I can ensure Bar receives
> the value of OPT1 the first time? It makes a huge difference when the
> option controls, for example, whether a static or dynamic library will be
> built.
>
> Thanks,
> Doug
>
> --
>
> 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:
> http://public.kitware.com/mailman/listinfo/cmake
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/cmake/attachments/20160520/fae22cb0/attachment.html>


More information about the CMake mailing list