summaryrefslogtreecommitdiff
path: root/json4cpp/cmake
diff options
context:
space:
mode:
Diffstat (limited to 'json4cpp/cmake')
-rw-r--r--json4cpp/cmake/ci.cmake725
-rw-r--r--json4cpp/cmake/clang_flags.cmake22
-rw-r--r--json4cpp/cmake/config.cmake.in15
-rw-r--r--json4cpp/cmake/detect_libcpp_version.cpp31
-rw-r--r--json4cpp/cmake/download_test_data.cmake87
-rw-r--r--json4cpp/cmake/gcc_flags.cmake363
-rw-r--r--json4cpp/cmake/nlohmann_jsonConfigVersion.cmake.in20
-rw-r--r--json4cpp/cmake/pkg-config.pc.in7
-rw-r--r--json4cpp/cmake/requirements/requirements-cppcheck.txt1
-rw-r--r--json4cpp/cmake/requirements/requirements-cpplint.txt1
-rw-r--r--json4cpp/cmake/requirements/requirements-reuse.txt1
-rw-r--r--json4cpp/cmake/scripts/gen_bazel_build_file.cmake24
-rw-r--r--json4cpp/cmake/test.cmake273
13 files changed, 1570 insertions, 0 deletions
diff --git a/json4cpp/cmake/ci.cmake b/json4cpp/cmake/ci.cmake
new file mode 100644
index 0000000000..f711368649
--- /dev/null
+++ b/json4cpp/cmake/ci.cmake
@@ -0,0 +1,725 @@
+# number of parallel jobs for CTest
+set(N 10)
+
+###############################################################################
+# Needed tools.
+###############################################################################
+
+include(FindPython3)
+find_package(Python3 COMPONENTS Interpreter)
+
+find_program(CLANG_TOOL NAMES clang++-HEAD clang++ clang++-20 clang++-19 clang++-18 clang++-17 clang++-16 clang++-15 clang++-14 clang++-13 clang++-12 clang++-11 clang++)
+execute_process(COMMAND ${CLANG_TOOL} --version OUTPUT_VARIABLE CLANG_TOOL_VERSION ERROR_VARIABLE CLANG_TOOL_VERSION)
+string(REGEX MATCH "[0-9]+(\\.[0-9]+)+" CLANG_TOOL_VERSION "${CLANG_TOOL_VERSION}")
+message(STATUS "🔖 Clang ${CLANG_TOOL_VERSION} (${CLANG_TOOL})")
+
+find_program(CLANG_TIDY_TOOL NAMES clang-tidy-20 clang-tidy-19 clang-tidy-18 clang-tidy-17 clang-tidy-16 clang-tidy-15 clang-tidy-14 clang-tidy-13 clang-tidy-12 clang-tidy-11 clang-tidy)
+execute_process(COMMAND ${CLANG_TIDY_TOOL} --version OUTPUT_VARIABLE CLANG_TIDY_TOOL_VERSION ERROR_VARIABLE CLANG_TIDY_TOOL_VERSION)
+string(REGEX MATCH "[0-9]+(\\.[0-9]+)+" CLANG_TIDY_TOOL_VERSION "${CLANG_TIDY_TOOL_VERSION}")
+message(STATUS "🔖 Clang-Tidy ${CLANG_TIDY_TOOL_VERSION} (${CLANG_TIDY_TOOL})")
+
+message(STATUS "🔖 CMake ${CMAKE_VERSION} (${CMAKE_COMMAND})")
+
+find_program(GCC_TOOL NAMES g++-latest g++-HEAD g++ g++-15 g++-14 g++-13 g++-12 g++-11 g++-10)
+execute_process(COMMAND ${GCC_TOOL} --version OUTPUT_VARIABLE GCC_TOOL_VERSION ERROR_VARIABLE GCC_TOOL_VERSION)
+string(REGEX MATCH "[0-9]+(\\.[0-9]+)+" GCC_TOOL_VERSION "${GCC_TOOL_VERSION}")
+message(STATUS "🔖 GCC ${GCC_TOOL_VERSION} (${GCC_TOOL})")
+
+find_program(GCOV_TOOL NAMES gcov-HEAD gcov gcov-15 gcov-14 gcov-13 gcov-12 gcov-11 gcov-10)
+execute_process(COMMAND ${GCOV_TOOL} --version OUTPUT_VARIABLE GCOV_TOOL_VERSION ERROR_VARIABLE GCOV_TOOL_VERSION)
+string(REGEX MATCH "[0-9]+(\\.[0-9]+)+" GCOV_TOOL_VERSION "${GCOV_TOOL_VERSION}")
+message(STATUS "🔖 GCOV ${GCOV_TOOL_VERSION} (${GCOV_TOOL})")
+
+find_program(GIT_TOOL NAMES git)
+execute_process(COMMAND ${GIT_TOOL} --version OUTPUT_VARIABLE GIT_TOOL_VERSION ERROR_VARIABLE GIT_TOOL_VERSION)
+string(REGEX MATCH "[0-9]+(\\.[0-9]+)+" GIT_TOOL_VERSION "${GIT_TOOL_VERSION}")
+message(STATUS "🔖 Git ${GIT_TOOL_VERSION} (${GIT_TOOL})")
+
+find_program(IWYU_TOOL NAMES include-what-you-use iwyu)
+execute_process(COMMAND ${IWYU_TOOL} --version OUTPUT_VARIABLE IWYU_TOOL_VERSION ERROR_VARIABLE IWYU_TOOL_VERSION)
+string(REGEX MATCH "[0-9]+(\\.[0-9]+)+" IWYU_TOOL_VERSION "${IWYU_TOOL_VERSION}")
+message(STATUS "🔖 include-what-you-use ${IWYU_TOOL_VERSION} (${IWYU_TOOL})")
+
+find_program(INFER_TOOL NAMES infer)
+execute_process(COMMAND ${INFER_TOOL} --version OUTPUT_VARIABLE INFER_TOOL_VERSION ERROR_VARIABLE INFER_TOOL_VERSION)
+string(REGEX MATCH "[0-9]+(\\.[0-9]+)+" INFER_TOOL_VERSION "${INFER_TOOL_VERSION}")
+message(STATUS "🔖 Infer ${INFER_TOOL_VERSION} (${INFER_TOOL})")
+
+find_program(LCOV_TOOL NAMES lcov)
+execute_process(COMMAND ${LCOV_TOOL} --version OUTPUT_VARIABLE LCOV_TOOL_VERSION ERROR_VARIABLE LCOV_TOOL_VERSION)
+string(REGEX MATCH "[0-9]+(\\.[0-9]+)+" LCOV_TOOL_VERSION "${LCOV_TOOL_VERSION}")
+message(STATUS "🔖 LCOV ${LCOV_TOOL_VERSION} (${LCOV_TOOL})")
+
+find_program(NINJA_TOOL NAMES ninja)
+execute_process(COMMAND ${NINJA_TOOL} --version OUTPUT_VARIABLE NINJA_TOOL_VERSION ERROR_VARIABLE NINJA_TOOL_VERSION)
+string(REGEX MATCH "[0-9]+(\\.[0-9]+)+" NINJA_TOOL_VERSION "${NINJA_TOOL_VERSION}")
+message(STATUS "🔖 Ninja ${NINJA_TOOL_VERSION} (${NINJA_TOOL})")
+
+find_program(OCLINT_TOOL NAMES oclint-json-compilation-database)
+find_program(OCLINT_VERSION_TOOL NAMES oclint)
+execute_process(COMMAND ${OCLINT_VERSION_TOOL} --version OUTPUT_VARIABLE OCLINT_TOOL_VERSION ERROR_VARIABLE OCLINT_TOOL_VERSION)
+string(REGEX MATCH "[0-9]+(\\.[0-9]+)+" OCLINT_TOOL_VERSION "${OCLINT_TOOL_VERSION}")
+message(STATUS "🔖 OCLint ${OCLINT_TOOL_VERSION} (${OCLINT_TOOL})")
+
+find_program(VALGRIND_TOOL NAMES valgrind)
+execute_process(COMMAND ${VALGRIND_TOOL} --version OUTPUT_VARIABLE VALGRIND_TOOL_VERSION ERROR_VARIABLE VALGRIND_TOOL_VERSION)
+string(REGEX MATCH "[0-9]+(\\.[0-9]+)+" VALGRIND_TOOL_VERSION "${VALGRIND_TOOL_VERSION}")
+message(STATUS "🔖 Valgrind ${VALGRIND_TOOL_VERSION} (${VALGRIND_TOOL})")
+
+find_program(GENHTML_TOOL NAMES genhtml)
+find_program(PLOG_CONVERTER_TOOL NAMES plog-converter)
+find_program(PVS_STUDIO_ANALYZER_TOOL NAMES pvs-studio-analyzer)
+find_program(SCAN_BUILD_TOOL NAMES scan-build-15 scan-build-14 scan-build-13 scan-build-12 scan-build-11 scan-build)
+
+# the individual source files
+file(GLOB_RECURSE SRC_FILES ${PROJECT_SOURCE_DIR}/include/nlohmann/*.hpp)
+
+###############################################################################
+# Thorough check with recent compilers
+###############################################################################
+
+include(clang_flags)
+include(gcc_flags)
+
+add_custom_target(ci_test_gcc
+ COMMAND CXX=${GCC_TOOL} CXXFLAGS="${GCC_CXXFLAGS}" ${CMAKE_COMMAND}
+ -DCMAKE_BUILD_TYPE=Debug -GNinja
+ -DJSON_BuildTests=ON
+ -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_gcc
+ COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_gcc
+ COMMAND cd ${PROJECT_BINARY_DIR}/build_gcc && ${CMAKE_CTEST_COMMAND} --parallel ${N} --output-on-failure
+ COMMENT "Compile and test with GCC using maximal warning flags"
+)
+
+add_custom_target(ci_test_clang
+ COMMAND CXX=${CLANG_TOOL} CXXFLAGS="${CLANG_CXXFLAGS}" ${CMAKE_COMMAND}
+ -DCMAKE_BUILD_TYPE=Debug -GNinja
+ -DJSON_BuildTests=ON
+ -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_clang
+ COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_clang
+ COMMAND cd ${PROJECT_BINARY_DIR}/build_clang && ${CMAKE_CTEST_COMMAND} --parallel ${N} --output-on-failure
+ COMMENT "Compile and test with Clang using maximal warning flags"
+)
+
+###############################################################################
+# Different C++ Standards.
+###############################################################################
+
+foreach(CXX_STANDARD 11 14 17 20 23 26)
+ add_custom_target(ci_test_gcc_cxx${CXX_STANDARD}
+ COMMAND CXX=${GCC_TOOL} CXXFLAGS="${GCC_CXXFLAGS}" ${CMAKE_COMMAND}
+ -DCMAKE_BUILD_TYPE=Debug -GNinja
+ -DJSON_BuildTests=ON -DJSON_FastTests=ON
+ -DJSON_TestStandards=${CXX_STANDARD}
+ -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_gcc_cxx${CXX_STANDARD}
+ COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_gcc_cxx${CXX_STANDARD}
+ COMMAND cd ${PROJECT_BINARY_DIR}/build_gcc_cxx${CXX_STANDARD} && ${CMAKE_CTEST_COMMAND} --parallel ${N} --output-on-failure
+ COMMENT "Compile and test with GCC for C++${CXX_STANDARD}"
+ )
+
+ add_custom_target(ci_test_clang_cxx${CXX_STANDARD}
+ COMMAND CXX=${CLANG_TOOL} CXXFLAGS="${CLANG_CXXFLAGS}" ${CMAKE_COMMAND}
+ -DCMAKE_BUILD_TYPE=Debug -GNinja
+ -DJSON_BuildTests=ON -DJSON_FastTests=ON
+ -DJSON_TestStandards=${CXX_STANDARD}
+ -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_clang_cxx${CXX_STANDARD}
+ COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_clang_cxx${CXX_STANDARD}
+ COMMAND cd ${PROJECT_BINARY_DIR}/build_clang_cxx${CXX_STANDARD} && ${CMAKE_CTEST_COMMAND} --parallel ${N} --output-on-failure
+ COMMENT "Compile and test with Clang for C++${CXX_STANDARD}"
+ )
+
+ add_custom_target(ci_test_clang_libcxx_cxx${CXX_STANDARD}
+ COMMAND CXX=${CLANG_TOOL} CXXFLAGS="${CLANG_CXXFLAGS}" ${CMAKE_COMMAND}
+ -DCMAKE_BUILD_TYPE=Debug -GNinja
+ -DJSON_BuildTests=ON -DJSON_FastTests=ON
+ -DJSON_TestStandards=${CXX_STANDARD}
+ -DCMAKE_CXX_FLAGS="-stdlib=libc++"
+ -DCMAKE_EXE_LINKER_FLAGS="-lc++abi"
+ -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_clang_cxx${CXX_STANDARD}
+ COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_clang_cxx${CXX_STANDARD}
+ COMMAND cd ${PROJECT_BINARY_DIR}/build_clang_cxx${CXX_STANDARD} && ${CMAKE_CTEST_COMMAND} --parallel ${N} --output-on-failure
+ COMMENT "Compile and test with Clang for C++${CXX_STANDARD} (libc++)"
+ )
+endforeach()
+
+###############################################################################
+# Disable exceptions.
+###############################################################################
+
+add_custom_target(ci_test_noexceptions
+ COMMAND ${CMAKE_COMMAND}
+ -DCMAKE_BUILD_TYPE=Debug -GNinja
+ -DJSON_BuildTests=ON -DCMAKE_CXX_FLAGS=-DJSON_NOEXCEPTION -DDOCTEST_TEST_FILTER=--no-throw
+ -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_noexceptions
+ COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_noexceptions
+ COMMAND cd ${PROJECT_BINARY_DIR}/build_noexceptions && ${CMAKE_CTEST_COMMAND} --parallel ${N} --output-on-failure
+ COMMENT "Compile and test with exceptions switched off"
+)
+
+###############################################################################
+# Disable implicit conversions.
+###############################################################################
+
+add_custom_target(ci_test_noimplicitconversions
+ COMMAND ${CMAKE_COMMAND}
+ -DCMAKE_BUILD_TYPE=Debug -GNinja
+ -DJSON_BuildTests=ON -DJSON_ImplicitConversions=OFF
+ -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_noimplicitconversions
+ COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_noimplicitconversions
+ COMMAND cd ${PROJECT_BINARY_DIR}/build_noimplicitconversions && ${CMAKE_CTEST_COMMAND} --parallel ${N} --output-on-failure
+ COMMENT "Compile and test with implicit conversions switched off"
+)
+
+###############################################################################
+# Enable improved diagnostics.
+###############################################################################
+
+add_custom_target(ci_test_diagnostics
+ COMMAND ${CMAKE_COMMAND}
+ -DCMAKE_BUILD_TYPE=Debug -GNinja
+ -DJSON_BuildTests=ON -DJSON_Diagnostics=ON
+ -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_diagnostics
+ COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_diagnostics
+ COMMAND cd ${PROJECT_BINARY_DIR}/build_diagnostics && ${CMAKE_CTEST_COMMAND} --parallel ${N} --output-on-failure
+ COMMENT "Compile and test with improved diagnostics enabled"
+)
+
+###############################################################################
+# Enable diagnostic positions support.
+###############################################################################
+
+add_custom_target(ci_test_diagnostic_positions
+ COMMAND ${CMAKE_COMMAND}
+ -DCMAKE_BUILD_TYPE=Debug -GNinja
+ -DJSON_BuildTests=ON -DJSON_Diagnostic_Positions=ON
+ -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_diagnostic_positions
+ COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_diagnostic_positions
+ COMMAND cd ${PROJECT_BINARY_DIR}/build_diagnostic_positions && ${CMAKE_CTEST_COMMAND} --parallel ${N} --output-on-failure
+ COMMENT "Compile and test with diagnostic positions enabled"
+)
+
+###############################################################################
+# Enable legacy discarded value comparison.
+###############################################################################
+
+add_custom_target(ci_test_legacycomparison
+ COMMAND ${CMAKE_COMMAND}
+ -DCMAKE_BUILD_TYPE=Debug -GNinja
+ -DJSON_BuildTests=ON -DJSON_LegacyDiscardedValueComparison=ON
+ -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_legacycomparison
+ COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_legacycomparison
+ COMMAND cd ${PROJECT_BINARY_DIR}/build_legacycomparison && ${CMAKE_CTEST_COMMAND} --parallel ${N} --output-on-failure
+ COMMENT "Compile and test with legacy discarded value comparison enabled"
+)
+
+###############################################################################
+# Disable global UDLs.
+###############################################################################
+
+add_custom_target(ci_test_noglobaludls
+ COMMAND ${CMAKE_COMMAND}
+ -DCMAKE_BUILD_TYPE=Debug -GNinja
+ -DJSON_BuildTests=ON -DJSON_FastTests=ON -DJSON_GlobalUDLs=OFF
+ -DCMAKE_CXX_FLAGS=-DJSON_TEST_NO_GLOBAL_UDLS
+ -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_noglobaludls
+ COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_noglobaludls
+ COMMAND cd ${PROJECT_BINARY_DIR}/build_noglobaludls && ${CMAKE_CTEST_COMMAND} --parallel ${N} --output-on-failure
+ COMMENT "Compile and test with global UDLs disabled"
+)
+
+###############################################################################
+# Coverage.
+###############################################################################
+
+add_custom_target(ci_test_coverage
+ COMMAND CXX=g++ ${CMAKE_COMMAND}
+ -DCMAKE_BUILD_TYPE=Debug -GNinja -DCMAKE_CXX_FLAGS="--coverage;-fprofile-arcs;-ftest-coverage"
+ -DJSON_BuildTests=ON
+ -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_coverage
+ COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_coverage
+ COMMAND cd ${PROJECT_BINARY_DIR}/build_coverage && ${CMAKE_CTEST_COMMAND} --parallel ${N} --output-on-failure
+
+ COMMAND CXX=g++ ${CMAKE_COMMAND}
+ -DCMAKE_BUILD_TYPE=Debug -GNinja -DCMAKE_CXX_FLAGS="-m32;--coverage;-fprofile-arcs;-ftest-coverage"
+ -DJSON_BuildTests=ON -DJSON_32bitTest=ONLY
+ -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_coverage32
+ COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_coverage32
+ COMMAND cd ${PROJECT_BINARY_DIR}/build_coverage32 && ${CMAKE_CTEST_COMMAND} --parallel ${N} --output-on-failure
+
+ COMMAND ${LCOV_TOOL} --directory . --capture --output-file json.info --rc branch_coverage=1 --rc geninfo_unexecuted_blocks=1 --ignore-errors mismatch --ignore-errors unused
+ COMMAND ${LCOV_TOOL} -e json.info ${SRC_FILES} --output-file json.info.filtered --rc branch_coverage=1 --ignore-errors unused
+ COMMAND ${CMAKE_SOURCE_DIR}/tests/thirdparty/imapdl/filterbr.py json.info.filtered > json.info.filtered.noexcept
+ COMMAND genhtml --title "JSON for Modern C++" --legend --demangle-cpp --output-directory html --show-details --branch-coverage json.info.filtered.noexcept
+
+ COMMENT "Compile and test with coverage"
+)
+
+###############################################################################
+# Sanitizers.
+###############################################################################
+
+set(CLANG_CXX_FLAGS_SANITIZER "-g -O1 -fsanitize=address -fsanitize=undefined -fsanitize=integer -fsanitize=nullability -fno-omit-frame-pointer -fno-sanitize-recover=all -fno-sanitize=unsigned-integer-overflow -fno-sanitize=unsigned-shift-base")
+
+add_custom_target(ci_test_clang_sanitizer
+ COMMAND CXX=${CLANG_TOOL} CXXFLAGS=${CLANG_CXX_FLAGS_SANITIZER} ${CMAKE_COMMAND}
+ -DCMAKE_BUILD_TYPE=Debug -GNinja
+ -DJSON_BuildTests=ON
+ -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_clang_sanitizer
+ COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_clang_sanitizer
+ COMMAND cd ${PROJECT_BINARY_DIR}/build_clang_sanitizer && ${CMAKE_CTEST_COMMAND} --parallel ${N} --output-on-failure
+ COMMENT "Compile and test with sanitizers"
+)
+
+###############################################################################
+# Check if header is amalgamated and sources are properly indented.
+###############################################################################
+
+file(GLOB_RECURSE INDENT_FILES
+ ${PROJECT_SOURCE_DIR}/include/nlohmann/*.hpp
+ ${PROJECT_SOURCE_DIR}/tests/src/*.cpp
+ ${PROJECT_SOURCE_DIR}/tests/src/*.hpp
+ ${PROJECT_SOURCE_DIR}/tests/benchmarks/src/benchmarks.cpp
+ ${PROJECT_SOURCE_DIR}/docs/examples/*.cpp
+)
+
+set(include_dir ${PROJECT_SOURCE_DIR}/single_include/nlohmann)
+set(tool_dir ${PROJECT_SOURCE_DIR}/tools/amalgamate)
+add_custom_target(ci_test_amalgamation
+ COMMAND rm -fr ${include_dir}/json.hpp~ ${include_dir}/json_fwd.hpp~
+ COMMAND cp ${include_dir}/json.hpp ${include_dir}/json.hpp~
+ COMMAND cp ${include_dir}/json_fwd.hpp ${include_dir}/json_fwd.hpp~
+
+ COMMAND ${Python3_EXECUTABLE} -mvenv venv_astyle
+ COMMAND venv_astyle/bin/pip3 --quiet install -r ${CMAKE_SOURCE_DIR}/tools/astyle/requirements.txt
+ COMMAND venv_astyle/bin/astyle --version
+
+ COMMAND ${Python3_EXECUTABLE} ${tool_dir}/amalgamate.py -c ${tool_dir}/config_json.json -s .
+ COMMAND ${Python3_EXECUTABLE} ${tool_dir}/amalgamate.py -c ${tool_dir}/config_json_fwd.json -s .
+ COMMAND venv_astyle/bin/astyle --project=tools/astyle/.astylerc --suffix=none ${include_dir}/json.hpp ${include_dir}/json_fwd.hpp
+
+ COMMAND diff ${include_dir}/json.hpp~ ${include_dir}/json.hpp
+ COMMAND diff ${include_dir}/json_fwd.hpp~ ${include_dir}/json_fwd.hpp
+
+ COMMAND venv_astyle/bin/astyle --project=tools/astyle/.astylerc --suffix=orig ${INDENT_FILES}
+ COMMAND for FILE in `find . -name '*.orig'`\; do false \; done
+
+ WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
+ COMMENT "Check amalgamation and indentation"
+)
+
+###############################################################################
+# Build and test using the amalgamated header
+###############################################################################
+
+add_custom_target(ci_test_single_header
+ COMMAND ${CMAKE_COMMAND}
+ -DCMAKE_BUILD_TYPE=Debug -GNinja
+ -DJSON_BuildTests=ON -DJSON_MultipleHeaders=OFF -DJSON_FastTests=ON
+ -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_single_header
+ COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_single_header
+ COMMAND cd ${PROJECT_BINARY_DIR}/build_single_header && ${CMAKE_CTEST_COMMAND} --parallel ${N} --output-on-failure
+ COMMENT "Compile and test single-header version"
+)
+
+###############################################################################
+# Valgrind.
+###############################################################################
+
+add_custom_target(ci_test_valgrind
+ COMMAND CXX=${GCC_TOOL} ${CMAKE_COMMAND}
+ -DCMAKE_BUILD_TYPE=Debug -GNinja
+ -DJSON_BuildTests=ON -DJSON_Valgrind=ON
+ -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_valgrind
+ COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_valgrind
+ COMMAND cd ${PROJECT_BINARY_DIR}/build_valgrind && ${CMAKE_CTEST_COMMAND} -L valgrind --parallel ${N} --output-on-failure
+ COMMENT "Compile and test with Valgrind"
+)
+
+###############################################################################
+# Check code with Clang Static Analyzer.
+###############################################################################
+
+set(CLANG_ANALYZER_CHECKS "fuchsia.HandleChecker,nullability.NullableDereferenced,nullability.NullablePassedToNonnull,nullability.NullableReturnedFromNonnull,optin.cplusplus.UninitializedObject,optin.cplusplus.VirtualCall,optin.mpi.MPI-Checker,optin.osx.OSObjectCStyleCast,optin.osx.cocoa.localizability.EmptyLocalizationContextChecker,optin.osx.cocoa.localizability.NonLocalizedStringChecker,optin.performance.GCDAntipattern,optin.performance.Padding,optin.portability.UnixAPI,security.FloatLoopCounter,security.insecureAPI.DeprecatedOrUnsafeBufferHandling,security.insecureAPI.bcmp,security.insecureAPI.bcopy,security.insecureAPI.bzero,security.insecureAPI.rand,security.insecureAPI.strcpy,valist.CopyToSelf,valist.Uninitialized,valist.Unterminated,webkit.NoUncountedMemberChecker,webkit.RefCntblBaseVirtualDtor,core.CallAndMessage,core.DivideZero,core.NonNullParamChecker,core.NullDereference,core.StackAddressEscape,core.UndefinedBinaryOperatorResult,core.VLASize,core.uninitialized.ArraySubscript,core.uninitialized.Assign,core.uninitialized.Branch,core.uninitialized.CapturedBlockVariable,core.uninitialized.UndefReturn,cplusplus.InnerPointer,cplusplus.Move,cplusplus.NewDelete,cplusplus.NewDeleteLeaks,cplusplus.PlacementNew,cplusplus.PureVirtualCall,deadcode.DeadStores,nullability.NullPassedToNonnull,nullability.NullReturnedFromNonnull,osx.API,osx.MIG,osx.NumberObjectConversion,osx.OSObjectRetainCount,osx.ObjCProperty,osx.SecKeychainAPI,osx.cocoa.AtSync,osx.cocoa.AutoreleaseWrite,osx.cocoa.ClassRelease,osx.cocoa.Dealloc,osx.cocoa.IncompatibleMethodTypes,osx.cocoa.Loops,osx.cocoa.MissingSuperCall,osx.cocoa.NSAutoreleasePool,osx.cocoa.NSError,osx.cocoa.NilArg,osx.cocoa.NonNilReturnValue,osx.cocoa.ObjCGenerics,osx.cocoa.RetainCount,osx.cocoa.RunLoopAutoreleaseLeak,osx.cocoa.SelfInit,osx.cocoa.SuperDealloc,osx.cocoa.UnusedIvars,osx.cocoa.VariadicMethodTypes,osx.coreFoundation.CFError,osx.coreFoundation.CFNumber,osx.coreFoundation.CFRetainRelease,osx.coreFoundation.containers.OutOfBounds,osx.coreFoundation.containers.PointerSizedValues,security.insecureAPI.UncheckedReturn,security.insecureAPI.decodeValueOfObjCType,security.insecureAPI.getpw,security.insecureAPI.gets,security.insecureAPI.mkstemp,security.insecureAPI.mktemp,security.insecureAPI.vfork,unix.API,unix.Malloc,unix.MallocSizeof,unix.MismatchedDeallocator,unix.Vfork,unix.cstring.BadSizeArg,unix.cstring.NullArg")
+
+add_custom_target(ci_clang_analyze
+ COMMAND CXX=${CLANG_TOOL} ${CMAKE_COMMAND}
+ -DCMAKE_BUILD_TYPE=Debug -GNinja
+ -DJSON_BuildTests=ON
+ -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_clang_analyze
+ COMMAND cd ${PROJECT_BINARY_DIR}/build_clang_analyze && ${SCAN_BUILD_TOOL} -enable-checker ${CLANG_ANALYZER_CHECKS} --use-c++=${CLANG_TOOL} -analyze-headers -o ${PROJECT_BINARY_DIR}/report ninja
+ COMMENT "Check code with Clang Analyzer"
+)
+
+###############################################################################
+# Check code with Cppcheck.
+###############################################################################
+
+add_custom_target(ci_cppcheck
+ COMMAND mkdir -p cppcheck
+ COMMAND clang -dM -E -x c++ -std=c++11 ${CMAKE_SOURCE_DIR}/include/nlohmann/thirdparty/hedley/hedley.hpp > default_defines.hpp 2> /dev/null
+ COMMAND ${Python3_EXECUTABLE} -mvenv venv_cppcheck
+ COMMAND venv_cppcheck/bin/pip3 --quiet install -r ${CMAKE_SOURCE_DIR}/cmake/requirements/requirements-cppcheck.txt
+ COMMAND venv_cppcheck/bin/cppcheck --enable=warning --check-level=exhaustive --inline-suppr --inconclusive --force
+ --std=c++11 ${PROJECT_SOURCE_DIR}/include/nlohmann/json.hpp -I ${CMAKE_SOURCE_DIR}/include
+ --error-exitcode=1 --relative-paths=${PROJECT_SOURCE_DIR} -j ${N} --include=default_defines.hpp
+ --cppcheck-build-dir=cppcheck --check-level=exhaustive
+ -UJSON_CATCH_USER -UJSON_TRY_USER -UJSON_ASSERT -UJSON_INTERNAL_CATCH -UJSON_THROW
+ -DJSON_HAS_CPP_11 -UJSON_HAS_CPP_14 -UJSON_HAS_CPP_17 -UJSON_HAS_CPP_20 -UJSON_HAS_THREE_WAY_COMPARISON
+ COMMENT "Check code with Cppcheck"
+)
+
+###############################################################################
+# Check code with cpplint.
+###############################################################################
+
+add_custom_target(ci_cpplint
+ COMMAND ${Python3_EXECUTABLE} -mvenv venv_cpplint
+ COMMAND venv_cpplint/bin/pip3 --quiet install -r ${CMAKE_SOURCE_DIR}/cmake/requirements/requirements-cpplint.txt
+ COMMAND venv_cpplint/bin/cpplint --filter=-whitespace,-legal,-runtime/references,-runtime/explicit,-runtime/indentation_namespace,-readability/casting,-readability/nolint --quiet --recursive ${SRC_FILES}
+ COMMENT "Check code with cpplint"
+ WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
+)
+
+###############################################################################
+# Check code with OCLint.
+###############################################################################
+
+file(COPY ${PROJECT_SOURCE_DIR}/single_include/nlohmann/json.hpp DESTINATION ${PROJECT_BINARY_DIR}/src_single)
+file(RENAME ${PROJECT_BINARY_DIR}/src_single/json.hpp ${PROJECT_BINARY_DIR}/src_single/all.cpp)
+file(APPEND "${PROJECT_BINARY_DIR}/src_single/all.cpp" "\n\nint main()\n{}\n")
+
+add_executable(single_all ${PROJECT_BINARY_DIR}/src_single/all.cpp)
+target_compile_features(single_all PRIVATE cxx_std_11)
+
+add_custom_target(ci_oclint
+ COMMAND ${CMAKE_COMMAND}
+ -DCMAKE_BUILD_TYPE=Debug
+ -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
+ -DJSON_BuildTests=OFF -DJSON_CI=ON
+ -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_oclint
+ COMMAND ${OCLINT_TOOL} -i ${PROJECT_BINARY_DIR}/build_oclint/src_single/all.cpp -p ${PROJECT_BINARY_DIR}/build_oclint --
+ -report-type html -enable-global-analysis --max-priority-1=0 --max-priority-2=1000 --max-priority-3=2000
+ --disable-rule=MultipleUnaryOperator
+ --disable-rule=DoubleNegative
+ --disable-rule=ShortVariableName
+ --disable-rule=GotoStatement
+ --disable-rule=LongLine
+ -o ${PROJECT_BINARY_DIR}/build_oclint/oclint_report.html
+ COMMENT "Check code with OCLint"
+)
+
+###############################################################################
+# Check code with Clang-Tidy.
+###############################################################################
+
+add_custom_target(ci_clang_tidy
+ COMMAND CXX=${CLANG_TOOL} ${CMAKE_COMMAND}
+ -DCMAKE_BUILD_TYPE=Debug -GNinja
+ -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_CXX_CLANG_TIDY=${CLANG_TIDY_TOOL}
+ -DJSON_BuildTests=ON
+ -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_clang_tidy
+ COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_clang_tidy
+ COMMENT "Check code with Clang-Tidy"
+)
+
+###############################################################################
+# Check code with PVS-Studio Analyzer <https://www.viva64.com/en/pvs-studio/>.
+###############################################################################
+
+add_custom_target(ci_pvs_studio
+ COMMAND CXX=${CLANG_TOOL} ${CMAKE_COMMAND}
+ -DCMAKE_BUILD_TYPE=Debug
+ -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
+ -DJSON_BuildTests=ON
+ -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_pvs_studio
+ COMMAND cd ${PROJECT_BINARY_DIR}/build_pvs_studio && ${PVS_STUDIO_ANALYZER_TOOL} analyze -j 10
+ COMMAND cd ${PROJECT_BINARY_DIR}/build_pvs_studio && ${PLOG_CONVERTER_TOOL} -a'GA:1,2;64:1;CS' -t fullhtml PVS-Studio.log -o pvs
+ COMMENT "Check code with PVS Studio"
+)
+
+###############################################################################
+# Check code with Infer <https://fbinfer.com> static analyzer.
+###############################################################################
+
+add_custom_target(ci_infer
+ COMMAND mkdir -p ${PROJECT_BINARY_DIR}/build_infer
+ COMMAND cd ${PROJECT_BINARY_DIR}/build_infer && ${INFER_TOOL} compile -- ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=Debug ${PROJECT_SOURCE_DIR} -DJSON_BuildTests=ON
+ COMMAND cd ${PROJECT_BINARY_DIR}/build_infer && ${INFER_TOOL} run -- make
+ COMMENT "Check code with Infer"
+)
+
+###############################################################################
+# Run test suite with previously downloaded test data.
+###############################################################################
+
+add_custom_target(ci_offline_testdata
+ COMMAND mkdir -p ${PROJECT_BINARY_DIR}/build_offline_testdata/test_data
+ COMMAND cd ${PROJECT_BINARY_DIR}/build_offline_testdata/test_data && ${GIT_TOOL} clone -c advice.detachedHead=false --branch v3.1.0 https://github.com/nlohmann/json_test_data.git --quiet --depth 1
+ COMMAND ${CMAKE_COMMAND}
+ -DCMAKE_BUILD_TYPE=Debug -GNinja
+ -DJSON_BuildTests=ON -DJSON_FastTests=ON -DJSON_TestDataDirectory=${PROJECT_BINARY_DIR}/build_offline_testdata/test_data/json_test_data
+ -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_offline_testdata
+ COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_offline_testdata
+ COMMAND cd ${PROJECT_BINARY_DIR}/build_offline_testdata && ${CMAKE_CTEST_COMMAND} --parallel ${N} --output-on-failure
+ COMMENT "Check code with previously downloaded test data"
+)
+
+###############################################################################
+# Run test suite when project was not checked out from Git
+###############################################################################
+
+add_custom_target(ci_non_git_tests
+ COMMAND git config --global --add safe.directory ${PROJECT_SOURCE_DIR}
+ COMMAND mkdir -p ${PROJECT_BINARY_DIR}/build_non_git_tests/sources
+ COMMAND cd ${PROJECT_SOURCE_DIR} && for FILE in `${GIT_TOOL} ls-tree --name-only HEAD`\; do cp -r $$FILE ${PROJECT_BINARY_DIR}/build_non_git_tests/sources \; done
+ COMMAND ${CMAKE_COMMAND}
+ -DCMAKE_BUILD_TYPE=Debug -GNinja
+ -DJSON_BuildTests=ON -DJSON_FastTests=ON
+ -S${PROJECT_BINARY_DIR}/build_non_git_tests/sources -B${PROJECT_BINARY_DIR}/build_non_git_tests
+ COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_non_git_tests
+ COMMAND cd ${PROJECT_BINARY_DIR}/build_non_git_tests && ${CMAKE_CTEST_COMMAND} --parallel ${N} -LE git_required --output-on-failure
+ COMMENT "Check code when project was not checked out from Git"
+)
+
+###############################################################################
+# Run test suite and exclude tests that change installed files
+###############################################################################
+
+add_custom_target(ci_reproducible_tests
+ COMMAND ${CMAKE_COMMAND}
+ -DCMAKE_BUILD_TYPE=Debug -GNinja
+ -DJSON_BuildTests=ON -DJSON_FastTests=ON
+ -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_reproducible_tests
+ COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_reproducible_tests
+ COMMAND cd ${PROJECT_BINARY_DIR}/build_reproducible_tests && ${CMAKE_CTEST_COMMAND} --parallel ${N} -LE not_reproducible --output-on-failure
+ COMMENT "Check code and exclude tests that change installed files"
+)
+
+###############################################################################
+# Check if every header in the include folder includes sufficient headers to
+# be compiled individually.
+###############################################################################
+
+set(iwyu_path_and_options ${IWYU_TOOL} -Xiwyu --max_line_length=300)
+
+foreach(SRC_FILE ${SRC_FILES})
+ # get relative path of the header file
+ file(RELATIVE_PATH RELATIVE_SRC_FILE "${PROJECT_SOURCE_DIR}/include/nlohmann" "${SRC_FILE}")
+ # replace slashes and strip suffix
+ string(REPLACE "/" "_" RELATIVE_SRC_FILE "${RELATIVE_SRC_FILE}")
+ string(REPLACE ".hpp" "" RELATIVE_SRC_FILE "${RELATIVE_SRC_FILE}")
+ # create code file
+ file(WRITE "${PROJECT_BINARY_DIR}/src_single/${RELATIVE_SRC_FILE}.cpp" "#include \"${SRC_FILE}\" // IWYU pragma: keep\n\nint main()\n{}\n")
+ # create executable
+ add_executable(single_${RELATIVE_SRC_FILE} EXCLUDE_FROM_ALL ${PROJECT_BINARY_DIR}/src_single/${RELATIVE_SRC_FILE}.cpp)
+ target_include_directories(single_${RELATIVE_SRC_FILE} PRIVATE ${PROJECT_SOURCE_DIR}/include)
+ target_compile_features(single_${RELATIVE_SRC_FILE} PRIVATE cxx_std_11)
+ set_property(TARGET single_${RELATIVE_SRC_FILE} PROPERTY CXX_INCLUDE_WHAT_YOU_USE "${iwyu_path_and_options}")
+ # remember binary for ci_single_binaries target
+ list(APPEND single_binaries single_${RELATIVE_SRC_FILE})
+endforeach()
+
+add_custom_target(ci_single_binaries
+ DEPENDS ${single_binaries}
+ COMMENT "Check if headers are self-contained"
+)
+
+###############################################################################
+# Benchmarks
+###############################################################################
+
+add_custom_target(ci_benchmarks
+ COMMAND ${CMAKE_COMMAND}
+ -DCMAKE_BUILD_TYPE=Release -GNinja
+ -S${PROJECT_SOURCE_DIR}/benchmarks -B${PROJECT_BINARY_DIR}/build_benchmarks
+ COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_benchmarks --target json_benchmarks
+ COMMAND cd ${PROJECT_BINARY_DIR}/build_benchmarks && ./json_benchmarks
+ COMMENT "Run benchmarks"
+)
+
+###############################################################################
+# CMake flags
+###############################################################################
+
+# we test the project with different CMake versions:
+# - CMake 3.5 (the earliest supported)
+# - CMake 3.31.6 (the latest 3.x release)
+# - CMake 4.0.0 (the latest release)
+
+function(ci_get_cmake version var)
+ set(${var} ${PROJECT_BINARY_DIR}/cmake-${version}/bin/cmake)
+ add_custom_command(
+ OUTPUT ${${var}}
+ COMMAND wget -nc https://github.com/Kitware/CMake/releases/download/v${version}/cmake-${version}.tar.gz
+ COMMAND tar xfz cmake-${version}.tar.gz
+ COMMAND rm cmake-${version}.tar.gz
+ # -DCMAKE_POLICY_VERSION_MINIMUM=3.5 required to compile older CMake versions with CMake 4.0.0
+ COMMAND cmake -S cmake-${version} -B cmake-${version} -DCMAKE_POLICY_VERSION_MINIMUM=3.5
+ COMMAND cmake --build cmake-${version} --parallel 10
+ WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
+ COMMENT "Download CMake ${version}"
+ )
+ set(${var} ${${var}} PARENT_SCOPE)
+endfunction()
+
+ci_get_cmake(3.5.0 CMAKE_3_5_0_BINARY)
+ci_get_cmake(3.31.6 CMAKE_3_31_6_BINARY)
+ci_get_cmake(4.0.0 CMAKE_4_0_0_BINARY)
+
+# the tests require CMake 3.13 or later, so they are excluded for CMake 3.5.0
+set(JSON_CMAKE_FLAGS_3_5_0 JSON_Diagnostics JSON_Diagnostic_Positions JSON_GlobalUDLs JSON_ImplicitConversions JSON_DisableEnumSerialization
+ JSON_LegacyDiscardedValueComparison JSON_Install JSON_MultipleHeaders JSON_SystemInclude JSON_Valgrind)
+set(JSON_CMAKE_FLAGS_3_31_6 JSON_BuildTests ${JSON_CMAKE_FLAGS_3_31_6})
+set(JSON_CMAKE_FLAGS_4_0_0 JSON_BuildTests ${JSON_CMAKE_FLAGS_3_5_0})
+
+function(ci_add_cmake_flags_targets flag min_version)
+ string(TOLOWER "ci_cmake_flag_${flag}" flag_target)
+ string(REPLACE . _ min_version_var ${min_version})
+ set(cmake_binary ${CMAKE_${min_version_var}_BINARY})
+ add_custom_target(${flag_target}_${min_version}_2
+ COMMENT "Check CMake flag ${flag} (CMake ${CMAKE_VERSION})"
+ COMMAND ${CMAKE_COMMAND}
+ -Werror=dev
+ -D${flag}=ON
+ -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_${flag_target}
+ )
+ add_custom_target(${flag_target}_${min_version_var}
+ COMMENT "Check CMake flag ${JSON_CMAKE_FLAG} (CMake ${min_version})"
+ COMMAND mkdir -pv ${PROJECT_BINARY_DIR}/build_${flag_target}_${min_version_var}
+ COMMAND cd ${PROJECT_BINARY_DIR}/build_${flag_target}_${min_version_var}
+ && ${cmake_binary} -Werror=dev ${PROJECT_SOURCE_DIR} -D${flag}=ON
+ DEPENDS ${cmake_binary}
+ )
+ list(APPEND JSON_CMAKE_FLAG_TARGETS ${JSON_CMAKE_FLAG_TARGET} ${flag_target}_${min_version_var})
+ list(APPEND JSON_CMAKE_FLAG_BUILD_DIRS ${PROJECT_BINARY_DIR}/build_${flag_target} ${PROJECT_BINARY_DIR}/build_${flag_target}_${min_version_var})
+ set(JSON_CMAKE_FLAG_TARGETS ${JSON_CMAKE_FLAG_TARGETS} PARENT_SCOPE)
+ set(JSON_CMAKE_FLAG_BUILD_DIRS ${JSON_CMAKE_FLAG_BUILD_DIRS} PARENT_SCOPE)
+endfunction()
+
+foreach(JSON_CMAKE_FLAG ${JSON_CMAKE_FLAGS_3_5_0})
+ ci_add_cmake_flags_targets(${JSON_CMAKE_FLAG} 3.5.0)
+endforeach()
+
+foreach(JSON_CMAKE_FLAG ${JSON_CMAKE_FLAGS_3_31_6})
+ ci_add_cmake_flags_targets(${JSON_CMAKE_FLAG} 3.31.6)
+endforeach()
+
+foreach(JSON_CMAKE_FLAG ${JSON_CMAKE_FLAGS_4_0_0})
+ ci_add_cmake_flags_targets(${JSON_CMAKE_FLAG} 4.0.0)
+endforeach()
+
+add_custom_target(ci_cmake_flags
+ DEPENDS ${JSON_CMAKE_FLAG_TARGETS}
+ COMMENT "Check CMake flags"
+)
+
+###############################################################################
+# Use more installed compilers.
+###############################################################################
+
+foreach(COMPILER g++-4.8 g++-4.9 g++-5 g++-6 g++-7 g++-8 g++-9 g++-10 g++-11 clang++-3.5 clang++-3.6 clang++-3.7 clang++-3.8 clang++-3.9 clang++-4.0 clang++-5.0 clang++-6.0 clang++-7 clang++-8 clang++-9 clang++-10 clang++-11 clang++-12 clang++-13 clang++-14 clang++-15 clang++-16 clang++-17 clang++-18 clang++-19 clang++-20)
+ find_program(COMPILER_TOOL NAMES ${COMPILER})
+ if (COMPILER_TOOL)
+ unset(ADDITIONAL_FLAGS)
+
+ add_custom_target(ci_test_compiler_${COMPILER}
+ COMMAND CXX=${COMPILER} ${CMAKE_COMMAND}
+ -DCMAKE_BUILD_TYPE=Debug -GNinja
+ -DJSON_BuildTests=ON -DJSON_FastTests=ON
+ -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_compiler_${COMPILER}
+ ${ADDITIONAL_FLAGS}
+ COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_compiler_${COMPILER}
+ COMMAND cd ${PROJECT_BINARY_DIR}/build_compiler_${COMPILER} && ${CMAKE_CTEST_COMMAND} --parallel ${N} --exclude-regex "test-unicode" --output-on-failure
+ COMMENT "Compile and test with ${COMPILER}"
+ )
+ endif()
+ unset(COMPILER_TOOL CACHE)
+endforeach()
+
+add_custom_target(ci_test_compiler_default
+ COMMAND ${CMAKE_COMMAND}
+ -DCMAKE_BUILD_TYPE=Debug -GNinja
+ -DJSON_BuildTests=ON -DJSON_FastTests=ON
+ -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_compiler_default
+ ${ADDITIONAL_FLAGS}
+ COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_compiler_default --parallel ${N}
+ COMMAND cd ${PROJECT_BINARY_DIR}/build_compiler_default && ${CMAKE_CTEST_COMMAND} --parallel ${N} --exclude-regex "test-unicode" -LE git_required --output-on-failure
+ COMMENT "Compile and test with default C++ compiler"
+)
+
+###############################################################################
+# CUDA example
+###############################################################################
+
+add_custom_target(ci_cuda_example
+ COMMAND ${CMAKE_COMMAND}
+ -DCMAKE_BUILD_TYPE=Debug -GNinja
+ -DCMAKE_CUDA_HOST_COMPILER=g++-8
+ -S${PROJECT_SOURCE_DIR}/tests/cuda_example -B${PROJECT_BINARY_DIR}/build_cuda_example
+ COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_cuda_example
+)
+
+###############################################################################
+# C++ 20 modules
+###############################################################################
+
+add_custom_target(ci_module_cpp20
+ COMMAND ${CMAKE_COMMAND}
+ -DCMAKE_BUILD_TYPE=Debug -GNinja
+ -DJSON_CI=ON -DNLOHMANN_JSON_BUILD_MODULES=ON -DJSON_Install=ON
+ -S${PROJECT_SOURCE_DIR}/tests/module_cpp20 -B${PROJECT_BINARY_DIR}/ci_module_cpp20
+ COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/ci_module_cpp20
+)
+
+###############################################################################
+# Intel C++ Compiler
+###############################################################################
+
+add_custom_target(ci_icpc
+ COMMAND ${CMAKE_COMMAND}
+ -DCMAKE_BUILD_TYPE=Debug -GNinja
+ -DCMAKE_C_COMPILER=icc -DCMAKE_CXX_COMPILER=icpc
+ -DJSON_BuildTests=ON -DJSON_FastTests=ON
+ -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_icpc
+ COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_icpc
+ COMMAND cd ${PROJECT_BINARY_DIR}/build_icpc && ${CMAKE_CTEST_COMMAND} --parallel ${N} --exclude-regex "test-unicode" --output-on-failure
+ COMMENT "Compile and test with ICPC"
+)
+
+###############################################################################
+# REUSE
+###############################################################################
+
+add_custom_target(ci_reuse_compliance
+ COMMAND ${Python3_EXECUTABLE} -mvenv venv_reuse
+ COMMAND venv_reuse/bin/pip3 --quiet install -r ${PROJECT_SOURCE_DIR}/cmake/requirements/requirements-reuse.txt
+ COMMAND venv_reuse/bin/reuse --root ${PROJECT_SOURCE_DIR} lint
+ COMMENT "Check REUSE specification compliance"
+)
+
+###############################################################################
+# test documentation
+###############################################################################
+
+add_custom_target(ci_test_examples
+ COMMAND make CXX="${GCC_TOOL}" check_output_portable -j8
+ WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/docs
+ COMMENT "Check that all examples compile and create the desired output"
+)
+
+add_custom_target(ci_test_build_documentation
+ COMMAND ${Python3_EXECUTABLE} -mvenv venv
+ COMMAND venv/bin/pip3 --quiet install -r requirements.txt
+ COMMAND make build
+ WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/docs/mkdocs
+ COMMENT "Build the documentation"
+)
+
+###############################################################################
+# Clean up all generated files.
+###############################################################################
+
+add_custom_target(ci_clean
+ COMMAND rm -fr ${PROJECT_BINARY_DIR}/build_* cmake-3.5.0-Darwin64 ${JSON_CMAKE_FLAG_BUILD_DIRS} ${single_binaries}
+ COMMENT "Clean generated directories"
+)
diff --git a/json4cpp/cmake/clang_flags.cmake b/json4cpp/cmake/clang_flags.cmake
new file mode 100644
index 0000000000..b3dfa31440
--- /dev/null
+++ b/json4cpp/cmake/clang_flags.cmake
@@ -0,0 +1,22 @@
+# Ignored Clang warnings:
+# -Wno-c++98-compat The library targets C++11.
+# -Wno-c++98-compat-pedantic The library targets C++11.
+# -Wno-deprecated-declarations The library contains annotations for deprecated functions.
+# -Wno-extra-semi-stmt The library uses assert which triggers this warning.
+# -Wno-padded We do not care about padding warnings.
+# -Wno-covered-switch-default All switches list all cases and a default case.
+# -Wno-unsafe-buffer-usage Otherwise Doctest would not compile.
+# -Wno-missing-noreturn We found no way to silence this warning otherwise, see PR #4871
+
+set(CLANG_CXXFLAGS
+ -Werror
+ -Weverything
+ -Wno-c++98-compat
+ -Wno-c++98-compat-pedantic
+ -Wno-deprecated-declarations
+ -Wno-extra-semi-stmt
+ -Wno-padded
+ -Wno-covered-switch-default
+ -Wno-unsafe-buffer-usage
+ -Wno-missing-noreturn
+)
diff --git a/json4cpp/cmake/config.cmake.in b/json4cpp/cmake/config.cmake.in
new file mode 100644
index 0000000000..9a17a7d7b2
--- /dev/null
+++ b/json4cpp/cmake/config.cmake.in
@@ -0,0 +1,15 @@
+include(FindPackageHandleStandardArgs)
+set(${CMAKE_FIND_PACKAGE_NAME}_CONFIG ${CMAKE_CURRENT_LIST_FILE})
+find_package_handle_standard_args(@PROJECT_NAME@ CONFIG_MODE)
+
+if(NOT TARGET @PROJECT_NAME@::@NLOHMANN_JSON_TARGET_NAME@)
+ include("${CMAKE_CURRENT_LIST_DIR}/@NLOHMANN_JSON_TARGETS_EXPORT_NAME@.cmake")
+ if((NOT TARGET @NLOHMANN_JSON_TARGET_NAME@) AND
+ (NOT @PROJECT_NAME@_FIND_VERSION OR
+ @PROJECT_NAME@_FIND_VERSION VERSION_LESS 3.2.0))
+ add_library(@NLOHMANN_JSON_TARGET_NAME@ INTERFACE IMPORTED)
+ set_target_properties(@NLOHMANN_JSON_TARGET_NAME@ PROPERTIES
+ INTERFACE_LINK_LIBRARIES @PROJECT_NAME@::@NLOHMANN_JSON_TARGET_NAME@
+ )
+ endif()
+endif()
diff --git a/json4cpp/cmake/detect_libcpp_version.cpp b/json4cpp/cmake/detect_libcpp_version.cpp
new file mode 100644
index 0000000000..a39322fcd2
--- /dev/null
+++ b/json4cpp/cmake/detect_libcpp_version.cpp
@@ -0,0 +1,31 @@
+/*
+ * Detect used C++ Standard Library
+ *
+ * This file is compiled and run via try_run in download_test_data.cmake.
+ */
+
+#include <cstdio>
+
+// see https://en.cppreference.com/w/cpp/header/ciso646
+#if __cplusplus >= 202002L
+ #include <version>
+#else
+ #include <ciso646>
+#endif
+
+int main()
+{
+#if defined(_LIBCPP_VERSION)
+ std::printf("LLVM C++ Standard Library (libc++), _LIBCPP_VERSION=%d", _LIBCPP_VERSION);
+#elif defined(__GLIBCXX__)
+ std::printf("GNU C++ Standard Library (libstdc++), __GLIBCXX__=%d", __GLIBCXX__);
+#elif defined(_MSVC_STL_VERSION)
+ std::printf("Microsoft C++ Standard Library (MSVC STL), _MSVC_STL_VERSION=%d", _MSVC_STL_VERSION);
+#elif defined(_LIBCUDACXX_VERSION)
+ std::printf("NVIDIA C++ Standard Library (libcudacxx), _LIBCUDACXX_VERSION=%d", _LIBCUDACXX_VERSION);
+#elif defined(EASTL_VERSION)
+ std::printf("Electronic Arts Standard Template Library (EASTL), EASTL_VERSION=%d", EASTL_VERSION);
+#else
+ std::printf("unknown");
+#endif
+}
diff --git a/json4cpp/cmake/download_test_data.cmake b/json4cpp/cmake/download_test_data.cmake
new file mode 100644
index 0000000000..6f63a08ac6
--- /dev/null
+++ b/json4cpp/cmake/download_test_data.cmake
@@ -0,0 +1,87 @@
+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 GitHub release
+ 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(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}")
+
+# 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_SOURCE_DIR}/cmake/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}")
diff --git a/json4cpp/cmake/gcc_flags.cmake b/json4cpp/cmake/gcc_flags.cmake
new file mode 100644
index 0000000000..34c168cee5
--- /dev/null
+++ b/json4cpp/cmake/gcc_flags.cmake
@@ -0,0 +1,363 @@
+# Warning flags determined for GCC 15.1.0 with https://github.com/nlohmann/gcc_flags:
+# Ignored GCC warnings:
+# -Wno-abi-tag We do not care about ABI tags.
+# -Wno-aggregate-return The library uses aggregate returns.
+# -Wno-long-long The library uses the long long type to interface with system functions.
+# -Wno-namespaces The library uses namespaces.
+# -Wno-nrvo Doctest triggers this warning.
+# -Wno-padded We do not care about padding warnings.
+# -Wno-system-headers We do not care about warnings in system headers.
+# -Wno-templates The library uses templates.
+
+set(GCC_CXXFLAGS
+ -pedantic
+ -Werror
+ --all-warnings
+ --extra-warnings
+ -W
+ -WNSObject-attribute
+ -Wno-abi-tag
+ -Waddress
+ -Waddress-of-packed-member
+ -Wno-aggregate-return
+ -Waggressive-loop-optimizations
+ -Waligned-new=all
+ -Wall
+ -Walloc-size
+ -Walloc-zero
+ -Walloca
+ -Wanalyzer-allocation-size
+ -Wanalyzer-deref-before-check
+ -Wanalyzer-double-fclose
+ -Wanalyzer-double-free
+ -Wanalyzer-exposure-through-output-file
+ -Wanalyzer-exposure-through-uninit-copy
+ -Wanalyzer-fd-access-mode-mismatch
+ -Wanalyzer-fd-double-close
+ -Wanalyzer-fd-leak
+ -Wanalyzer-fd-phase-mismatch
+ -Wanalyzer-fd-type-mismatch
+ -Wanalyzer-fd-use-after-close
+ -Wanalyzer-fd-use-without-check
+ -Wanalyzer-file-leak
+ -Wanalyzer-free-of-non-heap
+ -Wanalyzer-imprecise-fp-arithmetic
+ -Wanalyzer-infinite-loop
+ -Wanalyzer-infinite-recursion
+ -Wanalyzer-jump-through-null
+ -Wanalyzer-malloc-leak
+ -Wanalyzer-mismatching-deallocation
+ -Wanalyzer-null-argument
+ -Wanalyzer-null-dereference
+ -Wanalyzer-out-of-bounds
+ -Wanalyzer-overlapping-buffers
+ -Wanalyzer-possible-null-argument
+ -Wanalyzer-possible-null-dereference
+ -Wanalyzer-putenv-of-auto-var
+ -Wanalyzer-shift-count-negative
+ -Wanalyzer-shift-count-overflow
+ -Wanalyzer-stale-setjmp-buffer
+ -Wanalyzer-symbol-too-complex
+ -Wanalyzer-tainted-allocation-size
+ -Wanalyzer-tainted-array-index
+ -Wanalyzer-tainted-assertion
+ -Wanalyzer-tainted-divisor
+ -Wanalyzer-tainted-offset
+ -Wanalyzer-tainted-size
+ -Wanalyzer-too-complex
+ -Wanalyzer-undefined-behavior-ptrdiff
+ -Wanalyzer-undefined-behavior-strtok
+ -Wanalyzer-unsafe-call-within-signal-handler
+ -Wanalyzer-use-after-free
+ -Wanalyzer-use-of-pointer-in-stale-stack-frame
+ -Wanalyzer-use-of-uninitialized-value
+ -Wanalyzer-va-arg-type-mismatch
+ -Wanalyzer-va-list-exhausted
+ -Wanalyzer-va-list-leak
+ -Wanalyzer-va-list-use-after-va-end
+ -Wanalyzer-write-to-const
+ -Wanalyzer-write-to-string-literal
+ -Warith-conversion
+ -Warray-bounds=2
+ -Warray-compare
+ -Warray-parameter=2
+ -Wattribute-alias=2
+ -Wattribute-warning
+ -Wattributes
+ -Wbool-compare
+ -Wbool-operation
+ -Wbuiltin-declaration-mismatch
+ -Wbuiltin-macro-redefined
+ -Wc++0x-compat
+ -Wc++11-compat
+ -Wc++11-extensions
+ -Wc++14-compat
+ -Wc++14-extensions
+ -Wc++17-compat
+ -Wc++17-extensions
+ -Wc++1z-compat
+ -Wc++20-compat
+ -Wc++20-extensions
+ -Wc++23-extensions
+ -Wc++26-extensions
+ -Wc++2a-compat
+ -Wcalloc-transposed-args
+ -Wcannot-profile
+ -Wcast-align
+ -Wcast-align=strict
+ -Wcast-function-type
+ -Wcast-qual
+ -Wcast-user-defined
+ -Wcatch-value=3
+ -Wchanges-meaning
+ -Wchar-subscripts
+ -Wclass-conversion
+ -Wclass-memaccess
+ -Wclobbered
+ -Wcomma-subscript
+ -Wcomment
+ -Wcomments
+ -Wcomplain-wrong-lang
+ -Wconditionally-supported
+ -Wconversion
+ -Wconversion-null
+ -Wcoverage-invalid-line-number
+ -Wcoverage-mismatch
+ -Wcoverage-too-many-conditions
+ -Wcoverage-too-many-paths
+ -Wcpp
+ -Wctad-maybe-unsupported
+ -Wctor-dtor-privacy
+ -Wdangling-else
+ -Wdangling-pointer=2
+ -Wdangling-reference
+ -Wdate-time
+ -Wdefaulted-function-deleted
+ -Wdelete-incomplete
+ -Wdelete-non-virtual-dtor
+ -Wdeprecated
+ -Wdeprecated-copy
+ -Wdeprecated-copy-dtor
+ -Wdeprecated-declarations
+ -Wdeprecated-enum-enum-conversion
+ -Wdeprecated-enum-float-conversion
+ -Wdeprecated-literal-operator
+ -Wdeprecated-variadic-comma-omission
+ -Wdisabled-optimization
+ -Wdiv-by-zero
+ -Wdouble-promotion
+ -Wduplicated-branches
+ -Wduplicated-cond
+ -Weffc++
+ -Welaborated-enum-base
+ -Wempty-body
+ -Wendif-labels
+ -Wenum-compare
+ -Wenum-conversion
+ -Wexceptions
+ -Wexpansion-to-defined
+ -Wextra
+ -Wextra-semi
+ -Wflex-array-member-not-at-end
+ -Wfloat-conversion
+ -Wfloat-equal
+ -Wformat -Wformat-contains-nul
+ -Wformat -Wformat-diag
+ -Wformat -Wformat-extra-args
+ -Wformat -Wformat-nonliteral
+ -Wformat -Wformat-overflow=2
+ -Wformat -Wformat-security
+ -Wformat -Wformat-signedness
+ -Wformat -Wformat-truncation=2
+ -Wformat -Wformat-y2k
+ -Wformat -Wformat-zero-length
+ -Wformat=2
+ -Wframe-address
+ -Wfree-nonheap-object
+ -Wglobal-module
+ -Whardened
+ -Wheader-guard
+ -Whsa
+ -Wif-not-aligned
+ -Wignored-attributes
+ -Wignored-qualifiers
+ -Wimplicit-fallthrough=5
+ -Winaccessible-base
+ -Winfinite-recursion
+ -Winherited-variadic-ctor
+ -Winit-list-lifetime
+ -Winit-self
+ -Winline
+ -Wint-in-bool-context
+ -Wint-to-pointer-cast
+ -Winterference-size
+ -Winvalid-constexpr
+ -Winvalid-imported-macros
+ -Winvalid-memory-model
+ -Winvalid-offsetof
+ -Winvalid-pch
+ -Winvalid-utf8
+ -Wliteral-suffix
+ -Wlogical-not-parentheses
+ -Wlogical-op
+ -Wno-long-long
+ -Wlto-type-mismatch
+ -Wmain
+ -Wmaybe-musttail-local-addr
+ -Wmaybe-uninitialized
+ -Wmemset-elt-size
+ -Wmemset-transposed-args
+ -Wmisleading-indentation
+ -Wmismatched-dealloc
+ -Wmismatched-new-delete
+ -Wmismatched-tags
+ -Wmissing-attributes
+ -Wmissing-braces
+ -Wmissing-declarations
+ -Wmissing-field-initializers
+ -Wmissing-include-dirs
+ -Wmissing-profile
+ -Wmissing-requires
+ -Wmissing-template-keyword
+ -Wmultichar
+ -Wmultiple-inheritance
+ -Wmultistatement-macros
+ -Wmusttail-local-addr
+ -Wno-namespaces
+ -Wnarrowing
+ -Wnoexcept
+ -Wnoexcept-type
+ -Wnon-template-friend
+ -Wnon-virtual-dtor
+ -Wnonnull
+ -Wnonnull-compare
+ -Wnormalized=nfkc
+ -Wno-nrvo
+ -Wnull-dereference
+ -Wodr
+ -Wold-style-cast
+ -Wopenacc-parallelism
+ -Wopenmp
+ -Wopenmp-simd
+ -Woverflow
+ -Woverlength-strings
+ -Woverloaded-virtual=2
+ -Wpacked
+ -Wpacked-bitfield-compat
+ -Wpacked-not-aligned
+ -Wno-padded
+ -Wparentheses
+ -Wpedantic
+ -Wpessimizing-move
+ -Wplacement-new=2
+ -Wpmf-conversions
+ -Wpointer-arith
+ -Wpointer-compare
+ -Wpragma-once-outside-header
+ -Wpragmas
+ -Wprio-ctor-dtor
+ -Wpsabi
+ -Wrange-loop-construct
+ -Wredundant-decls
+ -Wredundant-move
+ -Wredundant-tags
+ -Wregister
+ -Wreorder
+ -Wrestrict
+ -Wreturn-local-addr
+ -Wreturn-type
+ -Wscalar-storage-order
+ -Wself-move
+ -Wsequence-point
+ -Wshadow=compatible-local
+ -Wshadow=global
+ -Wshadow=local
+ -Wshift-count-negative
+ -Wshift-count-overflow
+ -Wshift-negative-value
+ -Wshift-overflow=2
+ -Wsign-compare
+ -Wsign-conversion
+ -Wsign-promo
+ -Wsized-deallocation
+ -Wsizeof-array-argument
+ -Wsizeof-array-div
+ -Wsizeof-pointer-div
+ -Wsizeof-pointer-memaccess
+ -Wstack-protector
+ -Wstrict-aliasing
+ -Wstrict-aliasing=3
+ -Wstrict-null-sentinel
+ -Wstrict-overflow
+ -Wstring-compare
+ -Wstringop-overflow
+ -Wstringop-overflow=4
+ -Wstringop-overread
+ -Wstringop-truncation
+ -Wsubobject-linkage
+ -Wsuggest-attribute=cold
+ -Wsuggest-attribute=const
+ -Wsuggest-attribute=format
+ -Wsuggest-attribute=malloc
+ -Wsuggest-attribute=noreturn
+ -Wsuggest-attribute=pure
+ -Wsuggest-attribute=returns_nonnull
+ -Wsuggest-final-methods
+ -Wsuggest-final-types
+ -Wsuggest-override
+ -Wswitch
+ -Wswitch-bool
+ -Wswitch-default
+ -Wswitch-enum
+ -Wswitch-outside-range
+ -Wswitch-unreachable
+ -Wsync-nand
+ -Wsynth
+ -Wno-system-headers
+ -Wtautological-compare
+ -Wtemplate-body
+ -Wtemplate-id-cdtor
+ -Wtemplate-names-tu-local
+ -Wno-templates
+ -Wterminate
+ -Wtrailing-whitespace
+ -Wtrampolines
+ -Wtrigraphs
+ -Wtrivial-auto-var-init
+ -Wtsan
+ -Wtype-limits
+ -Wundef
+ -Wunicode
+ -Wuninitialized
+ -Wunknown-pragmas
+ -Wunreachable-code
+ -Wunsafe-loop-optimizations
+ -Wunused
+ -Wunused-but-set-parameter
+ -Wunused-but-set-variable
+ -Wunused-const-variable=2
+ -Wunused-function
+ -Wunused-label
+ -Wunused-local-typedefs
+ -Wunused-macros
+ -Wunused-parameter
+ -Wunused-result
+ -Wunused-value
+ -Wunused-variable
+ -Wuse-after-free=3
+ -Wuseless-cast
+ -Wvarargs
+ -Wvariadic-macros
+ -Wvector-operation-performance
+ -Wvexing-parse
+ -Wvirtual-inheritance
+ -Wvirtual-move-assign
+ -Wvla
+ -Wvla-parameter
+ -Wvolatile
+ -Wvolatile-register-var
+ -Wwrite-strings
+ -Wxor-used-as-pow
+ -Wzero-as-null-pointer-constant
+ -Wzero-length-bounds
+)
diff --git a/json4cpp/cmake/nlohmann_jsonConfigVersion.cmake.in b/json4cpp/cmake/nlohmann_jsonConfigVersion.cmake.in
new file mode 100644
index 0000000000..1091085973
--- /dev/null
+++ b/json4cpp/cmake/nlohmann_jsonConfigVersion.cmake.in
@@ -0,0 +1,20 @@
+# This is essentially cmake's BasicConfigVersion-SameMajorVersion.cmake.in but
+# without the 32/64-bit check. Since json is a header-only library, it doesn't
+# matter if it was built on a different platform than what it is used on (see
+# https://github.com/nlohmann/json/issues/1697).
+set(PACKAGE_VERSION "@PROJECT_VERSION@")
+
+if(PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION)
+ set(PACKAGE_VERSION_COMPATIBLE FALSE)
+else()
+
+ if(PACKAGE_FIND_VERSION_MAJOR STREQUAL "@PROJECT_VERSION_MAJOR@")
+ set(PACKAGE_VERSION_COMPATIBLE TRUE)
+ else()
+ set(PACKAGE_VERSION_COMPATIBLE FALSE)
+ endif()
+
+ if(PACKAGE_FIND_VERSION STREQUAL PACKAGE_VERSION)
+ set(PACKAGE_VERSION_EXACT TRUE)
+ endif()
+endif()
diff --git a/json4cpp/cmake/pkg-config.pc.in b/json4cpp/cmake/pkg-config.pc.in
new file mode 100644
index 0000000000..21a91a3cf3
--- /dev/null
+++ b/json4cpp/cmake/pkg-config.pc.in
@@ -0,0 +1,7 @@
+prefix=@CMAKE_INSTALL_PREFIX@
+includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@
+
+Name: @PROJECT_NAME@
+Description: JSON for Modern C++
+Version: @PROJECT_VERSION@
+Cflags: -I${includedir}
diff --git a/json4cpp/cmake/requirements/requirements-cppcheck.txt b/json4cpp/cmake/requirements/requirements-cppcheck.txt
new file mode 100644
index 0000000000..9119ad7b6b
--- /dev/null
+++ b/json4cpp/cmake/requirements/requirements-cppcheck.txt
@@ -0,0 +1 @@
+cppcheck==1.5.0
diff --git a/json4cpp/cmake/requirements/requirements-cpplint.txt b/json4cpp/cmake/requirements/requirements-cpplint.txt
new file mode 100644
index 0000000000..6aabac21c3
--- /dev/null
+++ b/json4cpp/cmake/requirements/requirements-cpplint.txt
@@ -0,0 +1 @@
+cpplint==2.0.2
diff --git a/json4cpp/cmake/requirements/requirements-reuse.txt b/json4cpp/cmake/requirements/requirements-reuse.txt
new file mode 100644
index 0000000000..4666d51bf8
--- /dev/null
+++ b/json4cpp/cmake/requirements/requirements-reuse.txt
@@ -0,0 +1 @@
+reuse==6.2.0
diff --git a/json4cpp/cmake/scripts/gen_bazel_build_file.cmake b/json4cpp/cmake/scripts/gen_bazel_build_file.cmake
new file mode 100644
index 0000000000..e754d387d9
--- /dev/null
+++ b/json4cpp/cmake/scripts/gen_bazel_build_file.cmake
@@ -0,0 +1,24 @@
+# generate Bazel BUILD file
+
+set(PROJECT_ROOT "${CMAKE_CURRENT_LIST_DIR}/../..")
+set(BUILD_FILE "${PROJECT_ROOT}/BUILD.bazel")
+
+file(GLOB_RECURSE HEADERS LIST_DIRECTORIES false RELATIVE "${PROJECT_ROOT}" "include/*.hpp")
+
+file(WRITE "${BUILD_FILE}" [=[
+cc_library(
+ name = "json",
+ hdrs = [
+]=])
+
+foreach(header ${HEADERS})
+ file(APPEND "${BUILD_FILE}" " \"${header}\",\n")
+endforeach()
+
+file(APPEND "${BUILD_FILE}" [=[
+ ],
+ includes = ["include"],
+ visibility = ["//visibility:public"],
+ alwayslink = True,
+)
+]=])
diff --git a/json4cpp/cmake/test.cmake b/json4cpp/cmake/test.cmake
new file mode 100644
index 0000000000..7105b97c33
--- /dev/null
+++ b/json4cpp/cmake/test.cmake
@@ -0,0 +1,273 @@
+set(_json_test_cmake_list_file ${CMAKE_CURRENT_LIST_FILE})
+
+#############################################################################
+# download test data
+#############################################################################
+
+include(download_test_data)
+
+# test fixture to download test data
+add_test(NAME "download_test_data" COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR}
+ --target download_test_data
+)
+set_tests_properties(download_test_data PROPERTIES FIXTURES_SETUP TEST_DATA)
+
+if(JSON_Valgrind)
+ find_program(CMAKE_MEMORYCHECK_COMMAND valgrind)
+ message(STATUS "Executing test suite with Valgrind (${CMAKE_MEMORYCHECK_COMMAND})")
+ set(memcheck_command "${CMAKE_MEMORYCHECK_COMMAND} ${CMAKE_MEMORYCHECK_COMMAND_OPTIONS} --error-exitcode=1 --leak-check=full")
+ separate_arguments(memcheck_command)
+endif()
+
+#############################################################################
+# detect standard support
+#############################################################################
+
+# C++11 is the minimum required
+set(compiler_supports_cpp_11 TRUE)
+
+foreach(feature ${CMAKE_CXX_COMPILE_FEATURES})
+ if (${feature} STREQUAL cxx_std_14)
+ set(compiler_supports_cpp_14 TRUE)
+ elseif (${feature} STREQUAL cxx_std_17)
+ set(compiler_supports_cpp_17 TRUE)
+ elseif (${feature} STREQUAL cxx_std_20)
+ set(compiler_supports_cpp_20 TRUE)
+ elseif (${feature} STREQUAL cxx_std_23)
+ set(compiler_supports_cpp_23 TRUE)
+ endif()
+endforeach()
+
+#############################################################################
+# test functions
+#############################################################################
+
+#############################################################################
+# json_test_set_test_options(
+# all|<tests>
+# [CXX_STANDARDS all|<args>...]
+# [COMPILE_DEFINITIONS <args>...]
+# [COMPILE_FEATURES <args>...]
+# [COMPILE_OPTIONS <args>...]
+# [LINK_LIBRARIES <args>...]
+# [LINK_OPTIONS <args>...]
+# [TEST_PROPERTIES <args>...])
+#
+# Supply test- and standard-specific build settings and/or test properties.
+# Specify multiple tests using a list e.g., "test-foo;test-bar".
+#
+# Must be called BEFORE the test is created.
+#############################################################################
+
+function(json_test_set_test_options tests)
+ cmake_parse_arguments(args "" ""
+ "CXX_STANDARDS;COMPILE_DEFINITIONS;COMPILE_FEATURES;COMPILE_OPTIONS;LINK_LIBRARIES;LINK_OPTIONS;TEST_PROPERTIES"
+ ${ARGN})
+
+ if(NOT args_CXX_STANDARDS)
+ set(args_CXX_STANDARDS "all")
+ endif()
+
+ foreach(test ${tests})
+ if("${test}" STREQUAL "all")
+ set(test "")
+ endif()
+
+ foreach(cxx_standard ${args_CXX_STANDARDS})
+ if("${cxx_standard}" STREQUAL "all")
+ if("${test}" STREQUAL "")
+ message(FATAL_ERROR "Not supported. Change defaults in: ${_json_test_cmake_list_file}")
+ endif()
+ set(test_interface _json_test_interface_${test})
+ else()
+ set(test_interface _json_test_interface_${test}_cpp_${cxx_standard})
+ endif()
+
+ if(NOT TARGET ${test_interface})
+ add_library(${test_interface} INTERFACE)
+ endif()
+
+ target_compile_definitions(${test_interface} INTERFACE ${args_COMPILE_DEFINITIONS})
+ target_compile_features(${test_interface} INTERFACE ${args_COMPILE_FEATURES})
+ target_compile_options(${test_interface} INTERFACE ${args_COMPILE_OPTIONS})
+ target_link_libraries (${test_interface} INTERFACE ${args_LINK_LIBRARIES})
+ target_link_options(${test_interface} INTERFACE ${args_LINK_OPTIONS})
+ #set_target_properties(${test_interface} PROPERTIES JSON_TEST_PROPERTIES "${args_TEST_PROPERTIES}")
+ set_property(DIRECTORY PROPERTY
+ ${test_interface}_TEST_PROPERTIES "${args_TEST_PROPERTIES}"
+ )
+ endforeach()
+ endforeach()
+endfunction()
+
+# for internal use by _json_test_add_test()
+function(_json_test_apply_test_properties test_target properties_target)
+ #get_target_property(test_properties ${properties_target} JSON_TEST_PROPERTIES)
+ get_property(test_properties DIRECTORY PROPERTY ${properties_target}_TEST_PROPERTIES)
+ if(test_properties)
+ set_tests_properties(${test_target} PROPERTIES ${test_properties})
+ endif()
+endfunction()
+
+# for internal use by json_test_add_test_for()
+function(_json_test_add_test test_name file main cxx_standard)
+ set(test_target ${test_name}_cpp${cxx_standard})
+
+ if(TARGET ${test_target})
+ message(FATAL_ERROR "Target ${test_target} has already been added.")
+ endif()
+
+ add_executable(${test_target} ${file})
+ target_link_libraries(${test_target} PRIVATE ${main})
+
+ # set and require C++ standard
+ set_target_properties(${test_target} PROPERTIES
+ CXX_STANDARD ${cxx_standard}
+ CXX_STANDARD_REQUIRED ON
+ )
+
+ # apply standard-specific build settings
+ if(TARGET _json_test_interface__cpp_${cxx_standard})
+ target_link_libraries(${test_target} PRIVATE _json_test_interface__cpp_${cxx_standard})
+ endif()
+
+ # apply test-specific build settings
+ if(TARGET _json_test_interface_${test_name})
+ target_link_libraries(${test_target} PRIVATE _json_test_interface_${test_name})
+ endif()
+
+ # apply test- and standard-specific build settings
+ if(TARGET _json_test_interface_${test_name}_cpp_${cxx_standard})
+ target_link_libraries(${test_target} PRIVATE
+ _json_test_interface_${test_name}_cpp_${cxx_standard}
+ )
+ endif()
+
+ if (JSON_FastTests)
+ add_test(NAME ${test_target}
+ COMMAND ${test_target} ${DOCTEST_TEST_FILTER}
+ WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
+ )
+ else()
+ add_test(NAME ${test_target}
+ COMMAND ${test_target} ${DOCTEST_TEST_FILTER} --no-skip
+ WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
+ )
+ endif()
+ set_tests_properties(${test_target} PROPERTIES LABELS "all" FIXTURES_REQUIRED TEST_DATA)
+
+ # apply standard-specific test properties
+ if(TARGET _json_test_interface__cpp_${cxx_standard})
+ _json_test_apply_test_properties(${test_target} _json_test_interface__cpp_${cxx_standard})
+ endif()
+
+ # apply test-specific test properties
+ if(TARGET _json_test_interface_${test_name})
+ _json_test_apply_test_properties(${test_target} _json_test_interface_${test_name})
+ endif()
+
+ # apply test- and standard-specific test properties
+ if(TARGET _json_test_interface_${test_name}_cpp_${cxx_standard})
+ _json_test_apply_test_properties(${test_target}
+ _json_test_interface_${test_name}_cpp_${cxx_standard}
+ )
+ endif()
+
+ if(JSON_Valgrind)
+ add_test(NAME ${test_target}_valgrind
+ COMMAND ${memcheck_command} $<TARGET_FILE:${test_target}> ${DOCTEST_TEST_FILTER}
+ WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
+ )
+ set_tests_properties(${test_target}_valgrind PROPERTIES
+ LABELS "valgrind" FIXTURES_REQUIRED TEST_DATA
+ )
+ endif()
+endfunction()
+
+#############################################################################
+# json_test_add_test_for(
+# <file>
+# [NAME <name>]
+# MAIN <main>
+# [CXX_STANDARDS <version_number>...] [FORCE])
+#
+# Given a <file> unit-foo.cpp, produces
+#
+# test-foo_cpp<version_number>
+#
+# if C++ standard <version_number> is supported by the compiler and the
+# source file contains JSON_HAS_CPP_<version_number>.
+# Use NAME <name> to override the filename-derived test name.
+# Use FORCE to create the test regardless of the file containing
+# JSON_HAS_CPP_<version_number>.
+# Test targets are linked against <main>.
+# CXX_STANDARDS defaults to "11".
+#############################################################################
+
+function(json_test_add_test_for file)
+ cmake_parse_arguments(args "FORCE" "MAIN;NAME" "CXX_STANDARDS" ${ARGN})
+
+ if("${args_MAIN}" STREQUAL "")
+ message(FATAL_ERROR "Required argument MAIN <main> missing.")
+ endif()
+
+ if("${args_NAME}" STREQUAL "")
+ get_filename_component(file_basename ${file} NAME_WE)
+ string(REGEX REPLACE "unit-([^$]+)" "test-\\1" test_name ${file_basename})
+ else()
+ set(test_name ${args_NAME})
+ if(NOT test_name MATCHES "test-[^$]+")
+ message(FATAL_ERROR "Test name must start with 'test-'.")
+ endif()
+ endif()
+
+ if("${args_CXX_STANDARDS}" STREQUAL "")
+ set(args_CXX_STANDARDS 11)
+ endif()
+
+ file(READ ${file} file_content)
+ foreach(cxx_standard ${args_CXX_STANDARDS})
+ if(NOT compiler_supports_cpp_${cxx_standard})
+ continue()
+ endif()
+
+ # add unconditionally if C++11 (default) or forced
+ if(NOT ("${cxx_standard}" STREQUAL 11 OR args_FORCE))
+ string(FIND "${file_content}" JSON_HAS_CPP_${cxx_standard} has_cpp_found)
+ if(${has_cpp_found} EQUAL -1)
+ continue()
+ endif()
+ endif()
+
+ _json_test_add_test(${test_name} ${file} ${args_MAIN} ${cxx_standard})
+ endforeach()
+endfunction()
+
+#############################################################################
+# json_test_should_build_32bit_test(
+# <build_32bit_var> <build_32bit_only_var> <input>)
+#
+# Check if the 32bit unit test should be built based on the value of <input>
+# and store the result in the variables <build_32bit_var> and
+# <build_32bit_only_var>.
+#############################################################################
+
+function(json_test_should_build_32bit_test build_32bit_var build_32bit_only_var input)
+ set(${build_32bit_only_var} OFF PARENT_SCOPE)
+ string(TOUPPER "${input}" ${build_32bit_var})
+ if("${${build_32bit_var}}" STREQUAL AUTO)
+ # check if compiler is targeting 32bit by default
+ include(CheckTypeSize)
+ check_type_size("size_t" sizeof_size_t LANGUAGE CXX)
+ if(${sizeof_size_t} AND ${sizeof_size_t} EQUAL 4)
+ message(STATUS "Auto-enabling 32bit unit test.")
+ set(${build_32bit_var} ON)
+ else()
+ set(${build_32bit_var} OFF)
+ endif()
+ elseif("${${build_32bit_var}}" STREQUAL ONLY)
+ set(${build_32bit_only_var} ON PARENT_SCOPE)
+ endif()
+
+ set(${build_32bit_var} "${${build_32bit_var}}" PARENT_SCOPE)
+endfunction()