123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209 |
- CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
- if(POLICY CMP0025)
- # detect Apple's Clang
- cmake_policy(SET CMP0025 NEW)
- endif()
- if(POLICY CMP0054)
- cmake_policy(SET CMP0054 NEW)
- endif()
- SET(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules)
- PROJECT(RapidJSON CXX)
- set(LIB_MAJOR_VERSION "1")
- set(LIB_MINOR_VERSION "1")
- set(LIB_PATCH_VERSION "0")
- set(LIB_VERSION_STRING "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_PATCH_VERSION}")
- # compile in release with debug info mode by default
- if(NOT CMAKE_BUILD_TYPE)
- set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE)
- endif()
- # Build all binaries in a separate directory
- SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
- option(RAPIDJSON_BUILD_DOC "Build rapidjson documentation." ON)
- option(RAPIDJSON_BUILD_EXAMPLES "Build rapidjson examples." ON)
- option(RAPIDJSON_BUILD_TESTS "Build rapidjson perftests and unittests." ON)
- option(RAPIDJSON_BUILD_THIRDPARTY_GTEST
- "Use gtest installation in `thirdparty/gtest` by default if available" OFF)
- option(RAPIDJSON_BUILD_CXX11 "Build rapidjson with C++11 (gcc/clang)" ON)
- option(RAPIDJSON_BUILD_ASAN "Build rapidjson with address sanitizer (gcc/clang)" OFF)
- option(RAPIDJSON_BUILD_UBSAN "Build rapidjson with undefined behavior sanitizer (gcc/clang)" OFF)
- option(RAPIDJSON_HAS_STDSTRING "" OFF)
- if(RAPIDJSON_HAS_STDSTRING)
- add_definitions(-DRAPIDJSON_HAS_STDSTRING)
- endif()
- find_program(CCACHE_FOUND ccache)
- if(CCACHE_FOUND)
- set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
- set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
- if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Qunused-arguments -fcolor-diagnostics")
- endif()
- endif(CCACHE_FOUND)
- if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
- if(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "powerpc" OR ${CMAKE_SYSTEM_PROCESSOR} STREQUAL "ppc64" OR ${CMAKE_SYSTEM_PROCESSOR} STREQUAL "ppc64le")
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mcpu=native")
- else()
- #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.
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native")
- endif()
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Werror")
- set(EXTRA_CXX_FLAGS -Weffc++ -Wswitch-default -Wfloat-equal -Wconversion -Wsign-conversion)
- if (RAPIDJSON_BUILD_CXX11)
- if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.7.0")
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
- else()
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
- endif()
- endif()
- if (RAPIDJSON_BUILD_ASAN)
- if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.8.0")
- message(FATAL_ERROR "GCC < 4.8 doesn't support the address sanitizer")
- else()
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address")
- endif()
- endif()
- if (RAPIDJSON_BUILD_UBSAN)
- if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.9.0")
- message(FATAL_ERROR "GCC < 4.9 doesn't support the undefined behavior sanitizer")
- else()
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined")
- endif()
- endif()
- elseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
- if(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "powerpc" OR ${CMAKE_SYSTEM_PROCESSOR} STREQUAL "ppc64" OR ${CMAKE_SYSTEM_PROCESSOR} STREQUAL "ppc64le")
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mcpu=native")
- else()
- #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.
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native")
- endif()
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Werror -Wno-missing-field-initializers")
- set(EXTRA_CXX_FLAGS -Weffc++ -Wswitch-default -Wfloat-equal -Wconversion -Wimplicit-fallthrough -Weverything)
- if (RAPIDJSON_BUILD_CXX11)
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
- endif()
- if (RAPIDJSON_BUILD_ASAN)
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address")
- endif()
- if (RAPIDJSON_BUILD_UBSAN)
- if (CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined-trap -fsanitize-undefined-trap-on-error")
- else()
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined")
- endif()
- endif()
- elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
- add_definitions(-D_CRT_SECURE_NO_WARNINGS=1)
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc")
- elseif (CMAKE_CXX_COMPILER_ID MATCHES "XL")
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -qarch=auto")
- endif()
- #add extra search paths for libraries and includes
- SET(INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/include" CACHE PATH "The directory the headers are installed in")
- SET(LIB_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/lib" CACHE STRING "Directory where lib will install")
- SET(DOC_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/share/doc/${PROJECT_NAME}" CACHE PATH "Path to the documentation")
- IF(UNIX OR CYGWIN)
- SET(_CMAKE_INSTALL_DIR "${LIB_INSTALL_DIR}/cmake/${PROJECT_NAME}")
- ELSEIF(WIN32)
- SET(_CMAKE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/cmake")
- ENDIF()
- SET(CMAKE_INSTALL_DIR "${_CMAKE_INSTALL_DIR}" CACHE PATH "The directory cmake fiels are installed in")
- include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
- if(RAPIDJSON_BUILD_DOC)
- add_subdirectory(doc)
- endif()
- add_custom_target(travis_doc)
- add_custom_command(TARGET travis_doc
- COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/travis-doxygen.sh)
- if(RAPIDJSON_BUILD_EXAMPLES)
- add_subdirectory(example)
- endif()
- if(RAPIDJSON_BUILD_TESTS)
- if(MSVC11)
- # required for VS2012 due to missing support for variadic templates
- add_definitions(-D_VARIADIC_MAX=10)
- endif(MSVC11)
- add_subdirectory(test)
- include(CTest)
- endif()
- # pkg-config
- IF (UNIX OR CYGWIN)
- CONFIGURE_FILE (${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}.pc.in
- ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc
- @ONLY)
- INSTALL (FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc
- DESTINATION "${LIB_INSTALL_DIR}/pkgconfig"
- COMPONENT pkgconfig)
- ENDIF()
- install(FILES readme.md
- DESTINATION "${DOC_INSTALL_DIR}"
- COMPONENT doc)
- install(DIRECTORY include/rapidjson
- DESTINATION "${INCLUDE_INSTALL_DIR}"
- COMPONENT dev)
- install(DIRECTORY example/
- DESTINATION "${DOC_INSTALL_DIR}/examples"
- COMPONENT examples
- # Following patterns are for excluding the intermediate/object files
- # from an install of in-source CMake build.
- PATTERN "CMakeFiles" EXCLUDE
- PATTERN "Makefile" EXCLUDE
- PATTERN "cmake_install.cmake" EXCLUDE)
- # Provide config and version files to be used by other applications
- # ===============================
- ################################################################################
- # Export package for use from the build tree
- EXPORT( PACKAGE ${PROJECT_NAME} )
- # Create the RapidJSONConfig.cmake file for other cmake projects.
- # ... for the build tree
- SET( CONFIG_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
- SET( CONFIG_DIR ${CMAKE_CURRENT_BINARY_DIR})
- CONFIGURE_FILE( ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}Config.cmake.in
- ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake @ONLY )
- CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}ConfigVersion.cmake.in
- ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake @ONLY)
- # ... for the install tree
- SET( CMAKECONFIG_INSTALL_DIR lib/cmake/${PROJECT_NAME} )
- FILE( RELATIVE_PATH REL_INCLUDE_DIR
- "${CMAKE_INSTALL_PREFIX}/${CMAKECONFIG_INSTALL_DIR}"
- "${CMAKE_INSTALL_PREFIX}/include" )
- SET( ${PROJECT_NAME}_INCLUDE_DIR "\${${PROJECT_NAME}_CMAKE_DIR}/${REL_INCLUDE_DIR}" )
- SET( CONFIG_SOURCE_DIR )
- SET( CONFIG_DIR )
- CONFIGURE_FILE( ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}Config.cmake.in
- ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${PROJECT_NAME}Config.cmake @ONLY )
- INSTALL(FILES "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${PROJECT_NAME}Config.cmake"
- DESTINATION ${CMAKECONFIG_INSTALL_DIR} )
- # Install files
- INSTALL(FILES
- ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake
- ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake
- DESTINATION "${CMAKE_INSTALL_DIR}"
- COMPONENT dev)
|