From c3317066441e3bac8d23793ae614255f64f31e0f Mon Sep 17 00:00:00 2001 From: ArthurSonzogni Date: Wed, 29 Apr 2020 14:29:17 +0200 Subject: [PATCH] Add CMake fetchcontent documentation and tests Github issue: https://github.com/nlohmann/json/issues/2073 nlohmann::json documents 2 way of depending on it using CMake 1) Copy-paste the project/source into your own project. 2) Install nlohman::json and then use find_package. (1) pollutes your git repository, (2) requires everyone to install the dependencies themselves. Since 2018, CMake provide some kind of 'package manager' features using [FetchContent](https://cmake.org/cmake/help/v3.17/module/FetchContent.html) It gives the following: ~~~cmake include(FetchContent) FetchContent_Declare(json GIT_REPOSITORY https://github.com/nlohmann/json GIT_TAG v3.7.3) FetchContent_GetProperties(json) if(NOT json_POPULATED) FetchContent_Populate(json) add_subdirectory( ${json_SOURCE_DIR} ${json_BINARY_DIR} EXCLUDE_FROM_ALL) endif() ~~~ Then declares the dependency in the target using it: ~~~cmake target_link_library(my_project PRIVATE nlohmann_json::nlohmann_json ~~~ This patch updates the documentation and provides tests. --- README.md | 27 +++++++++++++++++++ test/CMakeLists.txt | 1 + test/cmake_fetch_content/CMakeLists.txt | 18 +++++++++++++ .../project/CMakeLists.txt | 21 +++++++++++++++ test/cmake_fetch_content/project/main.cpp | 8 ++++++ 5 files changed, 75 insertions(+) create mode 100644 test/cmake_fetch_content/CMakeLists.txt create mode 100644 test/cmake_fetch_content/project/CMakeLists.txt create mode 100644 test/cmake_fetch_content/project/main.cpp diff --git a/README.md b/README.md index 6ae87446..d6e94758 100644 --- a/README.md +++ b/README.md @@ -133,6 +133,33 @@ add_library(foo ...) target_link_libraries(foo PRIVATE nlohmann_json::nlohmann_json) ``` +##### Embedded (FetchContent) +Since CMake v3.11, +[FetchContent](https://cmake.org/cmake/help/v3.11/module/FetchContent.html) can +be used to automatically download the repository as a dependency. + +Example: +~~~cmake +include(FetchContent) + +FetchContent_Declare(json + GIT_REPOSITORY https://github.com/nlohmann/json + GIT_TAG v3.7.3) + +FetchContent_GetProperties(json) +if(NOT json_POPULATED) + FetchContent_Populate(json) + add_subdirectory(${json_SOURCE_DIR} ${json_BINARY_DIR} EXCLUDE_FROM_ALL) +endif() + +target_link_libraries(foo PRIVATE nlohmann_json::nlohmann_json) +~~~ + +**Note**: The repository https://github.com/nlohmann/json download size is huge. +It contains all the dataset used for the benchmarks. You might want to depend on +a smaller repository. For instance, you might want to replace the URL above by: +https://github.com/ArthurSonzogni/nlohmann_json_cmake_fetchcontent + #### Supporting Both To allow your project to support either an externally supplied or an embedded JSON library, you can use a pattern akin to the following: diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 8769c6b9..6a858153 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -189,3 +189,4 @@ endforeach() add_subdirectory(cmake_import) add_subdirectory(cmake_import_minver) add_subdirectory(cmake_add_subdirectory) +add_subdirectory(cmake_fetch_content) diff --git a/test/cmake_fetch_content/CMakeLists.txt b/test/cmake_fetch_content/CMakeLists.txt new file mode 100644 index 00000000..6d92d149 --- /dev/null +++ b/test/cmake_fetch_content/CMakeLists.txt @@ -0,0 +1,18 @@ +if (${CMAKE_VERSION} VERSION_GREATER "3.11.0") + add_test(NAME cmake_fetch_content_configure + COMMAND ${CMAKE_COMMAND} + -G "${CMAKE_GENERATOR}" + -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} + -Dnlohmann_json_source=${PROJECT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/project + ) + add_test(NAME cmake_fetch_content_build + COMMAND ${CMAKE_COMMAND} --build . + ) + set_tests_properties(cmake_fetch_content_configure PROPERTIES + FIXTURES_SETUP cmake_fetch_content + ) + set_tests_properties(cmake_fetch_content_build PROPERTIES + FIXTURES_REQUIRED cmake_fetch_content + ) +endif() diff --git a/test/cmake_fetch_content/project/CMakeLists.txt b/test/cmake_fetch_content/project/CMakeLists.txt new file mode 100644 index 00000000..742a112b --- /dev/null +++ b/test/cmake_fetch_content/project/CMakeLists.txt @@ -0,0 +1,21 @@ +cmake_minimum_required(VERSION 3.11) + +project(DummyImport CXX) + +include(FetchContent) + +FetchContent_Declare(json + GIT_REPOSITORY ${CMAKE_CURRENT_SOURCE_DIR}/../../.. + GIT_TAG HEAD) + +FetchContent_GetProperties(json) +if(NOT json_POPULATED) + FetchContent_Populate(json) + add_subdirectory(${json_SOURCE_DIR} ${json_BINARY_DIR} EXCLUDE_FROM_ALL) +endif() + +add_executable(with_namespace_target main.cpp) +target_link_libraries(with_namespace_target nlohmann_json::nlohmann_json) + +add_executable(without_namespace_target main.cpp) +target_link_libraries(without_namespace_target nlohmann_json) diff --git a/test/cmake_fetch_content/project/main.cpp b/test/cmake_fetch_content/project/main.cpp new file mode 100644 index 00000000..d2d118b8 --- /dev/null +++ b/test/cmake_fetch_content/project/main.cpp @@ -0,0 +1,8 @@ +#include + +int main(int argc, char **argv) +{ + nlohmann::json j; + + return 0; +}