123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654 |
- .PHONY: pretty clean ChangeLog.md release
- ##########################################################################
- # configuration
- ##########################################################################
- # directory to recent compiler binaries
- COMPILER_DIR=/Users/niels/Documents/projects/compilers/local/bin
- # find GNU sed to use `-i` parameter
- SED:=$(shell command -v gsed || which sed)
- ##########################################################################
- # source files
- ##########################################################################
- # the list of sources in the include folder
- SRCS=$(shell find include -type f | sort)
- # the single header (amalgamated from the source files)
- AMALGAMATED_FILE=single_include/nlohmann/json.hpp
- ##########################################################################
- # documentation of the Makefile's targets
- ##########################################################################
- # main target
- all:
- @echo "amalgamate - amalgamate file single_include/nlohmann/json.hpp from the include/nlohmann sources"
- @echo "ChangeLog.md - generate ChangeLog file"
- @echo "check - compile and execute test suite"
- @echo "check-amalgamation - check whether sources have been amalgamated"
- @echo "clean - remove built files"
- @echo "coverage - create coverage information with lcov"
- @echo "cppcheck - analyze code with cppcheck"
- @echo "cpplint - analyze code with cpplint"
- @echo "clang_tidy - analyze code with Clang-Tidy"
- @echo "clang_analyze - analyze code with Clang-Analyzer"
- @echo "doctest - compile example files and check their output"
- @echo "fuzz_testing - prepare fuzz testing of the JSON parser"
- @echo "fuzz_testing_bson - prepare fuzz testing of the BSON parser"
- @echo "fuzz_testing_cbor - prepare fuzz testing of the CBOR parser"
- @echo "fuzz_testing_msgpack - prepare fuzz testing of the MessagePack parser"
- @echo "fuzz_testing_ubjson - prepare fuzz testing of the UBJSON parser"
- @echo "json_unit - create single-file test executable"
- @echo "pedantic_clang - run Clang with maximal warning flags"
- @echo "pedantic_gcc - run GCC with maximal warning flags"
- @echo "pretty - beautify code with Artistic Style"
- @echo "run_benchmarks - build and run benchmarks"
- ##########################################################################
- # unit tests
- ##########################################################################
- # build unit tests
- json_unit:
- @$(MAKE) json_unit -C test
- # run unit tests
- check:
- $(MAKE) check -C test
- ##########################################################################
- # coverage
- ##########################################################################
- coverage:
- rm -fr build_coverage
- mkdir build_coverage
- cd build_coverage ; cmake .. -GNinja -DCMAKE_BUILD_TYPE=Debug -DJSON_Coverage=ON -DJSON_MultipleHeaders=ON
- cd build_coverage ; ninja
- cd build_coverage ; ctest -j10
- cd build_coverage ; ninja lcov_html
- open build_coverage/test/html/index.html
- ##########################################################################
- # documentation tests
- ##########################################################################
- # compile example files and check output
- doctest:
- $(MAKE) check_output -C doc
- ##########################################################################
- # warning detector
- ##########################################################################
- # calling Clang with all warnings, except:
- # -Wno-c++2a-compat: u8 literals will behave differently in C++20...
- # -Wno-deprecated-declarations: the library deprecated some functions
- # -Wno-documentation-unknown-command: code uses user-defined commands like @complexity
- # -Wno-exit-time-destructors: warning in json code triggered by NLOHMANN_JSON_SERIALIZE_ENUM
- # -Wno-float-equal: not all comparisons in the tests can be replaced by Approx
- # -Wno-keyword-macro: unit-tests use "#define private public"
- # -Wno-padded: padding is nothing to warn about
- # -Wno-range-loop-analysis: items tests "for(const auto i...)"
- # -Wno-switch-enum -Wno-covered-switch-default: pedantic/contradicting warnings about switches
- # -Wno-weak-vtables: exception class is defined inline, but has virtual method
- pedantic_clang:
- rm -fr build_pedantic
- CXXFLAGS=" \
- -std=c++11 -Wno-c++98-compat -Wno-c++98-compat-pedantic \
- -Werror \
- -Weverything \
- -Wno-c++2a-compat \
- -Wno-deprecated-declarations \
- -Wno-documentation-unknown-command \
- -Wno-exit-time-destructors \
- -Wno-float-equal \
- -Wno-keyword-macro \
- -Wno-padded \
- -Wno-range-loop-analysis \
- -Wno-switch-enum -Wno-covered-switch-default \
- -Wno-weak-vtables" cmake -S . -B build_pedantic -GNinja -DCMAKE_BUILD_TYPE=Debug -DJSON_MultipleHeaders=ON -DJSON_BuildTests=On
- cmake --build build_pedantic
- # calling GCC with most warnings
- pedantic_gcc:
- rm -fr build_pedantic
- CXXFLAGS=" \
- -std=c++11 \
- -pedantic \
- -Werror \
- --all-warnings \
- --extra-warnings \
- -W \
- -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-null-argument \
- -Wanalyzer-null-dereference \
- -Wanalyzer-possible-null-argument \
- -Wanalyzer-possible-null-dereference \
- -Wanalyzer-stale-setjmp-buffer \
- -Wanalyzer-tainted-array-index \
- -Wanalyzer-too-complex \
- -Wanalyzer-unsafe-call-within-signal-handler \
- -Wanalyzer-use-after-free \
- -Wanalyzer-use-of-pointer-in-stale-stack-frame \
- -Warith-conversion \
- -Warray-bounds \
- -Warray-bounds=2 \
- -Wattribute-alias=2 \
- -Wattribute-warning \
- -Wattributes \
- -Wbool-compare \
- -Wbool-operation \
- -Wbuiltin-declaration-mismatch \
- -Wbuiltin-macro-redefined \
- -Wc++0x-compat \
- -Wc++11-compat \
- -Wc++14-compat \
- -Wc++17-compat \
- -Wc++1z-compat \
- -Wc++20-compat \
- -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-mismatch \
- -Wcpp \
- -Wctor-dtor-privacy \
- -Wdangling-else \
- -Wdate-time \
- -Wdelete-incomplete \
- -Wdelete-non-virtual-dtor \
- -Wdeprecated \
- -Wdeprecated-copy \
- -Wdeprecated-copy-dtor \
- -Wdeprecated-declarations \
- -Wdisabled-optimization \
- -Wdiv-by-zero \
- -Wdouble-promotion \
- -Wduplicated-branches \
- -Wduplicated-cond \
- -Weffc++ \
- -Wempty-body \
- -Wendif-labels \
- -Wenum-compare \
- -Wexpansion-to-defined \
- -Wextra \
- -Wextra-semi \
- -Wfloat-conversion \
- -Wfloat-equal \
- -Wformat -Wformat-contains-nul \
- -Wformat -Wformat-extra-args \
- -Wformat -Wformat-nonliteral \
- -Wformat -Wformat-security \
- -Wformat -Wformat-y2k \
- -Wformat -Wformat-zero-length \
- -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 \
- -Winherited-variadic-ctor \
- -Winit-list-lifetime \
- -Winit-self \
- -Winline \
- -Wint-in-bool-context \
- -Wint-to-pointer-cast \
- -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-tags \
- -Wmissing-attributes \
- -Wmissing-braces \
- -Wmissing-declarations \
- -Wmissing-field-initializers \
- -Wmissing-include-dirs \
- -Wmissing-profile \
- -Wmultichar \
- -Wmultiple-inheritance \
- -Wmultistatement-macros \
- -Wno-namespaces \
- -Wnarrowing \
- -Wno-noexcept \
- -Wnoexcept-type \
- -Wnon-template-friend \
- -Wnon-virtual-dtor \
- -Wnonnull \
- -Wnonnull-compare \
- -Wnonportable-cfstrings \
- -Wnormalized=nfkc \
- -Wnull-dereference \
- -Wodr \
- -Wold-style-cast \
- -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 \
- -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-pointer-div \
- -Wsizeof-pointer-memaccess \
- -Wstack-protector \
- -Wstrict-aliasing \
- -Wstrict-aliasing=3 \
- -Wstrict-null-sentinel \
- -Wstrict-overflow \
- -Wstrict-overflow=5 \
- -Wstring-compare \
- -Wstringop-overflow \
- -Wstringop-overflow=4 \
- -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 \
- -Wno-switch-enum \
- -Wswitch-outside-range \
- -Wswitch-unreachable \
- -Wsync-nand \
- -Wsynth \
- -Wno-system-headers \
- -Wtautological-compare \
- -Wno-templates \
- -Wterminate \
- -Wtrampolines \
- -Wtrigraphs \
- -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 \
- -Wuseless-cast \
- -Wvarargs \
- -Wvariadic-macros \
- -Wvector-operation-performance \
- -Wvirtual-inheritance \
- -Wvirtual-move-assign \
- -Wvla \
- -Wvolatile \
- -Wvolatile-register-var \
- -Wwrite-strings \
- -Wzero-as-null-pointer-constant \
- -Wzero-length-bounds \
- " cmake -S . -B build_pedantic -GNinja -DCMAKE_BUILD_TYPE=Debug -DJSON_MultipleHeaders=ON -DJSON_BuildTests=On
- cmake --build build_pedantic
- ##########################################################################
- # benchmarks
- ##########################################################################
- run_benchmarks:
- rm -fr build_benchmarks
- mkdir build_benchmarks
- cd build_benchmarks ; cmake ../benchmarks -GNinja -DCMAKE_BUILD_TYPE=Release -DJSON_BuildTests=On
- cd build_benchmarks ; ninja
- cd build_benchmarks ; ./json_benchmarks
- ##########################################################################
- # fuzzing
- ##########################################################################
- # the overall fuzz testing target
- fuzz_testing:
- rm -fr fuzz-testing
- mkdir -p fuzz-testing fuzz-testing/testcases fuzz-testing/out
- $(MAKE) parse_afl_fuzzer -C test CXX=afl-clang++
- mv test/parse_afl_fuzzer fuzz-testing/fuzzer
- find test/data/json_tests -size -5k -name *json | xargs -I{} cp "{}" fuzz-testing/testcases
- @echo "Execute: afl-fuzz -i fuzz-testing/testcases -o fuzz-testing/out fuzz-testing/fuzzer"
- fuzz_testing_bson:
- rm -fr fuzz-testing
- mkdir -p fuzz-testing fuzz-testing/testcases fuzz-testing/out
- $(MAKE) parse_bson_fuzzer -C test CXX=afl-clang++
- mv test/parse_bson_fuzzer fuzz-testing/fuzzer
- find test/data -size -5k -name *.bson | xargs -I{} cp "{}" fuzz-testing/testcases
- @echo "Execute: afl-fuzz -i fuzz-testing/testcases -o fuzz-testing/out fuzz-testing/fuzzer"
- fuzz_testing_cbor:
- rm -fr fuzz-testing
- mkdir -p fuzz-testing fuzz-testing/testcases fuzz-testing/out
- $(MAKE) parse_cbor_fuzzer -C test CXX=afl-clang++
- mv test/parse_cbor_fuzzer fuzz-testing/fuzzer
- find test/data -size -5k -name *.cbor | xargs -I{} cp "{}" fuzz-testing/testcases
- @echo "Execute: afl-fuzz -i fuzz-testing/testcases -o fuzz-testing/out fuzz-testing/fuzzer"
- fuzz_testing_msgpack:
- rm -fr fuzz-testing
- mkdir -p fuzz-testing fuzz-testing/testcases fuzz-testing/out
- $(MAKE) parse_msgpack_fuzzer -C test CXX=afl-clang++
- mv test/parse_msgpack_fuzzer fuzz-testing/fuzzer
- find test/data -size -5k -name *.msgpack | xargs -I{} cp "{}" fuzz-testing/testcases
- @echo "Execute: afl-fuzz -i fuzz-testing/testcases -o fuzz-testing/out fuzz-testing/fuzzer"
- fuzz_testing_ubjson:
- rm -fr fuzz-testing
- mkdir -p fuzz-testing fuzz-testing/testcases fuzz-testing/out
- $(MAKE) parse_ubjson_fuzzer -C test CXX=afl-clang++
- mv test/parse_ubjson_fuzzer fuzz-testing/fuzzer
- find test/data -size -5k -name *.ubjson | xargs -I{} cp "{}" fuzz-testing/testcases
- @echo "Execute: afl-fuzz -i fuzz-testing/testcases -o fuzz-testing/out fuzz-testing/fuzzer"
- fuzzing-start:
- afl-fuzz -S fuzzer1 -i fuzz-testing/testcases -o fuzz-testing/out fuzz-testing/fuzzer > /dev/null &
- afl-fuzz -S fuzzer2 -i fuzz-testing/testcases -o fuzz-testing/out fuzz-testing/fuzzer > /dev/null &
- afl-fuzz -S fuzzer3 -i fuzz-testing/testcases -o fuzz-testing/out fuzz-testing/fuzzer > /dev/null &
- afl-fuzz -S fuzzer4 -i fuzz-testing/testcases -o fuzz-testing/out fuzz-testing/fuzzer > /dev/null &
- afl-fuzz -S fuzzer5 -i fuzz-testing/testcases -o fuzz-testing/out fuzz-testing/fuzzer > /dev/null &
- afl-fuzz -S fuzzer6 -i fuzz-testing/testcases -o fuzz-testing/out fuzz-testing/fuzzer > /dev/null &
- afl-fuzz -S fuzzer7 -i fuzz-testing/testcases -o fuzz-testing/out fuzz-testing/fuzzer > /dev/null &
- afl-fuzz -M fuzzer0 -i fuzz-testing/testcases -o fuzz-testing/out fuzz-testing/fuzzer
- fuzzing-stop:
- -killall fuzzer
- -killall afl-fuzz
- ##########################################################################
- # Static analysis
- ##########################################################################
- # call cppcheck <http://cppcheck.sourceforge.net>
- # Note: this target is called by Travis
- cppcheck:
- cppcheck --enable=warning --inline-suppr --inconclusive --force --std=c++11 $(AMALGAMATED_FILE) --error-exitcode=1
- # call Clang Static Analyzer <https://clang-analyzer.llvm.org>
- clang_analyze:
- rm -fr clang_analyze_build
- mkdir clang_analyze_build
- cd clang_analyze_build ; CCC_CXX=$(COMPILER_DIR)/clang++ CXX=$(COMPILER_DIR)/clang++ $(COMPILER_DIR)/scan-build cmake .. -GNinja -DJSON_BuildTests=On
- cd clang_analyze_build ; \
- $(COMPILER_DIR)/scan-build \
- -enable-checker alpha.core.BoolAssignment,alpha.core.CallAndMessageUnInitRefArg,alpha.core.CastSize,alpha.core.CastToStruct,alpha.core.Conversion,alpha.core.DynamicTypeChecker,alpha.core.FixedAddr,alpha.core.PointerArithm,alpha.core.PointerSub,alpha.core.SizeofPtr,alpha.core.StackAddressAsyncEscape,alpha.core.TestAfterDivZero,alpha.deadcode.UnreachableCode,core.builtin.BuiltinFunctions,core.builtin.NoReturnFunctions,core.CallAndMessage,core.DivideZero,core.DynamicTypePropagation,core.NonnilStringConstants,core.NonNullParamChecker,core.NullDereference,core.StackAddressEscape,core.UndefinedBinaryOperatorResult,core.uninitialized.ArraySubscript,core.uninitialized.Assign,core.uninitialized.Branch,core.uninitialized.CapturedBlockVariable,core.uninitialized.UndefReturn,core.VLASize,cplusplus.InnerPointer,cplusplus.Move,cplusplus.NewDelete,cplusplus.NewDeleteLeaks,cplusplus.SelfAssignment,deadcode.DeadStores,nullability.NullableDereferenced,nullability.NullablePassedToNonnull,nullability.NullableReturnedFromNonnull,nullability.NullPassedToNonnull,nullability.NullReturnedFromNonnull \
- --use-c++=$(COMPILER_DIR)/clang++ -analyze-headers -o report ninja
- open clang_analyze_build/report/*/index.html
- # call cpplint <https://github.com/cpplint/cpplint>
- # Note: some errors expected due to false positives
- cpplint:
- third_party/cpplint/cpplint.py \
- --filter=-whitespace,-legal,-readability/alt_tokens,-runtime/references,-runtime/explicit \
- --quiet --recursive $(SRCS)
- # call Clang-Tidy <https://clang.llvm.org/extra/clang-tidy/>
- clang_tidy:
- $(COMPILER_DIR)/clang-tidy $(AMALGAMATED_FILE) -- -Iinclude -std=c++11
- # call PVS-Studio Analyzer <https://www.viva64.com/en/pvs-studio/>
- pvs_studio:
- rm -fr pvs_studio_build
- mkdir pvs_studio_build
- cd pvs_studio_build ; cmake .. -DCMAKE_EXPORT_COMPILE_COMMANDS=On
- cd pvs_studio_build ; pvs-studio-analyzer analyze -j 10
- cd pvs_studio_build ; plog-converter -a'GA:1,2;64:1;CS' -t fullhtml PVS-Studio.log -o pvs
- open pvs_studio_build/pvs/index.html
- # call Infer <https://fbinfer.com> static analyzer
- infer:
- rm -fr infer_build
- mkdir infer_build
- cd infer_build ; infer compile -- cmake .. ; infer run -- make -j 4
- # call OCLint <http://oclint.org> static analyzer
- oclint:
- oclint $(SRCS) -report-type html -enable-global-analysis -o oclint_report.html -max-priority-1=10000 -max-priority-2=10000 -max-priority-3=10000 -- -std=c++11 -Iinclude
- open oclint_report.html
- # execute the test suite with Clang sanitizers (address and undefined behavior)
- clang_sanitize:
- rm -fr clang_sanitize_build
- mkdir clang_sanitize_build
- cd clang_sanitize_build ; CXX=$(COMPILER_DIR)/clang++ cmake .. -DJSON_Sanitizer=On -DJSON_MultipleHeaders=ON -DJSON_BuildTests=On -GNinja
- cd clang_sanitize_build ; ninja
- cd clang_sanitize_build ; ctest -j10
- ##########################################################################
- # Code format and source amalgamation
- ##########################################################################
- # call the Artistic Style pretty printer on all source files
- pretty:
- astyle \
- --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 \
- --suffix=none \
- --formatted \
- $(SRCS) $(AMALGAMATED_FILE) test/src/*.cpp benchmarks/src/benchmarks.cpp doc/examples/*.cpp
- # create single header file
- amalgamate: $(AMALGAMATED_FILE)
- # call the amalgamation tool and pretty print
- $(AMALGAMATED_FILE): $(SRCS)
- third_party/amalgamate/amalgamate.py -c third_party/amalgamate/config.json -s . --verbose=yes
- $(MAKE) pretty
- # check if file single_include/nlohmann/json.hpp has been amalgamated from the nlohmann sources
- # Note: this target is called by Travis
- check-amalgamation:
- @mv $(AMALGAMATED_FILE) $(AMALGAMATED_FILE)~
- @$(MAKE) amalgamate
- @diff $(AMALGAMATED_FILE) $(AMALGAMATED_FILE)~ || (echo "===================================================================\n Amalgamation required! Please read the contribution guidelines\n in file .github/CONTRIBUTING.md.\n===================================================================" ; mv $(AMALGAMATED_FILE)~ $(AMALGAMATED_FILE) ; false)
- @mv $(AMALGAMATED_FILE)~ $(AMALGAMATED_FILE)
- # check if every header in nlohmann includes sufficient headers to be compiled individually
- check-single-includes:
- @for x in $(SRCS); do \
- echo "Checking self-sufficiency of $$x..." ; \
- echo "#include <$$x>\nint main() {}\n" | sed 's|include/||' > single_include_test.cpp; \
- $(CXX) $(CXXFLAGS) -Iinclude -std=c++11 single_include_test.cpp -o single_include_test; \
- rm -f single_include_test.cpp single_include_test; \
- done
- ##########################################################################
- # CMake
- ##########################################################################
- # grep "^option" CMakeLists.txt test/CMakeLists.txt | sed 's/(/ /' | awk '{print $2}' | xargs
- # check if all flags of our CMake files work
- check_cmake_flags_do:
- $(CMAKE_BINARY) --version
- for flag in '' JSON_BuildTests JSON_Install JSON_MultipleHeaders JSON_Sanitizer JSON_Valgrind JSON_NoExceptions JSON_Coverage; do \
- rm -fr cmake_build; \
- mkdir cmake_build; \
- echo "$(CMAKE_BINARY) .. -D$$flag=On" ; \
- cd cmake_build ; \
- CXX=g++-8 $(CMAKE_BINARY) .. -D$$flag=On -DCMAKE_CXX_COMPILE_FEATURES="cxx_std_11;cxx_range_for" -DCMAKE_CXX_FLAGS="-std=gnu++11" ; \
- test -f Makefile || exit 1 ; \
- cd .. ; \
- done;
- # call target `check_cmake_flags_do` twice: once for minimal required CMake version 3.1.0 and once for the installed version
- check_cmake_flags:
- wget https://github.com/Kitware/CMake/releases/download/v3.1.0/cmake-3.1.0-Darwin64.tar.gz
- tar xfz cmake-3.1.0-Darwin64.tar.gz
- CMAKE_BINARY=$(abspath cmake-3.1.0-Darwin64/CMake.app/Contents/bin/cmake) $(MAKE) check_cmake_flags_do
- CMAKE_BINARY=$(shell which cmake) $(MAKE) check_cmake_flags_do
- ##########################################################################
- # ChangeLog
- ##########################################################################
- # Create a ChangeLog based on the git log using the GitHub Changelog Generator
- # (<https://github.com/github-changelog-generator/github-changelog-generator>).
- # variable to control the diffs between the last released version and the current repository state
- NEXT_VERSION ?= "unreleased"
- ChangeLog.md:
- github_changelog_generator -o ChangeLog.md --user nlohmann --project json --simple-list --release-url https://github.com/nlohmann/json/releases/tag/%s --future-release $(NEXT_VERSION)
- $(SED) -i 's|https://github.com/nlohmann/json/releases/tag/HEAD|https://github.com/nlohmann/json/tree/HEAD|' ChangeLog.md
- $(SED) -i '2i All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/).' ChangeLog.md
- ##########################################################################
- # Release files
- ##########################################################################
- # Create the files for a release and add signatures and hashes. We use `-X` to make the resulting ZIP file
- # reproducible, see <https://content.pivotal.io/blog/barriers-to-deterministic-reproducible-zip-files>.
- release:
- rm -fr release_files
- mkdir release_files
- zip -9 --recurse-paths -X include.zip $(SRCS) $(AMALGAMATED_FILE) meson.build
- gpg --armor --detach-sig include.zip
- mv include.zip include.zip.asc release_files
- gpg --armor --detach-sig $(AMALGAMATED_FILE)
- cp $(AMALGAMATED_FILE) release_files
- mv $(AMALGAMATED_FILE).asc release_files
- cd release_files ; shasum -a 256 json.hpp > hashes.txt
- cd release_files ; shasum -a 256 include.zip >> hashes.txt
- ##########################################################################
- # Maintenance
- ##########################################################################
- # clean up
- clean:
- rm -fr json_unit json_benchmarks fuzz fuzz-testing *.dSYM test/*.dSYM oclint_report.html
- rm -fr benchmarks/files/numbers/*.json
- rm -fr cmake-3.1.0-Darwin64.tar.gz cmake-3.1.0-Darwin64
- rm -fr build_coverage build_benchmarks fuzz-testing clang_analyze_build pvs_studio_build infer_build clang_sanitize_build cmake_build
- $(MAKE) clean -Cdoc
- $(MAKE) clean -Ctest
- ##########################################################################
- # Thirdparty code
- ##########################################################################
- update_hedley:
- rm -f include/nlohmann/thirdparty/hedley/hedley.hpp include/nlohmann/thirdparty/hedley/hedley_undef.hpp
- curl https://raw.githubusercontent.com/nemequ/hedley/master/hedley.h -o include/nlohmann/thirdparty/hedley/hedley.hpp
- gsed -i 's/HEDLEY_/JSON_HEDLEY_/g' include/nlohmann/thirdparty/hedley/hedley.hpp
- grep "[[:blank:]]*#[[:blank:]]*undef" include/nlohmann/thirdparty/hedley/hedley.hpp | grep -v "__" | sort | uniq | gsed 's/ //g' | gsed 's/undef/undef /g' > include/nlohmann/thirdparty/hedley/hedley_undef.hpp
- $(MAKE) amalgamate
|