From e1a815f35086c26e320cd7eadbdb7525ceaf08e4 Mon Sep 17 00:00:00 2001 From: Florian Albrechtskirchinger Date: Thu, 22 Sep 2022 11:21:52 +0200 Subject: [PATCH 01/14] Rename MAIN_PROJECT to JSON_MAIN_PROJECT --- CMakeLists.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f942e04ab..b8fc6b57c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,12 +7,12 @@ cmake_minimum_required(VERSION 3.1) project(nlohmann_json VERSION 3.11.2 LANGUAGES CXX) ## -## MAIN_PROJECT CHECK +## JSON_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) +set(JSON_MAIN_PROJECT OFF) if (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) - set(MAIN_PROJECT ON) + set(JSON_MAIN_PROJECT ON) endif() ## @@ -32,7 +32,7 @@ if (POLICY CMP0077) 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)) +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) @@ -44,7 +44,7 @@ option(JSON_GlobalUDLs "Place use-defined string literals in 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_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) From c14c48430324f7c38ef8954481530485613fc908 Mon Sep 17 00:00:00 2001 From: Florian Albrechtskirchinger Date: Thu, 22 Sep 2022 11:40:10 +0200 Subject: [PATCH 02/14] Move CMake policies --- CMakeLists.txt | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b8fc6b57c..71fb12242 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,14 @@ cmake_minimum_required(VERSION 3.1) +## +## POLICIES +## + +if (POLICY CMP0077) + # Allow CMake 3.13+ to override options when using FetchContent / add_subdirectory. + cmake_policy(SET CMP0077 NEW) +endif () + ## ## PROJECT ## name and version @@ -26,11 +35,6 @@ include(ExternalProject) ## OPTIONS ## -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(${JSON_MAIN_PROJECT} AND (${CMAKE_VERSION} VERSION_EQUAL 3.13 OR ${CMAKE_VERSION} VERSION_GREATER 3.13)) set(JSON_BuildTests_INIT ON) From 475c8d34b7db9380dcf4288e46be17a23ac80667 Mon Sep 17 00:00:00 2001 From: Florian Albrechtskirchinger Date: Thu, 22 Sep 2022 12:02:35 +0200 Subject: [PATCH 03/14] Move CMake options into cmake/json_opts.cmake --- CMakeLists.txt | 18 +------------ cmake/json_opts.cmake | 63 +++++++++++++++++++++++++++++++++++++++++++ tests/CMakeLists.txt | 6 ----- 3 files changed, 64 insertions(+), 23 deletions(-) create mode 100644 cmake/json_opts.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 71fb12242..1d689298b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -34,23 +34,7 @@ include(ExternalProject) ## ## 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}) -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." ${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) +include (json_opts) if (JSON_CI) include(ci) diff --git a/cmake/json_opts.cmake b/cmake/json_opts.cmake new file mode 100644 index 000000000..ea5e59238 --- /dev/null +++ b/cmake/json_opts.cmake @@ -0,0 +1,63 @@ +include(CMakeDependentOption) + +############################################################################# +# 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) +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() diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 1afb000ae..99f0d3efd 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1,11 +1,5 @@ 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) ############################################################################# From 7469e524c3385dc28dcb624046348344d6a7378d Mon Sep 17 00:00:00 2001 From: Florian Albrechtskirchinger Date: Thu, 22 Sep 2022 13:47:31 +0200 Subject: [PATCH 04/14] Add custom CMake feature summary --- CMakeLists.txt | 20 +----- cmake/json_summary.cmake | 147 +++++++++++++++++++++++++++++++++++++++ tests/CMakeLists.txt | 18 ++--- 3 files changed, 156 insertions(+), 29 deletions(-) create mode 100644 cmake/json_summary.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 1d689298b..dbde03798 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -58,26 +58,8 @@ 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}") -endif() - -if (NOT JSON_ImplicitConversions) - message(STATUS "Implicit conversions are disabled") -endif() - -if (JSON_DisableEnumSerialization) - message(STATUS "Enum integer serialization is disabled") -endif() - -if (JSON_LegacyDiscardedValueComparison) - message(STATUS "Legacy discarded value comparison enabled") -endif() - -if (JSON_Diagnostics) - message(STATUS "Diagnostics enabled") endif() if (JSON_SystemInclude) @@ -195,3 +177,5 @@ if(JSON_Install) DESTINATION ${NLOHMANN_JSON_PKGCONFIG_INSTALL_DIR} ) endif() + +include(json_summary) diff --git a/cmake/json_summary.cmake b/cmake/json_summary.cmake new file mode 100644 index 000000000..31cc85c97 --- /dev/null +++ b/cmake/json_summary.cmake @@ -0,0 +1,147 @@ +############################################################################# +# json_feature_summary_begin() +# +# Initialize the feature summary buffer. +############################################################################# + +function(json_feature_summary_begin) + set(_JSON_FEATURE_SUMMARY_TEXT "" PARENT_SCOPE) +endfunction() + +############################################################################# +# json_feature_summary_end() +# +# Print the feature summary buffer. +############################################################################# + +function(json_feature_summary_end) + if(NOT "${_JSON_FEATURE_SUMMARY_TEXT}" STREQUAL "") + message(STATUS "${_JSON_FEATURE_SUMMARY_TEXT}") + endif() + + unset(_JSON_FEATURE_SUMMARY_TEXT PARENT_SCOPE) +endfunction() + +############################################################################# +# json_feature( +# +# [VALUES ...] +# [NEGATE]) +# +# Append feature info using and the boolean value of converted +# to YES/NO. +# +# 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. +# +# --- +# +# json_feature(NEWLINE) +# +# Append a new line. +# +# --- +# +# json_feature(RAW ) +# +# Append raw text to feature summary. +############################################################################# + +function(json_feature) + if(NOT DEFINED _JSON_FEATURE_SUMMARY_TEXT) + message(FATAL_ERROR "json_feature() called before json_feature_summary_begin()") + endif() + + set(var "") + set(text "") + if(${ARGC} EQUAL 1 OR ${ARGC} GREATER 1) + list(GET ARGN 0 var) + endif() + if(${ARGC} EQUAL 2 OR ${ARGC} GREATER 2) + list(GET ARGN 1 text) + endif() + + # json_feature(RAW ) + if("${var}" STREQUAL RAW AND NOT "${text}" STREQUAL "") + set(text " ${text}") + # json_feature(NEWLINE) + elseif("${var}" STREQUAL NEWLINE AND "${text}" STREQUAL "") + # noop + # json_feature( ...) + elseif(NOT "${var}" STREQUAL "" AND NOT "${text}" STREQUAL "") + cmake_parse_arguments(args "NEGATE" "" "VALUES" ${ARGN}) + + set(state NO) + if(args_VALUES) + foreach(value ${args_VALUES}) + if(${var} STREQUAL value) + set(state ${value}) + break() + endif() + endforeach() + elseif(${args_NEGATE} AND NOT ${var} OR ${var}) + set(state YES) + endif() + set(text " ${text} ${state}") + else() + message(FATAL_ERROR "json_feature() called with incorrect arguments") + endif() + + # add preamble if buffer is empty + if("${_JSON_FEATURE_SUMMARY_TEXT}" STREQUAL "") + set(_JSON_FEATURE_SUMMARY_TEXT "[nohmann_json]: Feature summary:\n") + else() + set(_JSON_FEATURE_SUMMARY_TEXT "${_JSON_FEATURE_SUMMARY_TEXT}\n") + endif() + + # append to buffer + set(_JSON_FEATURE_SUMMARY_TEXT "${_JSON_FEATURE_SUMMARY_TEXT}${text}" PARENT_SCOPE) +endfunction() + +############################################################################# +# print feature summary +############################################################################# + +json_feature_summary_begin() + +json_feature(JSON_BuildTests "Build tests?") +if(JSON_BuildTests) + json_feature(JSON_32bitTest "Build the 32bit unit test?" VALUES AUTO ONLY) + json_feature(JSON_FastTests "Skip expensive/slow tests?") + + if(JSON_TestDataDirectory) + json_feature(RAW "Test data directory: ${JSON_TestDataDirectory}") + else() + json_feature(RAW "Test data source: ${JSON_TEST_DATA_URL} (v${JSON_TEST_DATA_VERSION})") + endif() + + json_feature(JSON_Valgrind "Execute test suite with Valgrind?") + if(JSON_Valgrind) + string (REPLACE ";" " " memcheck_command "${CMAKE_MEMORYCHECK_COMMAND};${CMAKE_MEMORYCHECK_COMMAND_OPTIONS}") + json_feature(RAW "Valgrind command: ${memcheck_command}") + 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(RAW "Test C++ standards: ${test_cxx_standards}") +endif() + +json_feature(NEWLINE) + +json_feature(JSON_Diagnostics "Diagnostics enabled?") +json_feature(JSON_DisableEnumSerialization "Default integer enum serialization enabled?" NEGATE) +json_feature(JSON_GlobalUDLs "Define user-defined string literals globally?") +json_feature(JSON_ImplicitConversions "Implicit conversions enabled?") +json_feature(JSON_LegacyDiscardedValueComparison "Legacy discarded value comparison enabled?") + +json_feature(NEWLINE) + +json_feature(JSON_MultipleHeaders "Use the multi-header code?") +json_feature(RAW "Include directory: ${NLOHMANN_JSON_INCLUDE_BUILD_DIR}") +json_feature(JSON_SystemInclude "Include as system headers?") + +json_feature_summary_end() diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 99f0d3efd..d85db0451 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -95,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 From e41f6685769f715e9195d6a4bbedc8ab738a0d70 Mon Sep 17 00:00:00 2001 From: Florian Albrechtskirchinger Date: Thu, 22 Sep 2022 15:04:02 +0200 Subject: [PATCH 05/14] Move CMake system info into cmake/json_info.cmake --- CMakeLists.txt | 2 ++ cmake/download_test_data.cmake | 37 ------------------- cmake/json_info.cmake | 65 ++++++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+), 37 deletions(-) create mode 100644 cmake/json_info.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index dbde03798..9ec00fa5f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,6 +31,8 @@ endif() set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH}) include(ExternalProject) +include(json_info) + ## ## OPTIONS ## diff --git a/cmake/download_test_data.cmake b/cmake/download_test_data.cmake index 1bb998dae..224d7db2c 100644 --- a/cmake/download_test_data.cmake +++ b/cmake/download_test_data.cmake @@ -17,40 +17,3 @@ 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}/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/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() From 4bed5779baf9d2bc4ba4e0976259199773964483 Mon Sep 17 00:00:00 2001 From: Florian Albrechtskirchinger Date: Thu, 22 Sep 2022 19:18:38 +0200 Subject: [PATCH 06/14] Move CMake configuration section into cmake/json_opts.cmake --- CMakeLists.txt | 26 -------------------------- cmake/json_opts.cmake | 1 + 2 files changed, 1 insertion(+), 26 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9ec00fa5f..074960792 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -42,32 +42,6 @@ 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/") -else() - set(NLOHMANN_JSON_INCLUDE_BUILD_DIR "${PROJECT_SOURCE_DIR}/single_include/") -endif() - -if (JSON_SystemInclude) - set(NLOHMANN_JSON_SYSTEM_INCLUDE "SYSTEM") -endif() - ## ## TARGET ## create target and add include path diff --git a/cmake/json_opts.cmake b/cmake/json_opts.cmake index ea5e59238..f22680fec 100644 --- a/cmake/json_opts.cmake +++ b/cmake/json_opts.cmake @@ -1,4 +1,5 @@ include(CMakeDependentOption) +include(GNUInstallDirs) ############################################################################# # test options From 368287fff0495cf4b5677c5d00d59c1f8d8167ae Mon Sep 17 00:00:00 2001 From: Florian Albrechtskirchinger Date: Thu, 22 Sep 2022 19:52:27 +0200 Subject: [PATCH 07/14] Reorganize main CMake list file --- CMakeLists.txt | 67 +++++++++++++++++++++++--------------------------- 1 file changed, 31 insertions(+), 36 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 074960792..cf9184080 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,51 +1,42 @@ cmake_minimum_required(VERSION 3.1) -## -## POLICIES -## +############################################################################# +# 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 () -## -## PROJECT -## name and version -## -project(nlohmann_json VERSION 3.11.2 LANGUAGES CXX) +# set the CMake module path +set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH}) -## -## JSON_MAIN_PROJECT CHECK -## determine if nlohmann_json is built as a subproject (using add_subdirectory) or if it is the main project -## +# 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() -## -## INCLUDE -## -## -set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH}) -include(ExternalProject) +# set project name and version +project(nlohmann_json VERSION 3.11.2 LANGUAGES CXX) +# print CMake, system, and compiler information include(json_info) -## -## OPTIONS -## -include (json_opts) +# handle options and configuration +include(json_opts) -if (JSON_CI) +# add CI targets +if(JSON_CI) include(ci) -endif () +endif() + +############################################################################# +# add library targets +############################################################################# -## -## 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") @@ -89,20 +80,20 @@ 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() -## +############################################################################# +# 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 @@ -154,4 +145,8 @@ if(JSON_Install) ) endif() +############################################################################# +# print feature summary +############################################################################# + include(json_summary) From 6dfa5a4834742607e5629942d7dec4864b11fb84 Mon Sep 17 00:00:00 2001 From: Florian Albrechtskirchinger Date: Thu, 22 Sep 2022 21:34:23 +0200 Subject: [PATCH 08/14] Merge cmake/download_test_data.cmake into cmake/test.cmake --- cmake/download_test_data.cmake | 19 ------------------- cmake/json_opts.cmake | 9 +++++++++ cmake/test.cmake | 16 +++++++++++++++- 3 files changed, 24 insertions(+), 20 deletions(-) delete mode 100644 cmake/download_test_data.cmake diff --git a/cmake/download_test_data.cmake b/cmake/download_test_data.cmake deleted file mode 100644 index 224d7db2c..000000000 --- a/cmake/download_test_data.cmake +++ /dev/null @@ -1,19 +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() diff --git a/cmake/json_opts.cmake b/cmake/json_opts.cmake index f22680fec..3483b15f3 100644 --- a/cmake/json_opts.cmake +++ b/cmake/json_opts.cmake @@ -62,3 +62,12 @@ endif() if (JSON_SystemInclude) set(NLOHMANN_JSON_SYSTEM_INCLUDE "SYSTEM") endif() + +if(JSON_TestDataDirectory) + set(JSON_TEST_DATA_DIRECTORY "${JSON_TestDataDirectory}" CACHE INTERNAL "") +elseif(DEFINED ENV{JSON_TEST_DATA_DIRECTORY}) + set(JSON_TEST_DATA_DIRECTORY "$ENV{JSON_TEST_DATA_DIRECTORY}" CACHE INTERNAL "") +endif() + +set(JSON_TEST_DATA_URL https://github.com/nlohmann/json_test_data CACHE INTERNAL "") +set(JSON_TEST_DATA_VERSION 3.1.0 CACHE INTERNAL "") diff --git a/cmake/test.cmake b/cmake/test.cmake index bb840c6c0..8a0240a06 100644 --- a/cmake/test.cmake +++ b/cmake/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_TEST_DATA_DIRECTORY) + add_custom_target(download_test_data) + file(WRITE ${CMAKE_BINARY_DIR}/include/test_data.hpp "#define TEST_DATA_DIRECTORY \"${JSON_TEST_DATA_DIRECTORY}\"\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}.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() # test fixture to download test data add_test(NAME "download_test_data" COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} From 4714ca880d3c4e2c08f6224cf29bb6d16ac349f8 Mon Sep 17 00:00:00 2001 From: Florian Albrechtskirchinger Date: Thu, 22 Sep 2022 21:37:00 +0200 Subject: [PATCH 09/14] Rename cmake/test.cmake to cmake/json_test.cmake --- cmake/{test.cmake => json_test.cmake} | 0 tests/CMakeLists.txt | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename cmake/{test.cmake => json_test.cmake} (100%) diff --git a/cmake/test.cmake b/cmake/json_test.cmake similarity index 100% rename from cmake/test.cmake rename to cmake/json_test.cmake diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index d85db0451..ab476fc80 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.13) -include(test) +include(json_test) ############################################################################# # override standard support From 892133d08f6283e17e1158d4e249e85b06186f2b Mon Sep 17 00:00:00 2001 From: Florian Albrechtskirchinger Date: Thu, 22 Sep 2022 21:38:05 +0200 Subject: [PATCH 10/14] Rename cmake/ci.cmake to cmake/json_ci.cmake --- CMakeLists.txt | 2 +- cmake/{ci.cmake => json_ci.cmake} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename cmake/{ci.cmake => json_ci.cmake} (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index cf9184080..667a7dbf1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,7 +30,7 @@ include(json_opts) # add CI targets if(JSON_CI) - include(ci) + include(json_ci) endif() ############################################################################# 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 From 6b6579cee948ec1faca9c3ccd5dcab032df4b008 Mon Sep 17 00:00:00 2001 From: Florian Albrechtskirchinger Date: Sat, 24 Sep 2022 11:57:52 +0200 Subject: [PATCH 11/14] Move CMake CI targets into tests section --- CMakeLists.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 667a7dbf1..f77b33870 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,11 +28,6 @@ include(json_info) # handle options and configuration include(json_opts) -# add CI targets -if(JSON_CI) - include(json_ci) -endif() - ############################################################################# # add library targets ############################################################################# @@ -90,6 +85,11 @@ if (JSON_BuildTests) add_subdirectory(tests) endif() +# add CI targets +if(JSON_CI) + include(json_ci) +endif() + ############################################################################# # install files and targets ############################################################################# From 239a974fe19bfb58633ed847748a26ba1d35727a Mon Sep 17 00:00:00 2001 From: Florian Albrechtskirchinger Date: Sat, 24 Sep 2022 13:49:16 +0200 Subject: [PATCH 12/14] Refactor CMake test data directory code * Add a cache variable and set default from environment. * Add '.git' suffix to URL variable. --- cmake/json_opts.cmake | 11 +++-------- cmake/json_test.cmake | 6 +++--- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/cmake/json_opts.cmake b/cmake/json_opts.cmake index 3483b15f3..b79e1c9f6 100644 --- a/cmake/json_opts.cmake +++ b/cmake/json_opts.cmake @@ -14,6 +14,7 @@ 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.") @@ -63,11 +64,5 @@ if (JSON_SystemInclude) set(NLOHMANN_JSON_SYSTEM_INCLUDE "SYSTEM") endif() -if(JSON_TestDataDirectory) - set(JSON_TEST_DATA_DIRECTORY "${JSON_TestDataDirectory}" CACHE INTERNAL "") -elseif(DEFINED ENV{JSON_TEST_DATA_DIRECTORY}) - set(JSON_TEST_DATA_DIRECTORY "$ENV{JSON_TEST_DATA_DIRECTORY}" CACHE INTERNAL "") -endif() - -set(JSON_TEST_DATA_URL https://github.com/nlohmann/json_test_data CACHE INTERNAL "") -set(JSON_TEST_DATA_VERSION 3.1.0 CACHE INTERNAL "") +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_test.cmake b/cmake/json_test.cmake index 8a0240a06..6ece47d59 100644 --- a/cmake/json_test.cmake +++ b/cmake/json_test.cmake @@ -5,14 +5,14 @@ set(_json_test_cmake_list_file ${CMAKE_CURRENT_LIST_FILE}) ############################################################################# # if variable is set, use test data from given directory rather than downloading them -if(JSON_TEST_DATA_DIRECTORY) +if(JSON_TestDataDirectory) add_custom_target(download_test_data) - file(WRITE ${CMAKE_BINARY_DIR}/include/test_data.hpp "#define TEST_DATA_DIRECTORY \"${JSON_TEST_DATA_DIRECTORY}\"\n") + 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}.git --quiet --depth 1 + 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} ) From 0ea7ec08649ee9abdefa92db5dd9e1ac47c45288 Mon Sep 17 00:00:00 2001 From: Florian Albrechtskirchinger Date: Mon, 26 Sep 2022 11:01:23 +0200 Subject: [PATCH 13/14] fixup! Add custom CMake feature summary --- cmake/json_summary.cmake | 219 ++++++++++++++++++++++++--------------- 1 file changed, 133 insertions(+), 86 deletions(-) diff --git a/cmake/json_summary.cmake b/cmake/json_summary.cmake index 31cc85c97..c48bbba78 100644 --- a/cmake/json_summary.cmake +++ b/cmake/json_summary.cmake @@ -1,40 +1,54 @@ -############################################################################# -# json_feature_summary_begin() -# -# Initialize the feature summary buffer. -############################################################################# +# 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}) -function(json_feature_summary_begin) - set(_JSON_FEATURE_SUMMARY_TEXT "" PARENT_SCOPE) -endfunction() - -############################################################################# -# json_feature_summary_end() -# -# Print the feature summary buffer. -############################################################################# - -function(json_feature_summary_end) - if(NOT "${_JSON_FEATURE_SUMMARY_TEXT}" STREQUAL "") - message(STATUS "${_JSON_FEATURE_SUMMARY_TEXT}") + if(NOT "${args_SWITCH}" STREQUAL "") + if(${args_SWITCH}) + # noop + else() + return() + endif() endif() - unset(_JSON_FEATURE_SUMMARY_TEXT PARENT_SCOPE) + 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 ...] -# [NEGATE]) +# [RAW] [NEGATE] +# [SWITCH ...]) # -# Append feature info using and the boolean value of converted -# to YES/NO. +# Append feature info using as description text and the boolean value +# of converted to YES/NO. # -# If additional values are given and matches any of them, is not -# converted to YES/NO. +# If RAW is specified, is appended as is. # -# If NEGATE is specified, the boolean value of is negated. +# 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. # # --- # @@ -49,99 +63,132 @@ endfunction() # Append raw text to feature summary. ############################################################################# -function(json_feature) - if(NOT DEFINED _JSON_FEATURE_SUMMARY_TEXT) - message(FATAL_ERROR "json_feature() called before json_feature_summary_begin()") - endif() - - set(var "") - set(text "") - if(${ARGC} EQUAL 1 OR ${ARGC} GREATER 1) - list(GET ARGN 0 var) - endif() - if(${ARGC} EQUAL 2 OR ${ARGC} GREATER 2) - list(GET ARGN 1 text) - endif() - - # json_feature(RAW ) - if("${var}" STREQUAL RAW AND NOT "${text}" STREQUAL "") - set(text " ${text}") - # json_feature(NEWLINE) - elseif("${var}" STREQUAL NEWLINE AND "${text}" STREQUAL "") - # noop - # json_feature( ...) - elseif(NOT "${var}" STREQUAL "" AND NOT "${text}" STREQUAL "") - cmake_parse_arguments(args "NEGATE" "" "VALUES" ${ARGN}) - - set(state NO) - if(args_VALUES) - foreach(value ${args_VALUES}) - if(${var} STREQUAL value) - set(state ${value}) - break() - endif() - endforeach() - elseif(${args_NEGATE} AND NOT ${var} OR ${var}) - set(state YES) +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() - set(text " ${text} ${state}") + elseif("${mode}" STREQUAL NEWLINE) + list(APPEND _JSON_FEATURE_SUMMARY N _ _) else() message(FATAL_ERROR "json_feature() called with incorrect arguments") endif() +endmacro() - # add preamble if buffer is empty - if("${_JSON_FEATURE_SUMMARY_TEXT}" STREQUAL "") - set(_JSON_FEATURE_SUMMARY_TEXT "[nohmann_json]: Feature summary:\n") - else() - set(_JSON_FEATURE_SUMMARY_TEXT "${_JSON_FEATURE_SUMMARY_TEXT}\n") +############################################################################# +# 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() - # append to buffer - set(_JSON_FEATURE_SUMMARY_TEXT "${_JSON_FEATURE_SUMMARY_TEXT}${text}" PARENT_SCOPE) + # 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_summary_begin() +json_feature(KEY_VALUE "Build tests?" JSON_BuildTests) -json_feature(JSON_BuildTests "Build tests?") if(JSON_BuildTests) - json_feature(JSON_32bitTest "Build the 32bit unit test?" VALUES AUTO ONLY) - json_feature(JSON_FastTests "Skip expensive/slow tests?") + 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(RAW "Test data directory: ${JSON_TestDataDirectory}") + json_feature(KEY_VALUE "Test data directory:" "${JSON_TestDataDirectory}" RAW) else() - json_feature(RAW "Test data source: ${JSON_TEST_DATA_URL} (v${JSON_TEST_DATA_VERSION})") + json_feature(KEY_VALUE "Test data source:" "${JSON_TEST_DATA_URL} (v${JSON_TEST_DATA_VERSION})" RAW) endif() - json_feature(JSON_Valgrind "Execute test suite with Valgrind?") + 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(RAW "Valgrind command: ${memcheck_command}") + 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(RAW "Test C++ standards: ${test_cxx_standards}") + json_feature(KEY_VALUE "Test C++ standards:" "${test_cxx_standards}" RAW) endif() json_feature(NEWLINE) -json_feature(JSON_Diagnostics "Diagnostics enabled?") -json_feature(JSON_DisableEnumSerialization "Default integer enum serialization enabled?" NEGATE) -json_feature(JSON_GlobalUDLs "Define user-defined string literals globally?") -json_feature(JSON_ImplicitConversions "Implicit conversions enabled?") -json_feature(JSON_LegacyDiscardedValueComparison "Legacy discarded value comparison enabled?") +json_feature(KEY_VALUE "Diagnostics enabled?" JSON_Diagnostics SWITCH JSON_Diagnostics) +json_feature(KEY_VALUE "Default integer enum serialization enabled?" JSON_DisableEnumSerialization NEGATE) +json_feature(KEY_VALUE "Define user-defined string literals 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(JSON_MultipleHeaders "Use the multi-header code?") -json_feature(RAW "Include directory: ${NLOHMANN_JSON_INCLUDE_BUILD_DIR}") -json_feature(JSON_SystemInclude "Include as system headers?") +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_feature_summary_end() +json_print_feature_summary() From 0c1454ca57d375f356bb9b8e5d81cdcdac5739c3 Mon Sep 17 00:00:00 2001 From: Florian Albrechtskirchinger Date: Mon, 26 Sep 2022 11:07:25 +0200 Subject: [PATCH 14/14] fixup! Add custom CMake feature summary --- cmake/json_summary.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/json_summary.cmake b/cmake/json_summary.cmake index c48bbba78..df4a2a78b 100644 --- a/cmake/json_summary.cmake +++ b/cmake/json_summary.cmake @@ -180,8 +180,8 @@ endif() json_feature(NEWLINE) json_feature(KEY_VALUE "Diagnostics enabled?" JSON_Diagnostics SWITCH JSON_Diagnostics) -json_feature(KEY_VALUE "Default integer enum serialization enabled?" JSON_DisableEnumSerialization NEGATE) -json_feature(KEY_VALUE "Define user-defined string literals globally?" JSON_GlobalUDLs) +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)