CMakeLists.txt 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. # vim: et ts=4 sts=4 sw=4 tw=0
  2. CMAKE_MINIMUM_REQUIRED(VERSION 3.1)
  3. PROJECT(jsoncpp)
  4. ENABLE_TESTING()
  5. OPTION(JSONCPP_WITH_TESTS "Compile and (for jsoncpp_check) run JsonCpp test executables" ON)
  6. OPTION(JSONCPP_WITH_POST_BUILD_UNITTEST "Automatically run unit-tests as a post build step" ON)
  7. OPTION(JSONCPP_WITH_WARNING_AS_ERROR "Force compilation to fail if a warning occurs" OFF)
  8. OPTION(JSONCPP_WITH_STRICT_ISO "Issue all the warnings demanded by strict ISO C and ISO C++" ON)
  9. OPTION(JSONCPP_WITH_PKGCONFIG_SUPPORT "Generate and install .pc files" ON)
  10. OPTION(JSONCPP_WITH_CMAKE_PACKAGE "Generate and install cmake package files" ON)
  11. OPTION(BUILD_SHARED_LIBS "Build jsoncpp_lib as a shared library." OFF)
  12. OPTION(BUILD_STATIC_LIBS "Build jsoncpp_lib static library." ON)
  13. # Ensures that CMAKE_BUILD_TYPE is visible in cmake-gui on Unix
  14. IF(NOT WIN32)
  15. IF(NOT CMAKE_BUILD_TYPE)
  16. SET(CMAKE_BUILD_TYPE Release CACHE STRING
  17. "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel Coverage."
  18. FORCE)
  19. ENDIF()
  20. ENDIF()
  21. # Enable runtime search path support for dynamic libraries on OSX
  22. IF(APPLE)
  23. SET(CMAKE_MACOSX_RPATH 1)
  24. ENDIF()
  25. # Adhere to GNU filesystem layout conventions
  26. INCLUDE(GNUInstallDirs)
  27. SET(DEBUG_LIBNAME_SUFFIX "" CACHE STRING "Optional suffix to append to the library name for a debug build")
  28. # Set variable named ${VAR_NAME} to value ${VALUE}
  29. FUNCTION(set_using_dynamic_name VAR_NAME VALUE)
  30. SET( "${VAR_NAME}" "${VALUE}" PARENT_SCOPE)
  31. ENDFUNCTION()
  32. # Extract major, minor, patch from version text
  33. # Parse a version string "X.Y.Z" and outputs
  34. # version parts in ${OUPUT_PREFIX}_MAJOR, _MINOR, _PATCH.
  35. # If parse succeeds then ${OUPUT_PREFIX}_FOUND is TRUE.
  36. MACRO(jsoncpp_parse_version VERSION_TEXT OUPUT_PREFIX)
  37. SET(VERSION_REGEX "[0-9]+\\.[0-9]+\\.[0-9]+(-[a-zA-Z0-9_]+)?")
  38. IF( ${VERSION_TEXT} MATCHES ${VERSION_REGEX} )
  39. STRING(REGEX MATCHALL "[0-9]+|-([A-Za-z0-9_]+)" VERSION_PARTS ${VERSION_TEXT})
  40. LIST(GET VERSION_PARTS 0 ${OUPUT_PREFIX}_MAJOR)
  41. LIST(GET VERSION_PARTS 1 ${OUPUT_PREFIX}_MINOR)
  42. LIST(GET VERSION_PARTS 2 ${OUPUT_PREFIX}_PATCH)
  43. set_using_dynamic_name( "${OUPUT_PREFIX}_FOUND" TRUE )
  44. ELSE( ${VERSION_TEXT} MATCHES ${VERSION_REGEX} )
  45. set_using_dynamic_name( "${OUPUT_PREFIX}_FOUND" FALSE )
  46. ENDIF()
  47. ENDMACRO()
  48. # Read out version from "version" file
  49. #FILE(STRINGS "version" JSONCPP_VERSION)
  50. #SET( JSONCPP_VERSION_MAJOR X )
  51. #SET( JSONCPP_VERSION_MINOR Y )
  52. #SET( JSONCPP_VERSION_PATCH Z )
  53. SET( JSONCPP_VERSION 1.8.4 )
  54. jsoncpp_parse_version( ${JSONCPP_VERSION} JSONCPP_VERSION )
  55. #IF(NOT JSONCPP_VERSION_FOUND)
  56. # MESSAGE(FATAL_ERROR "Failed to parse version string properly. Expect X.Y.Z")
  57. #ENDIF(NOT JSONCPP_VERSION_FOUND)
  58. SET( JSONCPP_SOVERSION 19 )
  59. SET( JSONCPP_USE_SECURE_MEMORY "0" CACHE STRING "-D...=1 to use memory-wiping allocator for STL" )
  60. MESSAGE(STATUS "JsonCpp Version: ${JSONCPP_VERSION_MAJOR}.${JSONCPP_VERSION_MINOR}.${JSONCPP_VERSION_PATCH}")
  61. # File version.h is only regenerated on CMake configure step
  62. CONFIGURE_FILE( "${PROJECT_SOURCE_DIR}/src/lib_json/version.h.in"
  63. "${PROJECT_SOURCE_DIR}/include/json/version.h"
  64. NEWLINE_STYLE UNIX )
  65. CONFIGURE_FILE( "${PROJECT_SOURCE_DIR}/version.in"
  66. "${PROJECT_SOURCE_DIR}/version"
  67. NEWLINE_STYLE UNIX )
  68. MACRO(UseCompilationWarningAsError)
  69. IF(MSVC)
  70. # Only enabled in debug because some old versions of VS STL generate
  71. # warnings when compiled in release configuration.
  72. SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /WX ")
  73. ELSEIF(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
  74. SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror")
  75. IF(JSONCPP_WITH_STRICT_ISO)
  76. SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic-errors")
  77. ENDIF()
  78. ENDIF()
  79. ENDMACRO()
  80. # Include our configuration header
  81. INCLUDE_DIRECTORIES( ${jsoncpp_SOURCE_DIR}/include )
  82. IF(MSVC)
  83. # Only enabled in debug because some old versions of VS STL generate
  84. # unreachable code warning when compiled in release configuration.
  85. SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /W4 ")
  86. ENDIF()
  87. # Require C++11 support, prefer ISO C++ over GNU variants,
  88. # as relying solely on ISO C++ is more portable.
  89. SET(CMAKE_CXX_STANDARD 11)
  90. SET(CMAKE_CXX_STANDARD_REQUIRED ON)
  91. SET(CMAKE_CXX_EXTENSIONS OFF)
  92. IF(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  93. # using regular Clang or AppleClang
  94. SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wconversion -Wshadow -Werror=conversion -Werror=sign-compare")
  95. ELSEIF(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
  96. # using GCC
  97. SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wconversion -Wshadow -Wextra")
  98. # not yet ready for -Wsign-conversion
  99. IF(JSONCPP_WITH_STRICT_ISO)
  100. SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic")
  101. ENDIF()
  102. IF(JSONCPP_WITH_WARNING_AS_ERROR)
  103. SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror=conversion")
  104. ENDIF()
  105. ELSEIF(CMAKE_CXX_COMPILER_ID STREQUAL "Intel")
  106. # using Intel compiler
  107. SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wconversion -Wshadow -Wextra -Werror=conversion")
  108. IF(JSONCPP_WITH_STRICT_ISO AND NOT JSONCPP_WITH_WARNING_AS_ERROR)
  109. SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic")
  110. ENDIF()
  111. ENDIF()
  112. FIND_PROGRAM(CCACHE_FOUND ccache)
  113. IF(CCACHE_FOUND)
  114. SET_PROPERTY(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
  115. SET_PROPERTY(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
  116. ENDIF(CCACHE_FOUND)
  117. IF(JSONCPP_WITH_WARNING_AS_ERROR)
  118. UseCompilationWarningAsError()
  119. ENDIF()
  120. IF(JSONCPP_WITH_PKGCONFIG_SUPPORT)
  121. CONFIGURE_FILE(
  122. "pkg-config/jsoncpp.pc.in"
  123. "pkg-config/jsoncpp.pc"
  124. @ONLY)
  125. INSTALL(FILES "${CMAKE_CURRENT_BINARY_DIR}/pkg-config/jsoncpp.pc"
  126. DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
  127. ENDIF()
  128. IF(JSONCPP_WITH_CMAKE_PACKAGE)
  129. INSTALL(EXPORT jsoncpp
  130. DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/jsoncpp
  131. FILE jsoncppConfig.cmake)
  132. ENDIF()
  133. # Build the different applications
  134. ADD_SUBDIRECTORY( src )
  135. #install the includes
  136. ADD_SUBDIRECTORY( include )