1*44844408SAndroid Build Coastguard Worker# vim: et ts=4 sts=4 sw=4 tw=0 2*44844408SAndroid Build Coastguard Worker 3*44844408SAndroid Build Coastguard Worker# ==== Define cmake build policies that affect compilation and linkage default behaviors 4*44844408SAndroid Build Coastguard Worker# 5*44844408SAndroid Build Coastguard Worker# Set the JSONCPP_NEWEST_VALIDATED_POLICIES_VERSION string to the newest cmake version 6*44844408SAndroid Build Coastguard Worker# policies that provide successful builds. By setting JSONCPP_NEWEST_VALIDATED_POLICIES_VERSION 7*44844408SAndroid Build Coastguard Worker# to a value greater than the oldest policies, all policies between 8*44844408SAndroid Build Coastguard Worker# JSONCPP_OLDEST_VALIDATED_POLICIES_VERSION and CMAKE_VERSION (used for this build) 9*44844408SAndroid Build Coastguard Worker# are set to their NEW behaivor, thereby suppressing policy warnings related to policies 10*44844408SAndroid Build Coastguard Worker# between the JSONCPP_OLDEST_VALIDATED_POLICIES_VERSION and CMAKE_VERSION. 11*44844408SAndroid Build Coastguard Worker# 12*44844408SAndroid Build Coastguard Worker# CMake versions greater than the JSONCPP_NEWEST_VALIDATED_POLICIES_VERSION policies will 13*44844408SAndroid Build Coastguard Worker# continue to generate policy warnings "CMake Warning (dev)...Policy CMP0XXX is not set:" 14*44844408SAndroid Build Coastguard Worker# 15*44844408SAndroid Build Coastguard Workerset(JSONCPP_OLDEST_VALIDATED_POLICIES_VERSION "3.8.0") 16*44844408SAndroid Build Coastguard Workerset(JSONCPP_NEWEST_VALIDATED_POLICIES_VERSION "3.13.2") 17*44844408SAndroid Build Coastguard Workercmake_minimum_required(VERSION ${JSONCPP_OLDEST_VALIDATED_POLICIES_VERSION}) 18*44844408SAndroid Build Coastguard Workerif("${CMAKE_VERSION}" VERSION_LESS "${JSONCPP_NEWEST_VALIDATED_POLICIES_VERSION}") 19*44844408SAndroid Build Coastguard Worker #Set and use the newest available cmake policies that are validated to work 20*44844408SAndroid Build Coastguard Worker set(JSONCPP_CMAKE_POLICY_VERSION "${CMAKE_VERSION}") 21*44844408SAndroid Build Coastguard Workerelse() 22*44844408SAndroid Build Coastguard Worker set(JSONCPP_CMAKE_POLICY_VERSION "${JSONCPP_NEWEST_VALIDATED_POLICIES_VERSION}") 23*44844408SAndroid Build Coastguard Workerendif() 24*44844408SAndroid Build Coastguard Workercmake_policy(VERSION ${JSONCPP_CMAKE_POLICY_VERSION}) 25*44844408SAndroid Build Coastguard Workerif(POLICY CMP0091) 26*44844408SAndroid Build Coastguard Worker cmake_policy(SET CMP0091 NEW) 27*44844408SAndroid Build Coastguard Workerendif() 28*44844408SAndroid Build Coastguard Worker# 29*44844408SAndroid Build Coastguard Worker# Now enumerate specific policies newer than JSONCPP_NEWEST_VALIDATED_POLICIES_VERSION 30*44844408SAndroid Build Coastguard Worker# that may need to be individually set to NEW/OLD 31*44844408SAndroid Build Coastguard Worker# 32*44844408SAndroid Build Coastguard Workerforeach(pnew "") # Currently Empty 33*44844408SAndroid Build Coastguard Worker if(POLICY ${pnew}) 34*44844408SAndroid Build Coastguard Worker cmake_policy(SET ${pnew} NEW) 35*44844408SAndroid Build Coastguard Worker endif() 36*44844408SAndroid Build Coastguard Workerendforeach() 37*44844408SAndroid Build Coastguard Workerforeach(pold "") # Currently Empty 38*44844408SAndroid Build Coastguard Worker if(POLICY ${pold}) 39*44844408SAndroid Build Coastguard Worker cmake_policy(SET ${pold} OLD) 40*44844408SAndroid Build Coastguard Worker endif() 41*44844408SAndroid Build Coastguard Workerendforeach() 42*44844408SAndroid Build Coastguard Worker 43*44844408SAndroid Build Coastguard Worker# Build the library with C++11 standard support, independent from other including 44*44844408SAndroid Build Coastguard Worker# software which may use a different CXX_STANDARD or CMAKE_CXX_STANDARD. 45*44844408SAndroid Build Coastguard Workerset(CMAKE_CXX_STANDARD 11) 46*44844408SAndroid Build Coastguard Workerset(CMAKE_CXX_EXTENSIONS OFF) 47*44844408SAndroid Build Coastguard Workerset(CMAKE_CXX_STANDARD_REQUIRED ON) 48*44844408SAndroid Build Coastguard Worker 49*44844408SAndroid Build Coastguard Worker# Ensure that CMAKE_BUILD_TYPE has a value specified for single configuration generators. 50*44844408SAndroid Build Coastguard Workerif(NOT DEFINED CMAKE_BUILD_TYPE AND NOT DEFINED CMAKE_CONFIGURATION_TYPES) 51*44844408SAndroid Build Coastguard Worker set(CMAKE_BUILD_TYPE Release CACHE STRING 52*44844408SAndroid Build Coastguard Worker "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel Coverage.") 53*44844408SAndroid Build Coastguard Workerendif() 54*44844408SAndroid Build Coastguard Worker 55*44844408SAndroid Build Coastguard Workerset(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake") 56*44844408SAndroid Build Coastguard Worker 57*44844408SAndroid Build Coastguard Worker# --------------------------------------------------------------------------- 58*44844408SAndroid Build Coastguard Worker# use ccache if found, has to be done before project() 59*44844408SAndroid Build Coastguard Worker# --------------------------------------------------------------------------- 60*44844408SAndroid Build Coastguard Workerfind_program(CCACHE_EXECUTABLE "ccache" HINTS /usr/local/bin /opt/local/bin) 61*44844408SAndroid Build Coastguard Workerif(CCACHE_EXECUTABLE) 62*44844408SAndroid Build Coastguard Worker message(STATUS "use ccache") 63*44844408SAndroid Build Coastguard Worker set(CMAKE_CXX_COMPILER_LAUNCHER "${CCACHE_EXECUTABLE}" CACHE PATH "ccache" FORCE) 64*44844408SAndroid Build Coastguard Worker set(CMAKE_C_COMPILER_LAUNCHER "${CCACHE_EXECUTABLE}" CACHE PATH "ccache" FORCE) 65*44844408SAndroid Build Coastguard Workerendif() 66*44844408SAndroid Build Coastguard Worker 67*44844408SAndroid Build Coastguard Workerproject(jsoncpp 68*44844408SAndroid Build Coastguard Worker # Note: version must be updated in three places when doing a release. This 69*44844408SAndroid Build Coastguard Worker # annoying process ensures that amalgamate, CMake, and meson all report the 70*44844408SAndroid Build Coastguard Worker # correct version. 71*44844408SAndroid Build Coastguard Worker # 1. ./meson.build 72*44844408SAndroid Build Coastguard Worker # 2. ./include/json/version.h 73*44844408SAndroid Build Coastguard Worker # 3. ./CMakeLists.txt 74*44844408SAndroid Build Coastguard Worker # IMPORTANT: also update the PROJECT_SOVERSION!! 75*44844408SAndroid Build Coastguard Worker VERSION 1.9.5 # <major>[.<minor>[.<patch>[.<tweak>]]] 76*44844408SAndroid Build Coastguard Worker LANGUAGES CXX) 77*44844408SAndroid Build Coastguard Worker 78*44844408SAndroid Build Coastguard Workermessage(STATUS "JsonCpp Version: ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}") 79*44844408SAndroid Build Coastguard Workerset(PROJECT_SOVERSION 25) 80*44844408SAndroid Build Coastguard Worker 81*44844408SAndroid Build Coastguard Workerinclude(${CMAKE_CURRENT_SOURCE_DIR}/include/PreventInSourceBuilds.cmake) 82*44844408SAndroid Build Coastguard Workerinclude(${CMAKE_CURRENT_SOURCE_DIR}/include/PreventInBuildInstalls.cmake) 83*44844408SAndroid Build Coastguard Worker 84*44844408SAndroid Build Coastguard Workeroption(JSONCPP_WITH_TESTS "Compile and (for jsoncpp_check) run JsonCpp test executables" ON) 85*44844408SAndroid Build Coastguard Workeroption(JSONCPP_WITH_POST_BUILD_UNITTEST "Automatically run unit-tests as a post build step" ON) 86*44844408SAndroid Build Coastguard Workeroption(JSONCPP_WITH_WARNING_AS_ERROR "Force compilation to fail if a warning occurs" OFF) 87*44844408SAndroid Build Coastguard Workeroption(JSONCPP_WITH_STRICT_ISO "Issue all the warnings demanded by strict ISO C and ISO C++" ON) 88*44844408SAndroid Build Coastguard Workeroption(JSONCPP_WITH_PKGCONFIG_SUPPORT "Generate and install .pc files" ON) 89*44844408SAndroid Build Coastguard Workeroption(JSONCPP_WITH_CMAKE_PACKAGE "Generate and install cmake package files" ON) 90*44844408SAndroid Build Coastguard Workeroption(JSONCPP_WITH_EXAMPLE "Compile JsonCpp example" OFF) 91*44844408SAndroid Build Coastguard Workeroption(JSONCPP_STATIC_WINDOWS_RUNTIME "Use static (MT/MTd) Windows runtime" OFF) 92*44844408SAndroid Build Coastguard Workeroption(BUILD_SHARED_LIBS "Build jsoncpp_lib as a shared library." ON) 93*44844408SAndroid Build Coastguard Workeroption(BUILD_STATIC_LIBS "Build jsoncpp_lib as a static library." ON) 94*44844408SAndroid Build Coastguard Workeroption(BUILD_OBJECT_LIBS "Build jsoncpp_lib as a object library." ON) 95*44844408SAndroid Build Coastguard Worker 96*44844408SAndroid Build Coastguard Worker# Adhere to GNU filesystem layout conventions 97*44844408SAndroid Build Coastguard Workerinclude(GNUInstallDirs) 98*44844408SAndroid Build Coastguard Worker 99*44844408SAndroid Build Coastguard Workerset(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" CACHE PATH "Archive output dir.") 100*44844408SAndroid Build Coastguard Workerset(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib" CACHE PATH "Library output dir.") 101*44844408SAndroid Build Coastguard Workerset(CMAKE_PDB_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" CACHE PATH "PDB (MSVC debug symbol)output dir.") 102*44844408SAndroid Build Coastguard Workerset(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" CACHE PATH "Executable/dll output dir.") 103*44844408SAndroid Build Coastguard Worker 104*44844408SAndroid Build Coastguard Workerset(JSONCPP_USE_SECURE_MEMORY "0" CACHE STRING "-D...=1 to use memory-wiping allocator for STL") 105*44844408SAndroid Build Coastguard Worker 106*44844408SAndroid Build Coastguard Workerconfigure_file("${PROJECT_SOURCE_DIR}/version.in" 107*44844408SAndroid Build Coastguard Worker "${PROJECT_BINARY_DIR}/version" 108*44844408SAndroid Build Coastguard Worker NEWLINE_STYLE UNIX) 109*44844408SAndroid Build Coastguard Worker 110*44844408SAndroid Build Coastguard Workermacro(use_compilation_warning_as_error) 111*44844408SAndroid Build Coastguard Worker if(MSVC) 112*44844408SAndroid Build Coastguard Worker # Only enabled in debug because some old versions of VS STL generate 113*44844408SAndroid Build Coastguard Worker # warnings when compiled in release configuration. 114*44844408SAndroid Build Coastguard Worker add_compile_options($<$<CONFIG:Debug>:/WX>) 115*44844408SAndroid Build Coastguard Worker elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") 116*44844408SAndroid Build Coastguard Worker add_compile_options(-Werror) 117*44844408SAndroid Build Coastguard Worker if(JSONCPP_WITH_STRICT_ISO) 118*44844408SAndroid Build Coastguard Worker add_compile_options(-pedantic-errors) 119*44844408SAndroid Build Coastguard Worker endif() 120*44844408SAndroid Build Coastguard Worker endif() 121*44844408SAndroid Build Coastguard Workerendmacro() 122*44844408SAndroid Build Coastguard Worker 123*44844408SAndroid Build Coastguard Worker# Include our configuration header 124*44844408SAndroid Build Coastguard Workerinclude_directories(${jsoncpp_SOURCE_DIR}/include) 125*44844408SAndroid Build Coastguard Worker 126*44844408SAndroid Build Coastguard Workerif(MSVC) 127*44844408SAndroid Build Coastguard Worker # Only enabled in debug because some old versions of VS STL generate 128*44844408SAndroid Build Coastguard Worker # unreachable code warning when compiled in release configuration. 129*44844408SAndroid Build Coastguard Worker add_compile_options($<$<CONFIG:Debug>:/W4>) 130*44844408SAndroid Build Coastguard Worker if (JSONCPP_STATIC_WINDOWS_RUNTIME) 131*44844408SAndroid Build Coastguard Worker set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>") 132*44844408SAndroid Build Coastguard Worker endif() 133*44844408SAndroid Build Coastguard Workerendif() 134*44844408SAndroid Build Coastguard Worker 135*44844408SAndroid Build Coastguard Workerif(CMAKE_CXX_COMPILER_ID MATCHES "Clang") 136*44844408SAndroid Build Coastguard Worker # using regular Clang or AppleClang 137*44844408SAndroid Build Coastguard Worker add_compile_options(-Wall -Wconversion -Wshadow) 138*44844408SAndroid Build Coastguard Worker 139*44844408SAndroid Build Coastguard Worker if(JSONCPP_WITH_WARNING_AS_ERROR) 140*44844408SAndroid Build Coastguard Worker add_compile_options(-Werror=conversion -Werror=sign-compare) 141*44844408SAndroid Build Coastguard Worker endif() 142*44844408SAndroid Build Coastguard Workerelseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") 143*44844408SAndroid Build Coastguard Worker # using GCC 144*44844408SAndroid Build Coastguard Worker add_compile_options(-Wall -Wconversion -Wshadow -Wextra) 145*44844408SAndroid Build Coastguard Worker # not yet ready for -Wsign-conversion 146*44844408SAndroid Build Coastguard Worker 147*44844408SAndroid Build Coastguard Worker if(JSONCPP_WITH_STRICT_ISO) 148*44844408SAndroid Build Coastguard Worker add_compile_options(-Wpedantic) 149*44844408SAndroid Build Coastguard Worker endif() 150*44844408SAndroid Build Coastguard Worker if(JSONCPP_WITH_WARNING_AS_ERROR) 151*44844408SAndroid Build Coastguard Worker add_compile_options(-Werror=conversion) 152*44844408SAndroid Build Coastguard Worker endif() 153*44844408SAndroid Build Coastguard Workerelseif(CMAKE_CXX_COMPILER_ID STREQUAL "Intel") 154*44844408SAndroid Build Coastguard Worker # using Intel compiler 155*44844408SAndroid Build Coastguard Worker add_compile_options(-Wall -Wconversion -Wshadow -Wextra) 156*44844408SAndroid Build Coastguard Worker 157*44844408SAndroid Build Coastguard Worker if(JSONCPP_WITH_WARNING_AS_ERROR) 158*44844408SAndroid Build Coastguard Worker add_compile_options(-Werror=conversion) 159*44844408SAndroid Build Coastguard Worker elseif(JSONCPP_WITH_STRICT_ISO) 160*44844408SAndroid Build Coastguard Worker add_compile_options(-Wpedantic) 161*44844408SAndroid Build Coastguard Worker endif() 162*44844408SAndroid Build Coastguard Workerendif() 163*44844408SAndroid Build Coastguard Worker 164*44844408SAndroid Build Coastguard Workerif(JSONCPP_WITH_WARNING_AS_ERROR) 165*44844408SAndroid Build Coastguard Worker use_compilation_warning_as_error() 166*44844408SAndroid Build Coastguard Workerendif() 167*44844408SAndroid Build Coastguard Worker 168*44844408SAndroid Build Coastguard Workerif(JSONCPP_WITH_PKGCONFIG_SUPPORT) 169*44844408SAndroid Build Coastguard Worker include(JoinPaths) 170*44844408SAndroid Build Coastguard Worker 171*44844408SAndroid Build Coastguard Worker join_paths(libdir_for_pc_file "\${exec_prefix}" "${CMAKE_INSTALL_LIBDIR}") 172*44844408SAndroid Build Coastguard Worker join_paths(includedir_for_pc_file "\${prefix}" "${CMAKE_INSTALL_INCLUDEDIR}") 173*44844408SAndroid Build Coastguard Worker 174*44844408SAndroid Build Coastguard Worker configure_file( 175*44844408SAndroid Build Coastguard Worker "pkg-config/jsoncpp.pc.in" 176*44844408SAndroid Build Coastguard Worker "pkg-config/jsoncpp.pc" 177*44844408SAndroid Build Coastguard Worker @ONLY) 178*44844408SAndroid Build Coastguard Worker install(FILES "${CMAKE_CURRENT_BINARY_DIR}/pkg-config/jsoncpp.pc" 179*44844408SAndroid Build Coastguard Worker DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") 180*44844408SAndroid Build Coastguard Workerendif() 181*44844408SAndroid Build Coastguard Worker 182*44844408SAndroid Build Coastguard Workerif(JSONCPP_WITH_CMAKE_PACKAGE) 183*44844408SAndroid Build Coastguard Worker include(CMakePackageConfigHelpers) 184*44844408SAndroid Build Coastguard Worker install(EXPORT jsoncpp 185*44844408SAndroid Build Coastguard Worker DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/jsoncpp 186*44844408SAndroid Build Coastguard Worker FILE jsoncpp-targets.cmake) 187*44844408SAndroid Build Coastguard Worker configure_package_config_file(jsoncppConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/jsoncppConfig.cmake 188*44844408SAndroid Build Coastguard Worker INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/jsoncpp) 189*44844408SAndroid Build Coastguard Worker 190*44844408SAndroid Build Coastguard Worker write_basic_package_version_file("${CMAKE_CURRENT_BINARY_DIR}/jsoncppConfigVersion.cmake" 191*44844408SAndroid Build Coastguard Worker VERSION ${PROJECT_VERSION} 192*44844408SAndroid Build Coastguard Worker COMPATIBILITY SameMajorVersion) 193*44844408SAndroid Build Coastguard Worker install(FILES 194*44844408SAndroid Build Coastguard Worker ${CMAKE_CURRENT_BINARY_DIR}/jsoncppConfigVersion.cmake ${CMAKE_CURRENT_BINARY_DIR}/jsoncppConfig.cmake 195*44844408SAndroid Build Coastguard Worker ${CMAKE_CURRENT_SOURCE_DIR}/jsoncpp-namespaced-targets.cmake 196*44844408SAndroid Build Coastguard Worker DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/jsoncpp) 197*44844408SAndroid Build Coastguard Workerendif() 198*44844408SAndroid Build Coastguard Worker 199*44844408SAndroid Build Coastguard Workerif(JSONCPP_WITH_TESTS) 200*44844408SAndroid Build Coastguard Worker enable_testing() 201*44844408SAndroid Build Coastguard Worker include(CTest) 202*44844408SAndroid Build Coastguard Workerendif() 203*44844408SAndroid Build Coastguard Worker 204*44844408SAndroid Build Coastguard Worker# Build the different applications 205*44844408SAndroid Build Coastguard Workeradd_subdirectory(src) 206*44844408SAndroid Build Coastguard Worker 207*44844408SAndroid Build Coastguard Worker#install the includes 208*44844408SAndroid Build Coastguard Workeradd_subdirectory(include) 209*44844408SAndroid Build Coastguard Worker 210*44844408SAndroid Build Coastguard Worker#install the example 211*44844408SAndroid Build Coastguard Workerif(JSONCPP_WITH_EXAMPLE) 212*44844408SAndroid Build Coastguard Worker add_subdirectory(example) 213*44844408SAndroid Build Coastguard Workerendif() 214