mirror of
https://github.com/nlohmann/json.git
synced 2026-09-28 21:15:49 +00:00
* Document the benchmarks, and make them build and compare versions again The benchmark project hasn't configured since #4793: download_test_data.cmake compiles cmake/detect_libcpp_version.cpp relative to CMAKE_SOURCE_DIR, which is tests/benchmarks when that is the top-level project, so try_run fails and so does `make run_benchmarks`. The path is now relative to the module itself, which is the same file for the main build. The Dump benchmark discarded dump()'s result, which is [[nodiscard]] by now; it warned, and left the optimizer free to shorten the loop. The result is now kept with benchmark::DoNotOptimize. A new cache variable, JSON_BENCHMARK_INCLUDE_DIR, names the directory holding the nlohmann/json.hpp to benchmark (single_include by default, as before), so the same benchmarks can be built against two versions and compared. tests/benchmarks/README.md documents what is measured, how to build and run the benchmarks, how to read the output, and how to compare two versions with Google Benchmark's compare.py; it recommends doing so by hand before a release rather than in CI. Signed-off-by: Niels Lohmann <mail@nlohmann.me> * Point ci_benchmarks at tests/benchmarks The target has configured ${PROJECT_SOURCE_DIR}/benchmarks since it was added in #2561, but the benchmarks live in tests/benchmarks. Signed-off-by: Niels Lohmann <mail@nlohmann.me> * Pin Google Benchmark to release 1.9.5 The benchmarks fetched Google Benchmark's main branch, so two builds on different days could measure with different library code, and CMake 3.30 and later warn that the single-argument FetchContent_Populate() is deprecated. Fetch the 1.9.5 release archive, verified by its SHA-256, with FetchContent_MakeAvailable() instead. That needs CMake 3.14; Google Benchmark itself already needed 3.13. Its -Werror is switched off, so a newer compiler's new warnings cannot break the pinned release, and its install rules are no longer added. Signed-off-by: Niels Lohmann <mail@nlohmann.me> --------- Signed-off-by: Niels Lohmann <mail@nlohmann.me>
92 lines
4.6 KiB
CMake
92 lines
4.6 KiB
CMake
set(JSON_TEST_DATA_URL https://github.com/nlohmann/json_test_data)
|
|
set(JSON_TEST_DATA_VERSION 3.1.0)
|
|
|
|
include(ExternalProject)
|
|
|
|
# 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()
|
|
# 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}/test_files\"\n")
|
|
|
|
# download test data from the GitHub tag source archive
|
|
ExternalProject_Add(download_test_data_project
|
|
URL "${JSON_TEST_DATA_URL}/archive/refs/tags/v${JSON_TEST_DATA_VERSION}.zip"
|
|
SOURCE_DIR "${CMAKE_BINARY_DIR}/test_files"
|
|
CONFIGURE_COMMAND ""
|
|
BUILD_COMMAND ""
|
|
INSTALL_COMMAND ""
|
|
LOG_DOWNLOAD TRUE
|
|
DOWNLOAD_EXTRACT_TIMESTAMP TRUE
|
|
EXCLUDE_FROM_ALL TRUE
|
|
)
|
|
|
|
# target to download test data
|
|
add_custom_target(download_test_data
|
|
DEPENDS download_test_data_project
|
|
)
|
|
endif()
|
|
|
|
# determine the operating system (for debug and support purposes)
|
|
find_program(UNAME_COMMAND uname)
|
|
find_program(LSB_RELEASE_COMMAND lsb_release)
|
|
find_program(SW_VERS_COMMAND sw_vers)
|
|
set(OS_VERSION_STRINGS "${CMAKE_SYSTEM}")
|
|
if (CMAKE_HOST_WIN32)
|
|
# "ver" is a cmd.exe builtin rather than a standalone executable, so it
|
|
# cannot be located with find_program and must be invoked through cmd
|
|
execute_process(COMMAND cmd /c ver OUTPUT_VARIABLE VER_COMMAND_RESULT ERROR_QUIET)
|
|
string(STRIP "${VER_COMMAND_RESULT}" VER_COMMAND_RESULT)
|
|
if (VER_COMMAND_RESULT)
|
|
set(OS_VERSION_STRINGS "${OS_VERSION_STRINGS}; ${VER_COMMAND_RESULT}")
|
|
endif()
|
|
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}")
|
|
|
|
# determine used C++ standard library (for debug and support purposes)
|
|
if(CMAKE_CROSSCOMPILING)
|
|
set(LIBCPP_VERSION_OUTPUT_CACHED "could not be detected due to cross-compiling" CACHE STRING "Detected C++ standard library version")
|
|
endif()
|
|
if(NOT DEFINED LIBCPP_VERSION_OUTPUT_CACHED)
|
|
try_run(RUN_RESULT_VAR COMPILE_RESULT_VAR
|
|
"${CMAKE_BINARY_DIR}" SOURCES "${CMAKE_CURRENT_LIST_DIR}/detect_libcpp_version.cpp"
|
|
RUN_OUTPUT_VARIABLE LIBCPP_VERSION_OUTPUT
|
|
COMPILE_OUTPUT_VARIABLE LIBCPP_VERSION_COMPILE_OUTPUT
|
|
)
|
|
if(NOT LIBCPP_VERSION_OUTPUT)
|
|
set(LIBCPP_VERSION_OUTPUT "Unknown")
|
|
message(AUTHOR_WARNING "Failed to compile cmake/detect_libcpp_version to detect the used C++ standard library. This does not affect the library or the test cases. Please still create an issue at https://github.com/nlohmann/json to investigate this.\n${LIBCPP_VERSION_COMPILE_OUTPUT}")
|
|
endif()
|
|
set(LIBCPP_VERSION_OUTPUT_CACHED "${LIBCPP_VERSION_OUTPUT}" CACHE STRING "Detected C++ standard library version")
|
|
endif()
|
|
|
|
message(STATUS "C++ standard library: ${LIBCPP_VERSION_OUTPUT_CACHED}")
|