CMakeLists.txt 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
  2. if(POLICY CMP0025)
  3. # detect Apple's Clang
  4. cmake_policy(SET CMP0025 NEW)
  5. endif()
  6. if(POLICY CMP0054)
  7. cmake_policy(SET CMP0054 NEW)
  8. endif()
  9. SET(CMAKE_MODULE_PATH CMakeModules)
  10. set(LIB_MAJOR_VERSION "1")
  11. set(LIB_MINOR_VERSION "1")
  12. set(LIB_PATCH_VERSION "0")
  13. set(LIB_VERSION_STRING "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_PATCH_VERSION}")
  14. if (CMAKE_VERSION VERSION_LESS 3.0)
  15. PROJECT(RapidJSON CXX)
  16. else()
  17. cmake_policy(SET CMP0048 NEW)
  18. PROJECT(RapidJSON VERSION "${LIB_VERSION_STRING}" LANGUAGES CXX)
  19. endif()
  20. # compile in release with debug info mode by default
  21. if(NOT CMAKE_BUILD_TYPE)
  22. set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE)
  23. endif()
  24. # Build all binaries in a separate directory
  25. SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
  26. option(RAPIDJSON_BUILD_DOC "Build rapidjson documentation." ON)
  27. option(RAPIDJSON_BUILD_EXAMPLES "Build rapidjson examples." ON)
  28. option(RAPIDJSON_BUILD_TESTS "Build rapidjson perftests and unittests." ON)
  29. option(RAPIDJSON_BUILD_THIRDPARTY_GTEST
  30. "Use gtest installation in `thirdparty/gtest` by default if available" OFF)
  31. option(RAPIDJSON_BUILD_CXX11 "Build rapidjson with C++11 (gcc/clang)" ON)
  32. if(RAPIDJSON_BUILD_CXX11)
  33. set(CMAKE_CXX_STANDARD 11)
  34. set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
  35. endif()
  36. option(RAPIDJSON_BUILD_ASAN "Build rapidjson with address sanitizer (gcc/clang)" OFF)
  37. option(RAPIDJSON_BUILD_UBSAN "Build rapidjson with undefined behavior sanitizer (gcc/clang)" OFF)
  38. option(RAPIDJSON_ENABLE_INSTRUMENTATION_OPT "Build rapidjson with -march or -mcpu options" ON)
  39. option(RAPIDJSON_HAS_STDSTRING "" OFF)
  40. if(RAPIDJSON_HAS_STDSTRING)
  41. add_definitions(-DRAPIDJSON_HAS_STDSTRING)
  42. endif()
  43. find_program(CCACHE_FOUND ccache)
  44. if(CCACHE_FOUND)
  45. set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
  46. set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
  47. if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  48. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Qunused-arguments -fcolor-diagnostics")
  49. endif()
  50. endif(CCACHE_FOUND)
  51. if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
  52. if(RAPIDJSON_ENABLE_INSTRUMENTATION_OPT AND NOT CMAKE_CROSSCOMPILING)
  53. if(CMAKE_SYSTEM_PROCESSOR STREQUAL "powerpc" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "ppc64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "ppc64le")
  54. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mcpu=native")
  55. else()
  56. #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.
  57. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native")
  58. endif()
  59. endif()
  60. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Werror")
  61. set(EXTRA_CXX_FLAGS -Weffc++ -Wswitch-default -Wfloat-equal -Wconversion -Wsign-conversion)
  62. if (RAPIDJSON_BUILD_CXX11 AND CMAKE_VERSION VERSION_LESS 3.1)
  63. if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.7.0")
  64. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
  65. else()
  66. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
  67. endif()
  68. endif()
  69. if (RAPIDJSON_BUILD_ASAN)
  70. if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.8.0")
  71. message(FATAL_ERROR "GCC < 4.8 doesn't support the address sanitizer")
  72. else()
  73. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address")
  74. endif()
  75. endif()
  76. if (RAPIDJSON_BUILD_UBSAN)
  77. if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.9.0")
  78. message(FATAL_ERROR "GCC < 4.9 doesn't support the undefined behavior sanitizer")
  79. else()
  80. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined")
  81. endif()
  82. endif()
  83. elseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  84. if(NOT CMAKE_CROSSCOMPILING)
  85. if(CMAKE_SYSTEM_PROCESSOR STREQUAL "powerpc" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "ppc64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "ppc64le")
  86. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mcpu=native")
  87. else()
  88. #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.
  89. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native")
  90. endif()
  91. endif()
  92. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Werror -Wno-missing-field-initializers")
  93. set(EXTRA_CXX_FLAGS -Weffc++ -Wswitch-default -Wfloat-equal -Wconversion -Wimplicit-fallthrough)
  94. if (RAPIDJSON_BUILD_CXX11 AND CMAKE_VERSION VERSION_LESS 3.1)
  95. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
  96. endif()
  97. if (RAPIDJSON_BUILD_ASAN)
  98. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address")
  99. endif()
  100. if (RAPIDJSON_BUILD_UBSAN)
  101. if (CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
  102. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined-trap -fsanitize-undefined-trap-on-error")
  103. else()
  104. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined")
  105. endif()
  106. endif()
  107. elseif (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
  108. add_definitions(-D_CRT_SECURE_NO_WARNINGS=1)
  109. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc")
  110. elseif (CMAKE_CXX_COMPILER_ID MATCHES "XL")
  111. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -qarch=auto")
  112. endif()
  113. #add extra search paths for libraries and includes
  114. SET(INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/include" CACHE PATH "The directory the headers are installed in")
  115. SET(LIB_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/lib" CACHE STRING "Directory where lib will install")
  116. SET(DOC_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/share/doc/${PROJECT_NAME}" CACHE PATH "Path to the documentation")
  117. IF(UNIX OR CYGWIN)
  118. SET(_CMAKE_INSTALL_DIR "${LIB_INSTALL_DIR}/cmake/${PROJECT_NAME}")
  119. ELSEIF(WIN32)
  120. SET(_CMAKE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/cmake")
  121. ENDIF()
  122. SET(CMAKE_INSTALL_DIR "${_CMAKE_INSTALL_DIR}" CACHE PATH "The directory cmake files are installed in")
  123. include_directories(include)
  124. if(RAPIDJSON_BUILD_DOC)
  125. add_subdirectory(doc)
  126. endif()
  127. add_custom_target(travis_doc)
  128. add_custom_command(TARGET travis_doc
  129. COMMAND travis-doxygen.sh)
  130. if(RAPIDJSON_BUILD_EXAMPLES)
  131. add_subdirectory(example)
  132. endif()
  133. if(RAPIDJSON_BUILD_TESTS)
  134. if(MSVC11)
  135. # required for VS2012 due to missing support for variadic templates
  136. add_definitions(-D_VARIADIC_MAX=10)
  137. endif(MSVC11)
  138. add_subdirectory(test)
  139. include(CTest)
  140. endif()
  141. # pkg-config
  142. IF (UNIX OR CYGWIN)
  143. CONFIGURE_FILE (${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}.pc.in
  144. ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc
  145. @ONLY)
  146. INSTALL (FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc
  147. DESTINATION "${LIB_INSTALL_DIR}/pkgconfig"
  148. COMPONENT pkgconfig)
  149. ENDIF()
  150. install(FILES readme.md
  151. DESTINATION "${DOC_INSTALL_DIR}"
  152. COMPONENT doc)
  153. install(DIRECTORY include/rapidjson
  154. DESTINATION "${INCLUDE_INSTALL_DIR}"
  155. COMPONENT dev)
  156. install(DIRECTORY example
  157. DESTINATION "${DOC_INSTALL_DIR}/examples"
  158. COMPONENT examples
  159. # Following patterns are for excluding the intermediate/object files
  160. # from an install of in-source CMake build.
  161. PATTERN "CMakeFiles" EXCLUDE
  162. PATTERN "Makefile" EXCLUDE
  163. PATTERN "cmake_install.cmake" EXCLUDE)
  164. # Provide config and version files to be used by other applications
  165. # ===============================
  166. ################################################################################
  167. # Export package for use from the build tree
  168. EXPORT( PACKAGE ${PROJECT_NAME} )
  169. # Create the RapidJSONConfig.cmake file for other cmake projects.
  170. # ... for the build tree
  171. SET( CONFIG_SOURCE_DIR .)
  172. SET( CONFIG_DIR ${CMAKE_CURRENT_BINARY_DIR})
  173. SET( ${PROJECT_NAME}_INCLUDE_DIR "\${${PROJECT_NAME}_SOURCE_DIR}/include" )
  174. CONFIGURE_FILE( ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}Config.cmake.in
  175. ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake @ONLY )
  176. CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}ConfigVersion.cmake.in
  177. ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake @ONLY)
  178. # ... for the install tree
  179. SET( CMAKECONFIG_INSTALL_DIR ${LIB_INSTALL_DIR}/cmake/${PROJECT_NAME} )
  180. FILE( RELATIVE_PATH REL_INCLUDE_DIR
  181. "${CMAKECONFIG_INSTALL_DIR}"
  182. "${CMAKE_INSTALL_PREFIX}/include" )
  183. SET( ${PROJECT_NAME}_INCLUDE_DIR "\${${PROJECT_NAME}_CMAKE_DIR}/${REL_INCLUDE_DIR}" )
  184. SET( CONFIG_SOURCE_DIR )
  185. SET( CONFIG_DIR )
  186. CONFIGURE_FILE( ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}Config.cmake.in
  187. ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${PROJECT_NAME}Config.cmake @ONLY )
  188. INSTALL(FILES "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${PROJECT_NAME}Config.cmake"
  189. DESTINATION ${CMAKECONFIG_INSTALL_DIR} )
  190. # Install files
  191. INSTALL(FILES
  192. ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake
  193. ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake
  194. DESTINATION "${CMAKE_INSTALL_DIR}"
  195. COMPONENT dev)