CMakeLists.txt 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  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 ${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules)
  10. PROJECT(RapidJSON CXX)
  11. set(LIB_MAJOR_VERSION "1")
  12. set(LIB_MINOR_VERSION "1")
  13. set(LIB_PATCH_VERSION "0")
  14. set(LIB_VERSION_STRING "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_PATCH_VERSION}")
  15. # compile in release with debug info mode by default
  16. if(NOT CMAKE_BUILD_TYPE)
  17. set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE)
  18. endif()
  19. # Build all binaries in a separate directory
  20. SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
  21. option(RAPIDJSON_BUILD_DOC "Build rapidjson documentation." ON)
  22. option(RAPIDJSON_BUILD_EXAMPLES "Build rapidjson examples." ON)
  23. option(RAPIDJSON_BUILD_TESTS "Build rapidjson perftests and unittests." ON)
  24. option(RAPIDJSON_BUILD_THIRDPARTY_GTEST
  25. "Use gtest installation in `thirdparty/gtest` by default if available" OFF)
  26. option(RAPIDJSON_BUILD_CXX11 "Build rapidjson with C++11 (gcc/clang)" ON)
  27. option(RAPIDJSON_BUILD_ASAN "Build rapidjson with address sanitizer (gcc/clang)" OFF)
  28. option(RAPIDJSON_BUILD_UBSAN "Build rapidjson with undefined behavior sanitizer (gcc/clang)" OFF)
  29. option(RAPIDJSON_HAS_STDSTRING "" OFF)
  30. if(RAPIDJSON_HAS_STDSTRING)
  31. add_definitions(-DRAPIDJSON_HAS_STDSTRING)
  32. endif()
  33. find_program(CCACHE_FOUND ccache)
  34. if(CCACHE_FOUND)
  35. set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
  36. set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
  37. if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  38. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Qunused-arguments -fcolor-diagnostics")
  39. endif()
  40. endif(CCACHE_FOUND)
  41. if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
  42. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native -Wall -Wextra -Werror")
  43. if (RAPIDJSON_BUILD_CXX11)
  44. if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.7.0")
  45. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
  46. else()
  47. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
  48. endif()
  49. endif()
  50. if (RAPIDJSON_BUILD_ASAN)
  51. if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.8.0")
  52. message(FATAL_ERROR "GCC < 4.8 doesn't support the address sanitizer")
  53. else()
  54. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address")
  55. endif()
  56. endif()
  57. if (RAPIDJSON_BUILD_UBSAN)
  58. if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.9.0")
  59. message(FATAL_ERROR "GCC < 4.9 doesn't support the undefined behavior sanitizer")
  60. else()
  61. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined")
  62. endif()
  63. endif()
  64. elseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  65. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native -Wall -Wextra -Werror -Wno-missing-field-initializers")
  66. if (RAPIDJSON_BUILD_CXX11)
  67. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
  68. endif()
  69. if (RAPIDJSON_BUILD_ASAN)
  70. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address")
  71. endif()
  72. if (RAPIDJSON_BUILD_UBSAN)
  73. if (CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
  74. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined-trap -fsanitize-undefined-trap-on-error")
  75. else()
  76. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined")
  77. endif()
  78. endif()
  79. elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
  80. add_definitions(-D_CRT_SECURE_NO_WARNINGS=1)
  81. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc")
  82. endif()
  83. #add extra search paths for libraries and includes
  84. SET(INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/include" CACHE PATH "The directory the headers are installed in")
  85. SET(LIB_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/lib" CACHE STRING "Directory where lib will install")
  86. SET(DOC_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/share/doc/${PROJECT_NAME}" CACHE PATH "Path to the documentation")
  87. IF(UNIX OR CYGWIN)
  88. SET(_CMAKE_INSTALL_DIR "${LIB_INSTALL_DIR}/cmake/${PROJECT_NAME}")
  89. ELSEIF(WIN32)
  90. SET(_CMAKE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/cmake")
  91. ENDIF()
  92. SET(CMAKE_INSTALL_DIR "${_CMAKE_INSTALL_DIR}" CACHE PATH "The directory cmake fiels are installed in")
  93. include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
  94. if(RAPIDJSON_BUILD_DOC)
  95. add_subdirectory(doc)
  96. endif()
  97. add_custom_target(travis_doc)
  98. add_custom_command(TARGET travis_doc
  99. COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/travis-doxygen.sh)
  100. if(RAPIDJSON_BUILD_EXAMPLES)
  101. add_subdirectory(example)
  102. endif()
  103. if(RAPIDJSON_BUILD_TESTS)
  104. if(MSVC11)
  105. # required for VS2012 due to missing support for variadic templates
  106. add_definitions(-D_VARIADIC_MAX=10)
  107. endif(MSVC11)
  108. add_subdirectory(test)
  109. include(CTest)
  110. endif()
  111. # pkg-config
  112. IF (UNIX OR CYGWIN)
  113. CONFIGURE_FILE (${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}.pc.in
  114. ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc
  115. @ONLY)
  116. INSTALL (FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc
  117. DESTINATION "${LIB_INSTALL_DIR}/pkgconfig"
  118. COMPONENT pkgconfig)
  119. ENDIF()
  120. install(FILES readme.md
  121. DESTINATION "${DOC_INSTALL_DIR}"
  122. COMPONENT doc)
  123. install(DIRECTORY include/rapidjson
  124. DESTINATION "${INCLUDE_INSTALL_DIR}"
  125. COMPONENT dev)
  126. install(DIRECTORY example/
  127. DESTINATION "${DOC_INSTALL_DIR}/examples"
  128. COMPONENT examples
  129. # Following patterns are for excluding the intermediate/object files
  130. # from an install of in-source CMake build.
  131. PATTERN "CMakeFiles" EXCLUDE
  132. PATTERN "Makefile" EXCLUDE
  133. PATTERN "cmake_install.cmake" EXCLUDE)
  134. # Provide config and version files to be used by other applications
  135. # ===============================
  136. export(PACKAGE ${PROJECT_NAME})
  137. # cmake-modules
  138. CONFIGURE_FILE(${PROJECT_NAME}Config.cmake.in
  139. ${PROJECT_NAME}Config.cmake
  140. @ONLY)
  141. CONFIGURE_FILE(${PROJECT_NAME}ConfigVersion.cmake.in
  142. ${PROJECT_NAME}ConfigVersion.cmake
  143. @ONLY)
  144. INSTALL(FILES
  145. ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake
  146. ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake
  147. DESTINATION "${CMAKE_INSTALL_DIR}"
  148. COMPONENT dev)