From 7284dfe6e1e72c7873c3438e64e85131bd01a304 Mon Sep 17 00:00:00 2001 From: Ralf Habacker Date: Mon, 13 Feb 2017 21:05:41 +0100 Subject: [PATCH] cmake: Add find package config support Generate cmake equivalent of pkgconfig files and install them at a location known by clients using find_package(DBus1). See readme.cmake for more instructions how to use. Bug: https://bugs.freedesktop.org/show_bug.cgi?id=99721 Signed-off-by: Ralf Habacker --- README.cmake | 26 +++++++++++++++++- cmake/CMakeLists.txt | 12 +++++++++ cmake/DBus1Config.cmake.in | 55 +++++++++++++++++++++++++++++++++++++++ cmake/DBus1ConfigVersion.cmake.in | 11 ++++++++ 4 files changed, 103 insertions(+), 1 deletion(-) create mode 100644 cmake/DBus1Config.cmake.in create mode 100644 cmake/DBus1ConfigVersion.cmake.in diff --git a/README.cmake b/README.cmake index 55427df..facfaf0 100644 --- a/README.cmake +++ b/README.cmake @@ -2,7 +2,7 @@ This file describes how to compile dbus using the cmake build system Requirements ------------ -- cmake version >= 2.4.4 see http://www.cmake.org +- cmake version >= 2.6.0 see http://www.cmake.org - installed libexpat see http://sourceforge.net/projects/expat/ unsupported RelWithDebInfo builds could be fetched from http://sourceforge.net/projects/kde-windows/files/expat/ @@ -171,3 +171,27 @@ Note: The above mentioned options could be extracted after configuring from the output of running " help-options" in the build directory. The related entries start with CMAKE_ or DBUS_. + + +How to compile in dbus into clients with cmake +---------------------------------------------- + +To compile dbus library into a client application with cmake +the following cmake commands are required: + +1. call find_package to find dbus package + +find_package(DBus1) + +2. after specifing targets link dbus into target + +add_executable(test test.c) +target_link_libraries(test ${DBus1_LIBRARIES}) + +Adding ${DBus1_LIBRARIES} to targets also adds required dbus +include dirs and compiler definitions by default. There is +no need to add them with include_directories and add_definitions. + +To compile against dbus installed in a non standard location +specify -DDBus1_DIR=/lib[64]/cmake/DBus1 +on cmake command line. diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 581a788..7603fdd 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -510,6 +510,18 @@ endif() add_definitions(-DHAVE_CONFIG_H=1) +# +# create cmake find_package related files +# +set(INSTALL_CMAKE_DIR ${CMAKE_INSTALL_LIBDIR}/cmake/DBus1) +configure_file(DBus1Config.cmake.in "${CMAKE_BINARY_DIR}/DBus1Config.cmake" @ONLY) +configure_file(DBus1ConfigVersion.cmake.in "${CMAKE_BINARY_DIR}/DBus1ConfigVersion.cmake" @ONLY) +install(FILES + "${CMAKE_BINARY_DIR}/DBus1Config.cmake" + "${CMAKE_BINARY_DIR}/DBus1ConfigVersion.cmake" + DESTINATION "${INSTALL_CMAKE_DIR}" COMPONENT dev +) + ########### subdirs ############### add_subdirectory( dbus ) diff --git a/cmake/DBus1Config.cmake.in b/cmake/DBus1Config.cmake.in new file mode 100644 index 0000000..ae4e9ba --- /dev/null +++ b/cmake/DBus1Config.cmake.in @@ -0,0 +1,55 @@ +# - Config file for the DBus1 package +# It defines the following variables +# DBus1_FOUND - Flag for indicating that DBus1 package has been found +# DBus1_DEFINITIONS - compile definitions for DBus1 [1] +# DBus1_INCLUDE_DIRS - include directories for DBus1 [1] +# DBus1_LIBRARIES - cmake targets to link against + +# [1] This variable is not required if DBus1_LIBRARIES is added +# to a target with target_link_libraries + +# Compute paths +if(CMAKE_LIBRARY_ARCHITECTURE) + get_filename_component(DBus1_INSTALL_DIR "${CMAKE_CURRENT_LIST_DIR}/../../../../" ABSOLUTE) +else() + get_filename_component(DBus1_INSTALL_DIR "${CMAKE_CURRENT_LIST_DIR}/../../../" ABSOLUTE) +endif() +get_filename_component(DBus1_PKGCONFIG_DIR "${CMAKE_CURRENT_LIST_DIR}/../../pkgconfig" ABSOLUTE) + +find_package(PkgConfig) +set(ENV{PKG_CONFIG_DIR}) +set(ENV{PKG_CONFIG_PATH} ${DBus1_PKGCONFIG_DIR}) +set(ENV{PKG_CONFIG_LIBDIR} ${DBus1_PKGCONFIG_DIR}) +# for debugging +#set(ENV{PKG_CONFIG_DEBUG_SPEW} 1) +pkg_check_modules(PC_DBUS1 QUIET dbus-1) +set(DBus1_DEFINITIONS ${PC_DBUS1_CFLAGS_OTHER}) + +# find the real stuff and use pkgconfig variables as hints +# because cmake provides more search options +find_path(DBus1_INCLUDE_DIR dbus/dbus.h + HINTS ${PC_DBUS1_INCLUDEDIR} ${PC_DBUS1_INCLUDE_DIRS} + PATH_SUFFIXES dbus-1.0) +find_path(DBus1_ARCH_INCLUDE_DIR dbus/dbus-arch-deps.h + HINTS ${PC_DBUS1_INCLUDE_DIRS} + PATH_SUFFIXES dbus-1.0) +find_library(DBus1_LIBRARY NAMES ${PC_DBUS1_LIBRARIES} + HINTS ${PC_DBUS1_LIBDIR} ${PC_DBUS1_LIBRARY_DIRS}) + +include(FindPackageHandleStandardArgs) +# handle the QUIETLY and REQUIRED arguments and set DBus1_FOUND to TRUE +# if all listed variables are TRUE +find_package_handle_standard_args(DBus1 DEFAULT_MSG + DBus1_LIBRARY DBus1_INCLUDE_DIR DBus1_ARCH_INCLUDE_DIR) + +# make the mentioned variables only visible in cmake gui with "advanced" enabled +mark_as_advanced(DBus1_INCLUDE_DIR DBus1_LIBRARY) + +set(DBus1_LIBRARIES dbus-1) +set(DBus1_INCLUDE_DIRS "${DBus1_INCLUDE_DIR}" "${DBus1_ARCH_INCLUDE_DIR}") + +# setup imported target +add_library(dbus-1 SHARED IMPORTED) +set_property(TARGET dbus-1 APPEND PROPERTY IMPORTED_LOCATION ${DBus1_LIBRARY}) +set_property(TARGET dbus-1 APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${DBus1_INCLUDE_DIRS}) +set_property(TARGET dbus-1 APPEND PROPERTY INTERFACE_COMPILE_DEFINITIONS ${DBus1_DEFINITIONS}) diff --git a/cmake/DBus1ConfigVersion.cmake.in b/cmake/DBus1ConfigVersion.cmake.in new file mode 100644 index 0000000..e691528 --- /dev/null +++ b/cmake/DBus1ConfigVersion.cmake.in @@ -0,0 +1,11 @@ +set(PACKAGE_VERSION "@DBUS_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() -- 2.6.6