123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996 |
- # number of parallel jobs for CTest
- set(N 10)
- ###############################################################################
- # Needed tools.
- ###############################################################################
- include(FindPython3)
- find_package(Python3 COMPONENTS Interpreter)
- find_program(ASTYLE_TOOL NAMES astyle)
- execute_process(COMMAND ${ASTYLE_TOOL} --version OUTPUT_VARIABLE ASTYLE_TOOL_VERSION ERROR_VARIABLE ASTYLE_TOOL_VERSION)
- string(REGEX MATCH "[0-9]+(\\.[0-9]+)+" ASTYLE_TOOL_VERSION "${ASTYLE_TOOL_VERSION}")
- message(STATUS "🔖 Artistic Style ${ASTYLE_TOOL_VERSION} (${ASTYLE_TOOL})")
- find_program(CLANG_TOOL NAMES clang++-HEAD 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-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(CPPCHECK_TOOL NAMES cppcheck)
- execute_process(COMMAND ${CPPCHECK_TOOL} --version OUTPUT_VARIABLE CPPCHECK_TOOL_VERSION ERROR_VARIABLE CPPCHECK_TOOL_VERSION)
- string(REGEX MATCH "[0-9]+(\\.[0-9]+)+" CPPCHECK_TOOL_VERSION "${CPPCHECK_TOOL_VERSION}")
- message(STATUS "🔖 Cppcheck ${CPPCHECK_TOOL_VERSION} (${CPPCHECK_TOOL})")
- find_program(GCC_TOOL NAMES g++-latest g++-HEAD 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-11 gcov-10 gcov)
- 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
- ###############################################################################
- # 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 std::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-weak-vtables The library is header-only.
- # -Wreserved-identifier See https://github.com/onqtam/doctest/issues/536.
- 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-weak-vtables
- -Wno-reserved-identifier
- )
- # Warning flags determined for GCC 13.0 (experimental) 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-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-zero
- -Walloca
- -Wanalyzer-double-fclose
- -Wanalyzer-double-free
- -Wanalyzer-exposure-through-output-file
- -Wanalyzer-file-leak
- -Wanalyzer-free-of-non-heap
- -Wanalyzer-malloc-leak
- -Wanalyzer-mismatching-deallocation
- -Wanalyzer-null-argument
- -Wanalyzer-null-dereference
- -Wanalyzer-possible-null-argument
- -Wanalyzer-possible-null-dereference
- -Wanalyzer-shift-count-negative
- -Wanalyzer-shift-count-overflow
- -Wanalyzer-stale-setjmp-buffer
- -Wanalyzer-tainted-allocation-size
- -Wanalyzer-tainted-array-index
- -Wanalyzer-tainted-divisor
- -Wanalyzer-tainted-offset
- -Wanalyzer-tainted-size
- -Wanalyzer-too-complex
- -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++2a-compat
- -Wcannot-profile
- -Wcast-align
- -Wcast-align=strict
- -Wcast-function-type
- -Wcast-qual
- -Wcatch-value=3
- -Wchar-subscripts
- -Wclass-conversion
- -Wclass-memaccess
- -Wclobbered
- -Wcomma-subscript
- -Wcomment
- -Wcomments
- -Wconditionally-supported
- -Wconversion
- -Wconversion-null
- -Wcoverage-invalid-line-number
- -Wcoverage-mismatch
- -Wcpp
- -Wctad-maybe-unsupported
- -Wctor-dtor-privacy
- -Wdangling-else
- -Wdangling-pointer=2
- -Wdate-time
- -Wdelete-incomplete
- -Wdelete-non-virtual-dtor
- -Wdeprecated
- -Wdeprecated-copy
- -Wdeprecated-copy-dtor
- -Wdeprecated-declarations
- -Wdeprecated-enum-enum-conversion
- -Wdeprecated-enum-float-conversion
- -Wdisabled-optimization
- -Wdiv-by-zero
- -Wdouble-promotion
- -Wduplicated-branches
- -Wduplicated-cond
- -Weffc++
- -Wempty-body
- -Wendif-labels
- -Wenum-compare
- -Wenum-conversion
- -Wexceptions
- -Wexpansion-to-defined
- -Wextra
- -Wextra-semi
- -Wfloat-conversion
- -Wfloat-equal
- -Wformat-diag
- -Wformat-overflow=2
- -Wformat-signedness
- -Wformat-truncation=2
- -Wformat=2
- -Wframe-address
- -Wfree-nonheap-object
- -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-imported-macros
- -Winvalid-memory-model
- -Winvalid-offsetof
- -Winvalid-pch
- -Wliteral-suffix
- -Wlogical-not-parentheses
- -Wlogical-op
- -Wno-long-long
- -Wlto-type-mismatch
- -Wmain
- -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
- -Wno-namespaces
- -Wnarrowing
- -Wnoexcept
- -Wnoexcept-type
- -Wnon-template-friend
- -Wnon-virtual-dtor
- -Wnonnull
- -Wnonnull-compare
- -Wnormalized=nfkc
- -Wnull-dereference
- -Wodr
- -Wold-style-cast
- -Wopenacc-parallelism
- -Wopenmp-simd
- -Woverflow
- -Woverlength-strings
- -Woverloaded-virtual
- -Wpacked
- -Wpacked-bitfield-compat
- -Wpacked-not-aligned
- -Wno-padded
- -Wparentheses
- -Wpedantic
- -Wpessimizing-move
- -Wplacement-new=2
- -Wpmf-conversions
- -Wpointer-arith
- -Wpointer-compare
- -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
- -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=3
- -Wstrict-null-sentinel
- -Wno-strict-overflow
- -Wstring-compare
- -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-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
- -Wno-templates
- -Wterminate
- -Wtrampolines
- -Wtrigraphs
- -Wtrivial-auto-var-init
- -Wtsan
- -Wtype-limits
- -Wundef
- -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
- -Wzero-as-null-pointer-constant
- -Wzero-length-bounds
- )
- 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)
- 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}"
- )
- endforeach()
- ###############################################################################
- # Disable exceptions.
- ###############################################################################
- add_custom_target(ci_test_noexceptions
- COMMAND CXX=${CLANG_TOOL} ${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 CXX=${CLANG_TOOL} ${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 CXX=${CLANG_TOOL} ${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 legacy discarded value comparison.
- ###############################################################################
- add_custom_target(ci_test_legacycomparison
- COMMAND CXX=${CLANG_TOOL} ${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 CXX=${CLANG_TOOL} ${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 lcov_branch_coverage=1
- COMMAND ${LCOV_TOOL} -e json.info ${SRC_FILES} --output-file json.info.filtered --rc lcov_branch_coverage=1
- 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.
- ###############################################################################
- set(ASTYLE_FLAGS --style=allman --indent=spaces=4 --indent-modifiers --indent-switches --indent-preproc-block --indent-preproc-define --indent-col1-comments --pad-oper --pad-header --align-pointer=type --align-reference=type --add-brackets --convert-tabs --close-templates --lineend=linux --preserve-date --formatted)
- 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} ${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 ${ASTYLE_TOOL} ${ASTYLE_FLAGS} --suffix=none --quiet ${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 ${ASTYLE_TOOL} ${ASTYLE_FLAGS} ${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 CXX=${GCC_TOOL} CXXFLAGS="${GCC_CXXFLAGS}" ${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 ${CPPCHECK_TOOL} --enable=warning --suppress=missingReturn --inline-suppr --inconclusive --force --std=c++11 ${PROJECT_SOURCE_DIR}/single_include/nlohmann/json.hpp --error-exitcode=1
- 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 cpplint
- 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
- ###############################################################################
- function(ci_get_cmake version var)
- if (APPLE)
- set(${var} ${PROJECT_BINARY_DIR}/cmake-${version}-Darwin64/CMake.app/Contents/bin/cmake)
- add_custom_command(
- OUTPUT ${${var}}
- COMMAND wget -nc https://github.com/Kitware/CMake/releases/download/v${version}/cmake-${version}-Darwin64.tar.gz
- COMMAND tar xfz cmake-${version}-Darwin64.tar.gz
- COMMAND rm cmake-${version}-Darwin64.tar.gz
- WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
- COMMENT "Download CMake ${version}"
- )
- else()
- set(${var} ${PROJECT_BINARY_DIR}/cmake-${version}-Linux-x86_64/bin/cmake)
- add_custom_command(
- OUTPUT ${${var}}
- COMMAND wget -nc https://github.com/Kitware/CMake/releases/download/v${version}/cmake-${version}-Linux-x86_64.tar.gz
- COMMAND tar xfz cmake-${version}-Linux-x86_64.tar.gz
- COMMAND rm cmake-${version}-Linux-x86_64.tar.gz
- WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
- COMMENT "Download CMake ${version}"
- )
- endif()
- set(${var} ${${var}} PARENT_SCOPE)
- endfunction()
- ci_get_cmake(3.1.0 CMAKE_3_1_0_BINARY)
- ci_get_cmake(3.13.0 CMAKE_3_13_0_BINARY)
- set(JSON_CMAKE_FLAGS_3_1_0 JSON_Diagnostics JSON_GlobalUDLs JSON_ImplicitConversions JSON_DisableEnumSerialization
- JSON_LegacyDiscardedValueComparison JSON_Install JSON_MultipleHeaders JSON_SystemInclude JSON_Valgrind)
- set(JSON_CMAKE_FLAGS_3_13_0 JSON_BuildTests)
- 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}
- 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_1_0})
- ci_add_cmake_flags_targets(${JSON_CMAKE_FLAG} 3.1.0)
- endforeach()
- foreach(JSON_CMAKE_FLAG ${JSON_CMAKE_FLAGS_3_13_0})
- ci_add_cmake_flags_targets(${JSON_CMAKE_FLAG} 3.13.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)
- find_program(COMPILER_TOOL NAMES ${COMPILER})
- if (COMPILER_TOOL)
- if ("${COMPILER}" STREQUAL "clang++-9")
- # fix for https://github.com/nlohmann/json/pull/3101#issuecomment-998788786 / https://stackoverflow.com/a/64051725/266378
- set(ADDITIONAL_FLAGS "-DCMAKE_CXX_FLAGS=--gcc-toolchain=/root/gcc/9")
- else()
- unset(ADDITIONAL_FLAGS)
- endif()
- 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
- )
- ###############################################################################
- # 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"
- )
- ###############################################################################
- # 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_api_documentation
- COMMAND ${Python3_EXECUTABLE} scripts/check_structure.py
- WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/docs/mkdocs
- COMMENT "Lint the API documentation"
- )
- ###############################################################################
- # Clean up all generated files.
- ###############################################################################
- add_custom_target(ci_clean
- COMMAND rm -fr ${PROJECT_BINARY_DIR}/build_* cmake-3.1.0-Darwin64 ${JSON_CMAKE_FLAG_BUILD_DIRS} ${single_binaries}
- COMMENT "Clean generated directories"
- )
|