This commit is contained in:
Florian Albrechtskirchinger 2022-12-05 21:38:41 +08:00 committed by GitHub
commit 6a1d6eb26e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 388 additions and 170 deletions

View File

@ -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)

View File

@ -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}")

65
cmake/json_info.cmake Normal file
View File

@ -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()

68
cmake/json_opts.cmake Normal file
View File

@ -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)

194
cmake/json_summary.cmake Normal file
View File

@ -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 <key> <value_var>
# [VALUES <value>...]
# [RAW] [NEGATE]
# [SWITCH <conditional_args>...])
#
# Append feature info using <key> as description text and the boolean value
# of <value_var> converted to YES/NO.
#
# If RAW is specified, <value_var> is appended as is.
#
# If additional values are given and <value_var> matches any of them,
# <value_var> is not converted to YES/NO.
#
# If NEGATE is specified, the boolean value of <value_var> is negated.
#
# If a conditional expression consisting of <conditional_args> 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 <text>)
#
# Append raw text <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()

View File

@ -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}

View File

@ -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