blob: f8927b4900dcd0253c1692b27bc29b09719c341a [file] [log] [blame]
Steve Hanson7cad78e2022-11-25 14:21:45 +00001CMAKE_MINIMUM_REQUIRED(VERSION 2.8.12)
Eli Fidler56bb9992016-05-31 10:46:52 -04002if(POLICY CMP0025)
3 # detect Apple's Clang
4 cmake_policy(SET CMP0025 NEW)
5endif()
Milo Yipaae2fbf2016-04-21 23:12:31 +08006if(POLICY CMP0054)
7 cmake_policy(SET CMP0054 NEW)
8endif()
9
Phyks89ad34c2015-05-12 00:23:50 +020010SET(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules)
Andriy Senkovych8ae1c972014-11-04 00:36:24 +020011
miloyip5ab1e932015-04-21 16:38:49 +080012set(LIB_MAJOR_VERSION "1")
Milo Yip17254e02016-08-25 14:35:17 +080013set(LIB_MINOR_VERSION "1")
14set(LIB_PATCH_VERSION "0")
Andriy Senkovych8ae1c972014-11-04 00:36:24 +020015set(LIB_VERSION_STRING "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_PATCH_VERSION}")
16
piratf46d980b2019-11-11 16:09:43 +080017if (CMAKE_VERSION VERSION_LESS 3.0)
18 PROJECT(RapidJSON CXX)
19else()
20 cmake_policy(SET CMP0048 NEW)
21 PROJECT(RapidJSON VERSION "${LIB_VERSION_STRING}" LANGUAGES CXX)
22endif()
23
Andriy Senkovych8ae1c972014-11-04 00:36:24 +020024# compile in release with debug info mode by default
Milo Yipb5156272016-01-31 01:17:29 +080025if(NOT CMAKE_BUILD_TYPE)
26 set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE)
27endif()
Andriy Senkovych8ae1c972014-11-04 00:36:24 +020028
Andriy Senkovychd69991f2014-11-11 17:16:51 +020029# Build all binaries in a separate directory
30SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
31
Andriy Senkovych8ae1c972014-11-04 00:36:24 +020032option(RAPIDJSON_BUILD_DOC "Build rapidjson documentation." ON)
33option(RAPIDJSON_BUILD_EXAMPLES "Build rapidjson examples." ON)
34option(RAPIDJSON_BUILD_TESTS "Build rapidjson perftests and unittests." ON)
Phyks89ad34c2015-05-12 00:23:50 +020035option(RAPIDJSON_BUILD_THIRDPARTY_GTEST
Andrii Senkovych04b67362015-04-21 13:10:08 +030036 "Use gtest installation in `thirdparty/gtest` by default if available" OFF)
Andriy Senkovych8ae1c972014-11-04 00:36:24 +020037
ylavice3366672021-03-29 17:42:30 +020038option(RAPIDJSON_BUILD_CXX11 "Build rapidjson with C++11" ON)
39option(RAPIDJSON_BUILD_CXX17 "Build rapidjson with C++17" OFF)
Rolf Eike Beerff59b612017-11-24 17:00:53 +010040if(RAPIDJSON_BUILD_CXX11)
41 set(CMAKE_CXX_STANDARD 11)
42 set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
43endif()
Milo Yipa6eb15d2016-01-23 14:37:15 +080044
Eli Fidler56bb9992016-05-31 10:46:52 -040045option(RAPIDJSON_BUILD_ASAN "Build rapidjson with address sanitizer (gcc/clang)" OFF)
46option(RAPIDJSON_BUILD_UBSAN "Build rapidjson with undefined behavior sanitizer (gcc/clang)" OFF)
47
M.Tayel7bd9b5a2017-10-16 15:01:27 +020048option(RAPIDJSON_ENABLE_INSTRUMENTATION_OPT "Build rapidjson with -march or -mcpu options" ON)
49
Andriy Senkovych40c03112014-11-12 01:57:25 +020050option(RAPIDJSON_HAS_STDSTRING "" OFF)
51if(RAPIDJSON_HAS_STDSTRING)
52 add_definitions(-DRAPIDJSON_HAS_STDSTRING)
53endif()
54
ylavic71f0fa72021-04-01 18:20:09 +020055option(RAPIDJSON_USE_MEMBERSMAP "" OFF)
56if(RAPIDJSON_USE_MEMBERSMAP)
57 add_definitions(-DRAPIDJSON_USE_MEMBERSMAP=1)
58endif()
59
Milo Yipae840f62016-01-04 09:27:53 +080060find_program(CCACHE_FOUND ccache)
61if(CCACHE_FOUND)
62 set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
63 set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
64 if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
65 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Qunused-arguments -fcolor-diagnostics")
66 endif()
67endif(CCACHE_FOUND)
68
Rolf Eike Beer4e1c7362017-11-24 15:46:44 +010069if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
Rolf Eike Beer4c9a28a2017-11-24 15:48:43 +010070 if(RAPIDJSON_ENABLE_INSTRUMENTATION_OPT AND NOT CMAKE_CROSSCOMPILING)
Rolf Eike Beer4e1c7362017-11-24 15:46:44 +010071 if(CMAKE_SYSTEM_PROCESSOR STREQUAL "powerpc" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "ppc64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "ppc64le")
M.Tayel7bd9b5a2017-10-16 15:01:27 +020072 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mcpu=native")
73 else()
74 #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.
75 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native")
76 endif()
Wu Zhaoc4db88a2016-10-26 17:27:54 +080077 endif()
78 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Werror")
Zhihao Yuan3cc77d52017-01-18 16:16:07 -060079 set(EXTRA_CXX_FLAGS -Weffc++ -Wswitch-default -Wfloat-equal -Wconversion -Wsign-conversion)
Rolf Eike Beerff59b612017-11-24 17:00:53 +010080 if (RAPIDJSON_BUILD_CXX11 AND CMAKE_VERSION VERSION_LESS 3.1)
Milo Yip2f5a69b2016-01-23 14:58:19 +080081 if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.7.0")
82 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
83 else()
84 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
85 endif()
ylavice3366672021-03-29 17:42:30 +020086 elseif (RAPIDJSON_BUILD_CXX17 AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS "5.0")
87 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")
Milo Yipa6eb15d2016-01-23 14:37:15 +080088 endif()
Eli Fidler56bb9992016-05-31 10:46:52 -040089 if (RAPIDJSON_BUILD_ASAN)
90 if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.8.0")
91 message(FATAL_ERROR "GCC < 4.8 doesn't support the address sanitizer")
92 else()
93 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address")
94 endif()
95 endif()
96 if (RAPIDJSON_BUILD_UBSAN)
97 if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.9.0")
98 message(FATAL_ERROR "GCC < 4.9 doesn't support the undefined behavior sanitizer")
99 else()
100 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined")
101 endif()
102 endif()
Andrii Senkovych3ae2a292015-02-11 14:10:09 +0200103elseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
Rolf Eike Beer4c9a28a2017-11-24 15:48:43 +0100104 if(NOT CMAKE_CROSSCOMPILING)
105 if(CMAKE_SYSTEM_PROCESSOR STREQUAL "powerpc" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "ppc64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "ppc64le")
106 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mcpu=native")
107 else()
108 #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.
109 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native")
110 endif()
Wu Zhaoc4db88a2016-10-26 17:27:54 +0800111 endif()
112 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Werror -Wno-missing-field-initializers")
Milo Yipf8eb7ba2017-05-12 10:32:06 +0800113 set(EXTRA_CXX_FLAGS -Weffc++ -Wswitch-default -Wfloat-equal -Wconversion -Wimplicit-fallthrough)
Rolf Eike Beerff59b612017-11-24 17:00:53 +0100114 if (RAPIDJSON_BUILD_CXX11 AND CMAKE_VERSION VERSION_LESS 3.1)
Milo Yipa6eb15d2016-01-23 14:37:15 +0800115 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
ylavice3366672021-03-29 17:42:30 +0200116 elseif (RAPIDJSON_BUILD_CXX17 AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.0")
117 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")
Milo Yipa6eb15d2016-01-23 14:37:15 +0800118 endif()
Eli Fidler56bb9992016-05-31 10:46:52 -0400119 if (RAPIDJSON_BUILD_ASAN)
120 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address")
121 endif()
122 if (RAPIDJSON_BUILD_UBSAN)
123 if (CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
124 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined-trap -fsanitize-undefined-trap-on-error")
125 else()
126 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined")
127 endif()
128 endif()
Rolf Eike Beer4e1c7362017-11-24 15:46:44 +0100129elseif (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
Andrii Senkovych122170b2015-02-19 22:41:31 +0200130 add_definitions(-D_CRT_SECURE_NO_WARNINGS=1)
Steve Hanson794248e2022-10-07 08:16:13 +0100131 add_definitions(-DNOMINMAX)
Milo Yipc843a262016-04-04 15:01:34 +0800132 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc")
ylavice3366672021-03-29 17:42:30 +0200133 # CMake >= 3.10 should handle the above CMAKE_CXX_STANDARD fine, otherwise use /std:c++XX with MSVC >= 19.10
134 if (RAPIDJSON_BUILD_CXX11 AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS "19.10")
135 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++11")
136 elseif (RAPIDJSON_BUILD_CXX17 AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS "19.14")
137 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++17")
138 endif()
139 # Always compile with /WX
140 if(CMAKE_CXX_FLAGS MATCHES "/WX-")
141 string(REGEX REPLACE "/WX-" "/WX" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
142 else()
143 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /WX")
144 endif()
Wu Zhaoc4db88a2016-10-26 17:27:54 +0800145elseif (CMAKE_CXX_COMPILER_ID MATCHES "XL")
146 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -qarch=auto")
Andrii Senkovych3ae2a292015-02-11 14:10:09 +0200147endif()
Andriy Senkovych40c03112014-11-12 01:57:25 +0200148
Andriy Senkovych8ae1c972014-11-04 00:36:24 +0200149#add extra search paths for libraries and includes
150SET(INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/include" CACHE PATH "The directory the headers are installed in")
151SET(LIB_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/lib" CACHE STRING "Directory where lib will install")
152SET(DOC_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/share/doc/${PROJECT_NAME}" CACHE PATH "Path to the documentation")
153
154IF(UNIX OR CYGWIN)
155 SET(_CMAKE_INSTALL_DIR "${LIB_INSTALL_DIR}/cmake/${PROJECT_NAME}")
156ELSEIF(WIN32)
157 SET(_CMAKE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/cmake")
158ENDIF()
luz.paz91521882018-02-19 06:42:52 -0500159SET(CMAKE_INSTALL_DIR "${_CMAKE_INSTALL_DIR}" CACHE PATH "The directory cmake files are installed in")
Andriy Senkovych8ae1c972014-11-04 00:36:24 +0200160
Phyks89ad34c2015-05-12 00:23:50 +0200161include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
Andriy Senkovych8ae1c972014-11-04 00:36:24 +0200162
163if(RAPIDJSON_BUILD_DOC)
164 add_subdirectory(doc)
165endif()
166
Andriy Senkovych40c03112014-11-12 01:57:25 +0200167add_custom_target(travis_doc)
168add_custom_command(TARGET travis_doc
169 COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/travis-doxygen.sh)
170
Andriy Senkovych8ae1c972014-11-04 00:36:24 +0200171if(RAPIDJSON_BUILD_EXAMPLES)
172 add_subdirectory(example)
173endif()
174
175if(RAPIDJSON_BUILD_TESTS)
unknown63ad11c2015-02-17 10:42:43 +0100176 if(MSVC11)
unknowna3398a82015-02-17 13:58:31 +0100177 # required for VS2012 due to missing support for variadic templates
178 add_definitions(-D_VARIADIC_MAX=10)
179 endif(MSVC11)
Andriy Senkovych8ae1c972014-11-04 00:36:24 +0200180 add_subdirectory(test)
181 include(CTest)
182endif()
183
184# pkg-config
185IF (UNIX OR CYGWIN)
186 CONFIGURE_FILE (${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}.pc.in
187 ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc
188 @ONLY)
189 INSTALL (FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc
190 DESTINATION "${LIB_INSTALL_DIR}/pkgconfig"
191 COMPONENT pkgconfig)
192ENDIF()
193
194install(FILES readme.md
195 DESTINATION "${DOC_INSTALL_DIR}"
196 COMPONENT doc)
197
198install(DIRECTORY include/rapidjson
199 DESTINATION "${INCLUDE_INSTALL_DIR}"
200 COMPONENT dev)
201
202install(DIRECTORY example/
203 DESTINATION "${DOC_INSTALL_DIR}/examples"
thebusytypist58cd2532015-03-24 13:50:02 +0800204 COMPONENT examples
205 # Following patterns are for excluding the intermediate/object files
206 # from an install of in-source CMake build.
207 PATTERN "CMakeFiles" EXCLUDE
208 PATTERN "Makefile" EXCLUDE
209 PATTERN "cmake_install.cmake" EXCLUDE)
Andriy Senkovych8ae1c972014-11-04 00:36:24 +0200210
211# Provide config and version files to be used by other applications
212# ===============================
213
Clemens Arthb91c5152017-03-14 10:27:36 +0100214################################################################################
215# Export package for use from the build tree
216EXPORT( PACKAGE ${PROJECT_NAME} )
Andriy Senkovych8ae1c972014-11-04 00:36:24 +0200217
Clemens Arthb91c5152017-03-14 10:27:36 +0100218# Create the RapidJSONConfig.cmake file for other cmake projects.
219# ... for the build tree
220SET( CONFIG_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
221SET( CONFIG_DIR ${CMAKE_CURRENT_BINARY_DIR})
Captain Crutches49526622017-10-08 23:43:18 -0400222SET( ${PROJECT_NAME}_INCLUDE_DIR "\${${PROJECT_NAME}_SOURCE_DIR}/include" )
Captain Crutches84ca4852017-10-02 20:39:40 -0400223
Clemens Arthb91c5152017-03-14 10:27:36 +0100224CONFIGURE_FILE( ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}Config.cmake.in
225 ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake @ONLY )
226CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}ConfigVersion.cmake.in
227 ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake @ONLY)
228
229# ... for the install tree
Ruslan Bilovol8d272e52019-01-24 18:11:39 +0200230SET( CMAKECONFIG_INSTALL_DIR ${LIB_INSTALL_DIR}/cmake/${PROJECT_NAME} )
Clemens Arthb91c5152017-03-14 10:27:36 +0100231FILE( RELATIVE_PATH REL_INCLUDE_DIR
Ruslan Bilovol8d272e52019-01-24 18:11:39 +0200232 "${CMAKECONFIG_INSTALL_DIR}"
Clemens Arthb91c5152017-03-14 10:27:36 +0100233 "${CMAKE_INSTALL_PREFIX}/include" )
234
235SET( ${PROJECT_NAME}_INCLUDE_DIR "\${${PROJECT_NAME}_CMAKE_DIR}/${REL_INCLUDE_DIR}" )
236SET( CONFIG_SOURCE_DIR )
237SET( CONFIG_DIR )
238CONFIGURE_FILE( ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}Config.cmake.in
239 ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${PROJECT_NAME}Config.cmake @ONLY )
240
241INSTALL(FILES "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${PROJECT_NAME}Config.cmake"
242 DESTINATION ${CMAKECONFIG_INSTALL_DIR} )
243
244# Install files
Ivan Le Lanne6736d12021-10-02 15:26:17 +0200245IF(CMAKE_INSTALL_DIR)
246 INSTALL(FILES
247 ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake
248 ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake
249 DESTINATION "${CMAKE_INSTALL_DIR}"
250 COMPONENT dev)
251ENDIF()