Permalink
Browse files

Add initial CMake support

 * Support for both in-source and out-of-source builds
 * Set library version to 0.12 to map Debian package
 * Add separate options to build tests, examples and documentation
 * Add pkgconfig lookup support (if installed with `make install`)
 * Add CMake lookup support (if isntalled with `make install`)
 * Add Google Test Source lookup
 * Add CTest support for running tests (use `make test` or `ctest -V`)
  • Loading branch information...
1 parent 8d4405c commit 8ae1c971ea833fed0640dd87abdeb3374ce890e7 @jollyroger jollyroger committed Nov 3, 2014
View
@@ -0,0 +1,85 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 2.8.11)
+SET(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/CMakeModules)
+
+PROJECT(RapidJSON CXX)
+
+set(LIB_MAJOR_VERSION "0")
+set(LIB_MINOR_VERSION "12")
+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
+SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Build Type")
+
+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)
+
+#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_SOURCE_DIR}/include)
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${RAPIDJSON_CXX_FLAGS}")
+
+if(RAPIDJSON_BUILD_DOC)
+ add_subdirectory(doc)
+endif()
+
+if(RAPIDJSON_BUILD_EXAMPLES)
+ add_subdirectory(example)
+endif()
+
+if(RAPIDJSON_BUILD_TESTS)
+ 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)
+
+# Provide config and version files to be used by other applications
+# ===============================
+
+export(PACKAGE ${PROJECT_NAME})
+
+# cmake-modules
+CONFIGURE_FILE(${PROJECT_NAME}Config.cmake.in
+ ${PROJECT_NAME}Config.cmake
+ @ONLY)
+CONFIGURE_FILE(${PROJECT_NAME}ConfigVersion.cmake.in
+ ${PROJECT_NAME}ConfigVersion.cmake
+ @ONLY)
+INSTALL(FILES
+ ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake
+ ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake
+ DESTINATION "${CMAKE_INSTALL_DIR}"
+ COMPONENT dev)
@@ -0,0 +1,22 @@
+SET(GTEST_SEARCH_PATH
+ "${GTEST_SOURCE_DIR}"
+ "${CMAKE_SOURCE_DIR}/thirdparty/gtest")
+
+IF(UNIX)
+ LIST(INSERT GTEST_SEARCH_PATH 1 "/usr/src/gtest")
+ENDIF()
+
+FIND_PATH(GTEST_SOURCE_DIR
+ NAMES CMakeLists.txt src/gtest_main.cc
+ PATHS ${GTEST_SEARCH_PATH})
+
+# Debian installs gtest include directory in /usr/include, thus need to look
+# for include directory separately from source directory.
+FIND_PATH(GTEST_INCLUDE_DIR
+ NAMES gtest/gtest.h
+ PATH_SUFFIXES include
+ PATHS ${GTEST_SEARCH_PATH})
+
+find_package_handle_standard_args(GTestSrc DEFAULT_MSG
+ GTEST_SOURCE_DIR
+ GTEST_INCLUDE_DIR)
View
@@ -0,0 +1,4 @@
+Name: @PROJECT_NAME@
+Description: RapidJSON is a JSON parser and generator for C++ inspired by RapidXml.
+Version: @LIB_VERSION_STRING@
+Cflags: -I${includedir}
@@ -0,0 +1,3 @@
+get_filename_component(RAPIDJSON_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH)
+set(RAPIDJSON_INCLUDE_DIRS "@INCLUDE_INSTALL_DIR@")
+message(STATUS "RapidJSON found. Headers: ${RAPIDJSON_INCLUDE_DIRS}")
@@ -0,0 +1,10 @@
+SET(PACKAGE_VERSION "@LIB_VERSION_STRING@")
+
+IF (PACKAGE_FIND_VERSION VERSION_EQUAL PACKAGE_VERSION)
+ SET(PACKAGE_VERSION_EXACT "true")
+ENDIF (PACKAGE_FIND_VERSION VERSION_EQUAL PACKAGE_VERSION)
+IF (NOT PACKAGE_FIND_VERSION VERSION_GREATER PACKAGE_VERSION)
+ SET(PACKAGE_VERSION_COMPATIBLE "true")
+ELSE (NOT PACKAGE_FIND_VERSION VERSION_GREATER PACKAGE_VERSION)
+ SET(PACKAGE_VERSION_UNSUITABLE "true")
+ENDIF (NOT PACKAGE_FIND_VERSION VERSION_GREATER PACKAGE_VERSION)
View
@@ -0,0 +1,23 @@
+find_package(Doxygen)
+
+IF(NOT DOXYGEN_FOUND)
+ MESSAGE(STATUS "No Doxygen found. Documentation won't be built")
+ELSE()
+ file(GLOB SOURCES ${CMAKE_SOURCE_DIR}/include/*)
+ file(GLOB MARKDOWN_DOC ${CMAKE_SOURCE_DIR}/doc/*.md)
+ list(APPEND MARKDOWN_DOC ${CMAKE_SOURCE_DIR}/readme.md)
+
+ CONFIGURE_FILE(Doxyfile.in Doxyfile @ONLY)
+
+ add_custom_command(OUTPUT html
+ COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
+ COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/html
+ DEPENDS ${MARKDOWN_DOC} ${SOURCES} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
+ WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
+ )
+
+ add_custom_target(doc ALL DEPENDS html)
+ install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/html
+ DESTINATION ${DOC_INSTALL_DIR}
+ COMPONENT doc)
+ENDIF()
@@ -58,7 +58,7 @@ PROJECT_LOGO =
# entered, it will be relative to the location where doxygen was started. If
# left blank the current directory will be used.
-OUTPUT_DIRECTORY = ./doc
+OUTPUT_DIRECTORY = @CMAKE_CURRENT_BINARY_DIR@
# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub-
# directories (in 2 levels) under the output directory of each output format and
@@ -0,0 +1,19 @@
+# Copyright (c) 2011 Milo Yip (miloyip@gmail.com)
+# Copyright (c) 2013 Rafal Jeczalik (rjeczalik@gmail.com)
+# Distributed under the MIT License (see license.txt file)
+
+set(EXAMPLES
+ capitalize
+ condense
+ messagereader
+ pretty
+ prettyauto
+ serialize
+ simpledom
+ simplereader
+ simplewriter
+ tutorial)
+
+foreach (example ${EXAMPLES})
+ add_executable(${example}_ ${example}/${example}.cpp)
+endforeach()
View
@@ -0,0 +1,17 @@
+find_package(GTestSrc)
+
+IF(GTESTSRC_FOUND)
+ enable_testing()
+
+ if (WIN32 AND (NOT CYGWIN) AND (NOT MINGW))
+ set(gtest_disable_pthreads ON)
+ endif()
+
+ add_subdirectory(${GTEST_SOURCE_DIR} ${CMAKE_BINARY_DIR}/googletest)
+ include_directories(${GTEST_INCLUDE_DIR})
+
+ set(TEST_LIBRARIES gtest gtest_main)
+
+ add_subdirectory(perftest)
+ add_subdirectory(unittest)
+ENDIF(GTESTSRC_FOUND)
@@ -0,0 +1,11 @@
+set(PERFTEST_SOURCES
+ misctest.cpp
+ perftest.cpp
+ platformtest.cpp
+ rapidjsontest.cpp)
+
+add_executable(perftest ${PERFTEST_SOURCES})
+target_link_libraries(perftest ${TEST_LIBRARIES})
+add_test(NAME perftest
+ COMMAND ${CMAKE_CURRENT_BINARY_DIR}/perftest
+ WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/bin)
@@ -0,0 +1,17 @@
+set(UNITTEST_SOURCES
+ documenttest.cpp
+ encodedstreamtest.cpp
+ encodingstest.cpp
+ filestreamtest.cpp
+ jsoncheckertest.cpp
+ readertest.cpp
+ unittest.cpp
+ unittest.h
+ valuetest.cpp
+ writertest.cpp)
+
+add_executable(unittest ${UNITTEST_SOURCES})
+target_link_libraries(unittest ${TEST_LIBRARIES})
+add_test(NAME unittest
+ COMMAND ${CMAKE_CURRENT_BINARY_DIR}/unittest
+ WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/bin)

0 comments on commit 8ae1c97

Please sign in to comment.