diff --git a/CMakeLists.txt b/CMakeLists.txt index f942e04ab..f77b33870 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,105 +1,37 @@ cmake_minimum_required(VERSION 3.1) -## -## PROJECT -## name and version -## -project(nlohmann_json VERSION 3.11.2 LANGUAGES CXX) - -## -## MAIN_PROJECT CHECK -## determine if nlohmann_json is built as a subproject (using add_subdirectory) or if it is the main project -## -set(MAIN_PROJECT OFF) -if (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) - set(MAIN_PROJECT ON) -endif() - -## -## INCLUDE -## -## -set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH}) -include(ExternalProject) - -## -## OPTIONS -## +############################################################################# +# set up +############################################################################# +# set policies if (POLICY CMP0077) # Allow CMake 3.13+ to override options when using FetchContent / add_subdirectory. cmake_policy(SET CMP0077 NEW) endif () -# VERSION_GREATER_EQUAL is not available in CMake 3.1 -if(${MAIN_PROJECT} AND (${CMAKE_VERSION} VERSION_EQUAL 3.13 OR ${CMAKE_VERSION} VERSION_GREATER 3.13)) - set(JSON_BuildTests_INIT ON) -else() - set(JSON_BuildTests_INIT OFF) -endif() -option(JSON_BuildTests "Build the unit tests when BUILD_TESTING is enabled." ${JSON_BuildTests_INIT}) -option(JSON_CI "Enable CI build targets." OFF) -option(JSON_Diagnostics "Use extended diagnostic messages." OFF) -option(JSON_GlobalUDLs "Place use-defined string literals in the global namespace." ON) -option(JSON_ImplicitConversions "Enable implicit conversions." ON) -option(JSON_DisableEnumSerialization "Disable default integer enum serialization." OFF) -option(JSON_LegacyDiscardedValueComparison "Enable legacy discarded value comparison." OFF) -option(JSON_Install "Install CMake targets during install step." ${MAIN_PROJECT}) -option(JSON_MultipleHeaders "Use non-amalgamated version of the library." ON) -option(JSON_SystemInclude "Include as system headers (skip for clang-tidy)." OFF) +# set the CMake module path +set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH}) -if (JSON_CI) - include(ci) -endif () - -## -## CONFIGURATION -## -include(GNUInstallDirs) - -set(NLOHMANN_JSON_TARGET_NAME ${PROJECT_NAME}) -set(NLOHMANN_JSON_CONFIG_INSTALL_DIR "${CMAKE_INSTALL_DATADIR}/cmake/${PROJECT_NAME}" CACHE INTERNAL "") -set(NLOHMANN_JSON_INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_INCLUDEDIR}") -set(NLOHMANN_JSON_TARGETS_EXPORT_NAME "${PROJECT_NAME}Targets") -set(NLOHMANN_JSON_CMAKE_CONFIG_TEMPLATE "cmake/config.cmake.in") -set(NLOHMANN_JSON_CMAKE_CONFIG_DIR "${CMAKE_CURRENT_BINARY_DIR}") -set(NLOHMANN_JSON_CMAKE_VERSION_CONFIG_FILE "${NLOHMANN_JSON_CMAKE_CONFIG_DIR}/${PROJECT_NAME}ConfigVersion.cmake") -set(NLOHMANN_JSON_CMAKE_PROJECT_CONFIG_FILE "${NLOHMANN_JSON_CMAKE_CONFIG_DIR}/${PROJECT_NAME}Config.cmake") -set(NLOHMANN_JSON_CMAKE_PROJECT_TARGETS_FILE "${NLOHMANN_JSON_CMAKE_CONFIG_DIR}/${PROJECT_NAME}Targets.cmake") -set(NLOHMANN_JSON_PKGCONFIG_INSTALL_DIR "${CMAKE_INSTALL_DATADIR}/pkgconfig") - -if (JSON_MultipleHeaders) - set(NLOHMANN_JSON_INCLUDE_BUILD_DIR "${PROJECT_SOURCE_DIR}/include/") - message(STATUS "Using the multi-header code from ${NLOHMANN_JSON_INCLUDE_BUILD_DIR}") -else() - set(NLOHMANN_JSON_INCLUDE_BUILD_DIR "${PROJECT_SOURCE_DIR}/single_include/") - message(STATUS "Using the single-header code from ${NLOHMANN_JSON_INCLUDE_BUILD_DIR}") +# determine if nlohmann_json is the main project or built as a subproject (using add_subdirectory) +set(JSON_MAIN_PROJECT OFF) +if (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) + set(JSON_MAIN_PROJECT ON) endif() -if (NOT JSON_ImplicitConversions) - message(STATUS "Implicit conversions are disabled") -endif() +# set project name and version +project(nlohmann_json VERSION 3.11.2 LANGUAGES CXX) -if (JSON_DisableEnumSerialization) - message(STATUS "Enum integer serialization is disabled") -endif() +# print CMake, system, and compiler information +include(json_info) -if (JSON_LegacyDiscardedValueComparison) - message(STATUS "Legacy discarded value comparison enabled") -endif() +# handle options and configuration +include(json_opts) -if (JSON_Diagnostics) - message(STATUS "Diagnostics enabled") -endif() +############################################################################# +# add library targets +############################################################################# -if (JSON_SystemInclude) - set(NLOHMANN_JSON_SYSTEM_INCLUDE "SYSTEM") -endif() - -## -## TARGET -## create target and add include path -## add_library(${NLOHMANN_JSON_TARGET_NAME} INTERFACE) add_library(${PROJECT_NAME}::${NLOHMANN_JSON_TARGET_NAME} ALIAS ${NLOHMANN_JSON_TARGET_NAME}) if (${CMAKE_VERSION} VERSION_LESS "3.8.0") @@ -143,20 +75,25 @@ CONFIGURE_FILE( "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc" ) -## -## TESTS -## create and configure the unit test target -## +############################################################################# +# add tests +############################################################################# + if (JSON_BuildTests) include(CTest) enable_testing() add_subdirectory(tests) endif() -## -## INSTALL -## install header files, generate and install cmake config files for find_package() -## +# add CI targets +if(JSON_CI) + include(json_ci) +endif() + +############################################################################# +# install files and targets +############################################################################# + include(CMakePackageConfigHelpers) # use a custom package version config file instead of # write_basic_package_version_file to ensure that it's architecture-independent @@ -207,3 +144,9 @@ if(JSON_Install) DESTINATION ${NLOHMANN_JSON_PKGCONFIG_INSTALL_DIR} ) endif() + +############################################################################# +# print feature summary +############################################################################# + +include(json_summary) diff --git a/cmake/download_test_data.cmake b/cmake/download_test_data.cmake deleted file mode 100644 index 1bb998dae..000000000 --- a/cmake/download_test_data.cmake +++ /dev/null @@ -1,56 +0,0 @@ -set(JSON_TEST_DATA_URL https://github.com/nlohmann/json_test_data) -set(JSON_TEST_DATA_VERSION 3.1.0) - -# if variable is set, use test data from given directory rather than downloading them -if(JSON_TestDataDirectory) - message(STATUS "Using test data in ${JSON_TestDataDirectory}.") - add_custom_target(download_test_data) - file(WRITE ${CMAKE_BINARY_DIR}/include/test_data.hpp "#define TEST_DATA_DIRECTORY \"${JSON_TestDataDirectory}\"\n") -else() - find_package(Git) - # target to download test data - add_custom_target(download_test_data - COMMAND test -d json_test_data || ${GIT_EXECUTABLE} clone -c advice.detachedHead=false --branch v${JSON_TEST_DATA_VERSION} ${JSON_TEST_DATA_URL}.git --quiet --depth 1 - COMMENT "Downloading test data from ${JSON_TEST_DATA_URL} (v${JSON_TEST_DATA_VERSION})" - WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - ) - # create a header with the path to the downloaded test data - file(WRITE ${CMAKE_BINARY_DIR}/include/test_data.hpp "#define TEST_DATA_DIRECTORY \"${CMAKE_BINARY_DIR}/json_test_data\"\n") -endif() - -# determine the operating system (for debug and support purposes) -find_program(UNAME_COMMAND uname) -find_program(VER_COMMAND ver) -find_program(LSB_RELEASE_COMMAND lsb_release) -find_program(SW_VERS_COMMAND sw_vers) -set(OS_VERSION_STRINGS "${CMAKE_SYSTEM}") -if (VER_COMMAND) - execute_process(COMMAND ${VER_COMMAND} OUTPUT_VARIABLE VER_COMMAND_RESULT OUTPUT_STRIP_TRAILING_WHITESPACE) - set(OS_VERSION_STRINGS "${OS_VERSION_STRINGS}; ${VER_COMMAND_RESULT}") -endif() -if (SW_VERS_COMMAND) - execute_process(COMMAND ${SW_VERS_COMMAND} OUTPUT_VARIABLE SW_VERS_COMMAND_RESULT OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET) - string(REGEX REPLACE "[ ]*\n" "; " SW_VERS_COMMAND_RESULT "${SW_VERS_COMMAND_RESULT}") - set(OS_VERSION_STRINGS "${OS_VERSION_STRINGS}; ${SW_VERS_COMMAND_RESULT}") -endif() -if (LSB_RELEASE_COMMAND) - execute_process(COMMAND ${LSB_RELEASE_COMMAND} -a OUTPUT_VARIABLE LSB_RELEASE_COMMAND_RESULT OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET) - string(REGEX REPLACE "[ ]*\n" "; " LSB_RELEASE_COMMAND_RESULT "${LSB_RELEASE_COMMAND_RESULT}") - set(OS_VERSION_STRINGS "${OS_VERSION_STRINGS}; ${LSB_RELEASE_COMMAND_RESULT}") -endif() -if (UNAME_COMMAND) - execute_process(COMMAND ${UNAME_COMMAND} -a OUTPUT_VARIABLE UNAME_COMMAND_RESULT OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET) - set(OS_VERSION_STRINGS "${OS_VERSION_STRINGS}; ${UNAME_COMMAND_RESULT}") -endif() - -message(STATUS "Operating system: ${OS_VERSION_STRINGS}") - -# determine the compiler (for debug and support purposes) -if (MSVC) - execute_process(COMMAND ${CMAKE_CXX_COMPILER} OUTPUT_VARIABLE CXX_VERSION_RESULT OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_VARIABLE CXX_VERSION_RESULT ERROR_STRIP_TRAILING_WHITESPACE) - set(CXX_VERSION_RESULT "${CXX_VERSION_RESULT}; MSVC_VERSION=${MSVC_VERSION}; MSVC_TOOLSET_VERSION=${MSVC_TOOLSET_VERSION}") -else() - execute_process(COMMAND ${CMAKE_CXX_COMPILER} --version OUTPUT_VARIABLE CXX_VERSION_RESULT OUTPUT_STRIP_TRAILING_WHITESPACE) -endif() -string(REGEX REPLACE "[ ]*\n" "; " CXX_VERSION_RESULT "${CXX_VERSION_RESULT}") -message(STATUS "Compiler: ${CXX_VERSION_RESULT}") diff --git a/cmake/ci.cmake b/cmake/json_ci.cmake similarity index 100% rename from cmake/ci.cmake rename to cmake/json_ci.cmake diff --git a/cmake/json_info.cmake b/cmake/json_info.cmake new file mode 100644 index 000000000..97b87844d --- /dev/null +++ b/cmake/json_info.cmake @@ -0,0 +1,65 @@ +############################################################################# +# cmake info +############################################################################# + +message(STATUS "[nohmann_json]: CMake ${CMAKE_VERSION}") + +############################################################################# +# system info +############################################################################# + +if(CMAKE_VERSION VERSION_EQUAL "3.10" OR CMAKE_VERSION VERSION_GREATER "3.10") + # get distribution name on Linux + set(distrib_name "") + if(CMAKE_VERSION VERSION_EQUAL "3.22" OR CMAKE_VERSION VERSION_GREATER "3.22") + cmake_host_system_information(RESULT distrib_name QUERY DISTRIB_PRETTY_NAME) + endif() + + cmake_host_system_information(RESULT os_platform QUERY OS_PLATFORM) + + if(NOT "${distrib_name}" STREQUAL "") + message(STATUS "[nohmann_json]: Host system: ${distrib_name} ${os_platform} (${CMAKE_HOST_SYSTEM})") + else() + cmake_host_system_information(RESULT os_name QUERY OS_NAME) + cmake_host_system_information(RESULT os_release QUERY OS_RELEASE) + cmake_host_system_information(RESULT os_version QUERY OS_VERSION) + + message(STATUS "[nohmann_json]: Host system: ${os_name} ${os_release} ${os_version} ${os_platform} (${CMAKE_HOST_SYSTEM})") + endif() +else() + message(STATUS "[nohmann_json]: Host system: ${CMAKE_HOST_SYSTEM} ${CMAKE_HOST_SYSTEM_PROCESSOR}") +endif() + +if(NOT CMAKE_SYSTEM STREQUAL CMAKE_HOST_SYSTEM) + message(STATUS "[nohmann_json]: Target system: ${CMAKE_SYSTEM}") +endif() + +if(DEFINED ENV{CI}) + # print additional info in CI environment + cmake_host_system_information(RESULT num_cores QUERY NUMBER_OF_PHYSICAL_CORES) + cmake_host_system_information(RESULT num_threads QUERY NUMBER_OF_LOGICAL_CORES) + set(threads "") + if(num_threads) + set(num_threads " (${num_threads})") + set(threads " (threads)") + endif() + if(num_cores) + message(STATUS "[nohmann_json]: Processor cores${threads}: ${num_cores}${num_threads}") + endif() +endif() + +############################################################################# +# compiler info +############################################################################# + +execute_process(COMMAND ${CMAKE_CXX_COMPILER} --version OUTPUT_VARIABLE cxx_version_result OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_VARIABLE cxx_version_result_error ERROR_STRIP_TRAILING_WHITESPACE) +if(NOT cxx_version_result_error) + string(REGEX REPLACE ";" "\\\\;" cxx_version_result "${cxx_version_result}") + string(REGEX REPLACE "\n" ";" cxx_version_result "${cxx_version_result}") + list(GET cxx_version_result 0 cxx_version_result) + message(STATUS "[nohmann_json]: C++ compiler: ${cxx_version_result}") +endif() + +if(MSVC) + message(STATUS "[nohmann_json]: MSVC version (toolset version): ${MSVC_VERSION} (${MSVC_TOOLSET_VERSION})") +endif() diff --git a/cmake/json_opts.cmake b/cmake/json_opts.cmake new file mode 100644 index 000000000..b79e1c9f6 --- /dev/null +++ b/cmake/json_opts.cmake @@ -0,0 +1,68 @@ +include(CMakeDependentOption) +include(GNUInstallDirs) + +############################################################################# +# test options +############################################################################# + +# VERSION_GREATER_EQUAL is not available in CMake 3.1 +if(${JSON_MAIN_PROJECT} AND (${CMAKE_VERSION} VERSION_EQUAL 3.13 OR ${CMAKE_VERSION} VERSION_GREATER 3.13)) + set(JSON_BuildTests_INIT ON) +else() + set(JSON_BuildTests_INIT OFF) +endif() +option(JSON_BuildTests "Build the unit tests when BUILD_TESTING is enabled." ${JSON_BuildTests_INIT}) +set(JSON_32bitTest AUTO CACHE STRING "Enable the 32bit unit test (ON/OFF/AUTO/ONLY).") +cmake_dependent_option(JSON_FastTests "Skip expensive/slow tests." OFF "JSON_BuildTests" OFF) +set(JSON_TestDataDirectory "$ENV{JSON_TEST_DATA_DIRECTORY}" CACHE FILEPATH "Test data directory for the unit tests (will be downloaded if not specified).") +cmake_dependent_option(JSON_Valgrind "Execute test suite with Valgrind." OFF "JSON_BuildTests" OFF) + +set(JSON_TestStandards "" CACHE STRING "The list of standards to test explicitly.") + +############################################################################# +# CI options +############################################################################# + +option(JSON_CI "Enable CI build targets." OFF) + +############################################################################# +# build & install options +############################################################################# + +option(JSON_Diagnostics "Use extended diagnostic messages." OFF) +option(JSON_DisableEnumSerialization "Disable default integer enum serialization." OFF) +option(JSON_GlobalUDLs "Place user-defined string literals in the global namespace." ON) +option(JSON_ImplicitConversions "Enable implicit conversions." ON) +option(JSON_LegacyDiscardedValueComparison "Enable legacy discarded value comparison." OFF) + +option(JSON_Install "Install CMake targets during install step." ${JSON_MAIN_PROJECT}) +option(JSON_MultipleHeaders "Use non-amalgamated version of the library." ON) +option(JSON_SystemInclude "Include as system headers (skip for clang-tidy)." OFF) + +############################################################################# +# configuration +############################################################################# + +set(NLOHMANN_JSON_TARGET_NAME ${PROJECT_NAME}) +set(NLOHMANN_JSON_CONFIG_INSTALL_DIR "${CMAKE_INSTALL_DATADIR}/cmake/${PROJECT_NAME}" CACHE INTERNAL "") +set(NLOHMANN_JSON_INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_INCLUDEDIR}") +set(NLOHMANN_JSON_TARGETS_EXPORT_NAME "${PROJECT_NAME}Targets") +set(NLOHMANN_JSON_CMAKE_CONFIG_TEMPLATE "cmake/config.cmake.in") +set(NLOHMANN_JSON_CMAKE_CONFIG_DIR "${CMAKE_CURRENT_BINARY_DIR}") +set(NLOHMANN_JSON_CMAKE_VERSION_CONFIG_FILE "${NLOHMANN_JSON_CMAKE_CONFIG_DIR}/${PROJECT_NAME}ConfigVersion.cmake") +set(NLOHMANN_JSON_CMAKE_PROJECT_CONFIG_FILE "${NLOHMANN_JSON_CMAKE_CONFIG_DIR}/${PROJECT_NAME}Config.cmake") +set(NLOHMANN_JSON_CMAKE_PROJECT_TARGETS_FILE "${NLOHMANN_JSON_CMAKE_CONFIG_DIR}/${PROJECT_NAME}Targets.cmake") +set(NLOHMANN_JSON_PKGCONFIG_INSTALL_DIR "${CMAKE_INSTALL_DATADIR}/pkgconfig") + +if (JSON_MultipleHeaders) + set(NLOHMANN_JSON_INCLUDE_BUILD_DIR "${PROJECT_SOURCE_DIR}/include/") +else() + set(NLOHMANN_JSON_INCLUDE_BUILD_DIR "${PROJECT_SOURCE_DIR}/single_include/") +endif() + +if (JSON_SystemInclude) + set(NLOHMANN_JSON_SYSTEM_INCLUDE "SYSTEM") +endif() + +set(JSON_TEST_DATA_URL https://github.com/nlohmann/json_test_data.git) +set(JSON_TEST_DATA_VERSION 3.1.0) diff --git a/cmake/json_summary.cmake b/cmake/json_summary.cmake new file mode 100644 index 000000000..df4a2a78b --- /dev/null +++ b/cmake/json_summary.cmake @@ -0,0 +1,194 @@ +# internal function used to implement json_feature(KEY_VALUE) +function(_json_feature_key_value key value_var) + cmake_parse_arguments(args "NEGATE;RAW" "" "SWITCH;VALUES" ${ARGN}) + + if(NOT "${args_SWITCH}" STREQUAL "") + if(${args_SWITCH}) + # noop + else() + return() + endif() + endif() + + if(${args_RAW}) + set(value "${value_var}") + else() + set(value NO) + if(args_VALUES) + foreach(val ${args_VALUES}) + if(${value_var} STREQUAL val) + set(value ${val}) + break() + endif() + endforeach() + elseif(${args_NEGATE} AND NOT ${value_var} OR ${value_var}) + set(value YES) + endif() + endif() + list(APPEND _JSON_FEATURE_SUMMARY KV "${key}" "${value}") + set(_JSON_FEATURE_SUMMARY "${_JSON_FEATURE_SUMMARY}" PARENT_SCOPE) +endfunction() + +############################################################################# +# json_feature( +# KEY_VALUE +# [VALUES ...] +# [RAW] [NEGATE] +# [SWITCH ...]) +# +# Append feature info using as description text and the boolean value +# of converted to YES/NO. +# +# If RAW is specified, is appended as is. +# +# If additional values are given and matches any of them, +# is not converted to YES/NO. +# +# If NEGATE is specified, the boolean value of is negated. +# +# If a conditional expression consisting of is listed +# following SWITCH, the feature is only added if the expression evaluates to +# TRUE. +# +# --- +# +# json_feature(NEWLINE) +# +# Append a new line. +# +# --- +# +# json_feature(RAW ) +# +# Append raw text to feature summary. +############################################################################# + +macro(json_feature mode) + if("${mode}" STREQUAL KEY_VALUE) + _json_feature_key_value(${ARGN}) + elseif("${mode}" STREQUAL RAW) + list(LENGTH ARGN len) + if(${len} EQUAL 1) + list(APPEND _JSON_FEATURE_SUMMARY R ${ARGN} _) + else() + message(FATAL_ERROR "json_feature(RAW) called with incorrect arguments") + endif() + elseif("${mode}" STREQUAL NEWLINE) + list(APPEND _JSON_FEATURE_SUMMARY N _ _) + else() + message(FATAL_ERROR "json_feature() called with incorrect arguments") + endif() +endmacro() + +############################################################################# +# json_print_feature_summary() +# +# Build and print the feature summary. +############################################################################# + +function(json_print_feature_summary) + if(NOT DEFINED _JSON_FEATURE_SUMMARY) + return() + endif() + if("${_JSON_FEATURE_SUMMARY}" STREQUAL "") + return() + endif() + + # calculate maximum key length + set(max_key_len 0) + set(feature_summary "${_JSON_FEATURE_SUMMARY}") + while(NOT "${feature_summary}" STREQUAL "") + list(GET feature_summary 0 mode) + list(GET feature_summary 1 key) + list(REMOVE_AT feature_summary 0 1 2) + + if("${mode}" STREQUAL KV) + string(LENGTH "${key}" len) + if(${len} GREATER ${max_key_len}) + set(max_key_len ${len}) + endif() + endif() + endwhile() + + # build feature summary string + set(last_newline FALSE) + set(text "[nohmann_json]: Feature summary:") + while(NOT "${_JSON_FEATURE_SUMMARY}" STREQUAL "") + list(GET _JSON_FEATURE_SUMMARY 0 mode) + list(GET _JSON_FEATURE_SUMMARY 1 key) + list(GET _JSON_FEATURE_SUMMARY 2 value) + list(REMOVE_AT _JSON_FEATURE_SUMMARY 0 1 2) + + if("${mode}" STREQUAL KV) + # pad key to max_key_len with spaces + string(LENGTH "${key}" len) + math(EXPR pad_len "${max_key_len} - ${len}") + set(pad "") + if(${pad_len} GREATER 1) + foreach(i RANGE 1 ${pad_len}) + set(pad "${pad} ") + endforeach() + endif() + + set(text "${text}\n ${key}${pad} ${value}") + set(last_newline FALSE) + elseif("${mode}" STREQUAL R) + set(text "${text}\n ${key}") + set(last_newline FALSE) + elseif("${mode}" STREQUAL N AND NOT ${last_newline}) + if("${_JSON_FEATURE_SUMMARY}" STREQUAL "") + # skip trailing newline + break() + endif() + set(text "${text}\n") + set(last_newline TRUE) + endif() + endwhile() + + message(STATUS "${text}") +endfunction() + +############################################################################# +# print feature summary +############################################################################# + +json_feature(KEY_VALUE "Build tests?" JSON_BuildTests) + +if(JSON_BuildTests) + json_feature(KEY_VALUE "Build the 32bit unit test?" JSON_32bitTest VALUES AUTO ONLY) + json_feature(KEY_VALUE "Skip expensive/slow tests?" JSON_FastTests) + + if(JSON_TestDataDirectory) + json_feature(KEY_VALUE "Test data directory:" "${JSON_TestDataDirectory}" RAW) + else() + json_feature(KEY_VALUE "Test data source:" "${JSON_TEST_DATA_URL} (v${JSON_TEST_DATA_VERSION})" RAW) + endif() + + json_feature(KEY_VALUE "Execute test suite with Valgrind?" JSON_Valgrind) + if(JSON_Valgrind) + string (REPLACE ";" " " memcheck_command "${CMAKE_MEMORYCHECK_COMMAND};${CMAKE_MEMORYCHECK_COMMAND_OPTIONS}") + json_feature(KEY_VALUE "Valgrind command:" "${memcheck_command}" RAW) + endif() + + list(JOIN JSON_TEST_CXX_STANDARDS_FEATURE_INFO " " test_cxx_standards) + if(JSON_TEST_CXX_STANDARDS_FORCED) + set(test_cxx_standards "${test_cxx_standards} (forced)") + endif() + json_feature(KEY_VALUE "Test C++ standards:" "${test_cxx_standards}" RAW) +endif() + +json_feature(NEWLINE) + +json_feature(KEY_VALUE "Diagnostics enabled?" JSON_Diagnostics SWITCH JSON_Diagnostics) +json_feature(KEY_VALUE "Default enum serialization enabled?" JSON_DisableEnumSerialization NEGATE) +json_feature(KEY_VALUE "User-defined literals defined globally?" JSON_GlobalUDLs) +json_feature(KEY_VALUE "Implicit conversions enabled?" JSON_ImplicitConversions) +json_feature(KEY_VALUE "Legacy discarded value comparison enabled?" JSON_LegacyDiscardedValueComparison) + +json_feature(NEWLINE) + +json_feature(KEY_VALUE "Use the multi-header code?" JSON_MultipleHeaders) +json_feature(KEY_VALUE "Include directory:" "${NLOHMANN_JSON_INCLUDE_BUILD_DIR}" RAW) +json_feature(KEY_VALUE "Include as system headers?" JSON_SystemInclude) + +json_print_feature_summary() diff --git a/cmake/test.cmake b/cmake/json_test.cmake similarity index 91% rename from cmake/test.cmake rename to cmake/json_test.cmake index bb840c6c0..6ece47d59 100644 --- a/cmake/test.cmake +++ b/cmake/json_test.cmake @@ -4,7 +4,21 @@ set(_json_test_cmake_list_file ${CMAKE_CURRENT_LIST_FILE}) # download test data ############################################################################# -include(download_test_data) +# if variable is set, use test data from given directory rather than downloading them +if(JSON_TestDataDirectory) + add_custom_target(download_test_data) + file(WRITE ${CMAKE_BINARY_DIR}/include/test_data.hpp "#define TEST_DATA_DIRECTORY \"${JSON_TestDataDirectory}\"\n") +else() + find_package(Git REQUIRED) + # target to download test data + add_custom_target(download_test_data + COMMAND test -d json_test_data || ${GIT_EXECUTABLE} clone -c advice.detachedHead=false --branch v${JSON_TEST_DATA_VERSION} ${JSON_TEST_DATA_URL} --quiet --depth 1 + COMMENT "Downloading test data from ${JSON_TEST_DATA_URL} (v${JSON_TEST_DATA_VERSION})" + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + ) + # create a header with the path to the downloaded test data + file(WRITE ${CMAKE_BINARY_DIR}/include/test_data.hpp "#define TEST_DATA_DIRECTORY \"${CMAKE_BINARY_DIR}/json_test_data\"\n") +endif() # test fixture to download test data add_test(NAME "download_test_data" COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 1afb000ae..ab476fc80 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1,12 +1,6 @@ cmake_minimum_required(VERSION 3.13) -option(JSON_Valgrind "Execute test suite with Valgrind." OFF) -option(JSON_FastTests "Skip expensive/slow tests." OFF) - -set(JSON_32bitTest AUTO CACHE STRING "Enable the 32bit unit test (ON/OFF/AUTO/ONLY).") -set(JSON_TestStandards "" CACHE STRING "The list of standards to test explicitly.") - -include(test) +include(json_test) ############################################################################# # override standard support @@ -101,27 +95,23 @@ json_test_set_test_options(test-unicode4 TEST_PROPERTIES TIMEOUT 3000) if("${JSON_TestStandards}" STREQUAL "") set(test_cxx_standards 11 14 17 20 23) - unset(test_force) + set(test_force "") else() set(test_cxx_standards ${JSON_TestStandards}) set(test_force FORCE) endif() -# Print selected standards marking unavailable ones with brackets -set(msg_standards "") +# create list of selected C++ standards for feature summary +set(info "") foreach(cxx_standard ${test_cxx_standards}) if(compiler_supports_cpp_${cxx_standard}) - list(APPEND msg_standards ${cxx_standard}) + list(APPEND info ${cxx_standard}) else() - list(APPEND msg_standards [${cxx_standard}]) + list(APPEND info [${cxx_standard}]) endif() endforeach() -string(JOIN " " msg_standards ${msg_standards}) -set(msg "Testing standards: ${msg_standards}") -if(test_force) - string(APPEND msg " (forced)") -endif() -message(STATUS "${msg}") +set(JSON_TEST_CXX_STANDARDS_FEATURE_INFO "${info}" PARENT_SCOPE) +set(JSON_TEST_CXX_STANDARDS_FORCED ${test_force} PARENT_SCOPE) # *DO* use json_test_set_test_options() above this line