xref: /aosp_15_r20/external/jsoncpp/CMakeLists.txt (revision 4484440890e2bc6e07362b4feaf15601abfe0071)
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