From a627916d4a11f50fc26f292f089deff2014aa7fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torbj=C3=B6rn=20Klatt?= Date: Thu, 19 Sep 2013 16:53:03 +0200 Subject: [PATCH] add CMake package configuration file This will enabled other CMake-based projects to find an installed version of cpp-netlib via find_package(cppnetlib [[VERSION] 0.10.1] [REQUIRED]) To link to the installed cppnetlib version projects want to use include_directories(${CPPNETLIB_INCLUDE_DIRS}) target_link_library(myTarget ${CPPNETLIB_LIBRARIES}) --- CMakeLists.txt | 55 +++++++++++++++++++++++++++++++-- cppnetlibConfig.cmake.in | 24 ++++++++++++++ cppnetlibConfigVersion.cmake.in | 11 +++++++ libs/network/src/CMakeLists.txt | 30 ++++++++++++++---- 4 files changed, 112 insertions(+), 8 deletions(-) create mode 100644 cppnetlibConfig.cmake.in create mode 100644 cppnetlibConfigVersion.cmake.in diff --git a/CMakeLists.txt b/CMakeLists.txt index 606ea337e..8726ecc7f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,8 +8,24 @@ project(CPP-NETLIB) option( CPP-NETLIB_BUILD_SHARED_LIBS "Build cpp-netlib as shared libraries." OFF ) +include(GNUInstallDirs) + +# determine install path for CMake config files +if(WIN32 AND NOT CYGWIN) + set(DEF_INSTALL_CMAKE_DIR CMake) +else() + set(DEF_INSTALL_CMAKE_DIR lib/CMake/cppnetlib) +endif() +set(INSTALL_CMAKE_DIR ${DEF_INSTALL_CMAKE_DIR} CACHE PATH "Installation directory for CMake files") + +# Make relative cmake install path absolute (needed later on) +if(NOT IS_ABSOLUTE "${INSTALL_CMAKE_DIR}") + set(INSTALL_CMAKE_DIR "${CMAKE_INSTALL_PREFIX}/${INSTALL_CMAKE_DIR}") +endif() + + if(CPP-NETLIB_BUILD_SHARED_LIBS OR BUILD_SHARED_LIBS) - message ("Linking boost testing libs dynamically...") + message (STATUS "Linking boost testing libs dynamically...") set(Boost_USE_STATIC_LIBS OFF) set(CPP-NETLIB_BUILD_SHARED_LIBS ON) set(BUILD_SHARED_LIBS ON) @@ -68,5 +84,40 @@ endif() enable_testing() -include(GNUInstallDirs) install(DIRECTORY boost DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) + +### +## Export Targets +# (so cpp-netlib can be easily used by other CMake projects) +# [see http://www.cmake.org/Wiki/CMake/Tutorials/How_to_create_a_ProjectConfig.cmake_file] + +# Add all targets to the build-tree export set +export(TARGETS cppnetlib-client-connections cppnetlib-server-parsers cppnetlib-uri + FILE "${PROJECT_BINARY_DIR}/cppnetlibTargets.cmake") +# Export the package for use from the build-tree +# (this registers the build-tree with a global CMake-registry) +export(PACKAGE cppnetlib) +# Create the cppnetlibConfig.cmake and cppnetlibConfigVersion files +file(RELATIVE_PATH REL_INCLUDE_DIR "${INSTALL_CMAKE_DIR}" + "${CMAKE_INSTALL_FULL_INCLUDEDIR}") +# ... for the build tree +set(CONF_INCLUDE_DIRS "${PROJECT_SOURCE_DIR}") +configure_file(cppnetlibConfig.cmake.in + "${PROJECT_BINARY_DIR}/cppnetlibConfig.cmake" @ONLY) +# ... for the install tree +set(CONF_INCLUDE_DIRS "\${CPPNETLIB_CMAKE_DIR}/${REL_INCLUDE_DIR}") +configure_file(cppnetlibConfig.cmake.in + "${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/cppnetlibConfig.cmake" @ONLY) +# ... for both +configure_file(cppnetlibConfigVersion.cmake.in + "${PROJECT_BINARY_DIR}/cppnetlibConfigVersion.cmake" @ONLY) +# Install the cppnetlibConfig.cmake and cppnetlibConfigVersion.cmake +install(FILES + "${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/cppnetlibConfig.cmake" + "${PROJECT_BINARY_DIR}/cppnetlibConfigVersion.cmake" + DESTINATION "${INSTALL_CMAKE_DIR}" + COMPONENT dev) +# Install the export set for use with the install-tree +install(EXPORT cppnetlibTargets + DESTINATION "${INSTALL_CMAKE_DIR}" + COMPONENT dev) diff --git a/cppnetlibConfig.cmake.in b/cppnetlibConfig.cmake.in new file mode 100644 index 000000000..a7e5581a7 --- /dev/null +++ b/cppnetlibConfig.cmake.in @@ -0,0 +1,24 @@ +# - Config file for the cppnetlib package +# It defines the following variables +# CPPNETLIB_INCLUDE_DIRS - include directories for cppnetlib +# CPPNETLIB_LIBRARIES - libraries to link against +# CPPNETLIB_EXECUTABLE - the bar executable + +# Compute paths +get_filename_component(CPPNETLIB_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) +set(CPPNETLIB_INCLUDE_DIRS "@CONF_INCLUDE_DIRS@") + +# Our library dependencies (contains definitions for IMPORTED targets) +if( NOT TARGET cppnetlib-client-connections + AND NOT TARGET cppnetlib-server-parsers + AND NOT TARGET cppnetlib-uri + AND NOT CPPNETLIB_BINARY_DIR) + include("${CPPNETLIB_CMAKE_DIR}/cppnetlibTargets.cmake") +endif() + +# These are IMPORTED targets created by cppnetlibTargets.cmake +set(CPPNETLIB_LIBRARIES + cppnetlib-client-connections + cppnetlib-server-parsers + cppnetlib-uri) +#set(CPPNETLIB_EXECUTABLE ...) # maybe the examples? diff --git a/cppnetlibConfigVersion.cmake.in b/cppnetlibConfigVersion.cmake.in new file mode 100644 index 000000000..e459ca324 --- /dev/null +++ b/cppnetlibConfigVersion.cmake.in @@ -0,0 +1,11 @@ +set(PACKAGE_VERSION "@CPPNETLIB_VERSION_STRING@") + +# 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() \ No newline at end of file diff --git a/libs/network/src/CMakeLists.txt b/libs/network/src/CMakeLists.txt index 0314e5f8d..e66943d69 100644 --- a/libs/network/src/CMakeLists.txt +++ b/libs/network/src/CMakeLists.txt @@ -8,20 +8,38 @@ include_directories(${CPP-NETLIB_SOURCE_DIR}) +file(GLOB_RECURSE CPP-NETLIB_HEADERS + "${CPP-NETLIB_SOURCE_DIR}/boost/" "*.hpp") + set(CPP-NETLIB_URI_SRCS uri/uri.cpp uri/schemes.cpp) add_library(cppnetlib-uri ${CPP-NETLIB_URI_SRCS}) set_target_properties(cppnetlib-uri - PROPERTIES VERSION ${CPPNETLIB_VERSION_STRING} SOVERSION ${CPPNETLIB_VERSION_MAJOR}) -install(TARGETS cppnetlib-uri DESTINATION ${CMAKE_INSTALL_LIBDIR}) + PROPERTIES VERSION ${CPPNETLIB_VERSION_STRING} + SOVERSION ${CPPNETLIB_VERSION_MAJOR} + PUBLIC_HEADER "${CPP-NETLIB_HEADERS}") +install(TARGETS cppnetlib-uri + EXPORT cppnetlibTargets + PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_FULL_INCLUDEDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR}) set(CPP-NETLIB_HTTP_SERVER_SRCS server_request_parsers_impl.cpp) add_library(cppnetlib-server-parsers ${CPP-NETLIB_HTTP_SERVER_SRCS}) set_target_properties(cppnetlib-server-parsers - PROPERTIES VERSION ${CPPNETLIB_VERSION_STRING} SOVERSION ${CPPNETLIB_VERSION_MAJOR}) -install(TARGETS cppnetlib-server-parsers DESTINATION ${CMAKE_INSTALL_LIBDIR}) + PROPERTIES VERSION ${CPPNETLIB_VERSION_STRING} + SOVERSION ${CPPNETLIB_VERSION_MAJOR} + PUBLIC_HEADER "${CPP-NETLIB_HEADERS}") +install(TARGETS cppnetlib-server-parsers + EXPORT cppnetlibTargets + PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_FULL_INCLUDEDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR}) set(CPP-NETLIB_HTTP_CLIENT_SRCS client.cpp) add_library(cppnetlib-client-connections ${CPP-NETLIB_HTTP_CLIENT_SRCS}) set_target_properties(cppnetlib-client-connections - PROPERTIES VERSION ${CPPNETLIB_VERSION_STRING} SOVERSION ${CPPNETLIB_VERSION_MAJOR}) -install(TARGETS cppnetlib-client-connections DESTINATION ${CMAKE_INSTALL_LIBDIR}) + PROPERTIES VERSION ${CPPNETLIB_VERSION_STRING} + SOVERSION ${CPPNETLIB_VERSION_MAJOR} + PUBLIC_HEADER "${CPP-NETLIB_HEADERS}") +install(TARGETS cppnetlib-client-connections + EXPORT cppnetlibTargets + PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_FULL_INCLUDEDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR})