1c5f01b2fSopenharmony_ci# number of parallel jobs for CTest
2c5f01b2fSopenharmony_ciset(N 10)
3c5f01b2fSopenharmony_ci
4c5f01b2fSopenharmony_ci###############################################################################
5c5f01b2fSopenharmony_ci# Needed tools.
6c5f01b2fSopenharmony_ci###############################################################################
7c5f01b2fSopenharmony_ci
8c5f01b2fSopenharmony_ciinclude(FindPython3)
9c5f01b2fSopenharmony_cifind_package(Python3 COMPONENTS Interpreter)
10c5f01b2fSopenharmony_ci
11c5f01b2fSopenharmony_cifind_program(ASTYLE_TOOL NAMES astyle)
12c5f01b2fSopenharmony_ciexecute_process(COMMAND ${ASTYLE_TOOL} --version OUTPUT_VARIABLE ASTYLE_TOOL_VERSION ERROR_VARIABLE ASTYLE_TOOL_VERSION)
13c5f01b2fSopenharmony_cistring(REGEX MATCH "[0-9]+(\\.[0-9]+)+" ASTYLE_TOOL_VERSION "${ASTYLE_TOOL_VERSION}")
14c5f01b2fSopenharmony_cimessage(STATUS "� Artistic Style ${ASTYLE_TOOL_VERSION} (${ASTYLE_TOOL})")
15c5f01b2fSopenharmony_ci
16c5f01b2fSopenharmony_cifind_program(CLANG_TOOL NAMES clang++-HEAD clang++-15 clang++-14 clang++-13 clang++-12 clang++-11 clang++)
17c5f01b2fSopenharmony_ciexecute_process(COMMAND ${CLANG_TOOL} --version OUTPUT_VARIABLE CLANG_TOOL_VERSION ERROR_VARIABLE CLANG_TOOL_VERSION)
18c5f01b2fSopenharmony_cistring(REGEX MATCH "[0-9]+(\\.[0-9]+)+" CLANG_TOOL_VERSION "${CLANG_TOOL_VERSION}")
19c5f01b2fSopenharmony_cimessage(STATUS "� Clang ${CLANG_TOOL_VERSION} (${CLANG_TOOL})")
20c5f01b2fSopenharmony_ci
21c5f01b2fSopenharmony_cifind_program(CLANG_TIDY_TOOL NAMES clang-tidy-15 clang-tidy-14 clang-tidy-13 clang-tidy-12 clang-tidy-11 clang-tidy)
22c5f01b2fSopenharmony_ciexecute_process(COMMAND ${CLANG_TIDY_TOOL} --version OUTPUT_VARIABLE CLANG_TIDY_TOOL_VERSION ERROR_VARIABLE CLANG_TIDY_TOOL_VERSION)
23c5f01b2fSopenharmony_cistring(REGEX MATCH "[0-9]+(\\.[0-9]+)+" CLANG_TIDY_TOOL_VERSION "${CLANG_TIDY_TOOL_VERSION}")
24c5f01b2fSopenharmony_cimessage(STATUS "� Clang-Tidy ${CLANG_TIDY_TOOL_VERSION} (${CLANG_TIDY_TOOL})")
25c5f01b2fSopenharmony_ci
26c5f01b2fSopenharmony_cimessage(STATUS "� CMake ${CMAKE_VERSION} (${CMAKE_COMMAND})")
27c5f01b2fSopenharmony_ci
28c5f01b2fSopenharmony_cifind_program(CPPCHECK_TOOL NAMES cppcheck)
29c5f01b2fSopenharmony_ciexecute_process(COMMAND ${CPPCHECK_TOOL} --version OUTPUT_VARIABLE CPPCHECK_TOOL_VERSION ERROR_VARIABLE CPPCHECK_TOOL_VERSION)
30c5f01b2fSopenharmony_cistring(REGEX MATCH "[0-9]+(\\.[0-9]+)+" CPPCHECK_TOOL_VERSION "${CPPCHECK_TOOL_VERSION}")
31c5f01b2fSopenharmony_cimessage(STATUS "� Cppcheck ${CPPCHECK_TOOL_VERSION} (${CPPCHECK_TOOL})")
32c5f01b2fSopenharmony_ci
33c5f01b2fSopenharmony_cifind_program(GCC_TOOL NAMES g++-latest g++-HEAD g++-11 g++-10)
34c5f01b2fSopenharmony_ciexecute_process(COMMAND ${GCC_TOOL} --version OUTPUT_VARIABLE GCC_TOOL_VERSION ERROR_VARIABLE GCC_TOOL_VERSION)
35c5f01b2fSopenharmony_cistring(REGEX MATCH "[0-9]+(\\.[0-9]+)+" GCC_TOOL_VERSION "${GCC_TOOL_VERSION}")
36c5f01b2fSopenharmony_cimessage(STATUS "� GCC ${GCC_TOOL_VERSION} (${GCC_TOOL})")
37c5f01b2fSopenharmony_ci
38c5f01b2fSopenharmony_cifind_program(GCOV_TOOL NAMES gcov-HEAD gcov-11 gcov-10 gcov)
39c5f01b2fSopenharmony_ciexecute_process(COMMAND ${GCOV_TOOL} --version OUTPUT_VARIABLE GCOV_TOOL_VERSION ERROR_VARIABLE GCOV_TOOL_VERSION)
40c5f01b2fSopenharmony_cistring(REGEX MATCH "[0-9]+(\\.[0-9]+)+" GCOV_TOOL_VERSION "${GCOV_TOOL_VERSION}")
41c5f01b2fSopenharmony_cimessage(STATUS "� GCOV ${GCOV_TOOL_VERSION} (${GCOV_TOOL})")
42c5f01b2fSopenharmony_ci
43c5f01b2fSopenharmony_cifind_program(GIT_TOOL NAMES git)
44c5f01b2fSopenharmony_ciexecute_process(COMMAND ${GIT_TOOL} --version OUTPUT_VARIABLE GIT_TOOL_VERSION ERROR_VARIABLE GIT_TOOL_VERSION)
45c5f01b2fSopenharmony_cistring(REGEX MATCH "[0-9]+(\\.[0-9]+)+" GIT_TOOL_VERSION "${GIT_TOOL_VERSION}")
46c5f01b2fSopenharmony_cimessage(STATUS "� Git ${GIT_TOOL_VERSION} (${GIT_TOOL})")
47c5f01b2fSopenharmony_ci
48c5f01b2fSopenharmony_cifind_program(IWYU_TOOL NAMES include-what-you-use iwyu)
49c5f01b2fSopenharmony_ciexecute_process(COMMAND ${IWYU_TOOL} --version OUTPUT_VARIABLE IWYU_TOOL_VERSION ERROR_VARIABLE IWYU_TOOL_VERSION)
50c5f01b2fSopenharmony_cistring(REGEX MATCH "[0-9]+(\\.[0-9]+)+" IWYU_TOOL_VERSION "${IWYU_TOOL_VERSION}")
51c5f01b2fSopenharmony_cimessage(STATUS "� include-what-you-use ${IWYU_TOOL_VERSION} (${IWYU_TOOL})")
52c5f01b2fSopenharmony_ci
53c5f01b2fSopenharmony_cifind_program(INFER_TOOL NAMES infer)
54c5f01b2fSopenharmony_ciexecute_process(COMMAND ${INFER_TOOL} --version OUTPUT_VARIABLE INFER_TOOL_VERSION ERROR_VARIABLE INFER_TOOL_VERSION)
55c5f01b2fSopenharmony_cistring(REGEX MATCH "[0-9]+(\\.[0-9]+)+" INFER_TOOL_VERSION "${INFER_TOOL_VERSION}")
56c5f01b2fSopenharmony_cimessage(STATUS "� Infer ${INFER_TOOL_VERSION} (${INFER_TOOL})")
57c5f01b2fSopenharmony_ci
58c5f01b2fSopenharmony_cifind_program(LCOV_TOOL NAMES lcov)
59c5f01b2fSopenharmony_ciexecute_process(COMMAND ${LCOV_TOOL} --version OUTPUT_VARIABLE LCOV_TOOL_VERSION ERROR_VARIABLE LCOV_TOOL_VERSION)
60c5f01b2fSopenharmony_cistring(REGEX MATCH "[0-9]+(\\.[0-9]+)+" LCOV_TOOL_VERSION "${LCOV_TOOL_VERSION}")
61c5f01b2fSopenharmony_cimessage(STATUS "� LCOV ${LCOV_TOOL_VERSION} (${LCOV_TOOL})")
62c5f01b2fSopenharmony_ci
63c5f01b2fSopenharmony_cifind_program(NINJA_TOOL NAMES ninja)
64c5f01b2fSopenharmony_ciexecute_process(COMMAND ${NINJA_TOOL} --version OUTPUT_VARIABLE NINJA_TOOL_VERSION ERROR_VARIABLE NINJA_TOOL_VERSION)
65c5f01b2fSopenharmony_cistring(REGEX MATCH "[0-9]+(\\.[0-9]+)+" NINJA_TOOL_VERSION "${NINJA_TOOL_VERSION}")
66c5f01b2fSopenharmony_cimessage(STATUS "� Ninja ${NINJA_TOOL_VERSION} (${NINJA_TOOL})")
67c5f01b2fSopenharmony_ci
68c5f01b2fSopenharmony_cifind_program(OCLINT_TOOL NAMES oclint-json-compilation-database)
69c5f01b2fSopenharmony_cifind_program(OCLINT_VERSION_TOOL NAMES oclint)
70c5f01b2fSopenharmony_ciexecute_process(COMMAND ${OCLINT_VERSION_TOOL} --version OUTPUT_VARIABLE OCLINT_TOOL_VERSION ERROR_VARIABLE OCLINT_TOOL_VERSION)
71c5f01b2fSopenharmony_cistring(REGEX MATCH "[0-9]+(\\.[0-9]+)+" OCLINT_TOOL_VERSION "${OCLINT_TOOL_VERSION}")
72c5f01b2fSopenharmony_cimessage(STATUS "� OCLint ${OCLINT_TOOL_VERSION} (${OCLINT_TOOL})")
73c5f01b2fSopenharmony_ci
74c5f01b2fSopenharmony_cifind_program(VALGRIND_TOOL NAMES valgrind)
75c5f01b2fSopenharmony_ciexecute_process(COMMAND ${VALGRIND_TOOL} --version OUTPUT_VARIABLE VALGRIND_TOOL_VERSION ERROR_VARIABLE VALGRIND_TOOL_VERSION)
76c5f01b2fSopenharmony_cistring(REGEX MATCH "[0-9]+(\\.[0-9]+)+" VALGRIND_TOOL_VERSION "${VALGRIND_TOOL_VERSION}")
77c5f01b2fSopenharmony_cimessage(STATUS "� Valgrind ${VALGRIND_TOOL_VERSION} (${VALGRIND_TOOL})")
78c5f01b2fSopenharmony_ci
79c5f01b2fSopenharmony_cifind_program(GENHTML_TOOL NAMES genhtml)
80c5f01b2fSopenharmony_cifind_program(PLOG_CONVERTER_TOOL NAMES plog-converter)
81c5f01b2fSopenharmony_cifind_program(PVS_STUDIO_ANALYZER_TOOL NAMES pvs-studio-analyzer)
82c5f01b2fSopenharmony_cifind_program(SCAN_BUILD_TOOL NAMES scan-build-15 scan-build-14 scan-build-13 scan-build-12 scan-build-11 scan-build)
83c5f01b2fSopenharmony_ci
84c5f01b2fSopenharmony_ci# the individual source files
85c5f01b2fSopenharmony_cifile(GLOB_RECURSE SRC_FILES ${PROJECT_SOURCE_DIR}/include/nlohmann/*.hpp)
86c5f01b2fSopenharmony_ci
87c5f01b2fSopenharmony_ci###############################################################################
88c5f01b2fSopenharmony_ci# Thorough check with recent compilers
89c5f01b2fSopenharmony_ci###############################################################################
90c5f01b2fSopenharmony_ci
91c5f01b2fSopenharmony_ci# Ignored Clang warnings:
92c5f01b2fSopenharmony_ci# -Wno-c++98-compat               The library targets C++11.
93c5f01b2fSopenharmony_ci# -Wno-c++98-compat-pedantic      The library targets C++11.
94c5f01b2fSopenharmony_ci# -Wno-deprecated-declarations    The library contains annotations for deprecated functions.
95c5f01b2fSopenharmony_ci# -Wno-extra-semi-stmt            The library uses std::assert which triggers this warning.
96c5f01b2fSopenharmony_ci# -Wno-padded                     We do not care about padding warnings.
97c5f01b2fSopenharmony_ci# -Wno-covered-switch-default     All switches list all cases and a default case.
98c5f01b2fSopenharmony_ci# -Wno-weak-vtables               The library is header-only.
99c5f01b2fSopenharmony_ci# -Wreserved-identifier           See https://github.com/onqtam/doctest/issues/536.
100c5f01b2fSopenharmony_ci
101c5f01b2fSopenharmony_ciset(CLANG_CXXFLAGS
102c5f01b2fSopenharmony_ci    -Werror
103c5f01b2fSopenharmony_ci    -Weverything
104c5f01b2fSopenharmony_ci    -Wno-c++98-compat
105c5f01b2fSopenharmony_ci    -Wno-c++98-compat-pedantic
106c5f01b2fSopenharmony_ci    -Wno-deprecated-declarations
107c5f01b2fSopenharmony_ci    -Wno-extra-semi-stmt
108c5f01b2fSopenharmony_ci    -Wno-padded
109c5f01b2fSopenharmony_ci    -Wno-covered-switch-default
110c5f01b2fSopenharmony_ci    -Wno-weak-vtables
111c5f01b2fSopenharmony_ci    -Wno-reserved-identifier
112c5f01b2fSopenharmony_ci)
113c5f01b2fSopenharmony_ci
114c5f01b2fSopenharmony_ci# Warning flags determined for GCC 13.0 (experimental) with https://github.com/nlohmann/gcc_flags:
115c5f01b2fSopenharmony_ci# Ignored GCC warnings:
116c5f01b2fSopenharmony_ci# -Wno-abi-tag                    We do not care about ABI tags.
117c5f01b2fSopenharmony_ci# -Wno-aggregate-return           The library uses aggregate returns.
118c5f01b2fSopenharmony_ci# -Wno-long-long                  The library uses the long long type to interface with system functions.
119c5f01b2fSopenharmony_ci# -Wno-namespaces                 The library uses namespaces.
120c5f01b2fSopenharmony_ci# -Wno-padded                     We do not care about padding warnings.
121c5f01b2fSopenharmony_ci# -Wno-system-headers             We do not care about warnings in system headers.
122c5f01b2fSopenharmony_ci# -Wno-templates                  The library uses templates.
123c5f01b2fSopenharmony_ci
124c5f01b2fSopenharmony_ciset(GCC_CXXFLAGS
125c5f01b2fSopenharmony_ci    -pedantic
126c5f01b2fSopenharmony_ci    -Werror
127c5f01b2fSopenharmony_ci    --all-warnings
128c5f01b2fSopenharmony_ci    --extra-warnings
129c5f01b2fSopenharmony_ci    -W
130c5f01b2fSopenharmony_ci    -WNSObject-attribute
131c5f01b2fSopenharmony_ci    -Wno-abi-tag
132c5f01b2fSopenharmony_ci    -Waddress
133c5f01b2fSopenharmony_ci    -Waddress-of-packed-member
134c5f01b2fSopenharmony_ci    -Wno-aggregate-return
135c5f01b2fSopenharmony_ci    -Waggressive-loop-optimizations
136c5f01b2fSopenharmony_ci    -Waligned-new=all
137c5f01b2fSopenharmony_ci    -Wall
138c5f01b2fSopenharmony_ci    -Walloc-zero
139c5f01b2fSopenharmony_ci    -Walloca
140c5f01b2fSopenharmony_ci    -Wanalyzer-double-fclose
141c5f01b2fSopenharmony_ci    -Wanalyzer-double-free
142c5f01b2fSopenharmony_ci    -Wanalyzer-exposure-through-output-file
143c5f01b2fSopenharmony_ci    -Wanalyzer-file-leak
144c5f01b2fSopenharmony_ci    -Wanalyzer-free-of-non-heap
145c5f01b2fSopenharmony_ci    -Wanalyzer-malloc-leak
146c5f01b2fSopenharmony_ci    -Wanalyzer-mismatching-deallocation
147c5f01b2fSopenharmony_ci    -Wanalyzer-null-argument
148c5f01b2fSopenharmony_ci    -Wanalyzer-null-dereference
149c5f01b2fSopenharmony_ci    -Wanalyzer-possible-null-argument
150c5f01b2fSopenharmony_ci    -Wanalyzer-possible-null-dereference
151c5f01b2fSopenharmony_ci    -Wanalyzer-shift-count-negative
152c5f01b2fSopenharmony_ci    -Wanalyzer-shift-count-overflow
153c5f01b2fSopenharmony_ci    -Wanalyzer-stale-setjmp-buffer
154c5f01b2fSopenharmony_ci    -Wanalyzer-tainted-allocation-size
155c5f01b2fSopenharmony_ci    -Wanalyzer-tainted-array-index
156c5f01b2fSopenharmony_ci    -Wanalyzer-tainted-divisor
157c5f01b2fSopenharmony_ci    -Wanalyzer-tainted-offset
158c5f01b2fSopenharmony_ci    -Wanalyzer-tainted-size
159c5f01b2fSopenharmony_ci    -Wanalyzer-too-complex
160c5f01b2fSopenharmony_ci    -Wanalyzer-unsafe-call-within-signal-handler
161c5f01b2fSopenharmony_ci    -Wanalyzer-use-after-free
162c5f01b2fSopenharmony_ci    -Wanalyzer-use-of-pointer-in-stale-stack-frame
163c5f01b2fSopenharmony_ci    -Wanalyzer-use-of-uninitialized-value
164c5f01b2fSopenharmony_ci    -Wanalyzer-va-arg-type-mismatch
165c5f01b2fSopenharmony_ci    -Wanalyzer-va-list-exhausted
166c5f01b2fSopenharmony_ci    -Wanalyzer-va-list-leak
167c5f01b2fSopenharmony_ci    -Wanalyzer-va-list-use-after-va-end
168c5f01b2fSopenharmony_ci    -Wanalyzer-write-to-const
169c5f01b2fSopenharmony_ci    -Wanalyzer-write-to-string-literal
170c5f01b2fSopenharmony_ci    -Warith-conversion
171c5f01b2fSopenharmony_ci    -Warray-bounds=2
172c5f01b2fSopenharmony_ci    -Warray-compare
173c5f01b2fSopenharmony_ci    -Warray-parameter=2
174c5f01b2fSopenharmony_ci    -Wattribute-alias=2
175c5f01b2fSopenharmony_ci    -Wattribute-warning
176c5f01b2fSopenharmony_ci    -Wattributes
177c5f01b2fSopenharmony_ci    -Wbool-compare
178c5f01b2fSopenharmony_ci    -Wbool-operation
179c5f01b2fSopenharmony_ci    -Wbuiltin-declaration-mismatch
180c5f01b2fSopenharmony_ci    -Wbuiltin-macro-redefined
181c5f01b2fSopenharmony_ci    -Wc++0x-compat
182c5f01b2fSopenharmony_ci    -Wc++11-compat
183c5f01b2fSopenharmony_ci    -Wc++11-extensions
184c5f01b2fSopenharmony_ci    -Wc++14-compat
185c5f01b2fSopenharmony_ci    -Wc++14-extensions
186c5f01b2fSopenharmony_ci    -Wc++17-compat
187c5f01b2fSopenharmony_ci    -Wc++17-extensions
188c5f01b2fSopenharmony_ci    -Wc++1z-compat
189c5f01b2fSopenharmony_ci    -Wc++20-compat
190c5f01b2fSopenharmony_ci    -Wc++20-extensions
191c5f01b2fSopenharmony_ci    -Wc++23-extensions
192c5f01b2fSopenharmony_ci    -Wc++2a-compat
193c5f01b2fSopenharmony_ci    -Wcannot-profile
194c5f01b2fSopenharmony_ci    -Wcast-align
195c5f01b2fSopenharmony_ci    -Wcast-align=strict
196c5f01b2fSopenharmony_ci    -Wcast-function-type
197c5f01b2fSopenharmony_ci    -Wcast-qual
198c5f01b2fSopenharmony_ci    -Wcatch-value=3
199c5f01b2fSopenharmony_ci    -Wchar-subscripts
200c5f01b2fSopenharmony_ci    -Wclass-conversion
201c5f01b2fSopenharmony_ci    -Wclass-memaccess
202c5f01b2fSopenharmony_ci    -Wclobbered
203c5f01b2fSopenharmony_ci    -Wcomma-subscript
204c5f01b2fSopenharmony_ci    -Wcomment
205c5f01b2fSopenharmony_ci    -Wcomments
206c5f01b2fSopenharmony_ci    -Wconditionally-supported
207c5f01b2fSopenharmony_ci    -Wconversion
208c5f01b2fSopenharmony_ci    -Wconversion-null
209c5f01b2fSopenharmony_ci    -Wcoverage-invalid-line-number
210c5f01b2fSopenharmony_ci    -Wcoverage-mismatch
211c5f01b2fSopenharmony_ci    -Wcpp
212c5f01b2fSopenharmony_ci    -Wctad-maybe-unsupported
213c5f01b2fSopenharmony_ci    -Wctor-dtor-privacy
214c5f01b2fSopenharmony_ci    -Wdangling-else
215c5f01b2fSopenharmony_ci    -Wdangling-pointer=2
216c5f01b2fSopenharmony_ci    -Wdate-time
217c5f01b2fSopenharmony_ci    -Wdelete-incomplete
218c5f01b2fSopenharmony_ci    -Wdelete-non-virtual-dtor
219c5f01b2fSopenharmony_ci    -Wdeprecated
220c5f01b2fSopenharmony_ci    -Wdeprecated-copy
221c5f01b2fSopenharmony_ci    -Wdeprecated-copy-dtor
222c5f01b2fSopenharmony_ci    -Wdeprecated-declarations
223c5f01b2fSopenharmony_ci    -Wdeprecated-enum-enum-conversion
224c5f01b2fSopenharmony_ci    -Wdeprecated-enum-float-conversion
225c5f01b2fSopenharmony_ci    -Wdisabled-optimization
226c5f01b2fSopenharmony_ci    -Wdiv-by-zero
227c5f01b2fSopenharmony_ci    -Wdouble-promotion
228c5f01b2fSopenharmony_ci    -Wduplicated-branches
229c5f01b2fSopenharmony_ci    -Wduplicated-cond
230c5f01b2fSopenharmony_ci    -Weffc++
231c5f01b2fSopenharmony_ci    -Wempty-body
232c5f01b2fSopenharmony_ci    -Wendif-labels
233c5f01b2fSopenharmony_ci    -Wenum-compare
234c5f01b2fSopenharmony_ci    -Wenum-conversion
235c5f01b2fSopenharmony_ci    -Wexceptions
236c5f01b2fSopenharmony_ci    -Wexpansion-to-defined
237c5f01b2fSopenharmony_ci    -Wextra
238c5f01b2fSopenharmony_ci    -Wextra-semi
239c5f01b2fSopenharmony_ci    -Wfloat-conversion
240c5f01b2fSopenharmony_ci    -Wfloat-equal
241c5f01b2fSopenharmony_ci    -Wformat-diag
242c5f01b2fSopenharmony_ci    -Wformat-overflow=2
243c5f01b2fSopenharmony_ci    -Wformat-signedness
244c5f01b2fSopenharmony_ci    -Wformat-truncation=2
245c5f01b2fSopenharmony_ci    -Wformat=2
246c5f01b2fSopenharmony_ci    -Wframe-address
247c5f01b2fSopenharmony_ci    -Wfree-nonheap-object
248c5f01b2fSopenharmony_ci    -Whsa
249c5f01b2fSopenharmony_ci    -Wif-not-aligned
250c5f01b2fSopenharmony_ci    -Wignored-attributes
251c5f01b2fSopenharmony_ci    -Wignored-qualifiers
252c5f01b2fSopenharmony_ci    -Wimplicit-fallthrough=5
253c5f01b2fSopenharmony_ci    -Winaccessible-base
254c5f01b2fSopenharmony_ci    -Winfinite-recursion
255c5f01b2fSopenharmony_ci    -Winherited-variadic-ctor
256c5f01b2fSopenharmony_ci    -Winit-list-lifetime
257c5f01b2fSopenharmony_ci    -Winit-self
258c5f01b2fSopenharmony_ci    -Winline
259c5f01b2fSopenharmony_ci    -Wint-in-bool-context
260c5f01b2fSopenharmony_ci    -Wint-to-pointer-cast
261c5f01b2fSopenharmony_ci    -Winterference-size
262c5f01b2fSopenharmony_ci    -Winvalid-imported-macros
263c5f01b2fSopenharmony_ci    -Winvalid-memory-model
264c5f01b2fSopenharmony_ci    -Winvalid-offsetof
265c5f01b2fSopenharmony_ci    -Winvalid-pch
266c5f01b2fSopenharmony_ci    -Wliteral-suffix
267c5f01b2fSopenharmony_ci    -Wlogical-not-parentheses
268c5f01b2fSopenharmony_ci    -Wlogical-op
269c5f01b2fSopenharmony_ci    -Wno-long-long
270c5f01b2fSopenharmony_ci    -Wlto-type-mismatch
271c5f01b2fSopenharmony_ci    -Wmain
272c5f01b2fSopenharmony_ci    -Wmaybe-uninitialized
273c5f01b2fSopenharmony_ci    -Wmemset-elt-size
274c5f01b2fSopenharmony_ci    -Wmemset-transposed-args
275c5f01b2fSopenharmony_ci    -Wmisleading-indentation
276c5f01b2fSopenharmony_ci    -Wmismatched-dealloc
277c5f01b2fSopenharmony_ci    -Wmismatched-new-delete
278c5f01b2fSopenharmony_ci    -Wmismatched-tags
279c5f01b2fSopenharmony_ci    -Wmissing-attributes
280c5f01b2fSopenharmony_ci    -Wmissing-braces
281c5f01b2fSopenharmony_ci    -Wmissing-declarations
282c5f01b2fSopenharmony_ci    -Wmissing-field-initializers
283c5f01b2fSopenharmony_ci    -Wmissing-include-dirs
284c5f01b2fSopenharmony_ci    -Wmissing-profile
285c5f01b2fSopenharmony_ci    -Wmissing-requires
286c5f01b2fSopenharmony_ci    -Wmissing-template-keyword
287c5f01b2fSopenharmony_ci    -Wmultichar
288c5f01b2fSopenharmony_ci    -Wmultiple-inheritance
289c5f01b2fSopenharmony_ci    -Wmultistatement-macros
290c5f01b2fSopenharmony_ci    -Wno-namespaces
291c5f01b2fSopenharmony_ci    -Wnarrowing
292c5f01b2fSopenharmony_ci    -Wnoexcept
293c5f01b2fSopenharmony_ci    -Wnoexcept-type
294c5f01b2fSopenharmony_ci    -Wnon-template-friend
295c5f01b2fSopenharmony_ci    -Wnon-virtual-dtor
296c5f01b2fSopenharmony_ci    -Wnonnull
297c5f01b2fSopenharmony_ci    -Wnonnull-compare
298c5f01b2fSopenharmony_ci    -Wnormalized=nfkc
299c5f01b2fSopenharmony_ci    -Wnull-dereference
300c5f01b2fSopenharmony_ci    -Wodr
301c5f01b2fSopenharmony_ci    -Wold-style-cast
302c5f01b2fSopenharmony_ci    -Wopenacc-parallelism
303c5f01b2fSopenharmony_ci    -Wopenmp-simd
304c5f01b2fSopenharmony_ci    -Woverflow
305c5f01b2fSopenharmony_ci    -Woverlength-strings
306c5f01b2fSopenharmony_ci    -Woverloaded-virtual
307c5f01b2fSopenharmony_ci    -Wpacked
308c5f01b2fSopenharmony_ci    -Wpacked-bitfield-compat
309c5f01b2fSopenharmony_ci    -Wpacked-not-aligned
310c5f01b2fSopenharmony_ci    -Wno-padded
311c5f01b2fSopenharmony_ci    -Wparentheses
312c5f01b2fSopenharmony_ci    -Wpedantic
313c5f01b2fSopenharmony_ci    -Wpessimizing-move
314c5f01b2fSopenharmony_ci    -Wplacement-new=2
315c5f01b2fSopenharmony_ci    -Wpmf-conversions
316c5f01b2fSopenharmony_ci    -Wpointer-arith
317c5f01b2fSopenharmony_ci    -Wpointer-compare
318c5f01b2fSopenharmony_ci    -Wpragmas
319c5f01b2fSopenharmony_ci    -Wprio-ctor-dtor
320c5f01b2fSopenharmony_ci    -Wpsabi
321c5f01b2fSopenharmony_ci    -Wrange-loop-construct
322c5f01b2fSopenharmony_ci    -Wredundant-decls
323c5f01b2fSopenharmony_ci    -Wredundant-move
324c5f01b2fSopenharmony_ci    -Wredundant-tags
325c5f01b2fSopenharmony_ci    -Wregister
326c5f01b2fSopenharmony_ci    -Wreorder
327c5f01b2fSopenharmony_ci    -Wrestrict
328c5f01b2fSopenharmony_ci    -Wreturn-local-addr
329c5f01b2fSopenharmony_ci    -Wreturn-type
330c5f01b2fSopenharmony_ci    -Wscalar-storage-order
331c5f01b2fSopenharmony_ci    -Wsequence-point
332c5f01b2fSopenharmony_ci    -Wshadow=compatible-local
333c5f01b2fSopenharmony_ci    -Wshadow=global
334c5f01b2fSopenharmony_ci    -Wshadow=local
335c5f01b2fSopenharmony_ci    -Wshift-count-negative
336c5f01b2fSopenharmony_ci    -Wshift-count-overflow
337c5f01b2fSopenharmony_ci    -Wshift-negative-value
338c5f01b2fSopenharmony_ci    -Wshift-overflow=2
339c5f01b2fSopenharmony_ci    -Wsign-compare
340c5f01b2fSopenharmony_ci    -Wsign-conversion
341c5f01b2fSopenharmony_ci    -Wsign-promo
342c5f01b2fSopenharmony_ci    -Wsized-deallocation
343c5f01b2fSopenharmony_ci    -Wsizeof-array-argument
344c5f01b2fSopenharmony_ci    -Wsizeof-array-div
345c5f01b2fSopenharmony_ci    -Wsizeof-pointer-div
346c5f01b2fSopenharmony_ci    -Wsizeof-pointer-memaccess
347c5f01b2fSopenharmony_ci    -Wstack-protector
348c5f01b2fSopenharmony_ci    -Wstrict-aliasing=3
349c5f01b2fSopenharmony_ci    -Wstrict-null-sentinel
350c5f01b2fSopenharmony_ci    -Wno-strict-overflow
351c5f01b2fSopenharmony_ci    -Wstring-compare
352c5f01b2fSopenharmony_ci    -Wstringop-overflow=4
353c5f01b2fSopenharmony_ci    -Wstringop-overread
354c5f01b2fSopenharmony_ci    -Wstringop-truncation
355c5f01b2fSopenharmony_ci    -Wsubobject-linkage
356c5f01b2fSopenharmony_ci    -Wsuggest-attribute=cold
357c5f01b2fSopenharmony_ci    -Wsuggest-attribute=const
358c5f01b2fSopenharmony_ci    -Wsuggest-attribute=format
359c5f01b2fSopenharmony_ci    -Wsuggest-attribute=malloc
360c5f01b2fSopenharmony_ci    -Wsuggest-attribute=noreturn
361c5f01b2fSopenharmony_ci    -Wsuggest-attribute=pure
362c5f01b2fSopenharmony_ci    -Wsuggest-final-methods
363c5f01b2fSopenharmony_ci    -Wsuggest-final-types
364c5f01b2fSopenharmony_ci    -Wsuggest-override
365c5f01b2fSopenharmony_ci    -Wswitch
366c5f01b2fSopenharmony_ci    -Wswitch-bool
367c5f01b2fSopenharmony_ci    -Wswitch-default
368c5f01b2fSopenharmony_ci    -Wswitch-enum
369c5f01b2fSopenharmony_ci    -Wswitch-outside-range
370c5f01b2fSopenharmony_ci    -Wswitch-unreachable
371c5f01b2fSopenharmony_ci    -Wsync-nand
372c5f01b2fSopenharmony_ci    -Wsynth
373c5f01b2fSopenharmony_ci    -Wno-system-headers
374c5f01b2fSopenharmony_ci    -Wtautological-compare
375c5f01b2fSopenharmony_ci    -Wno-templates
376c5f01b2fSopenharmony_ci    -Wterminate
377c5f01b2fSopenharmony_ci    -Wtrampolines
378c5f01b2fSopenharmony_ci    -Wtrigraphs
379c5f01b2fSopenharmony_ci    -Wtrivial-auto-var-init
380c5f01b2fSopenharmony_ci    -Wtsan
381c5f01b2fSopenharmony_ci    -Wtype-limits
382c5f01b2fSopenharmony_ci    -Wundef
383c5f01b2fSopenharmony_ci    -Wuninitialized
384c5f01b2fSopenharmony_ci    -Wunknown-pragmas
385c5f01b2fSopenharmony_ci    -Wunreachable-code
386c5f01b2fSopenharmony_ci    -Wunsafe-loop-optimizations
387c5f01b2fSopenharmony_ci    -Wunused
388c5f01b2fSopenharmony_ci    -Wunused-but-set-parameter
389c5f01b2fSopenharmony_ci    -Wunused-but-set-variable
390c5f01b2fSopenharmony_ci    -Wunused-const-variable=2
391c5f01b2fSopenharmony_ci    -Wunused-function
392c5f01b2fSopenharmony_ci    -Wunused-label
393c5f01b2fSopenharmony_ci    -Wunused-local-typedefs
394c5f01b2fSopenharmony_ci    -Wunused-macros
395c5f01b2fSopenharmony_ci    -Wunused-parameter
396c5f01b2fSopenharmony_ci    -Wunused-result
397c5f01b2fSopenharmony_ci    -Wunused-value
398c5f01b2fSopenharmony_ci    -Wunused-variable
399c5f01b2fSopenharmony_ci    -Wuse-after-free=3
400c5f01b2fSopenharmony_ci    -Wuseless-cast
401c5f01b2fSopenharmony_ci    -Wvarargs
402c5f01b2fSopenharmony_ci    -Wvariadic-macros
403c5f01b2fSopenharmony_ci    -Wvector-operation-performance
404c5f01b2fSopenharmony_ci    -Wvexing-parse
405c5f01b2fSopenharmony_ci    -Wvirtual-inheritance
406c5f01b2fSopenharmony_ci    -Wvirtual-move-assign
407c5f01b2fSopenharmony_ci    -Wvla
408c5f01b2fSopenharmony_ci    -Wvla-parameter
409c5f01b2fSopenharmony_ci    -Wvolatile
410c5f01b2fSopenharmony_ci    -Wvolatile-register-var
411c5f01b2fSopenharmony_ci    -Wwrite-strings
412c5f01b2fSopenharmony_ci    -Wzero-as-null-pointer-constant
413c5f01b2fSopenharmony_ci    -Wzero-length-bounds
414c5f01b2fSopenharmony_ci)
415c5f01b2fSopenharmony_ci
416c5f01b2fSopenharmony_ciadd_custom_target(ci_test_gcc
417c5f01b2fSopenharmony_ci    COMMAND CXX=${GCC_TOOL} CXXFLAGS="${GCC_CXXFLAGS}" ${CMAKE_COMMAND}
418c5f01b2fSopenharmony_ci        -DCMAKE_BUILD_TYPE=Debug -GNinja
419c5f01b2fSopenharmony_ci        -DJSON_BuildTests=ON
420c5f01b2fSopenharmony_ci        -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_gcc
421c5f01b2fSopenharmony_ci    COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_gcc
422c5f01b2fSopenharmony_ci    COMMAND cd ${PROJECT_BINARY_DIR}/build_gcc && ${CMAKE_CTEST_COMMAND} --parallel ${N} --output-on-failure
423c5f01b2fSopenharmony_ci    COMMENT "Compile and test with GCC using maximal warning flags"
424c5f01b2fSopenharmony_ci)
425c5f01b2fSopenharmony_ci
426c5f01b2fSopenharmony_ciadd_custom_target(ci_test_clang
427c5f01b2fSopenharmony_ci    COMMAND CXX=${CLANG_TOOL} CXXFLAGS="${CLANG_CXXFLAGS}" ${CMAKE_COMMAND}
428c5f01b2fSopenharmony_ci        -DCMAKE_BUILD_TYPE=Debug -GNinja
429c5f01b2fSopenharmony_ci        -DJSON_BuildTests=ON
430c5f01b2fSopenharmony_ci        -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_clang
431c5f01b2fSopenharmony_ci    COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_clang
432c5f01b2fSopenharmony_ci    COMMAND cd ${PROJECT_BINARY_DIR}/build_clang && ${CMAKE_CTEST_COMMAND} --parallel ${N} --output-on-failure
433c5f01b2fSopenharmony_ci    COMMENT "Compile and test with Clang using maximal warning flags"
434c5f01b2fSopenharmony_ci)
435c5f01b2fSopenharmony_ci
436c5f01b2fSopenharmony_ci###############################################################################
437c5f01b2fSopenharmony_ci# Different C++ Standards.
438c5f01b2fSopenharmony_ci###############################################################################
439c5f01b2fSopenharmony_ci
440c5f01b2fSopenharmony_ciforeach(CXX_STANDARD 11 14 17 20)
441c5f01b2fSopenharmony_ci    add_custom_target(ci_test_gcc_cxx${CXX_STANDARD}
442c5f01b2fSopenharmony_ci        COMMAND CXX=${GCC_TOOL} CXXFLAGS="${GCC_CXXFLAGS}" ${CMAKE_COMMAND}
443c5f01b2fSopenharmony_ci            -DCMAKE_BUILD_TYPE=Debug -GNinja
444c5f01b2fSopenharmony_ci            -DJSON_BuildTests=ON -DJSON_FastTests=ON
445c5f01b2fSopenharmony_ci            -DJSON_TestStandards=${CXX_STANDARD}
446c5f01b2fSopenharmony_ci            -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_gcc_cxx${CXX_STANDARD}
447c5f01b2fSopenharmony_ci        COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_gcc_cxx${CXX_STANDARD}
448c5f01b2fSopenharmony_ci        COMMAND cd ${PROJECT_BINARY_DIR}/build_gcc_cxx${CXX_STANDARD} && ${CMAKE_CTEST_COMMAND} --parallel ${N} --output-on-failure
449c5f01b2fSopenharmony_ci        COMMENT "Compile and test with GCC for C++${CXX_STANDARD}"
450c5f01b2fSopenharmony_ci    )
451c5f01b2fSopenharmony_ci
452c5f01b2fSopenharmony_ci    add_custom_target(ci_test_clang_cxx${CXX_STANDARD}
453c5f01b2fSopenharmony_ci        COMMAND CXX=${CLANG_TOOL} CXXFLAGS="${CLANG_CXXFLAGS}" ${CMAKE_COMMAND}
454c5f01b2fSopenharmony_ci            -DCMAKE_BUILD_TYPE=Debug -GNinja
455c5f01b2fSopenharmony_ci            -DJSON_BuildTests=ON -DJSON_FastTests=ON
456c5f01b2fSopenharmony_ci            -DJSON_TestStandards=${CXX_STANDARD}
457c5f01b2fSopenharmony_ci            -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_clang_cxx${CXX_STANDARD}
458c5f01b2fSopenharmony_ci        COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_clang_cxx${CXX_STANDARD}
459c5f01b2fSopenharmony_ci        COMMAND cd ${PROJECT_BINARY_DIR}/build_clang_cxx${CXX_STANDARD} && ${CMAKE_CTEST_COMMAND} --parallel ${N} --output-on-failure
460c5f01b2fSopenharmony_ci        COMMENT "Compile and test with Clang for C++${CXX_STANDARD}"
461c5f01b2fSopenharmony_ci    )
462c5f01b2fSopenharmony_ciendforeach()
463c5f01b2fSopenharmony_ci
464c5f01b2fSopenharmony_ci###############################################################################
465c5f01b2fSopenharmony_ci# Disable exceptions.
466c5f01b2fSopenharmony_ci###############################################################################
467c5f01b2fSopenharmony_ci
468c5f01b2fSopenharmony_ciadd_custom_target(ci_test_noexceptions
469c5f01b2fSopenharmony_ci    COMMAND CXX=${CLANG_TOOL} ${CMAKE_COMMAND}
470c5f01b2fSopenharmony_ci    -DCMAKE_BUILD_TYPE=Debug -GNinja
471c5f01b2fSopenharmony_ci    -DJSON_BuildTests=ON -DCMAKE_CXX_FLAGS=-DJSON_NOEXCEPTION -DDOCTEST_TEST_FILTER=--no-throw
472c5f01b2fSopenharmony_ci    -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_noexceptions
473c5f01b2fSopenharmony_ci    COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_noexceptions
474c5f01b2fSopenharmony_ci    COMMAND cd ${PROJECT_BINARY_DIR}/build_noexceptions && ${CMAKE_CTEST_COMMAND} --parallel ${N} --output-on-failure
475c5f01b2fSopenharmony_ci    COMMENT "Compile and test with exceptions switched off"
476c5f01b2fSopenharmony_ci)
477c5f01b2fSopenharmony_ci
478c5f01b2fSopenharmony_ci###############################################################################
479c5f01b2fSopenharmony_ci# Disable implicit conversions.
480c5f01b2fSopenharmony_ci###############################################################################
481c5f01b2fSopenharmony_ci
482c5f01b2fSopenharmony_ciadd_custom_target(ci_test_noimplicitconversions
483c5f01b2fSopenharmony_ci    COMMAND CXX=${CLANG_TOOL} ${CMAKE_COMMAND}
484c5f01b2fSopenharmony_ci    -DCMAKE_BUILD_TYPE=Debug -GNinja
485c5f01b2fSopenharmony_ci    -DJSON_BuildTests=ON -DJSON_ImplicitConversions=OFF
486c5f01b2fSopenharmony_ci    -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_noimplicitconversions
487c5f01b2fSopenharmony_ci    COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_noimplicitconversions
488c5f01b2fSopenharmony_ci    COMMAND cd ${PROJECT_BINARY_DIR}/build_noimplicitconversions && ${CMAKE_CTEST_COMMAND} --parallel ${N} --output-on-failure
489c5f01b2fSopenharmony_ci    COMMENT "Compile and test with implicit conversions switched off"
490c5f01b2fSopenharmony_ci)
491c5f01b2fSopenharmony_ci
492c5f01b2fSopenharmony_ci###############################################################################
493c5f01b2fSopenharmony_ci# Enable improved diagnostics.
494c5f01b2fSopenharmony_ci###############################################################################
495c5f01b2fSopenharmony_ci
496c5f01b2fSopenharmony_ciadd_custom_target(ci_test_diagnostics
497c5f01b2fSopenharmony_ci    COMMAND CXX=${CLANG_TOOL} ${CMAKE_COMMAND}
498c5f01b2fSopenharmony_ci    -DCMAKE_BUILD_TYPE=Debug -GNinja
499c5f01b2fSopenharmony_ci    -DJSON_BuildTests=ON -DJSON_Diagnostics=ON
500c5f01b2fSopenharmony_ci    -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_diagnostics
501c5f01b2fSopenharmony_ci    COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_diagnostics
502c5f01b2fSopenharmony_ci    COMMAND cd ${PROJECT_BINARY_DIR}/build_diagnostics && ${CMAKE_CTEST_COMMAND} --parallel ${N} --output-on-failure
503c5f01b2fSopenharmony_ci    COMMENT "Compile and test with improved diagnostics enabled"
504c5f01b2fSopenharmony_ci)
505c5f01b2fSopenharmony_ci
506c5f01b2fSopenharmony_ci###############################################################################
507c5f01b2fSopenharmony_ci# Enable legacy discarded value comparison.
508c5f01b2fSopenharmony_ci###############################################################################
509c5f01b2fSopenharmony_ci
510c5f01b2fSopenharmony_ciadd_custom_target(ci_test_legacycomparison
511c5f01b2fSopenharmony_ci    COMMAND CXX=${CLANG_TOOL} ${CMAKE_COMMAND}
512c5f01b2fSopenharmony_ci    -DCMAKE_BUILD_TYPE=Debug -GNinja
513c5f01b2fSopenharmony_ci    -DJSON_BuildTests=ON -DJSON_LegacyDiscardedValueComparison=ON
514c5f01b2fSopenharmony_ci    -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_legacycomparison
515c5f01b2fSopenharmony_ci    COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_legacycomparison
516c5f01b2fSopenharmony_ci    COMMAND cd ${PROJECT_BINARY_DIR}/build_legacycomparison && ${CMAKE_CTEST_COMMAND} --parallel ${N} --output-on-failure
517c5f01b2fSopenharmony_ci    COMMENT "Compile and test with legacy discarded value comparison enabled"
518c5f01b2fSopenharmony_ci)
519c5f01b2fSopenharmony_ci
520c5f01b2fSopenharmony_ci###############################################################################
521c5f01b2fSopenharmony_ci# Disable global UDLs.
522c5f01b2fSopenharmony_ci###############################################################################
523c5f01b2fSopenharmony_ci
524c5f01b2fSopenharmony_ciadd_custom_target(ci_test_noglobaludls
525c5f01b2fSopenharmony_ci    COMMAND CXX=${CLANG_TOOL} ${CMAKE_COMMAND}
526c5f01b2fSopenharmony_ci    -DCMAKE_BUILD_TYPE=Debug -GNinja
527c5f01b2fSopenharmony_ci    -DJSON_BuildTests=ON -DJSON_FastTests=ON -DJSON_GlobalUDLs=OFF
528c5f01b2fSopenharmony_ci    -DCMAKE_CXX_FLAGS=-DJSON_TEST_NO_GLOBAL_UDLS
529c5f01b2fSopenharmony_ci    -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_noglobaludls
530c5f01b2fSopenharmony_ci    COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_noglobaludls
531c5f01b2fSopenharmony_ci    COMMAND cd ${PROJECT_BINARY_DIR}/build_noglobaludls && ${CMAKE_CTEST_COMMAND} --parallel ${N} --output-on-failure
532c5f01b2fSopenharmony_ci    COMMENT "Compile and test with global UDLs disabled"
533c5f01b2fSopenharmony_ci)
534c5f01b2fSopenharmony_ci
535c5f01b2fSopenharmony_ci###############################################################################
536c5f01b2fSopenharmony_ci# Coverage.
537c5f01b2fSopenharmony_ci###############################################################################
538c5f01b2fSopenharmony_ci
539c5f01b2fSopenharmony_ciadd_custom_target(ci_test_coverage
540c5f01b2fSopenharmony_ci    COMMAND CXX=g++ ${CMAKE_COMMAND}
541c5f01b2fSopenharmony_ci        -DCMAKE_BUILD_TYPE=Debug -GNinja -DCMAKE_CXX_FLAGS="--coverage;-fprofile-arcs;-ftest-coverage"
542c5f01b2fSopenharmony_ci        -DJSON_BuildTests=ON
543c5f01b2fSopenharmony_ci        -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_coverage
544c5f01b2fSopenharmony_ci    COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_coverage
545c5f01b2fSopenharmony_ci    COMMAND cd ${PROJECT_BINARY_DIR}/build_coverage && ${CMAKE_CTEST_COMMAND} --parallel ${N} --output-on-failure
546c5f01b2fSopenharmony_ci
547c5f01b2fSopenharmony_ci    COMMAND CXX=g++ ${CMAKE_COMMAND}
548c5f01b2fSopenharmony_ci        -DCMAKE_BUILD_TYPE=Debug -GNinja -DCMAKE_CXX_FLAGS="-m32;--coverage;-fprofile-arcs;-ftest-coverage"
549c5f01b2fSopenharmony_ci        -DJSON_BuildTests=ON -DJSON_32bitTest=ONLY
550c5f01b2fSopenharmony_ci        -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_coverage32
551c5f01b2fSopenharmony_ci    COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_coverage32
552c5f01b2fSopenharmony_ci    COMMAND cd ${PROJECT_BINARY_DIR}/build_coverage32 && ${CMAKE_CTEST_COMMAND} --parallel ${N} --output-on-failure
553c5f01b2fSopenharmony_ci
554c5f01b2fSopenharmony_ci    COMMAND ${LCOV_TOOL} --directory . --capture --output-file json.info --rc lcov_branch_coverage=1
555c5f01b2fSopenharmony_ci    COMMAND ${LCOV_TOOL} -e json.info ${SRC_FILES} --output-file json.info.filtered --rc lcov_branch_coverage=1
556c5f01b2fSopenharmony_ci    COMMAND ${CMAKE_SOURCE_DIR}/tests/thirdparty/imapdl/filterbr.py json.info.filtered > json.info.filtered.noexcept
557c5f01b2fSopenharmony_ci    COMMAND genhtml --title "JSON for Modern C++" --legend --demangle-cpp --output-directory html --show-details --branch-coverage json.info.filtered.noexcept
558c5f01b2fSopenharmony_ci
559c5f01b2fSopenharmony_ci    COMMENT "Compile and test with coverage"
560c5f01b2fSopenharmony_ci)
561c5f01b2fSopenharmony_ci
562c5f01b2fSopenharmony_ci###############################################################################
563c5f01b2fSopenharmony_ci# Sanitizers.
564c5f01b2fSopenharmony_ci###############################################################################
565c5f01b2fSopenharmony_ci
566c5f01b2fSopenharmony_ciset(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")
567c5f01b2fSopenharmony_ci
568c5f01b2fSopenharmony_ciadd_custom_target(ci_test_clang_sanitizer
569c5f01b2fSopenharmony_ci    COMMAND CXX=${CLANG_TOOL} CXXFLAGS=${CLANG_CXX_FLAGS_SANITIZER} ${CMAKE_COMMAND}
570c5f01b2fSopenharmony_ci        -DCMAKE_BUILD_TYPE=Debug -GNinja
571c5f01b2fSopenharmony_ci        -DJSON_BuildTests=ON
572c5f01b2fSopenharmony_ci        -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_clang_sanitizer
573c5f01b2fSopenharmony_ci    COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_clang_sanitizer
574c5f01b2fSopenharmony_ci    COMMAND cd ${PROJECT_BINARY_DIR}/build_clang_sanitizer && ${CMAKE_CTEST_COMMAND} --parallel ${N} --output-on-failure
575c5f01b2fSopenharmony_ci    COMMENT "Compile and test with sanitizers"
576c5f01b2fSopenharmony_ci)
577c5f01b2fSopenharmony_ci
578c5f01b2fSopenharmony_ci###############################################################################
579c5f01b2fSopenharmony_ci# Check if header is amalgamated and sources are properly indented.
580c5f01b2fSopenharmony_ci###############################################################################
581c5f01b2fSopenharmony_ci
582c5f01b2fSopenharmony_ciset(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)
583c5f01b2fSopenharmony_ci
584c5f01b2fSopenharmony_cifile(GLOB_RECURSE INDENT_FILES
585c5f01b2fSopenharmony_ci    ${PROJECT_SOURCE_DIR}/include/nlohmann/*.hpp
586c5f01b2fSopenharmony_ci        ${PROJECT_SOURCE_DIR}/tests/src/*.cpp
587c5f01b2fSopenharmony_ci        ${PROJECT_SOURCE_DIR}/tests/src/*.hpp
588c5f01b2fSopenharmony_ci        ${PROJECT_SOURCE_DIR}/tests/benchmarks/src/benchmarks.cpp
589c5f01b2fSopenharmony_ci    ${PROJECT_SOURCE_DIR}/docs/examples/*.cpp
590c5f01b2fSopenharmony_ci)
591c5f01b2fSopenharmony_ci
592c5f01b2fSopenharmony_ciset(include_dir ${PROJECT_SOURCE_DIR}/single_include/nlohmann)
593c5f01b2fSopenharmony_ciset(tool_dir ${PROJECT_SOURCE_DIR}/tools/amalgamate)
594c5f01b2fSopenharmony_ciadd_custom_target(ci_test_amalgamation
595c5f01b2fSopenharmony_ci    COMMAND rm -fr ${include_dir}/json.hpp~ ${include_dir}/json_fwd.hpp~
596c5f01b2fSopenharmony_ci    COMMAND cp ${include_dir}/json.hpp ${include_dir}/json.hpp~
597c5f01b2fSopenharmony_ci    COMMAND cp ${include_dir}/json_fwd.hpp ${include_dir}/json_fwd.hpp~
598c5f01b2fSopenharmony_ci
599c5f01b2fSopenharmony_ci    COMMAND ${Python3_EXECUTABLE} ${tool_dir}/amalgamate.py -c ${tool_dir}/config_json.json -s .
600c5f01b2fSopenharmony_ci    COMMAND ${Python3_EXECUTABLE} ${tool_dir}/amalgamate.py -c ${tool_dir}/config_json_fwd.json -s .
601c5f01b2fSopenharmony_ci    COMMAND ${ASTYLE_TOOL} ${ASTYLE_FLAGS} --suffix=none --quiet ${include_dir}/json.hpp ${include_dir}/json_fwd.hpp
602c5f01b2fSopenharmony_ci
603c5f01b2fSopenharmony_ci    COMMAND diff ${include_dir}/json.hpp~ ${include_dir}/json.hpp
604c5f01b2fSopenharmony_ci    COMMAND diff ${include_dir}/json_fwd.hpp~ ${include_dir}/json_fwd.hpp
605c5f01b2fSopenharmony_ci
606c5f01b2fSopenharmony_ci    COMMAND ${ASTYLE_TOOL} ${ASTYLE_FLAGS} ${INDENT_FILES}
607c5f01b2fSopenharmony_ci    COMMAND for FILE in `find . -name '*.orig'`\; do false \; done
608c5f01b2fSopenharmony_ci
609c5f01b2fSopenharmony_ci    WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
610c5f01b2fSopenharmony_ci    COMMENT "Check amalgamation and indentation"
611c5f01b2fSopenharmony_ci)
612c5f01b2fSopenharmony_ci
613c5f01b2fSopenharmony_ci###############################################################################
614c5f01b2fSopenharmony_ci# Build and test using the amalgamated header
615c5f01b2fSopenharmony_ci###############################################################################
616c5f01b2fSopenharmony_ci
617c5f01b2fSopenharmony_ciadd_custom_target(ci_test_single_header
618c5f01b2fSopenharmony_ci    COMMAND CXX=${GCC_TOOL} CXXFLAGS="${GCC_CXXFLAGS}" ${CMAKE_COMMAND}
619c5f01b2fSopenharmony_ci        -DCMAKE_BUILD_TYPE=Debug -GNinja
620c5f01b2fSopenharmony_ci        -DJSON_BuildTests=ON -DJSON_MultipleHeaders=OFF -DJSON_FastTests=ON
621c5f01b2fSopenharmony_ci        -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_single_header
622c5f01b2fSopenharmony_ci    COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_single_header
623c5f01b2fSopenharmony_ci    COMMAND cd ${PROJECT_BINARY_DIR}/build_single_header && ${CMAKE_CTEST_COMMAND} --parallel ${N} --output-on-failure
624c5f01b2fSopenharmony_ci    COMMENT "Compile and test single-header version"
625c5f01b2fSopenharmony_ci)
626c5f01b2fSopenharmony_ci
627c5f01b2fSopenharmony_ci###############################################################################
628c5f01b2fSopenharmony_ci# Valgrind.
629c5f01b2fSopenharmony_ci###############################################################################
630c5f01b2fSopenharmony_ci
631c5f01b2fSopenharmony_ciadd_custom_target(ci_test_valgrind
632c5f01b2fSopenharmony_ci    COMMAND CXX=${GCC_TOOL} ${CMAKE_COMMAND}
633c5f01b2fSopenharmony_ci        -DCMAKE_BUILD_TYPE=Debug -GNinja
634c5f01b2fSopenharmony_ci        -DJSON_BuildTests=ON -DJSON_Valgrind=ON
635c5f01b2fSopenharmony_ci        -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_valgrind
636c5f01b2fSopenharmony_ci    COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_valgrind
637c5f01b2fSopenharmony_ci    COMMAND cd ${PROJECT_BINARY_DIR}/build_valgrind && ${CMAKE_CTEST_COMMAND} -L valgrind --parallel ${N} --output-on-failure
638c5f01b2fSopenharmony_ci    COMMENT "Compile and test with Valgrind"
639c5f01b2fSopenharmony_ci)
640c5f01b2fSopenharmony_ci
641c5f01b2fSopenharmony_ci###############################################################################
642c5f01b2fSopenharmony_ci# Check code with Clang Static Analyzer.
643c5f01b2fSopenharmony_ci###############################################################################
644c5f01b2fSopenharmony_ci
645c5f01b2fSopenharmony_ciset(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")
646c5f01b2fSopenharmony_ci
647c5f01b2fSopenharmony_ciadd_custom_target(ci_clang_analyze
648c5f01b2fSopenharmony_ci    COMMAND CXX=${CLANG_TOOL} ${CMAKE_COMMAND}
649c5f01b2fSopenharmony_ci        -DCMAKE_BUILD_TYPE=Debug -GNinja
650c5f01b2fSopenharmony_ci        -DJSON_BuildTests=ON
651c5f01b2fSopenharmony_ci        -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_clang_analyze
652c5f01b2fSopenharmony_ci    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
653c5f01b2fSopenharmony_ci    COMMENT "Check code with Clang Analyzer"
654c5f01b2fSopenharmony_ci)
655c5f01b2fSopenharmony_ci
656c5f01b2fSopenharmony_ci###############################################################################
657c5f01b2fSopenharmony_ci# Check code with Cppcheck.
658c5f01b2fSopenharmony_ci###############################################################################
659c5f01b2fSopenharmony_ci
660c5f01b2fSopenharmony_ciadd_custom_target(ci_cppcheck
661c5f01b2fSopenharmony_ci    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
662c5f01b2fSopenharmony_ci    COMMENT "Check code with Cppcheck"
663c5f01b2fSopenharmony_ci)
664c5f01b2fSopenharmony_ci
665c5f01b2fSopenharmony_ci###############################################################################
666c5f01b2fSopenharmony_ci# Check code with cpplint.
667c5f01b2fSopenharmony_ci###############################################################################
668c5f01b2fSopenharmony_ci
669c5f01b2fSopenharmony_ciadd_custom_target(ci_cpplint
670c5f01b2fSopenharmony_ci    COMMAND ${Python3_EXECUTABLE} ${CMAKE_SOURCE_DIR}/tools/cpplint/cpplint.py --filter=-whitespace,-legal,-runtime/references,-runtime/explicit,-runtime/indentation_namespace,-readability/casting,-readability/nolint --quiet --recursive ${SRC_FILES}
671c5f01b2fSopenharmony_ci    COMMENT "Check code with cpplint"
672c5f01b2fSopenharmony_ci)
673c5f01b2fSopenharmony_ci
674c5f01b2fSopenharmony_ci###############################################################################
675c5f01b2fSopenharmony_ci# Check code with OCLint.
676c5f01b2fSopenharmony_ci###############################################################################
677c5f01b2fSopenharmony_ci
678c5f01b2fSopenharmony_cifile(COPY ${PROJECT_SOURCE_DIR}/single_include/nlohmann/json.hpp DESTINATION ${PROJECT_BINARY_DIR}/src_single)
679c5f01b2fSopenharmony_cifile(RENAME ${PROJECT_BINARY_DIR}/src_single/json.hpp ${PROJECT_BINARY_DIR}/src_single/all.cpp)
680c5f01b2fSopenharmony_cifile(APPEND "${PROJECT_BINARY_DIR}/src_single/all.cpp" "\n\nint main()\n{}\n")
681c5f01b2fSopenharmony_ci
682c5f01b2fSopenharmony_ciadd_executable(single_all ${PROJECT_BINARY_DIR}/src_single/all.cpp)
683c5f01b2fSopenharmony_citarget_compile_features(single_all PRIVATE cxx_std_11)
684c5f01b2fSopenharmony_ci
685c5f01b2fSopenharmony_ciadd_custom_target(ci_oclint
686c5f01b2fSopenharmony_ci    COMMAND ${CMAKE_COMMAND}
687c5f01b2fSopenharmony_ci        -DCMAKE_BUILD_TYPE=Debug
688c5f01b2fSopenharmony_ci        -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
689c5f01b2fSopenharmony_ci        -DJSON_BuildTests=OFF -DJSON_CI=ON
690c5f01b2fSopenharmony_ci        -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_oclint
691c5f01b2fSopenharmony_ci    COMMAND ${OCLINT_TOOL} -i ${PROJECT_BINARY_DIR}/build_oclint/src_single/all.cpp -p ${PROJECT_BINARY_DIR}/build_oclint --
692c5f01b2fSopenharmony_ci        -report-type html -enable-global-analysis --max-priority-1=0 --max-priority-2=1000 --max-priority-3=2000
693c5f01b2fSopenharmony_ci        --disable-rule=MultipleUnaryOperator
694c5f01b2fSopenharmony_ci        --disable-rule=DoubleNegative
695c5f01b2fSopenharmony_ci        --disable-rule=ShortVariableName
696c5f01b2fSopenharmony_ci        --disable-rule=GotoStatement
697c5f01b2fSopenharmony_ci        --disable-rule=LongLine
698c5f01b2fSopenharmony_ci        -o ${PROJECT_BINARY_DIR}/build_oclint/oclint_report.html
699c5f01b2fSopenharmony_ci    COMMENT "Check code with OCLint"
700c5f01b2fSopenharmony_ci)
701c5f01b2fSopenharmony_ci
702c5f01b2fSopenharmony_ci###############################################################################
703c5f01b2fSopenharmony_ci# Check code with Clang-Tidy.
704c5f01b2fSopenharmony_ci###############################################################################
705c5f01b2fSopenharmony_ci
706c5f01b2fSopenharmony_ciadd_custom_target(ci_clang_tidy
707c5f01b2fSopenharmony_ci    COMMAND CXX=${CLANG_TOOL} ${CMAKE_COMMAND}
708c5f01b2fSopenharmony_ci        -DCMAKE_BUILD_TYPE=Debug -GNinja
709c5f01b2fSopenharmony_ci        -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_CXX_CLANG_TIDY=${CLANG_TIDY_TOOL}
710c5f01b2fSopenharmony_ci        -DJSON_BuildTests=ON
711c5f01b2fSopenharmony_ci        -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_clang_tidy
712c5f01b2fSopenharmony_ci    COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_clang_tidy
713c5f01b2fSopenharmony_ci    COMMENT "Check code with Clang-Tidy"
714c5f01b2fSopenharmony_ci)
715c5f01b2fSopenharmony_ci
716c5f01b2fSopenharmony_ci###############################################################################
717c5f01b2fSopenharmony_ci# Check code with PVS-Studio Analyzer <https://www.viva64.com/en/pvs-studio/>.
718c5f01b2fSopenharmony_ci###############################################################################
719c5f01b2fSopenharmony_ci
720c5f01b2fSopenharmony_ciadd_custom_target(ci_pvs_studio
721c5f01b2fSopenharmony_ci    COMMAND CXX=${CLANG_TOOL} ${CMAKE_COMMAND}
722c5f01b2fSopenharmony_ci        -DCMAKE_BUILD_TYPE=Debug
723c5f01b2fSopenharmony_ci        -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
724c5f01b2fSopenharmony_ci        -DJSON_BuildTests=ON
725c5f01b2fSopenharmony_ci        -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_pvs_studio
726c5f01b2fSopenharmony_ci    COMMAND cd ${PROJECT_BINARY_DIR}/build_pvs_studio && ${PVS_STUDIO_ANALYZER_TOOL} analyze -j 10
727c5f01b2fSopenharmony_ci    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
728c5f01b2fSopenharmony_ci    COMMENT "Check code with PVS Studio"
729c5f01b2fSopenharmony_ci)
730c5f01b2fSopenharmony_ci
731c5f01b2fSopenharmony_ci###############################################################################
732c5f01b2fSopenharmony_ci# Check code with Infer <https://fbinfer.com> static analyzer.
733c5f01b2fSopenharmony_ci###############################################################################
734c5f01b2fSopenharmony_ci
735c5f01b2fSopenharmony_ciadd_custom_target(ci_infer
736c5f01b2fSopenharmony_ci    COMMAND mkdir -p ${PROJECT_BINARY_DIR}/build_infer
737c5f01b2fSopenharmony_ci    COMMAND cd ${PROJECT_BINARY_DIR}/build_infer && ${INFER_TOOL} compile -- ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=Debug ${PROJECT_SOURCE_DIR} -DJSON_BuildTests=ON
738c5f01b2fSopenharmony_ci    COMMAND cd ${PROJECT_BINARY_DIR}/build_infer && ${INFER_TOOL} run -- make
739c5f01b2fSopenharmony_ci    COMMENT "Check code with Infer"
740c5f01b2fSopenharmony_ci)
741c5f01b2fSopenharmony_ci
742c5f01b2fSopenharmony_ci###############################################################################
743c5f01b2fSopenharmony_ci# Run test suite with previously downloaded test data.
744c5f01b2fSopenharmony_ci###############################################################################
745c5f01b2fSopenharmony_ci
746c5f01b2fSopenharmony_ciadd_custom_target(ci_offline_testdata
747c5f01b2fSopenharmony_ci    COMMAND mkdir -p ${PROJECT_BINARY_DIR}/build_offline_testdata/test_data
748c5f01b2fSopenharmony_ci    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
749c5f01b2fSopenharmony_ci    COMMAND ${CMAKE_COMMAND}
750c5f01b2fSopenharmony_ci        -DCMAKE_BUILD_TYPE=Debug -GNinja
751c5f01b2fSopenharmony_ci        -DJSON_BuildTests=ON -DJSON_FastTests=ON -DJSON_TestDataDirectory=${PROJECT_BINARY_DIR}/build_offline_testdata/test_data/json_test_data
752c5f01b2fSopenharmony_ci        -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_offline_testdata
753c5f01b2fSopenharmony_ci    COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_offline_testdata
754c5f01b2fSopenharmony_ci    COMMAND cd ${PROJECT_BINARY_DIR}/build_offline_testdata && ${CMAKE_CTEST_COMMAND} --parallel ${N} --output-on-failure
755c5f01b2fSopenharmony_ci    COMMENT "Check code with previously downloaded test data"
756c5f01b2fSopenharmony_ci)
757c5f01b2fSopenharmony_ci
758c5f01b2fSopenharmony_ci###############################################################################
759c5f01b2fSopenharmony_ci# Run test suite when project was not checked out from Git
760c5f01b2fSopenharmony_ci###############################################################################
761c5f01b2fSopenharmony_ci
762c5f01b2fSopenharmony_ciadd_custom_target(ci_non_git_tests
763c5f01b2fSopenharmony_ci    COMMAND git config --global --add safe.directory ${PROJECT_SOURCE_DIR}
764c5f01b2fSopenharmony_ci    COMMAND mkdir -p ${PROJECT_BINARY_DIR}/build_non_git_tests/sources
765c5f01b2fSopenharmony_ci    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
766c5f01b2fSopenharmony_ci    COMMAND ${CMAKE_COMMAND}
767c5f01b2fSopenharmony_ci        -DCMAKE_BUILD_TYPE=Debug -GNinja
768c5f01b2fSopenharmony_ci        -DJSON_BuildTests=ON -DJSON_FastTests=ON
769c5f01b2fSopenharmony_ci        -S${PROJECT_BINARY_DIR}/build_non_git_tests/sources -B${PROJECT_BINARY_DIR}/build_non_git_tests
770c5f01b2fSopenharmony_ci    COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_non_git_tests
771c5f01b2fSopenharmony_ci    COMMAND cd ${PROJECT_BINARY_DIR}/build_non_git_tests && ${CMAKE_CTEST_COMMAND} --parallel ${N} -LE git_required --output-on-failure
772c5f01b2fSopenharmony_ci    COMMENT "Check code when project was not checked out from Git"
773c5f01b2fSopenharmony_ci)
774c5f01b2fSopenharmony_ci
775c5f01b2fSopenharmony_ci###############################################################################
776c5f01b2fSopenharmony_ci# Run test suite and exclude tests that change installed files
777c5f01b2fSopenharmony_ci###############################################################################
778c5f01b2fSopenharmony_ci
779c5f01b2fSopenharmony_ciadd_custom_target(ci_reproducible_tests
780c5f01b2fSopenharmony_ci    COMMAND ${CMAKE_COMMAND}
781c5f01b2fSopenharmony_ci        -DCMAKE_BUILD_TYPE=Debug -GNinja
782c5f01b2fSopenharmony_ci        -DJSON_BuildTests=ON -DJSON_FastTests=ON
783c5f01b2fSopenharmony_ci        -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_reproducible_tests
784c5f01b2fSopenharmony_ci    COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_reproducible_tests
785c5f01b2fSopenharmony_ci    COMMAND cd ${PROJECT_BINARY_DIR}/build_reproducible_tests && ${CMAKE_CTEST_COMMAND} --parallel ${N} -LE not_reproducible --output-on-failure
786c5f01b2fSopenharmony_ci    COMMENT "Check code and exclude tests that change installed files"
787c5f01b2fSopenharmony_ci)
788c5f01b2fSopenharmony_ci
789c5f01b2fSopenharmony_ci###############################################################################
790c5f01b2fSopenharmony_ci# Check if every header in the include folder includes sufficient headers to
791c5f01b2fSopenharmony_ci# be compiled individually.
792c5f01b2fSopenharmony_ci###############################################################################
793c5f01b2fSopenharmony_ci
794c5f01b2fSopenharmony_ciset(iwyu_path_and_options ${IWYU_TOOL} -Xiwyu --max_line_length=300)
795c5f01b2fSopenharmony_ci
796c5f01b2fSopenharmony_ciforeach(SRC_FILE ${SRC_FILES})
797c5f01b2fSopenharmony_ci    # get relative path of the header file
798c5f01b2fSopenharmony_ci    file(RELATIVE_PATH RELATIVE_SRC_FILE "${PROJECT_SOURCE_DIR}/include/nlohmann" "${SRC_FILE}")
799c5f01b2fSopenharmony_ci    # replace slashes and strip suffix
800c5f01b2fSopenharmony_ci    string(REPLACE "/" "_" RELATIVE_SRC_FILE "${RELATIVE_SRC_FILE}")
801c5f01b2fSopenharmony_ci    string(REPLACE ".hpp" "" RELATIVE_SRC_FILE "${RELATIVE_SRC_FILE}")
802c5f01b2fSopenharmony_ci    # create code file
803c5f01b2fSopenharmony_ci    file(WRITE "${PROJECT_BINARY_DIR}/src_single/${RELATIVE_SRC_FILE}.cpp" "#include \"${SRC_FILE}\" // IWYU pragma: keep\n\nint main()\n{}\n")
804c5f01b2fSopenharmony_ci    # create executable
805c5f01b2fSopenharmony_ci    add_executable(single_${RELATIVE_SRC_FILE} EXCLUDE_FROM_ALL ${PROJECT_BINARY_DIR}/src_single/${RELATIVE_SRC_FILE}.cpp)
806c5f01b2fSopenharmony_ci    target_include_directories(single_${RELATIVE_SRC_FILE} PRIVATE ${PROJECT_SOURCE_DIR}/include)
807c5f01b2fSopenharmony_ci    target_compile_features(single_${RELATIVE_SRC_FILE} PRIVATE cxx_std_11)
808c5f01b2fSopenharmony_ci    set_property(TARGET single_${RELATIVE_SRC_FILE} PROPERTY CXX_INCLUDE_WHAT_YOU_USE "${iwyu_path_and_options}")
809c5f01b2fSopenharmony_ci    # remember binary for ci_single_binaries target
810c5f01b2fSopenharmony_ci    list(APPEND single_binaries single_${RELATIVE_SRC_FILE})
811c5f01b2fSopenharmony_ciendforeach()
812c5f01b2fSopenharmony_ci
813c5f01b2fSopenharmony_ciadd_custom_target(ci_single_binaries
814c5f01b2fSopenharmony_ci    DEPENDS ${single_binaries}
815c5f01b2fSopenharmony_ci    COMMENT "Check if headers are self-contained"
816c5f01b2fSopenharmony_ci)
817c5f01b2fSopenharmony_ci
818c5f01b2fSopenharmony_ci###############################################################################
819c5f01b2fSopenharmony_ci# Benchmarks
820c5f01b2fSopenharmony_ci###############################################################################
821c5f01b2fSopenharmony_ci
822c5f01b2fSopenharmony_ciadd_custom_target(ci_benchmarks
823c5f01b2fSopenharmony_ci    COMMAND ${CMAKE_COMMAND}
824c5f01b2fSopenharmony_ci        -DCMAKE_BUILD_TYPE=Release -GNinja
825c5f01b2fSopenharmony_ci        -S${PROJECT_SOURCE_DIR}/benchmarks -B${PROJECT_BINARY_DIR}/build_benchmarks
826c5f01b2fSopenharmony_ci    COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_benchmarks --target json_benchmarks
827c5f01b2fSopenharmony_ci    COMMAND cd ${PROJECT_BINARY_DIR}/build_benchmarks && ./json_benchmarks
828c5f01b2fSopenharmony_ci    COMMENT "Run benchmarks"
829c5f01b2fSopenharmony_ci)
830c5f01b2fSopenharmony_ci
831c5f01b2fSopenharmony_ci###############################################################################
832c5f01b2fSopenharmony_ci# CMake flags
833c5f01b2fSopenharmony_ci###############################################################################
834c5f01b2fSopenharmony_ci
835c5f01b2fSopenharmony_cifunction(ci_get_cmake version var)
836c5f01b2fSopenharmony_ci    if (APPLE)
837c5f01b2fSopenharmony_ci        set(${var} ${PROJECT_BINARY_DIR}/cmake-${version}-Darwin64/CMake.app/Contents/bin/cmake)
838c5f01b2fSopenharmony_ci        add_custom_command(
839c5f01b2fSopenharmony_ci            OUTPUT ${${var}}
840c5f01b2fSopenharmony_ci            COMMAND wget -nc https://github.com/Kitware/CMake/releases/download/v${version}/cmake-${version}-Darwin64.tar.gz
841c5f01b2fSopenharmony_ci            COMMAND tar xfz cmake-${version}-Darwin64.tar.gz
842c5f01b2fSopenharmony_ci            COMMAND rm cmake-${version}-Darwin64.tar.gz
843c5f01b2fSopenharmony_ci            WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
844c5f01b2fSopenharmony_ci            COMMENT "Download CMake ${version}"
845c5f01b2fSopenharmony_ci        )
846c5f01b2fSopenharmony_ci    else()
847c5f01b2fSopenharmony_ci        set(${var} ${PROJECT_BINARY_DIR}/cmake-${version}-Linux-x86_64/bin/cmake)
848c5f01b2fSopenharmony_ci        add_custom_command(
849c5f01b2fSopenharmony_ci            OUTPUT ${${var}}
850c5f01b2fSopenharmony_ci            COMMAND wget -nc https://github.com/Kitware/CMake/releases/download/v${version}/cmake-${version}-Linux-x86_64.tar.gz
851c5f01b2fSopenharmony_ci            COMMAND tar xfz cmake-${version}-Linux-x86_64.tar.gz
852c5f01b2fSopenharmony_ci            COMMAND rm cmake-${version}-Linux-x86_64.tar.gz
853c5f01b2fSopenharmony_ci            WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
854c5f01b2fSopenharmony_ci            COMMENT "Download CMake ${version}"
855c5f01b2fSopenharmony_ci        )
856c5f01b2fSopenharmony_ci    endif()
857c5f01b2fSopenharmony_ci    set(${var} ${${var}} PARENT_SCOPE)
858c5f01b2fSopenharmony_ciendfunction()
859c5f01b2fSopenharmony_ci
860c5f01b2fSopenharmony_cici_get_cmake(3.1.0 CMAKE_3_1_0_BINARY)
861c5f01b2fSopenharmony_cici_get_cmake(3.13.0 CMAKE_3_13_0_BINARY)
862c5f01b2fSopenharmony_ci
863c5f01b2fSopenharmony_ciset(JSON_CMAKE_FLAGS_3_1_0 JSON_Diagnostics JSON_GlobalUDLs JSON_ImplicitConversions JSON_DisableEnumSerialization
864c5f01b2fSopenharmony_ci    JSON_LegacyDiscardedValueComparison JSON_Install JSON_MultipleHeaders JSON_SystemInclude JSON_Valgrind)
865c5f01b2fSopenharmony_ciset(JSON_CMAKE_FLAGS_3_13_0 JSON_BuildTests)
866c5f01b2fSopenharmony_ci
867c5f01b2fSopenharmony_cifunction(ci_add_cmake_flags_targets flag min_version)
868c5f01b2fSopenharmony_ci    string(TOLOWER "ci_cmake_flag_${flag}" flag_target)
869c5f01b2fSopenharmony_ci    string(REPLACE . _ min_version_var ${min_version})
870c5f01b2fSopenharmony_ci    set(cmake_binary ${CMAKE_${min_version_var}_BINARY})
871c5f01b2fSopenharmony_ci    add_custom_target(${flag_target}
872c5f01b2fSopenharmony_ci        COMMENT "Check CMake flag ${flag} (CMake ${CMAKE_VERSION})"
873c5f01b2fSopenharmony_ci        COMMAND ${CMAKE_COMMAND}
874c5f01b2fSopenharmony_ci            -Werror=dev
875c5f01b2fSopenharmony_ci            -D${flag}=ON
876c5f01b2fSopenharmony_ci            -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_${flag_target}
877c5f01b2fSopenharmony_ci    )
878c5f01b2fSopenharmony_ci    add_custom_target(${flag_target}_${min_version_var}
879c5f01b2fSopenharmony_ci        COMMENT "Check CMake flag ${JSON_CMAKE_FLAG} (CMake ${min_version})"
880c5f01b2fSopenharmony_ci        COMMAND mkdir -pv ${PROJECT_BINARY_DIR}/build_${flag_target}_${min_version_var}
881c5f01b2fSopenharmony_ci        COMMAND cd ${PROJECT_BINARY_DIR}/build_${flag_target}_${min_version_var}
882c5f01b2fSopenharmony_ci            && ${cmake_binary} -Werror=dev ${PROJECT_SOURCE_DIR} -D${flag}=ON
883c5f01b2fSopenharmony_ci        DEPENDS ${cmake_binary}
884c5f01b2fSopenharmony_ci    )
885c5f01b2fSopenharmony_ci    list(APPEND JSON_CMAKE_FLAG_TARGETS ${JSON_CMAKE_FLAG_TARGET} ${flag_target}_${min_version_var})
886c5f01b2fSopenharmony_ci    list(APPEND JSON_CMAKE_FLAG_BUILD_DIRS ${PROJECT_BINARY_DIR}/build_${flag_target} ${PROJECT_BINARY_DIR}/build_${flag_target}_${min_version_var})
887c5f01b2fSopenharmony_ci    set(JSON_CMAKE_FLAG_TARGETS ${JSON_CMAKE_FLAG_TARGETS} PARENT_SCOPE)
888c5f01b2fSopenharmony_ci    set(JSON_CMAKE_FLAG_BUILD_DIRS ${JSON_CMAKE_FLAG_BUILD_DIRS} PARENT_SCOPE)
889c5f01b2fSopenharmony_ciendfunction()
890c5f01b2fSopenharmony_ci
891c5f01b2fSopenharmony_ciforeach(JSON_CMAKE_FLAG ${JSON_CMAKE_FLAGS_3_1_0})
892c5f01b2fSopenharmony_ci    ci_add_cmake_flags_targets(${JSON_CMAKE_FLAG} 3.1.0)
893c5f01b2fSopenharmony_ciendforeach()
894c5f01b2fSopenharmony_ci
895c5f01b2fSopenharmony_ciforeach(JSON_CMAKE_FLAG ${JSON_CMAKE_FLAGS_3_13_0})
896c5f01b2fSopenharmony_ci    ci_add_cmake_flags_targets(${JSON_CMAKE_FLAG} 3.13.0)
897c5f01b2fSopenharmony_ciendforeach()
898c5f01b2fSopenharmony_ci
899c5f01b2fSopenharmony_ciadd_custom_target(ci_cmake_flags
900c5f01b2fSopenharmony_ci    DEPENDS ${JSON_CMAKE_FLAG_TARGETS}
901c5f01b2fSopenharmony_ci    COMMENT "Check CMake flags"
902c5f01b2fSopenharmony_ci)
903c5f01b2fSopenharmony_ci
904c5f01b2fSopenharmony_ci###############################################################################
905c5f01b2fSopenharmony_ci# Use more installed compilers.
906c5f01b2fSopenharmony_ci###############################################################################
907c5f01b2fSopenharmony_ci
908c5f01b2fSopenharmony_ciforeach(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)
909c5f01b2fSopenharmony_ci    find_program(COMPILER_TOOL NAMES ${COMPILER})
910c5f01b2fSopenharmony_ci    if (COMPILER_TOOL)
911c5f01b2fSopenharmony_ci        if ("${COMPILER}" STREQUAL "clang++-9")
912c5f01b2fSopenharmony_ci            # fix for https://github.com/nlohmann/json/pull/3101#issuecomment-998788786 / https://stackoverflow.com/a/64051725/266378
913c5f01b2fSopenharmony_ci            set(ADDITIONAL_FLAGS "-DCMAKE_CXX_FLAGS=--gcc-toolchain=/root/gcc/9")
914c5f01b2fSopenharmony_ci        else()
915c5f01b2fSopenharmony_ci            unset(ADDITIONAL_FLAGS)
916c5f01b2fSopenharmony_ci        endif()
917c5f01b2fSopenharmony_ci
918c5f01b2fSopenharmony_ci        add_custom_target(ci_test_compiler_${COMPILER}
919c5f01b2fSopenharmony_ci            COMMAND CXX=${COMPILER} ${CMAKE_COMMAND}
920c5f01b2fSopenharmony_ci                -DCMAKE_BUILD_TYPE=Debug -GNinja
921c5f01b2fSopenharmony_ci                -DJSON_BuildTests=ON -DJSON_FastTests=ON
922c5f01b2fSopenharmony_ci                -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_compiler_${COMPILER}
923c5f01b2fSopenharmony_ci                ${ADDITIONAL_FLAGS}
924c5f01b2fSopenharmony_ci            COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_compiler_${COMPILER}
925c5f01b2fSopenharmony_ci            COMMAND cd ${PROJECT_BINARY_DIR}/build_compiler_${COMPILER} && ${CMAKE_CTEST_COMMAND} --parallel ${N} --exclude-regex "test-unicode" --output-on-failure
926c5f01b2fSopenharmony_ci            COMMENT "Compile and test with ${COMPILER}"
927c5f01b2fSopenharmony_ci        )
928c5f01b2fSopenharmony_ci    endif()
929c5f01b2fSopenharmony_ci    unset(COMPILER_TOOL CACHE)
930c5f01b2fSopenharmony_ciendforeach()
931c5f01b2fSopenharmony_ci
932c5f01b2fSopenharmony_ci###############################################################################
933c5f01b2fSopenharmony_ci# CUDA example
934c5f01b2fSopenharmony_ci###############################################################################
935c5f01b2fSopenharmony_ci
936c5f01b2fSopenharmony_ciadd_custom_target(ci_cuda_example
937c5f01b2fSopenharmony_ci    COMMAND ${CMAKE_COMMAND}
938c5f01b2fSopenharmony_ci        -DCMAKE_BUILD_TYPE=Debug -GNinja
939c5f01b2fSopenharmony_ci        -DCMAKE_CUDA_HOST_COMPILER=g++-8
940c5f01b2fSopenharmony_ci        -S${PROJECT_SOURCE_DIR}/tests/cuda_example -B${PROJECT_BINARY_DIR}/build_cuda_example
941c5f01b2fSopenharmony_ci    COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_cuda_example
942c5f01b2fSopenharmony_ci)
943c5f01b2fSopenharmony_ci
944c5f01b2fSopenharmony_ci###############################################################################
945c5f01b2fSopenharmony_ci# Intel C++ Compiler
946c5f01b2fSopenharmony_ci###############################################################################
947c5f01b2fSopenharmony_ci
948c5f01b2fSopenharmony_ciadd_custom_target(ci_icpc
949c5f01b2fSopenharmony_ci    COMMAND ${CMAKE_COMMAND}
950c5f01b2fSopenharmony_ci        -DCMAKE_BUILD_TYPE=Debug -GNinja
951c5f01b2fSopenharmony_ci        -DCMAKE_C_COMPILER=icc -DCMAKE_CXX_COMPILER=icpc
952c5f01b2fSopenharmony_ci        -DJSON_BuildTests=ON -DJSON_FastTests=ON
953c5f01b2fSopenharmony_ci        -S${PROJECT_SOURCE_DIR} -B${PROJECT_BINARY_DIR}/build_icpc
954c5f01b2fSopenharmony_ci    COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR}/build_icpc
955c5f01b2fSopenharmony_ci    COMMAND cd ${PROJECT_BINARY_DIR}/build_icpc && ${CMAKE_CTEST_COMMAND} --parallel ${N} --exclude-regex "test-unicode" --output-on-failure
956c5f01b2fSopenharmony_ci    COMMENT "Compile and test with ICPC"
957c5f01b2fSopenharmony_ci)
958c5f01b2fSopenharmony_ci
959c5f01b2fSopenharmony_ci###############################################################################
960c5f01b2fSopenharmony_ci# test documentation
961c5f01b2fSopenharmony_ci###############################################################################
962c5f01b2fSopenharmony_ci
963c5f01b2fSopenharmony_ciadd_custom_target(ci_test_examples
964c5f01b2fSopenharmony_ci    COMMAND make CXX="${GCC_TOOL}" check_output_portable -j8
965c5f01b2fSopenharmony_ci    WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/docs
966c5f01b2fSopenharmony_ci    COMMENT "Check that all examples compile and create the desired output"
967c5f01b2fSopenharmony_ci)
968c5f01b2fSopenharmony_ci
969c5f01b2fSopenharmony_ciadd_custom_target(ci_test_api_documentation
970c5f01b2fSopenharmony_ci    COMMAND ${Python3_EXECUTABLE} scripts/check_structure.py
971c5f01b2fSopenharmony_ci    WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/docs/mkdocs
972c5f01b2fSopenharmony_ci    COMMENT "Lint the API documentation"
973c5f01b2fSopenharmony_ci)
974c5f01b2fSopenharmony_ci
975c5f01b2fSopenharmony_ci###############################################################################
976c5f01b2fSopenharmony_ci# Clean up all generated files.
977c5f01b2fSopenharmony_ci###############################################################################
978c5f01b2fSopenharmony_ci
979c5f01b2fSopenharmony_ciadd_custom_target(ci_clean
980c5f01b2fSopenharmony_ci    COMMAND rm -fr ${PROJECT_BINARY_DIR}/build_* cmake-3.1.0-Darwin64 ${JSON_CMAKE_FLAG_BUILD_DIRS} ${single_binaries}
981c5f01b2fSopenharmony_ci    COMMENT "Clean generated directories"
982c5f01b2fSopenharmony_ci)
983