Better support to CMake
This commit is contained in:
parent
fb0a546113
commit
c0cadd9295
@ -78,6 +78,9 @@ project(jsoncpp
|
|||||||
message(STATUS "JsonCpp Version: ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}")
|
message(STATUS "JsonCpp Version: ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}")
|
||||||
set(PROJECT_SOVERSION 25)
|
set(PROJECT_SOVERSION 25)
|
||||||
|
|
||||||
|
# Defines the project root to be used throughout all scripts.
|
||||||
|
SET(JSONCPP_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
|
|
||||||
include(${CMAKE_CURRENT_SOURCE_DIR}/include/PreventInSourceBuilds.cmake)
|
include(${CMAKE_CURRENT_SOURCE_DIR}/include/PreventInSourceBuilds.cmake)
|
||||||
include(${CMAKE_CURRENT_SOURCE_DIR}/include/PreventInBuildInstalls.cmake)
|
include(${CMAKE_CURRENT_SOURCE_DIR}/include/PreventInBuildInstalls.cmake)
|
||||||
|
|
||||||
@ -89,9 +92,8 @@ option(JSONCPP_WITH_PKGCONFIG_SUPPORT "Generate and install .pc files" ON)
|
|||||||
option(JSONCPP_WITH_CMAKE_PACKAGE "Generate and install cmake package files" ON)
|
option(JSONCPP_WITH_CMAKE_PACKAGE "Generate and install cmake package files" ON)
|
||||||
option(JSONCPP_WITH_EXAMPLE "Compile JsonCpp example" OFF)
|
option(JSONCPP_WITH_EXAMPLE "Compile JsonCpp example" OFF)
|
||||||
option(JSONCPP_STATIC_WINDOWS_RUNTIME "Use static (MT/MTd) Windows runtime" OFF)
|
option(JSONCPP_STATIC_WINDOWS_RUNTIME "Use static (MT/MTd) Windows runtime" OFF)
|
||||||
option(BUILD_SHARED_LIBS "Build jsoncpp_lib as a shared library." ON)
|
|
||||||
option(BUILD_STATIC_LIBS "Build jsoncpp_lib as a static library." ON)
|
option(JSONCPP_BUILD_SHARED_LIBS "Build jsoncpp_lib as a shared library." OFF)
|
||||||
option(BUILD_OBJECT_LIBS "Build jsoncpp_lib as a object library." ON)
|
|
||||||
|
|
||||||
# Adhere to GNU filesystem layout conventions
|
# Adhere to GNU filesystem layout conventions
|
||||||
include(GNUInstallDirs)
|
include(GNUInstallDirs)
|
||||||
@ -179,22 +181,6 @@ if(JSONCPP_WITH_PKGCONFIG_SUPPORT)
|
|||||||
DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
|
DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(JSONCPP_WITH_CMAKE_PACKAGE)
|
|
||||||
include(CMakePackageConfigHelpers)
|
|
||||||
install(EXPORT jsoncpp
|
|
||||||
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/jsoncpp
|
|
||||||
FILE jsoncpp-targets.cmake)
|
|
||||||
configure_package_config_file(jsoncppConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/jsoncppConfig.cmake
|
|
||||||
INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/jsoncpp)
|
|
||||||
|
|
||||||
write_basic_package_version_file("${CMAKE_CURRENT_BINARY_DIR}/jsoncppConfigVersion.cmake"
|
|
||||||
VERSION ${PROJECT_VERSION}
|
|
||||||
COMPATIBILITY SameMajorVersion)
|
|
||||||
install(FILES
|
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/jsoncppConfigVersion.cmake ${CMAKE_CURRENT_BINARY_DIR}/jsoncppConfig.cmake
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/jsoncpp-namespaced-targets.cmake
|
|
||||||
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/jsoncpp)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(JSONCPP_WITH_TESTS)
|
if(JSONCPP_WITH_TESTS)
|
||||||
enable_testing()
|
enable_testing()
|
||||||
@ -204,9 +190,6 @@ endif()
|
|||||||
# Build the different applications
|
# Build the different applications
|
||||||
add_subdirectory(src)
|
add_subdirectory(src)
|
||||||
|
|
||||||
#install the includes
|
|
||||||
add_subdirectory(include)
|
|
||||||
|
|
||||||
#install the example
|
#install the example
|
||||||
if(JSONCPP_WITH_EXAMPLE)
|
if(JSONCPP_WITH_EXAMPLE)
|
||||||
add_subdirectory(example)
|
add_subdirectory(example)
|
||||||
|
@ -1,3 +1,2 @@
|
|||||||
add_executable(readFromStream readFromStream.cpp)
|
ADD_EXECUTABLE(readFromStream readFromStream.cpp)
|
||||||
target_include_directories(readFromStream PUBLIC ${CMAKE_SOURCE_DIR}/include)
|
TARGET_LINK_LIBRARIES(readFromStream PRIVATE jsoncpp::framework)
|
||||||
target_link_libraries(readFromStream jsoncpp_lib)
|
|
@ -1,3 +1,2 @@
|
|||||||
add_executable(readFromString readFromString.cpp)
|
ADD_EXECUTABLE(readFromString readFromString.cpp)
|
||||||
target_include_directories(readFromString PUBLIC ${CMAKE_SOURCE_DIR}/include)
|
TARGET_LINK_LIBRARIES(readFromString PRIVATE jsoncpp::framework)
|
||||||
target_link_libraries(readFromString jsoncpp_lib)
|
|
@ -1,3 +1,2 @@
|
|||||||
add_executable(streamWrite streamWrite.cpp)
|
ADD_EXECUTABLE(streamWrite streamWrite.cpp)
|
||||||
target_include_directories(streamWrite PUBLIC ${CMAKE_SOURCE_DIR}/include)
|
TARGET_LINK_LIBRARIES(streamWrite PRIVATE jsoncpp::framework)
|
||||||
target_link_libraries(streamWrite jsoncpp_lib)
|
|
@ -1,3 +1,2 @@
|
|||||||
add_executable(stringWrite stringWrite.cpp)
|
ADD_EXECUTABLE(stringWrite stringWrite.cpp)
|
||||||
target_include_directories(stringWrite PUBLIC ${CMAKE_SOURCE_DIR}/include)
|
TARGET_LINK_LIBRARIES(stringWrite PRIVATE jsoncpp::framework)
|
||||||
target_link_libraries(stringWrite jsoncpp_lib)
|
|
@ -1,5 +1,2 @@
|
|||||||
file(GLOB INCLUDE_FILES "json/*.h")
|
|
||||||
install(FILES
|
|
||||||
${INCLUDE_FILES}
|
|
||||||
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/json)
|
|
||||||
|
|
||||||
|
@ -25,41 +25,11 @@ if(NOT (HAVE_CLOCALE AND HAVE_LCONV_SIZE AND HAVE_DECIMAL_POINT AND HAVE_LOCALEC
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(JSONCPP_INCLUDE_DIR ../../include)
|
|
||||||
|
|
||||||
set(PUBLIC_HEADERS
|
|
||||||
${JSONCPP_INCLUDE_DIR}/json/config.h
|
|
||||||
${JSONCPP_INCLUDE_DIR}/json/forwards.h
|
|
||||||
${JSONCPP_INCLUDE_DIR}/json/json_features.h
|
|
||||||
${JSONCPP_INCLUDE_DIR}/json/value.h
|
|
||||||
${JSONCPP_INCLUDE_DIR}/json/reader.h
|
|
||||||
${JSONCPP_INCLUDE_DIR}/json/version.h
|
|
||||||
${JSONCPP_INCLUDE_DIR}/json/writer.h
|
|
||||||
${JSONCPP_INCLUDE_DIR}/json/assertions.h
|
|
||||||
)
|
|
||||||
|
|
||||||
source_group("Public API" FILES ${PUBLIC_HEADERS})
|
|
||||||
|
|
||||||
set(JSONCPP_SOURCES
|
|
||||||
json_tool.h
|
|
||||||
json_reader.cpp
|
|
||||||
json_valueiterator.inl
|
|
||||||
json_value.cpp
|
|
||||||
json_writer.cpp
|
|
||||||
)
|
|
||||||
|
|
||||||
# Install instructions for this target
|
|
||||||
if(JSONCPP_WITH_CMAKE_PACKAGE)
|
|
||||||
set(INSTALL_EXPORT EXPORT jsoncpp)
|
|
||||||
else()
|
|
||||||
set(INSTALL_EXPORT)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Specify compiler features required when compiling a given target.
|
# Specify compiler features required when compiling a given target.
|
||||||
# See https://cmake.org/cmake/help/v3.1/prop_gbl/CMAKE_CXX_KNOWN_FEATURES.html#prop_gbl:CMAKE_CXX_KNOWN_FEATURES
|
# See https://cmake.org/cmake/help/v3.1/prop_gbl/CMAKE_CXX_KNOWN_FEATURES.html#prop_gbl:CMAKE_CXX_KNOWN_FEATURES
|
||||||
# for complete list of features available
|
# for complete list of features available
|
||||||
list(APPEND REQUIRED_FEATURES
|
list(APPEND REQUIRED_FEATURES
|
||||||
cxx_std_11 # Compiler mode is aware of C++ 11.
|
|
||||||
#MSVC 1900 cxx_alignas # Alignment control alignas, as defined in N2341.
|
#MSVC 1900 cxx_alignas # Alignment control alignas, as defined in N2341.
|
||||||
#MSVC 1900 cxx_alignof # Alignment control alignof, as defined in N2341.
|
#MSVC 1900 cxx_alignof # Alignment control alignof, as defined in N2341.
|
||||||
#MSVC 1900 cxx_attributes # Generic attributes, as defined in N2761.
|
#MSVC 1900 cxx_attributes # Generic attributes, as defined in N2761.
|
||||||
@ -106,103 +76,46 @@ list(APPEND REQUIRED_FEATURES
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
if(BUILD_SHARED_LIBS)
|
ADD_LIBRARY(jsoncpp.framework.object OBJECT
|
||||||
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.12.0)
|
json_tool.h
|
||||||
add_compile_definitions(JSON_DLL_BUILD)
|
json_reader.cpp
|
||||||
else()
|
json_valueiterator.inl
|
||||||
add_definitions(-DJSON_DLL_BUILD)
|
json_value.cpp
|
||||||
endif()
|
json_writer.cpp
|
||||||
|
)
|
||||||
|
|
||||||
set(SHARED_LIB ${PROJECT_NAME}_lib)
|
SET_TARGET_PROPERTIES(jsoncpp.framework.object PROPERTIES CXX_STANDARD 11)
|
||||||
add_library(${SHARED_LIB} SHARED ${PUBLIC_HEADERS} ${JSONCPP_SOURCES})
|
SET_TARGET_PROPERTIES(jsoncpp.framework.object PROPERTIES VERSION ${PROJECT_VERSION})
|
||||||
set_target_properties(${SHARED_LIB} PROPERTIES
|
SET_TARGET_PROPERTIES(jsoncpp.framework.object PROPERTIES SOVERSION ${PROJECT_SOVERSION})
|
||||||
OUTPUT_NAME jsoncpp
|
|
||||||
VERSION ${PROJECT_VERSION}
|
|
||||||
SOVERSION ${PROJECT_SOVERSION}
|
|
||||||
POSITION_INDEPENDENT_CODE ${BUILD_SHARED_LIBS}
|
|
||||||
)
|
|
||||||
|
|
||||||
# Set library's runtime search path on OSX
|
TARGET_COMPILE_FEATURES(jsoncpp.framework.object PUBLIC ${REQUIRED_FEATURES})
|
||||||
if(APPLE)
|
TARGET_INCLUDE_DIRECTORIES(jsoncpp.framework.object PUBLIC $<BUILD_INTERFACE:${JSONCPP_ROOT_DIR}/include>)
|
||||||
set_target_properties(${SHARED_LIB} PROPERTIES INSTALL_RPATH "@loader_path/.")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
target_compile_features(${SHARED_LIB} PUBLIC ${REQUIRED_FEATURES})
|
# Set library's runtime search path on OSX
|
||||||
|
IF (APPLE)
|
||||||
|
SET_TARGET_PROPERTIES(jsoncpp.framework.object PROPERTIES INSTALL_RPATH "@loader_path/.")
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
target_include_directories(${SHARED_LIB} PUBLIC
|
|
||||||
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
|
|
||||||
$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/${JSONCPP_INCLUDE_DIR}>
|
|
||||||
$<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include/json>
|
|
||||||
)
|
|
||||||
|
|
||||||
list(APPEND CMAKE_TARGETS ${SHARED_LIB})
|
IF (JSONCPP_BUILD_SHARED_LIBS)
|
||||||
endif()
|
|
||||||
|
|
||||||
if(BUILD_STATIC_LIBS)
|
# CMake link shared library on Windows
|
||||||
set(STATIC_LIB ${PROJECT_NAME}_static)
|
# Ref: https://stackoverflow.com/a/41618677
|
||||||
add_library(${STATIC_LIB} STATIC ${PUBLIC_HEADERS} ${JSONCPP_SOURCES})
|
SET(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS TRUE)
|
||||||
|
|
||||||
# avoid name clashes on windows as the shared import lib is also named jsoncpp.lib
|
ADD_LIBRARY(jsoncpp.framework SHARED $<TARGET_OBJECTS:jsoncpp.framework.object>)
|
||||||
if(NOT DEFINED STATIC_SUFFIX AND BUILD_SHARED_LIBS)
|
TARGET_COMPILE_DEFINITIONS(jsoncpp.framework PUBLIC JSON_DLL_BUILD)
|
||||||
if (MSVC)
|
|
||||||
set(STATIC_SUFFIX "_static")
|
|
||||||
else()
|
|
||||||
set(STATIC_SUFFIX "")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set_target_properties(${STATIC_LIB} PROPERTIES
|
ELSE ()
|
||||||
OUTPUT_NAME jsoncpp${STATIC_SUFFIX}
|
|
||||||
VERSION ${PROJECT_VERSION}
|
|
||||||
)
|
|
||||||
|
|
||||||
# Set library's runtime search path on OSX
|
ADD_LIBRARY(jsoncpp.framework STATIC $<TARGET_OBJECTS:jsoncpp.framework.object>)
|
||||||
if(APPLE)
|
|
||||||
set_target_properties(${STATIC_LIB} PROPERTIES INSTALL_RPATH "@loader_path/.")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
target_compile_features(${STATIC_LIB} PUBLIC ${REQUIRED_FEATURES})
|
ENDIF ()
|
||||||
|
|
||||||
target_include_directories(${STATIC_LIB} PUBLIC
|
ADD_LIBRARY(jsoncpp::framework ALIAS jsoncpp.framework)
|
||||||
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
|
SET_TARGET_PROPERTIES(jsoncpp.framework PROPERTIES CXX_STANDARD 11)
|
||||||
$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/${JSONCPP_INCLUDE_DIR}>
|
SET_TARGET_PROPERTIES(jsoncpp.framework PROPERTIES VERSION ${PROJECT_VERSION})
|
||||||
$<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include/json>
|
SET_TARGET_PROPERTIES(jsoncpp.framework PROPERTIES SOVERSION ${PROJECT_SOVERSION})
|
||||||
)
|
|
||||||
|
|
||||||
list(APPEND CMAKE_TARGETS ${STATIC_LIB})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(BUILD_OBJECT_LIBS)
|
|
||||||
set(OBJECT_LIB ${PROJECT_NAME}_object)
|
|
||||||
add_library(${OBJECT_LIB} OBJECT ${PUBLIC_HEADERS} ${JSONCPP_SOURCES})
|
|
||||||
|
|
||||||
set_target_properties(${OBJECT_LIB} PROPERTIES
|
|
||||||
OUTPUT_NAME jsoncpp
|
|
||||||
VERSION ${PROJECT_VERSION}
|
|
||||||
SOVERSION ${PROJECT_SOVERSION}
|
|
||||||
POSITION_INDEPENDENT_CODE ${BUILD_SHARED_LIBS}
|
|
||||||
)
|
|
||||||
|
|
||||||
# Set library's runtime search path on OSX
|
|
||||||
if(APPLE)
|
|
||||||
set_target_properties(${OBJECT_LIB} PROPERTIES INSTALL_RPATH "@loader_path/.")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
target_compile_features(${OBJECT_LIB} PUBLIC ${REQUIRED_FEATURES})
|
|
||||||
|
|
||||||
target_include_directories(${OBJECT_LIB} PUBLIC
|
|
||||||
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
|
|
||||||
$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/${JSONCPP_INCLUDE_DIR}>
|
|
||||||
$<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include/json>
|
|
||||||
)
|
|
||||||
|
|
||||||
list(APPEND CMAKE_TARGETS ${OBJECT_LIB})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
install(TARGETS ${CMAKE_TARGETS} ${INSTALL_EXPORT}
|
|
||||||
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
|
||||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
|
||||||
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
|
||||||
OBJECTS DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
|
||||||
)
|
|
||||||
|
|
||||||
|
TARGET_COMPILE_FEATURES(jsoncpp.framework PUBLIC ${REQUIRED_FEATURES})
|
||||||
|
TARGET_INCLUDE_DIRECTORIES(jsoncpp.framework PUBLIC $<BUILD_INTERFACE:${JSONCPP_ROOT_DIR}/include>)
|
Loading…
Reference in New Issue
Block a user