On Sat, Mar 23, 2019 at 1:58 PM Jason Beach <jason.m.be...@gmail.com> wrote:
> I'm upgrading from cmake 3.5.1 and am trying to understand the new > FetchContent command. So far I have: > > cmake_minimum_required(VERSION 3.14) > project (json_test) > > include(FetchContent) > set(JSON_BuildTests OFF) #if I try this I get a warning as it appears to > be deprecated > > FetchContent_Declare( > nlohmann_json_fc > GIT_REPOSITORY https://github.com/nlohmann/json.git > GIT_TAG v3.6.1 > GIT_SHALLOW TRUE > # CMAKE_ARGS -DJSON_BuildTests=OFF #doesn't work > ) > FetchContent_MakeAvailable(nlohmann_json_fc) > add_executable(main src/main.cpp) > target_link_libraries(main nlohmann_json::nlohmann_json) > > > 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 > https://cmake.org/pipermail/cmake/2018-July/067804.html 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 > > cmake -DJSON_BuildTests=OFF .. > > 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. > 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. 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: cmake_minimum_required(VERSION 3.14) project (json_test) include(FetchContent) set(JSON_BuildTests OFF CACHE INTERNAL "") # Forces the value #option(JSON_BuildTests "" OFF) # Different default, but dev can still change it FetchContent_Declare( nlohmann_json_fc GIT_REPOSITORY https://github.com/nlohmann/json.git GIT_TAG v3.6.1 GIT_SHALLOW TRUE ) FetchContent_MakeAvailable(nlohmann_json_fc) add_executable(main src/main.cpp) target_link_libraries(main nlohmann_json::nlohmann_json) -- Craig Scott Melbourne, Australia https://crascit.com Get the hand-book for every CMake user: Professional CMake: A Practical Guide <https://crascit.com/professional-cmake/>
-- 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: https://cmake.org/mailman/listinfo/cmake