blob: e1d324aabd96709c0da5ffcfd4bff64d5e71cb23 [file] [log] [blame]
Christopher Dunn295e73f2015-03-05 18:14:58 -06001# vim: et ts=4 sts=4 sw=4 tw=0
2
David Seifertf3a49412016-12-14 17:53:10 +01003CMAKE_MINIMUM_REQUIRED(VERSION 3.1)
Baptiste Lepilleureafd7022013-05-08 20:21:11 +00004PROJECT(jsoncpp)
5ENABLE_TESTING()
6
Christopher Dunn99980942015-02-26 09:39:40 -06007OPTION(JSONCPP_WITH_TESTS "Compile and (for jsoncpp_check) run JsonCpp test executables" ON)
Baptiste Lepilleureafd7022013-05-08 20:21:11 +00008OPTION(JSONCPP_WITH_POST_BUILD_UNITTEST "Automatically run unit-tests as a post build step" ON)
Baptiste Lepilleur700b3802013-05-09 18:42:33 +00009OPTION(JSONCPP_WITH_WARNING_AS_ERROR "Force compilation to fail if a warning occurs" OFF)
Jörg Krause48bfe912015-10-27 22:45:17 +010010OPTION(JSONCPP_WITH_STRICT_ISO "Issue all the warnings demanded by strict ISO C and ISO C++" ON)
Jonas Platte62708582014-09-14 15:45:07 +020011OPTION(JSONCPP_WITH_PKGCONFIG_SUPPORT "Generate and install .pc files" ON)
Yu Xiaoleidc84d962014-11-04 16:33:25 +080012OPTION(JSONCPP_WITH_CMAKE_PACKAGE "Generate and install cmake package files" OFF)
Gaurav30bb4cc2015-04-23 18:39:00 +053013OPTION(BUILD_SHARED_LIBS "Build jsoncpp_lib as a shared library." OFF)
14OPTION(BUILD_STATIC_LIBS "Build jsoncpp_lib static library." ON)
Baptiste Lepilleureafd7022013-05-08 20:21:11 +000015
16# Ensures that CMAKE_BUILD_TYPE is visible in cmake-gui on Unix
17IF(NOT WIN32)
18 IF(NOT CMAKE_BUILD_TYPE)
19 SET(CMAKE_BUILD_TYPE Release CACHE STRING
20 "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel Coverage."
21 FORCE)
Robert Dailey37aaaec2015-08-06 10:17:09 -050022 ENDIF()
23ENDIF()
Baptiste Lepilleureafd7022013-05-08 20:21:11 +000024
Merlyn Morgan-Graham8d54e332016-09-22 22:05:13 -070025# Enable runtime search path support for dynamic libraries on OSX
26IF(APPLE)
27 SET(CMAKE_MACOSX_RPATH 1)
28ENDIF()
29
David Seifertf3a49412016-12-14 17:53:10 +010030# Adhere to GNU filesystem layout conventions
31INCLUDE(GNUInstallDirs)
Rémi Verscheldef8a3a592014-12-01 23:44:08 +010032
David Seifertf3a49412016-12-14 17:53:10 +010033SET(DEBUG_LIBNAME_SUFFIX "" CACHE STRING "Optional suffix to append to the library name for a debug build")
Yu Xiaolei1c3a20d2014-11-04 12:44:48 +080034
Baptiste Lepilleureafd7022013-05-08 20:21:11 +000035# Set variable named ${VAR_NAME} to value ${VALUE}
36FUNCTION(set_using_dynamic_name VAR_NAME VALUE)
37 SET( "${VAR_NAME}" "${VALUE}" PARENT_SCOPE)
Robert Dailey37aaaec2015-08-06 10:17:09 -050038ENDFUNCTION()
Baptiste Lepilleureafd7022013-05-08 20:21:11 +000039
Christopher Dunn0375af22014-09-18 10:06:14 -070040# Extract major, minor, patch from version text
41# Parse a version string "X.Y.Z" and outputs
42# version parts in ${OUPUT_PREFIX}_MAJOR, _MINOR, _PATCH.
Jonas Platte69c324e2014-09-17 20:37:59 +020043# If parse succeeds then ${OUPUT_PREFIX}_FOUND is TRUE.
Christopher Dunn9aa46812014-09-16 12:26:50 -070044MACRO(jsoncpp_parse_version VERSION_TEXT OUPUT_PREFIX)
45 SET(VERSION_REGEX "[0-9]+\\.[0-9]+\\.[0-9]+(-[a-zA-Z0-9_]+)?")
46 IF( ${VERSION_TEXT} MATCHES ${VERSION_REGEX} )
47 STRING(REGEX MATCHALL "[0-9]+|-([A-Za-z0-9_]+)" VERSION_PARTS ${VERSION_TEXT})
Christopher Dunn9aa46812014-09-16 12:26:50 -070048 LIST(GET VERSION_PARTS 0 ${OUPUT_PREFIX}_MAJOR)
49 LIST(GET VERSION_PARTS 1 ${OUPUT_PREFIX}_MINOR)
50 LIST(GET VERSION_PARTS 2 ${OUPUT_PREFIX}_PATCH)
Jonas Platte69c324e2014-09-17 20:37:59 +020051 set_using_dynamic_name( "${OUPUT_PREFIX}_FOUND" TRUE )
Christopher Dunn9aa46812014-09-16 12:26:50 -070052 ELSE( ${VERSION_TEXT} MATCHES ${VERSION_REGEX} )
Jonas Platte69c324e2014-09-17 20:37:59 +020053 set_using_dynamic_name( "${OUPUT_PREFIX}_FOUND" FALSE )
Robert Dailey37aaaec2015-08-06 10:17:09 -050054 ENDIF()
55ENDMACRO()
Christopher Dunn9aa46812014-09-16 12:26:50 -070056
57# Read out version from "version" file
Christopher Dunn295e73f2015-03-05 18:14:58 -060058#FILE(STRINGS "version" JSONCPP_VERSION)
59#SET( JSONCPP_VERSION_MAJOR X )
60#SET( JSONCPP_VERSION_MINOR Y )
61#SET( JSONCPP_VERSION_PATCH Z )
Christopher Dunnf700fe42016-12-14 13:39:05 -060062SET( JSONCPP_VERSION 1.8.0 )
Christopher Dunn9aa46812014-09-16 12:26:50 -070063jsoncpp_parse_version( ${JSONCPP_VERSION} JSONCPP_VERSION )
Christopher Dunn295e73f2015-03-05 18:14:58 -060064#IF(NOT JSONCPP_VERSION_FOUND)
65# MESSAGE(FATAL_ERROR "Failed to parse version string properly. Expect X.Y.Z")
66#ENDIF(NOT JSONCPP_VERSION_FOUND)
Christopher Dunn92259f72016-10-02 11:29:12 -050067SET( JSONCPP_SOVERSION 11 )
dawescae564652016-03-14 19:11:02 -050068SET( JSONCPP_USE_SECURE_MEMORY "0" CACHE STRING "-D...=1 to use memory-wiping allocator for STL" )
Christopher Dunn9aa46812014-09-16 12:26:50 -070069
Christopher Dunn0375af22014-09-18 10:06:14 -070070MESSAGE(STATUS "JsonCpp Version: ${JSONCPP_VERSION_MAJOR}.${JSONCPP_VERSION_MINOR}.${JSONCPP_VERSION_PATCH}")
Christopher Dunn9aa46812014-09-16 12:26:50 -070071# File version.h is only regenerated on CMake configure step
72CONFIGURE_FILE( "${PROJECT_SOURCE_DIR}/src/lib_json/version.h.in"
Christopher Dunn295e73f2015-03-05 18:14:58 -060073 "${PROJECT_SOURCE_DIR}/include/json/version.h"
74 NEWLINE_STYLE UNIX )
75CONFIGURE_FILE( "${PROJECT_SOURCE_DIR}/version.in"
76 "${PROJECT_SOURCE_DIR}/version"
77 NEWLINE_STYLE UNIX )
Christopher Dunn9aa46812014-09-16 12:26:50 -070078
David Seifertf3a49412016-12-14 17:53:10 +010079MACRO(UseCompilationWarningAsError)
80 IF(MSVC)
Baptiste Lepilleur700b3802013-05-09 18:42:33 +000081 # Only enabled in debug because some old versions of VS STL generate
82 # warnings when compiled in release configuration.
David Seifertf3a49412016-12-14 17:53:10 +010083 SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /WX ")
84 ELSEIF(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
85 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror")
86 IF(JSONCPP_WITH_STRICT_ISO)
87 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic-errors")
88 ENDIF()
89 ENDIF()
90ENDMACRO()
Baptiste Lepilleur700b3802013-05-09 18:42:33 +000091
Baptiste Lepilleureafd7022013-05-08 20:21:11 +000092# Include our configuration header
Aleksandr Derbenevb3deb612014-08-09 22:21:33 +040093INCLUDE_DIRECTORIES( ${jsoncpp_SOURCE_DIR}/include )
Baptiste Lepilleureafd7022013-05-08 20:21:11 +000094
David Seifertf3a49412016-12-14 17:53:10 +010095IF(MSVC)
Baptiste Lepilleur700b3802013-05-09 18:42:33 +000096 # Only enabled in debug because some old versions of VS STL generate
97 # unreachable code warning when compiled in release configuration.
David Seifertf3a49412016-12-14 17:53:10 +010098 SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /W4 ")
99ENDIF()
Baptiste Lepilleur700b3802013-05-09 18:42:33 +0000100
David Seifertf3a49412016-12-14 17:53:10 +0100101# Require C++11 support, prefer ISO C++ over GNU variants,
102# as relying solely on ISO C++ is more portable.
103SET(CMAKE_CXX_STANDARD 11)
104SET(CMAKE_CXX_STANDARD_REQUIRED ON)
105SET(CMAKE_CXX_EXTENSIONS OFF)
Jörg Krause48bfe912015-10-27 22:45:17 +0100106
David Seifertf3a49412016-12-14 17:53:10 +0100107IF(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
108 # using regular Clang or AppleClang
109 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wconversion -Wshadow -Werror=conversion -Werror=sign-compare")
110ELSEIF(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
111 # using GCC
112 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wconversion -Wshadow -Wextra")
113 # not yet ready for -Wsign-conversion
ds2836f22b0e2016-04-25 14:47:05 +0100114
Gaurav11c48d02017-03-10 10:22:33 +0530115 IF(JSONCPP_WITH_STRICT_ISO)
116 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic")
117 IF(JSONCPP_WITH_WARNING_AS_ERROR)
118 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror=conversion")
David Seifertf3a49412016-12-14 17:53:10 +0100119 ENDIF()
120ELSEIF(CMAKE_CXX_COMPILER_ID STREQUAL "Intel")
121 # using Intel compiler
122 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wconversion -Wshadow -Wextra -Werror=conversion")
Christopher Dunnec727e22015-01-20 13:32:38 -0600123
David Seifertf3a49412016-12-14 17:53:10 +0100124 IF(JSONCPP_WITH_STRICT_ISO AND NOT JSONCPP_WITH_WARNING_AS_ERROR)
125 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic")
126 ENDIF()
127ENDIF()
128
129FIND_PROGRAM(CCACHE_FOUND ccache)
130IF(CCACHE_FOUND)
131 SET_PROPERTY(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
132 SET_PROPERTY(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
133ENDIF(CCACHE_FOUND)
Christopher Dunnd1a2b942015-10-19 12:10:58 -0500134
Baptiste Lepilleur700b3802013-05-09 18:42:33 +0000135IF(JSONCPP_WITH_WARNING_AS_ERROR)
136 UseCompilationWarningAsError()
Robert Dailey37aaaec2015-08-06 10:17:09 -0500137ENDIF()
Baptiste Lepilleur700b3802013-05-09 18:42:33 +0000138
Jonas Platte62708582014-09-14 15:45:07 +0200139IF(JSONCPP_WITH_PKGCONFIG_SUPPORT)
David Seifertf3a49412016-12-14 17:53:10 +0100140 CONFIGURE_FILE(
141 "pkg-config/jsoncpp.pc.in"
142 "pkg-config/jsoncpp.pc"
143 @ONLY)
144 INSTALL(FILES "${CMAKE_CURRENT_BINARY_DIR}/pkg-config/jsoncpp.pc"
145 DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
Robert Dailey37aaaec2015-08-06 10:17:09 -0500146ENDIF()
Jonas Platte62708582014-09-14 15:45:07 +0200147
Yu Xiaoleidc84d962014-11-04 16:33:25 +0800148IF(JSONCPP_WITH_CMAKE_PACKAGE)
149 INSTALL(EXPORT jsoncpp
David Seifertf3a49412016-12-14 17:53:10 +0100150 DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/jsoncpp
Yu Xiaoleidc84d962014-11-04 16:33:25 +0800151 FILE jsoncppConfig.cmake)
Robert Dailey37aaaec2015-08-06 10:17:09 -0500152ENDIF()
Yu Xiaoleidc84d962014-11-04 16:33:25 +0800153
Baptiste Lepilleureafd7022013-05-08 20:21:11 +0000154# Build the different applications
155ADD_SUBDIRECTORY( src )
156
157#install the includes
158ADD_SUBDIRECTORY( include )