diff options
author | Joakim Soderberg <joakim.soderberg@gmail.com> | 2014-01-10 16:50:33 +0100 |
---|---|---|
committer | Joakim Soderberg <joakim.soderberg@gmail.com> | 2014-01-24 14:13:02 +0100 |
commit | 913937c98d2b530292e35b7c3fb6c21b576698e9 (patch) | |
tree | c82cf220ccd27cfe406de3044c3ac9f89ece8728 | |
parent | b21cd65d305f04b52c3c7cb1a33c63a2b1d7ad28 (diff) | |
download | jansson-913937c98d2b530292e35b7c3fb6c21b576698e9.zip jansson-913937c98d2b530292e35b7c3fb6c21b576698e9.tar.gz jansson-913937c98d2b530292e35b7c3fb6c21b576698e9.tar.bz2 |
Added CMake config files.
This will simplify linking against the lib, both from the build-tree and
install-tree from other CMake projects.
CMakes find_package command uses these configs to locate the exported
targets for the library.
* Also changed so that all CMake options for the project are prepended
with JANSSON_ so that there is no ambiguity when including this as a
subdirectory in another CMake project.
-rw-r--r-- | CMakeLists.txt | 228 | ||||
-rw-r--r-- | cmake/JanssonConfig.cmake.in | 17 | ||||
-rw-r--r-- | cmake/JanssonConfigVersion.cmake.in | 11 |
3 files changed, 185 insertions, 71 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 08c1666..75c0523 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -51,24 +51,24 @@ cmake_minimum_required (VERSION 2.8) project (jansson C) # Options -OPTION (BUILD_SHARED_LIBS "Build shared libraries." OFF) +option(JANSSON_BUILD_SHARED_LIBS "Build shared libraries." OFF) if (MSVC) # This option must match the settings used in your program, in particular if you # are linking statically - OPTION( STATIC_CRT "Link the static CRT libraries" OFF ) + option(JANSSON_STATIC_CRT "Link the static CRT libraries" OFF ) endif () # Set some nicer output dirs. -SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin) -SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib) -SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib) +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib) # Give the debug version a different postfix for windows, # so both the debug and release version can be built in the # same build-tree on Windows (MSVC). if (WIN32) - SET (CMAKE_DEBUG_POSTFIX "_d") + set(CMAKE_DEBUG_POSTFIX "_d") else (WIN32) endif (WIN32) @@ -79,8 +79,8 @@ endif (WIN32) set(JANSSON_DISPLAY_VERSION "2.5") # This is what is required to match the same numbers as automake's -set (JANSSON_VERSION "4.5.0") -set (JANSSON_SOVERSION 4) +set(JANSSON_VERSION "4.5.0") +set(JANSSON_SOVERSION 4) # for CheckFunctionKeywords set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") @@ -204,11 +204,11 @@ if (HAVE_LOCALECONV AND HAVE_LOCALE_H) set (JSON_HAVE_LOCALECONV 1) else () set (JSON_HAVE_LOCALECONV 0) -endif () +endif() # check if we have setlocale -check_function_exists (setlocale HAVE_SETLOCALE) +check_function_exists(setlocale HAVE_SETLOCALE) # Check what the inline keyword is. @@ -218,38 +218,25 @@ check_function_keywords("__inline") check_function_keywords("__inline__") if (HAVE_INLINE) - set (JSON_INLINE inline) + set(JSON_INLINE inline) elseif (HAVE___INLINE) - set (JSON_INLINE __inline) + set(JSON_INLINE __inline) elseif (HAVE___INLINE__) - set (JSON_INLINE __inline__) -else (HAVE_INLINE) + set(JSON_INLINE __inline__) +else() # no inline on this platform set (JSON_INLINE) -endif (HAVE_INLINE) +endif() # Find our snprintf check_function_exists (snprintf HAVE_SNPRINTF) check_function_exists (_snprintf HAVE__SNPRINTF) if (HAVE_SNPRINTF) - set (JSON_SNPRINTF snprintf) + set(JSON_SNPRINTF snprintf) elseif (HAVE__SNPRINTF) - set (JSON_SNPRINTF _snprintf) -endif () - -# Create pkg-conf file. -# (We use the same files as ./configure does, so we -# have to defined the same variables used there). -if(NOT DEFINED CMAKE_INSTALL_LIBDIR) - set(CMAKE_INSTALL_LIBDIR lib) -endif(NOT DEFINED CMAKE_INSTALL_LIBDIR) -set(prefix ${CMAKE_INSTALL_PREFIX}) -set(exec_prefix ${CMAKE_INSTALL_PREFIX}) -set(libdir ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}) -set(VERSION ${JANSSON_DISPLAY_VERSION}) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/jansson.pc.in - ${CMAKE_CURRENT_BINARY_DIR}/jansson.pc @ONLY) + set(JSON_SNPRINTF _snprintf) +endif () # configure the public config file configure_file (${CMAKE_CURRENT_SOURCE_DIR}/cmake/jansson_config.h.cmake @@ -271,47 +258,48 @@ include_directories (${CMAKE_CURRENT_BINARY_DIR}/include) include_directories (${CMAKE_CURRENT_BINARY_DIR}/private_include) # Add the lib sources. -file (GLOB C_FILES src/*.c) - -if (BUILD_SHARED_LIBS) - - add_library (jansson SHARED ${C_FILES} src/jansson.def) - - set_target_properties (jansson PROPERTIES +file(GLOB JANSSON_SRC src/*.c) + +set(JANSSON_HDR_PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/src/hashtable.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/jansson_private.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/strbuffer.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/utf.h) + +set(JANSSON_HDR_PUBLIC + ${CMAKE_CURRENT_BINARY_DIR}/include/jansson_config.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/jansson.h) + +source_group("Library Sources" FILES ${JANSSON_SRC}) +source_group("Library Private Headers" FILES ${JANSSON_HDR_PRIVATE}) +source_group("Library Public Headers" FILES ${JANSSON_HDR_PUBLIC}) + +if(JANSSON_BUILD_SHARED_LIBS) + add_library(jansson SHARED + ${JANSSON_SRC} + ${JANSSON_HDR_PRIVATE} + ${JANSSON_HDR_PUBLIC} + src/jansson.def) + + set_target_properties(jansson PROPERTIES VERSION ${JANSSON_VERSION} SOVERSION ${JANSSON_SOVERSION}) +else() + add_library(jansson + ${JANSSON_SRC} + ${JANSSON_HDR_PRIVATE} + ${JANSSON_HDR_PUBLIC}) +endif() -else () - - add_library (jansson ${C_FILES}) - -endif () - -# LIBRARY for linux -# RUNTIME for windows (when building shared) -install (TARGETS jansson - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - RUNTIME DESTINATION bin -) - -install (FILES - ${CMAKE_CURRENT_BINARY_DIR}/include/jansson_config.h - ${CMAKE_CURRENT_SOURCE_DIR}/src/jansson.h - DESTINATION include) - -install (FILES - ${CMAKE_CURRENT_BINARY_DIR}/jansson.pc - DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) # For building Documentation (uses Sphinx) -OPTION (BUILD_DOCS "Build documentation (uses python-sphinx)." ON) -if (BUILD_DOCS) +option(JANSSON_BUILD_DOCS "Build documentation (uses python-sphinx)." ON) +if (JANSSON_BUILD_DOCS) find_package(Sphinx) if (NOT SPHINX_FOUND) message(WARNING "Sphinx not found. Cannot generate documentation! - Set -DBUILD_DOCS=0 to get rid of this message.") + Set -DJSON_BUILD_DOCS=0 to get rid of this message.") else() if (Sphinx_VERSION_STRING VERSION_LESS 1.0) message(WARNING "Your Sphinx version is too old! @@ -346,9 +334,9 @@ if (BUILD_DOCS) # Add documentation targets. set(DOC_TARGETS html) - OPTION(BUILD_MAN "Create a target for building man pages." ON) + option(JANSSON_BUILD_MAN "Create a target for building man pages." ON) - if (BUILD_MAN) + if (JANSSON_BUILD_MAN) if (Sphinx_VERSION_STRING VERSION_LESS 1.0) message(WARNING "Sphinx version 1.0 > is required to build man pages. You have v${Sphinx_VERSION_STRING}.") else() @@ -356,9 +344,9 @@ if (BUILD_DOCS) endif() endif() - OPTION(BUILD_LATEX "Create a target for building latex docs (to create PDF)." OFF) + option(JANSSON_BUILD_LATEX "Create a target for building latex docs (to create PDF)." OFF) - if (BUILD_LATEX) + if (JANSSON_BUILD_LATEX) find_package(LATEX) if (NOT LATEX_COMPILER) @@ -391,14 +379,14 @@ if (BUILD_DOCS) endif () -OPTION (WITHOUT_TESTS "Don't build tests ('make test' to execute tests)" OFF) +option(JANSSON_WITHOUT_TESTS "Don't build tests ('make test' to execute tests)" OFF) -if (NOT WITHOUT_TESTS) - OPTION (TEST_WITH_VALGRIND "Enable valgrind tests." OFF) +if (NOT JANSSON_WITHOUT_TESTS) + option(JANSSON_TEST_WITH_VALGRIND "Enable valgrind tests." OFF) ENABLE_TESTING() - if (TEST_WITH_VALGRIND) + if (JANSSON_TEST_WITH_VALGRIND) # TODO: Add FindValgrind.cmake instead of having a hardcoded path. # enable valgrind @@ -479,3 +467,101 @@ if (NOT WITHOUT_TESTS) DEPENDS json_process ${api_tests}) endif () +# +# Installation preparation. +# + +# Allow the user to override installation directories. +set(JANSSON_INSTALL_LIB_DIR lib CACHE PATH "Installation directory for libraries") +set(JANSSON_INSTALL_BIN_DIR bin CACHE PATH "Installation directory for executables") +set(JANSSON_INSTALL_INCLUDE_DIR include CACHE PATH "Installation directory for header files") + +if(WIN32 AND NOT CYGWIN) + set(DEF_INSTALL_CMAKE_DIR cmake) +else() + set(DEF_INSTALL_CMAKE_DIR lib/cmake/jansson) +endif() + +set(JANSSON_INSTALL_CMAKE_DIR ${DEF_INSTALL_CMAKE_DIR} CACHE PATH "Installation directory for CMake files") + +# Make sure the paths are absolute. +foreach(p LIB BIN INCLUDE CMAKE) + set(var JANSSON_INSTALL_${p}_DIR) + if(NOT IS_ABSOLUTE "${${var}}") + set(${var} "${CMAKE_INSTALL_PREFIX}/${${var}}") + endif() +endforeach() + +# Export targets (This is used for other CMake projects to easily find the libraries and include files). +export(TARGETS jansson + FILE "${PROJECT_BINARY_DIR}/JanssonTargets.cmake") +export(PACKAGE jansson) + +# Generate the config file for the build-tree. +set(JANSSON__INCLUDE_DIRS + "${PROJECT_SOURCE_DIR}/include" + "${PROJECT_BINARY_DIR}/include") +configure_file(${PROJECT_SOURCE_DIR}/cmake/JanssonConfig.cmake.in + ${PROJECT_BINARY_DIR}/JanssonConfig.cmake + @ONLY) + +# Generate the config file for the installation tree. +file(RELATIVE_PATH + REL_INCLUDE_DIR + "${JANSSON_INSTALL_CMAKE_DIR}" + "${JANSSON_INSTALL_INCLUDE_DIR}") # Calculate the relative directory from the Cmake dir. + +# Note the EVENT_CMAKE_DIR is defined in JanssonConfig.cmake.in, +# we escape it here so it's evaluated when it is included instead +# so that the include dirs are given relative to where the +# config file is located. +set(JANSSON__INCLUDE_DIRS + "\${JANSSON_CMAKE_DIR}/${REL_INCLUDE_DIR}") +configure_file(${PROJECT_SOURCE_DIR}/cmake/JanssonConfig.cmake.in + ${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/JanssonConfig.cmake + @ONLY) + +# Generate version info for both build-tree and install-tree. +configure_file(${PROJECT_SOURCE_DIR}/cmake/JanssonConfigVersion.cmake.in + ${PROJECT_BINARY_DIR}/JanssonConfigVersion.cmake + @ONLY) + +# Define the public headers. +set_target_properties(jansson PROPERTIES PUBLIC_HEADER "${JANSSON_HDR_PUBLIC}") +#TODO: fix this. + +# Create pkg-conf file. +# (We use the same files as ./configure does, so we +# have to defined the same variables used there). +set(prefix ${CMAKE_INSTALL_PREFIX}) +set(exec_prefix ${CMAKE_INSTALL_PREFIX}) +set(libdir ${CMAKE_INSTALL_PREFIX}/${JANSSON_INSTALL_LIB_DIR}) +set(VERSION ${JANSSON_DISPLAY_VERSION}) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/jansson.pc.in + ${CMAKE_CURRENT_BINARY_DIR}/jansson.pc @ONLY) + +# +# Install targets. +# +install(TARGETS jansson + EXPORT JanssonTargets + LIBRARY DESTINATION "${JANSSON_INSTALL_LIB_DIR}" COMPONENT lib + ARCHIVE DESTINATION "${JANSSON_INSTALL_LIB_DIR}" COMPONENT lib + RUNTIME DESTINATION "${JANSSON_INSTALL_BIN_DIR}" COMPONENT lib # Windows DLLs + PUBLIC_HEADER DESTINATION "${JANSSON_INSTALL_INCLUDE_DIR}" COMPONENT dev) + +# Install the pkg-config. +install (FILES + ${CMAKE_CURRENT_BINARY_DIR}/jansson.pc + DESTINATION ${JANSSON_INSTALL_LIB_DIR}/pkgconfig COMPONENT dev) + +# Install the configs. +install(FILES + ${PROJECT_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/JanssonConfig.cmake + ${PROJECT_BINARY_DIR}/JanssonConfigVersion.cmake + DESTINATION "${JANSSON_INSTALL_CMAKE_DIR}" COMPONENT dev) + +# Install exports for the install-tree. +install(EXPORT JanssonTargets + DESTINATION "${JANSSON_INSTALL_CMAKE_DIR}" COMPONENT dev) + diff --git a/cmake/JanssonConfig.cmake.in b/cmake/JanssonConfig.cmake.in new file mode 100644 index 0000000..21af0ff --- /dev/null +++ b/cmake/JanssonConfig.cmake.in @@ -0,0 +1,17 @@ +# - Config file for the Libevent package +# It defines the following variables +# LIBEVENT_INCLUDE_DIRS - include directories for FooBar +# LIBEVENT_LIBRARIES - libraries to link against + +# Get the path of the current file. +get_filename_component(JANSSON_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) + +# Set the include directories. +set(JANSSON_INCLUDE_DIRS "@JANSSON__INCLUDE_DIRS@") + +# Include the project Targets file, this contains definitions for IMPORTED targets. +include(${JANSSON_CMAKE_DIR}/JanssonTargets.cmake) + +# IMPORTED targets from LibeventTargets.cmake +set(JANSSON_LIBRARIES event event_core event_extras) + diff --git a/cmake/JanssonConfigVersion.cmake.in b/cmake/JanssonConfigVersion.cmake.in new file mode 100644 index 0000000..83b0d74 --- /dev/null +++ b/cmake/JanssonConfigVersion.cmake.in @@ -0,0 +1,11 @@ +set(PACKAGE_VERSION "@JANSSON_DISPLAY_VERSION@") + +# Check whether the requested PACKAGE_FIND_VERSION is compatible +if("${PACKAGE_VERSION}" VERSION_LESS "${PACKAGE_FIND_VERSION}") + set(PACKAGE_VERSION_COMPATIBLE FALSE) +else() + set(PACKAGE_VERSION_COMPATIBLE TRUE) + if ("${PACKAGE_VERSION}" VERSION_EQUAL "${PACKAGE_FIND_VERSION}") + set(PACKAGE_VERSION_EXACT TRUE) + endif() +endif() |