<div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sat, Mar 23, 2019 at 1:58 PM Jason Beach <<a href="mailto:jason.m.beach@gmail.com">jason.m.beach@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div dir="ltr">I'm upgrading from cmake 3.5.1 and am trying to understand the new FetchContent command. So far I have:<br><br><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px">cmake_minimum_required(VERSION 3.14)<br>project (json_test)<br><br>include(FetchContent)<br>set(JSON_BuildTests OFF) #if I try this I get a warning as it appears to be deprecated<br><br>FetchContent_Declare(<br>    nlohmann_json_fc<br>    GIT_REPOSITORY <a href="https://github.com/nlohmann/json.git" target="_blank">https://github.com/nlohmann/json.git</a><br>    GIT_TAG v3.6.1<br>    GIT_SHALLOW TRUE<br>#    CMAKE_ARGS -DJSON_BuildTests=OFF #doesn't work<br>)<br>FetchContent_MakeAvailable(nlohmann_json_fc)<br>add_executable(main src/main.cpp)<br><div><div><div>target_link_libraries(main nlohmann_json::nlohmann_json)</div></div></div></blockquote><div dir="ltr"><div><br></div><div>I first tried sending in the JSON_BuildTests=OFF with CMAKE_ARGS in the FetchContent_Declare command but that didn't work.  On this post <a href="https://cmake.org/pipermail/cmake/2018-July/067804.html" target="_blank">https://cmake.org/pipermail/cmake/2018-July/067804.html</a> it appears this is because only the download portion of FetchContent_Declare is enabled with the intent to not do too much during configure time. How does specifying how the external project is configured fit that rationale?  If I execute </div></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div dir="ltr"><div>cmake -DJSON_BuildTests=OFF .. </div></div></blockquote><div dir="ltr"><div>the argument successfully makes it through to the external project. I guess I'm trying to understand why it's ok to specify it on the command line but not permanently in the CMakeLists.txt, particularly if you have many libraries each potentially with their options that need to be configured.</div></div></div></blockquote></div><div><br></div><div>The warning you are getting is due to the behavior of the option() command, which was changed in CMake 3.13. The first time you run CMake, the JSON_BuildTests variable is not in the cache. With CMake 3.12 and earlier, the option command will then ignore any non-cache variable of the same name and set the cache variable to the default value. This has the side-effect of also removing/updating the local variable, which means any non-cache variable you set before the call to option() will have no effect the first time you run CMake, but then it WILL have an effect for subsequent runs. This is unintuitive and easy to miss. In CMake 3.13, the behavior was changed to not create a cache variable if there was already a non-cache variable set. This is intuitively what developers typically expect, but it is only done if the CMP0077 policy is set to new. Inside the nlohmann/json project's CMakeLists.txt file, it uses cmake_minimum_required(VERSION 3.1), which means the CMP0077 policy is not set to NEW, hence the warning you are seeing.</div><div><br></div><div>To prevent this problem in your case, you will need to set JSON_BuildTests as a cache variable in your example project rather than just a regular non-cache variable. Then the option() command in the nlohmann/json project sees that the cache variable has already been set and it does nothing instead of forcing it to have the default value on the first run. I typically handle this situation in my projects by setting such variables to an INTERNAL type where the main project is forcing the value and it won't be available to the developer to change (so you don't want to show it to them in the GUI, etc.). If you still want the developer to be able to override it, just put an option command with your own preferred default here instead. For your case, the modified example would be the following:</div><div><br></div></div></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><div><div><font face="monospace, monospace">cmake_minimum_required(VERSION 3.14)</font></div></div></div><div><div><div><font face="monospace, monospace">project (json_test)</font></div></div></div><div><div><div><font face="monospace, monospace"><br></font></div></div></div><div><div><div><font face="monospace, monospace">include(FetchContent)</font></div></div></div><div><div><div><font face="monospace, monospace">set(JSON_BuildTests OFF CACHE INTERNAL "")  # Forces the value</font></div></div></div></blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><font face="monospace, monospace">#option(JSON_BuildTests "" OFF)   # Different default, but dev can still change it</font></div></blockquote><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><div><div><font face="monospace, monospace"><br></font></div></div></div><div><div><div><font face="monospace, monospace">FetchContent_Declare(</font></div></div></div><div><div><div><font face="monospace, monospace">    nlohmann_json_fc</font></div></div></div><div><div><div><font face="monospace, monospace">    GIT_REPOSITORY <a href="https://github.com/nlohmann/json.git" target="_blank">https://github.com/nlohmann/json.git</a></font></div></div></div><div><div><div><font face="monospace, monospace">    GIT_TAG v3.6.1</font></div></div></div><div><div><div><font face="monospace, monospace">    GIT_SHALLOW TRUE</font></div></div></div><div><div><div><span style="font-family:monospace,monospace">)</span><br></div></div></div><div><div><div><font face="monospace, monospace">FetchContent_MakeAvailable(nlohmann_json_fc)</font></div></div></div><div><div><div><font face="monospace, monospace">add_executable(main src/main.cpp)</font></div></div></div><div><div><div><div><font face="monospace, monospace">target_link_libraries(main nlohmann_json::nlohmann_json)</font></div></div></div></div></blockquote><div dir="ltr"><div dir="ltr"><div><br></div><div><br></div>-- <br><div dir="ltr" class="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr"><div dir="ltr"><div dir="ltr">Craig Scott<br><div>Melbourne, Australia</div><div><a href="https://crascit.com" target="_blank">https://crascit.com</a><br></div><div><br></div><div>Get the hand-book for every CMake user: <a href="https://crascit.com/professional-cmake/" target="_blank">Professional CMake: A Practical Guide</a><br></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div>