diff --git a/CMakeLists.txt b/CMakeLists.txt index dcb7c68..05a841f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -45,73 +45,28 @@ set_target_properties(nlohmann_json_schema_validator VERSION ${PROJECT_VERSION} SOVERSION 1) -# if used as a sub-directory, do not create install-rules - -# because of the dependency to nlohmann_json. -set(JSON_VALIDATOR_INSTALL ON) - -# here we decice how nlohmann::json is found and used to build this project - -# first, check whether a nlohmann_json::nlohmann_json target exists already -# -> we are used as a sub-directory from within another project -if(TARGET nlohmann_json::nlohmann_json) - message(STATUS "Found nlohmann_json::nlohmann_json-target - linking with it") - target_link_libraries( - nlohmann_json_schema_validator - PUBLIC nlohmann_json::nlohmann_json) - - set(JSON_VALIDATOR_INSTALL OFF) - set(BUILD_TESTS OFF) - set(BUILD_EXAMPLES OFF) - -elseif(TARGET nlohmann_json) # or nlohmann_json, we are used a sub-project next to nlohmann-json's git repo - message(STATUS "Found nlohmann_json-target - linking with it") - target_link_libraries( - nlohmann_json_schema_validator - PUBLIC nlohmann_json) - set(JSON_VALIDATOR_INSTALL OFF) - set(BUILD_TESTS OFF) - set(BUILD_EXAMPLES OFF) - -else() - if (NOT IS_ABSOLUTE ${nlohmann_json_DIR}) # make nlohmann_json_DIR absolute - get_filename_component(nlohmann_json_DIR - "${CMAKE_CURRENT_BINARY_DIR}/${nlohmann_json_DIR}" - REALPATH) - endif() - - set(nlohmann_json_orignal_DIR ${nlohmann_json_DIR}) # save path for later use - - # find nlohmann_json-cmake-package - find_package(nlohmann_json QUIET) - - if(TARGET nlohmann_json::nlohmann_json) - message(STATUS "Found nlohmann_json-cmake-package - linking with it") - target_link_libraries( - nlohmann_json_schema_validator - PUBLIC nlohmann_json::nlohmann_json) - else() - - # find nlohmann/json.hpp - - message(STATUS ${nlohmann_json_orignal_DIR}) - - find_path(JSON_HPP nlohmann/json.hpp - PATHS ${nlohmann_json_orignal_DIR}) - - if(EXISTS ${JSON_HPP}/nlohmann/json.hpp) - message(STATUS "Found nlohmann/json.hpp in given path: ${JSON_HPP}") - target_include_directories( - nlohmann_json_schema_validator - PUBLIC $) - else() - message(FATAL_ERROR "could not find nlohmann/json.hpp or any related cmake-target. Please set nlohmann_json_DIR.") - endif() - - # nlohmann_json_DIR has to be reset (for later use in tests) - set(nlohmann_json_DIR ${JSON_HPP}) - endif() +# disable tests and examples if project is not super project +if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR) + # I am top-level project. + set(JSON_VALIDATOR_IS_TOP_LEVEL TRUE) endif() +if(JSON_VALIDATOR_IS_TOP_LEVEL) + set(BUILD_TESTS ON) + set(BUILD_EXAMPLES ON) +else() + set(BUILD_TESTS OFF) + set(BUILD_EXAMPLES OFF) +endif() + +if(NOT TARGET nlohmann_json::nlohmann_json) + find_package(nlohmann_json REQUIRED) +endif() + +target_link_libraries( + nlohmann_json_schema_validator + PUBLIC nlohmann_json::nlohmann_json) + if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") target_compile_options(nlohmann_json_schema_validator @@ -141,16 +96,14 @@ if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") endif() endif() -if(JSON_VALIDATOR_INSTALL) - install(TARGETS nlohmann_json_schema_validator - EXPORT ${PROJECT_NAME}Targets - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib - RUNTIME DESTINATION bin) +install(TARGETS nlohmann_json_schema_validator + EXPORT ${PROJECT_NAME}Targets + LIBRARY DESTINATION lib + ARCHIVE DESTINATION lib + RUNTIME DESTINATION bin) - install(FILES src/nlohmann/json-schema.hpp - DESTINATION include/nlohmann) -endif() +install(FILES src/nlohmann/json-schema.hpp + DESTINATION include/nlohmann) if (BUILD_EXAMPLES) # simple nlohmann_json_schema_validator-executable @@ -173,40 +126,36 @@ if (BUILD_TESTS) add_subdirectory(test) endif() -if(JSON_VALIDATOR_INSTALL) - # Set Up the Project Targets and Config Files for CMake +# Set Up the Project Targets and Config Files for CMake - # Set the install path to the cmake config files (Relative, so install works correctly under Hunter as well) - set(INSTALL_CMAKE_DIR "lib/cmake/${PROJECT_NAME}") - set(INSTALL_CMAKEDIR_ROOT share/cmake) +# Set the install path to the cmake config files (Relative, so install works correctly under Hunter as well) +set(INSTALL_CMAKE_DIR "lib/cmake/${PROJECT_NAME}") +set(INSTALL_CMAKEDIR_ROOT share/cmake) - # Install Targets - install(EXPORT ${PROJECT_NAME}Targets - FILE ${PROJECT_NAME}Targets.cmake - DESTINATION "${INSTALL_CMAKE_DIR}") +# Install Targets +install(EXPORT ${PROJECT_NAME}Targets + FILE ${PROJECT_NAME}Targets.cmake + DESTINATION "${INSTALL_CMAKE_DIR}") - include(CMakePackageConfigHelpers) - write_basic_package_version_file( - ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake - VERSION ${PROJECT_VERSION} - COMPATIBILITY SameMajorVersion - ) +include(CMakePackageConfigHelpers) +write_basic_package_version_file( + ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake + VERSION ${PROJECT_VERSION} + COMPATIBILITY SameMajorVersion + ) - configure_package_config_file( - ${PROJECT_SOURCE_DIR}/${PROJECT_NAME}Config.cmake.in +configure_package_config_file( + ${PROJECT_SOURCE_DIR}/${PROJECT_NAME}Config.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake + INSTALL_DESTINATION ${INSTALL_CMAKEDIR_ROOT}/${PROJECT_NAME} + ) + +install( + FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake - INSTALL_DESTINATION ${INSTALL_CMAKEDIR_ROOT}/${PROJECT_NAME} - ) - - install( - FILES - ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake - ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake - DESTINATION - ${INSTALL_CMAKE_DIR} - ) - - -endif() + ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake + DESTINATION + ${INSTALL_CMAKE_DIR} + ) diff --git a/README.md b/README.md index da0be70..8b2f396 100644 --- a/README.md +++ b/README.md @@ -105,23 +105,12 @@ In your initial call to cmake simply add: cmake [..] -DBUILD_SHARED_LIBS=ON [..] ``` -## Providing access to nlohmann-json +## nlohmann-json integration -The CMake-file of this libraries tries several ways to ultimately include -`nlohmann/json.hpp` +As nlohmann-json is a dependency, this library tries find it. -During the cmake-configurate-step there are 3 tries done trying to -access nlohmann-json: - -1. link with a nlohmann_json::nlohmann_json-target, -2. find the nlohmann_json-cmake-package and link with nlohmann_json::nlohmann_json-target or -3. find path to `nlohmann/json.hpp`. - -1 is there to make it work when this project is added as -a sub-directory (via `add_subdirectory()`), 2 and 3 can be -assisted by setting the `nlohmann_json_DIR`-variable. - -For 1 there is an example of you to do in example/cmake-submodule. +The cmake-configuration first checks if nlohmann-json is available as a cmake-target. This may be the case, because it is used as a submodule in a super-project which already provides and uses nlohmann-json. +Otherwise, it calls `find_package` for nlohmann-json and requires nlohmann-json to be installed on the system. ### Building with Hunter package manager @@ -136,14 +125,7 @@ cmake [..] -DHUNTER_ENABLED=ON [..] Adding this library as a subdirectory to a parent project is one way of building it. -If the parent project - -- already used `find_package()` to find the CMake-package of nlohmann_json, method 1 will work. -- uses the git-repo of nlohmann_json as a subdirectory, method 1 will work. -- sets nlohmann_json_DIR, method 2 or 3 will work. - -Afterwards a target called `nlohmann_json_schema_validator` -is available in order to compile and link. +If the parent project already used `find_package()` to find the CMake-package of nlohmann_json or includes it as a submodule likewise. ### Building directly, finding a CMake-package. (short) @@ -153,22 +135,7 @@ CMake's `find_package()` to be used. This library is using this mechanism if `nlohmann_json::nlohmann_json`-target does not exist. -The variable `nlohmann_json_DIR` can be used to help `find_package()` find this package. - -### Building directly: provide a path to where to find json.hpp - -The last method before fataling out is by providing a path where the file json.hpp can be found. - -The variable `nlohmann_json_DIR` has to be used to point to the path -where `json.hpp` is found in a subdirectory called `nlohmann`, e.g.: - -`json.hpp` is located in `/path/to/nlohmann/json.hpp`. The `cmake`-command has to be run as follows: - -```bash -cmake -Dnlohmann_json_DIR=/path/to [..] -``` - -### Method 1 - long version +### Install Since version 2.1.0 this library can be installed and CMake-package-files will be created accordingly. If the installation of nlohmann-json and this library @@ -176,7 +143,6 @@ is done into default unix-system-paths CMake will be able to find this library by simply doing: ```CMake -find_package(nlohmann_json REQUIRED) find_package(nlohmann_json_schema_validator REQUIRED) ``` @@ -187,18 +153,6 @@ target_link_libraries( [..] nlohmann_json_schema_validator) ``` to build and link. -If a custom path has been used to install this library (and nlohmann-json), `find_package()` -needs a hint for where to find the package-files, it can be provided by setting the following variables - -```CMake -cmake .. \ - -Dnlohmann_json_DIR=lib/cmake/nlohmann_json \ - -Dnlohmann_json_schema_validator_DIR:PATH=/lib/cmake/nlohmann_json_schema_validator -``` - -Note that if the this library is used as cmake-package, nlohmann-json also has -to be used a cmake-package. - ## Code See also `app/json-schema-validate.cpp`. diff --git a/example/cmake-submodule/CMakeLists.txt b/example/cmake-submodule/CMakeLists.txt deleted file mode 100644 index d776fa2..0000000 --- a/example/cmake-submodule/CMakeLists.txt +++ /dev/null @@ -1,24 +0,0 @@ -cmake_minimum_required(VERSION 3.2) - -project(simple-json-validator-as-submodule-test) - -# absolute-path -set(PATH_TO_NLOHMANN_JSON_REPO $ENV{HOME}/devel/upstream/json) - -# build shared library -set(BUILD_SHARED_LIBS ON) - -# JSON library -option(JSON_BuildTests OFF) -add_subdirectory(${PATH_TO_NLOHMANN_JSON_REPO} - json-binary-dir - EXCLUDE_FROM_ALL) - -# JSON SCHEMA VALIDATOR library -option(BUILD_TESTS OFF) -add_subdirectory(../.. - json-validator-binary-dir - EXCLUDE_FROM_ALL) - -add_executable(validate validate.cpp) -target_link_libraries(validate nlohmann_json_schema_validator) diff --git a/example/cmake-submodule/validate.cpp b/example/cmake-submodule/validate.cpp deleted file mode 100644 index d8f3c12..0000000 --- a/example/cmake-submodule/validate.cpp +++ /dev/null @@ -1,20 +0,0 @@ -#include - -#include - -int main(void) -{ - nlohmann::json schema_json{{"type", "number"}}; - nlohmann::json_schema::json_validator validator; - - validator.set_root_schema(schema_json); - - validator.validate(1); - try { - validator.validate("\"1\""); - } catch (const std::exception &e) { - std::cerr << "expected exception: " << e.what() << "\n"; - return EXIT_SUCCESS; - } - return EXIT_FAILURE; -}