@@ -16,9 +16,15 @@ endif()
1616
1717SET (CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR } /CMakeModules)
1818include (${CMAKE_CURRENT_SOURCE_DIR } /YggdrasilRapidJSONMacros.cmake )
19- gitversion (LIB_VERSION_STRING "1.1.0.2" )
2019
21- PROJECT (YggdrasilRapidJSON VERSION "${LIB_VERSION_STRING} " LANGUAGES C CXX )
20+ set (YGGDRASIL_RAPIDJSON_VERSION "" CACHE STRING "Version to use instead of the git tag version" )
21+
22+ if (NOT YGGDRASIL_RAPIDJSON_VERSION)
23+ yggdrasil_rapidjson_gitversion (YGGDRASIL_RAPIDJSON_VERSION "1.1.0.2" )
24+ endif ()
25+ message (STATUS "YGGDRASIL_RAPIDJSON_VERSION = ${YGGDRASIL_RAPIDJSON_VERSION} " )
26+
27+ PROJECT (YggdrasilRapidJSON VERSION "${YGGDRASIL_RAPIDJSON_VERSION} " LANGUAGES C CXX )
2228set (PROJECT_NAME_UPPER "YGGDRASIL_RAPIDJSON" )
2329set (PROJECT_NAME_LOWER "yggdrasil_rapidjson" )
2430set (PROJECT_INCLUDE_DIR "include/yggdrasil_rapidjson" )
@@ -36,15 +42,45 @@ option(YGGDRASIL_RAPIDJSON_NEST_HEADERS "Nest the headers during install under t
3642option (YGGDRASIL_RAPIDJSON_CREATE_METASCHEMA "Re-create the metaschema" OFF )
3743option (YGGDRASIL_RAPIDJSON_CREATE_METASCHEMA_FULL "Re-create the metaschema and the full_schema.yaml file" OFF )
3844option (YGGDRASIL_RAPIDJSON_SCHEMA_TESTS "Build tests using the yggdrasil schema" OFF )
45+ option (YGGDRASIL_RAPIDJSON_BUILD_DOC "Build yggdrasil_rapidjson documentation." ON )
46+ option (YGGDRASIL_RAPIDJSON_BUILD_EXAMPLES "Build yggdrasil_rapidjson examples." ON )
47+ option (YGGDRASIL_RAPIDJSON_BUILD_TESTS "Build yggdrasil_rapidjson perftests and unittests." ON )
48+ option (YGGDRASIL_RAPIDJSON_BUILD_UNITTESTS "Build yggdrasil_rapidjson unittests." ON )
49+ option (YGGDRASIL_RAPIDJSON_BUILD_PERFTESTS "Build yggdrasil_rapidjson perftests." ON )
50+ option (YGGDRASIL_RAPIDJSON_BUILD_THIRDPARTY_GTEST
51+ "Use gtest installation in `thirdparty/gtest` by default if available" OFF )
3952
40- set (INTERFACE_PUBLIC_COMPILE_FLAGS -D_USE_MATH_DEFINES)
41- set (INTERFACE_PUBLIC_LINK_FLAGS)
42- set (INTERFACE_INCLUDE_DIRS)
43- set (INTERFACE_LIBRARIES)
44- set (LOCAL_PUBLIC_COMPILE_FLAGS)
45- set (LOCAL_PUBLIC_LINK_FLAGS)
46- set (LOCAL_INCLUDE_DIRS)
47- set (LOCAL_LIBRARIES)
53+ option (YGGDRASIL_RAPIDJSON_BUILD_CXXMIN "Build yggdrasil_rapidjson with minimum C++ standard" OFF )
54+ option (YGGDRASIL_RAPIDJSON_BUILD_CXX11 "Build yggdrasil_rapidjson with C++11" ON )
55+ option (YGGDRASIL_RAPIDJSON_BUILD_CXX17 "Build yggdrasil_rapidjson with C++17" OFF )
56+ option (YGGDRASIL_RAPIDJSON_BUILD_CXX20 "Build yggdrasil_rapidjson with C++20" OFF )
57+ if (YGGDRASIL_RAPIDJSON_BUILD_CXX11)
58+ set (CMAKE_CXX_STANDARD 11)
59+ set (CMAKE_CXX_STANDARD_REQUIRED TRUE )
60+ endif ()
61+ if (YGGDRASIL_RAPIDJSON_BUILD_CXXMIN)
62+ set (YGGDRASIL_RAPIDJSON_BUILD_CXX11 OFF )
63+ set (YGGDRASIL_RAPIDJSON_BUILD_CXX17 OFF )
64+ set (CMAKE_CXX_STANDARD 98)
65+ set (CMAKE_CXX_STANDARD_REQUIRED TRUE )
66+ endif ()
67+
68+ yggdrasil_rapidjson_config_init (INTERFACE )
69+ yggdrasil_rapidjson_config_init (LOCAL )
70+ list (
71+ APPEND INTERFACE_PUBLIC_COMPILE_FLAGS
72+ -D_USE_MATH_DEFINES
73+ )
74+ if (WIN32 )
75+ list (
76+ APPEND INTERFACE_PUBLIC_COMPILE_FLAGS
77+ $<$<COMPILE_LANG_AND_ID :C ,MSVC >:-D_CRT_SECURE_NO_WARNINGS =1;-DNOMINMAX ;/EHsc ;/bigobj > # /EHsc /Zm10
78+ $<$<COMPILE_LANG_AND_ID :CXX ,MSVC >:-D_CRT_SECURE_NO_WARNINGS =1;-DNOMINMAX ;/EHsc ;/bigobj > # /EHsc /Zm10
79+ $<$<COMPILE_LANG_AND_ID :C ,GNU >:-Wa ,-mbig -obj >
80+ $<$<COMPILE_LANG_AND_ID :CXX ,GNU >:-Wa ,-mbig -obj >
81+ $<$<COMPILE_LANG_AND_ID :Fortran ,GNU >:-Wa ,-mbig -obj >
82+ )
83+ endif ()
4884
4985if (DISABLE_YGGDRASIL_RAPIDJSON)
5086 set (RAPIDJSON_CREATE_METASCHEMA OFF )
@@ -68,9 +104,6 @@ if(NOT (YGGDRASIL_DISABLE_PYTHON_C_API OR DISABLE_YGGDRASIL_RAPIDJSON))
68104 message (STATUS "Python executable is ${Python3_EXECUTABLE} " )
69105 set (CONDA_PREFIX "$ENV{CONDA_PREFIX} " )
70106 message (STATUS "CONDA_PREFIX = ${CONDA_PREFIX} " )
71- if (FOR_CONDA_RECIPE AND NOT CONDA_PREFIX)
72- message (FATAL_ERROR "CONDA_PREFIX is not set, but FOR_CONDA_RECIPE is" )
73- endif ()
74107 if (CONDA_PREFIX AND NOT Python3_ROOT_DIR)
75108 set (Python3_ROOT_DIR "${CONDA_PREFIX} " )
76109 endif ()
@@ -117,6 +150,14 @@ if(NOT (YGGDRASIL_DISABLE_PYTHON_C_API OR DISABLE_YGGDRASIL_RAPIDJSON))
117150 endif ()
118151endif ()
119152
153+ # compile in release with debug info mode by default
154+ if (NOT CMAKE_BUILD_TYPE )
155+ set (CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE )
156+ endif ()
157+
158+ # Build all binaries in a separate directory
159+ SET (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR } /bin)
160+
120161# Handle option dependencies and set compilation options for tests
121162yggdrasil_rapidjson_options_config (LOCAL )
122163
@@ -139,51 +180,10 @@ if(YGGDRASIL_RAPIDJSON_CREATE_METASCHEMA)
139180 ARGS "${CMAKE_CURRENT_SOURCE_DIR } /create_metaschema.py ${CMAKE_CURRENT_SOURCE_DIR } /${PROJECT_INCLUDE_DIR} /metaschema.h ${YGGDRASIL_RAPIDJSON_METASCHEMA_FLAGS} " )
140181endif ()
141182
142- # compile in release with debug info mode by default
143- if (NOT CMAKE_BUILD_TYPE )
144- set (CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE )
145- endif ()
146-
147- # Build all binaries in a separate directory
148- SET (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR } /bin)
149-
150- option (YGGDRASIL_RAPIDJSON_BUILD_DOC "Build yggdrasil_rapidjson documentation." ON )
151- option (YGGDRASIL_RAPIDJSON_BUILD_EXAMPLES "Build yggdrasil_rapidjson examples." ON )
152- option (YGGDRASIL_RAPIDJSON_BUILD_TESTS "Build yggdrasil_rapidjson perftests and unittests." ON )
153- option (YGGDRASIL_RAPIDJSON_BUILD_UNITTESTS "Build yggdrasil_rapidjson unittests." ON )
154- option (YGGDRASIL_RAPIDJSON_BUILD_PERFTESTS "Build yggdrasil_rapidjson perftests." ON )
155- option (YGGDRASIL_RAPIDJSON_BUILD_THIRDPARTY_GTEST
156- "Use gtest installation in `thirdparty/gtest` by default if available" OFF )
157-
158- option (YGGDRASIL_RAPIDJSON_BUILD_CXXMIN "Build yggdrasil_rapidjson with minimum C++ standard" OFF )
159- option (YGGDRASIL_RAPIDJSON_BUILD_CXX11 "Build yggdrasil_rapidjson with C++11" ON )
160- option (YGGDRASIL_RAPIDJSON_BUILD_CXX17 "Build yggdrasil_rapidjson with C++17" OFF )
161- option (YGGDRASIL_RAPIDJSON_BUILD_CXX20 "Build yggdrasil_rapidjson with C++20" OFF )
162- if (YGGDRASIL_RAPIDJSON_BUILD_CXX11)
163- set (CMAKE_CXX_STANDARD 11)
164- set (CMAKE_CXX_STANDARD_REQUIRED TRUE )
165- endif ()
166- if (YGGDRASIL_RAPIDJSON_BUILD_CXXMIN)
167- set (YGGDRASIL_RAPIDJSON_BUILD_CXX11 OFF )
168- set (YGGDRASIL_RAPIDJSON_BUILD_CXX17 OFF )
169- set (CMAKE_CXX_STANDARD 98)
170- set (CMAKE_CXX_STANDARD_REQUIRED TRUE )
171- endif ()
172-
173- find_program (CCACHE_FOUND ccache )
174- if (CCACHE_FOUND)
175- set_property (GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
176- set_property (GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
177- if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" )
178- set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS } -Qunused-arguments -fcolor-diagnostics" )
179- endif ()
180- endif (CCACHE_FOUND )
181-
182- find_program (VALGRIND_FOUND valgrind )
183+ yggdrasil_rapidjson_global_compiler_flags (CXX )
183184
185+ # Set flags based on CXX version options
184186if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" )
185- set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS } -Wall -Wextra -Werror" )
186- set (EXTRA_CXX_FLAGS -Weffc++ -Wswitch-default -Wfloat-equal -Wconversion -Wsign-conversion)
187187 if (YGGDRASIL_RAPIDJSON_BUILD_CXXMIN)
188188 set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS } -std=c++03 -Wc++0x-compat -Werror=unused-parameter" )
189189 elseif (YGGDRASIL_RAPIDJSON_BUILD_CXX11 AND CMAKE_VERSION VERSION_LESS 3.1)
@@ -198,20 +198,6 @@ if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
198198 set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS } -std=c++20" )
199199 endif ()
200200elseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang" )
201- if (NOT CMAKE_CROSSCOMPILING )
202- if (CMAKE_SYSTEM_PROCESSOR STREQUAL "powerpc" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "ppc" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "ppc64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "ppc64le" )
203- set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS } -mcpu=native" )
204- else ()
205- if (CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "arm64" )
206- set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS } -mcpu=apple-m1" )
207- else ()
208- #FIXME: x86 is -march=native, but doesn't mean every arch is this option. To keep original project's compatibility, I leave this except POWER.
209- set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS } -march=native" )
210- endif ()
211- endif ()
212- endif ()
213- set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS } -Wall -Wextra -Werror -Wno-missing-field-initializers" )
214- set (EXTRA_CXX_FLAGS -Weffc++ -Wswitch-default -Wfloat-equal -Wconversion -Wimplicit-fallthrough)
215201 if (YGGDRASIL_RAPIDJSON_BUILD_CXXMIN)
216202 set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS } -std=c++03 -Wc++0x-compat -Werror=unused-parameter" )
217203 elseif (YGGDRASIL_RAPIDJSON_BUILD_CXX11 AND CMAKE_VERSION VERSION_LESS 3.1)
@@ -222,9 +208,6 @@ elseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
222208 set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS } -std=c++20" )
223209 endif ()
224210elseif (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC" )
225- list (APPEND INTERFACE_PUBLIC_COMPILE_FLAGS
226- -D_CRT_SECURE_NO_WARNINGS=1 -DNOMINMAX)
227- set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS } /EHsc /bigobj /Zm10" )
228211 # CMake >= 3.10 should handle the above CMAKE_CXX_STANDARD fine, otherwise use /std:c++XX with MSVC >= 19.10
229212 if (YGGDRASIL_RAPIDJSON_BUILD_CXXMIN)
230213 set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS } /std:c++03 /Wc++0x-compat" )
@@ -235,14 +218,6 @@ elseif (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
235218 elseif (YGGDRASIL_RAPIDJSON_BUILD_CXX20 AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS "19.29" )
236219 set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS } /std:c++20" )
237220 endif ()
238- # Always compile with /WX
239- if (CMAKE_CXX_FLAGS MATCHES "/WX-" )
240- string (REGEX REPLACE "/WX-" "/WX" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS } " )
241- else ()
242- set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS } /WX" )
243- endif ()
244- elseif (CMAKE_CXX_COMPILER_ID MATCHES "XL" )
245- set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS } -qarch=auto" )
246221endif ()
247222
248223#add extra search paths for libraries and includes
@@ -262,7 +237,7 @@ SET(CMAKE_INSTALL_DIR "${_CMAKE_INSTALL_DIR}" CACHE PATH "The directory cmake fi
262237# ===============================
263238
264239# Version header
265- generate_version_header (
240+ yggdrasil_rapidjson_version_header (
266241 ${PROJECT_NAME_UPPER}
267242 ${PROJECT_VERSION }
268243 ${CMAKE_CURRENT_SOURCE_DIR } /include/${PROJECT_NAME_LOWER}/${PROJECT_NAME_LOWER}_version.h.in
@@ -284,26 +259,11 @@ else()
284259 $<BUILD_INTERFACE :${CMAKE_CURRENT_SOURCE_DIR } /include >
285260 )
286261endif ()
287- target_compile_options (
288- ${PROJECT_NAME } INTERFACE ${INTERFACE_PUBLIC_COMPILE_FLAGS}
289- )
290- target_link_options (
291- ${PROJECT_NAME } INTERFACE ${INTERFACE_PUBLIC_LINK_FLAGS}
292- )
293- target_include_directories (
294- ${PROJECT_NAME } INTERFACE ${INTERFACE_INCLUDE_DIRS}
295- )
296- target_link_libraries (
297- ${PROJECT_NAME } INTERFACE ${INTERFACE_LIBRARIES}
298- )
299262
300- # Set after interface library created
263+ yggdrasil_rapidjson_target_config ( ${ PROJECT_NAME } INTERFACE INTERFACE )
301264
302- list (APPEND EXTRA_CXX_FLAGS ${LOCAL_PUBLIC_COMPILE_FLAGS} )
303- add_compile_options (${LOCAL_PUBLIC_COMPILE_FLAGS} )
304- add_link_options (${LOCAL_PUBLIC_LINK_FLAGS} )
305- include_directories (${LOCAL_INCLUDE_DIRS} )
306- link_libraries (${PROJECT_NAME } ${LOCAL_LIBRARIES} )
265+ link_libraries (${PROJECT_NAME } )
266+ yggdrasil_rapidjson_global_config (CXX LOCAL )
307267
308268if (YGGDRASIL_RAPIDJSON_BUILD_DOC)
309269 add_subdirectory (doc )
0 commit comments