From 0014bb0b6e4c5f4e1e66da078086a63933699bea Mon Sep 17 00:00:00 2001 From: Stanislav Angelovic Date: Thu, 23 May 2019 21:40:59 +0200 Subject: [PATCH] Go a step further towards modern CMake and cleaner project structure --- CMakeLists.txt | 65 +++++++++++--------- cmake/LibsystemdExternalProject.cmake | 6 +- cmake/sdbus-c++-config.cmake.in | 11 ++++ sdbus-c++.pc.in => pkgconfig/sdbus-c++.pc.in | 0 sdbus-c++-config.cmake.in | 14 ----- tests/CMakeLists.txt | 6 +- 6 files changed, 54 insertions(+), 48 deletions(-) create mode 100644 cmake/sdbus-c++-config.cmake.in rename sdbus-c++.pc.in => pkgconfig/sdbus-c++.pc.in (100%) delete mode 100644 sdbus-c++-config.cmake.in diff --git a/CMakeLists.txt b/CMakeLists.txt index 7daeef3..e704aa9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,9 +31,9 @@ endif() # SOURCE FILES CONFIGURATION #------------------------------- -set(SDBUSCPP_SOURCE_DIR ${CMAKE_SOURCE_DIR}/src) +set(SDBUSCPP_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src) set(SDBUSCPP_INCLUDE_SUBDIR sdbus-c++) -set(SDBUSCPP_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/include/${SDBUSCPP_INCLUDE_SUBDIR}) +set(SDBUSCPP_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/include/${SDBUSCPP_INCLUDE_SUBDIR}) set(SDBUSCPP_CPP_SRCS ${SDBUSCPP_SOURCE_DIR}/Connection.cpp @@ -86,9 +86,6 @@ if(${CMAKE_VERSION} VERSION_LESS "3.8.0") else() set(CMAKE_CXX_STANDARD 17) # Supported in CMake>=3.8 endif() -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17") -include_directories("${CMAKE_SOURCE_DIR}/include") -include_directories("${CMAKE_SOURCE_DIR}/src") #---------------------------------- # LIBRARY BUILD INFORMATION @@ -99,30 +96,35 @@ set(SDBUSCPP_VERSION "${PROJECT_VERSION}") option(BUILD_SHARED_LIBS "Build shared libraries (.so) instead of static ones (.a)" ON) -add_library(sdbus-cpp OBJECT ${SDBUSCPP_SRCS}) -target_include_directories(sdbus-cpp PUBLIC ${SYSTEMD_INCLUDE_DIRS}) -target_compile_definitions(sdbus-cpp PRIVATE BUILDLIB=1) +# Having an object target allows unit tests to reuse already built sources without re-building +add_library(sdbus-c++-objlib OBJECT ${SDBUSCPP_SRCS}) +target_compile_definitions(sdbus-c++-objlib PRIVATE BUILDLIB=1) +target_include_directories(sdbus-c++-objlib PUBLIC $ + $ + $) if(BUILD_SHARED_LIBS) - set_target_properties(sdbus-cpp PROPERTIES POSITION_INDEPENDENT_CODE ON) + set_target_properties(sdbus-c++-objlib PROPERTIES POSITION_INDEPENDENT_CODE ON) endif() if(BUILD_LIBSYSTEMD) - add_dependencies(sdbus-cpp LibsystemdBuildProject) + add_dependencies(sdbus-c++-objlib LibsystemdBuildProject) endif() -add_library(sdbus-c++ $) +add_library(sdbus-c++ $) +target_include_directories(sdbus-c++ PUBLIC $ + $) set_target_properties(sdbus-c++ - PROPERTIES - PUBLIC_HEADER "${SDBUSCPP_PUBLIC_HDRS}" - VERSION "${SDBUSCPP_VERSION}" - SOVERSION "${SDBUSCPP_VERSION_MAJOR}" - OUTPUT_NAME "sdbus-c++") -target_link_libraries(sdbus-c++ ${SYSTEMD_LIBRARIES}) + PROPERTIES PUBLIC_HEADER "${SDBUSCPP_PUBLIC_HDRS}" + VERSION "${SDBUSCPP_VERSION}" + SOVERSION "${SDBUSCPP_VERSION_MAJOR}" + OUTPUT_NAME "sdbus-c++") +target_link_libraries(sdbus-c++ PRIVATE ${SYSTEMD_LIBRARIES}) #---------------------------------- # INSTALLATION #---------------------------------- install(TARGETS sdbus-c++ + EXPORT sdbus-c++-targets RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT libraries LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT libraries ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT static_libraries @@ -136,7 +138,7 @@ option(BUILD_TESTS "Build and install tests (default OFF)" OFF) if(BUILD_TESTS) enable_testing() - add_subdirectory("${CMAKE_SOURCE_DIR}/tests") + add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/tests") endif() #---------------------------------- @@ -146,7 +148,7 @@ endif() option(BUILD_CODE_GEN "Build and install interface stub code generator (default OFF)" OFF) if(BUILD_CODE_GEN) - add_subdirectory("${CMAKE_SOURCE_DIR}/tools") + add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/tools") endif() #---------------------------------- @@ -157,7 +159,7 @@ option(BUILD_DOC "Build documentation for sdbus-c++" ON) if(BUILD_DOC) option(BUILD_DOXYGEN_DOC "Build doxygen documentation for sdbus-c++ API" OFF) - add_subdirectory("${CMAKE_SOURCE_DIR}/docs") + add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/docs") install(FILES README README.md NEWS COPYING ChangeLog AUTHORS DESTINATION ${CMAKE_INSTALL_DOCDIR}) endif() @@ -166,15 +168,20 @@ endif() #---------------------------------- include(CMakePackageConfigHelpers) -set(SDBUSCPP_CONFIG_INSTALL_DIR ${CMAKE_INSTALL_LIBDIR}/cmake/sdbus-c++) -configure_file(sdbus-c++-config.cmake.in sdbus-c++-config.cmake @ONLY) -install(FILES ${CMAKE_BINARY_DIR}/sdbus-c++-config.cmake DESTINATION ${SDBUSCPP_CONFIG_INSTALL_DIR} COMPONENT dev) +install(EXPORT sdbus-c++-targets + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/sdbus-c++ + NAMESPACE SDBusCpp:: + COMPONENT dev) -write_basic_package_version_file(sdbus-c++-config-version.cmake - VERSION ${PROJECT_VERSION} - COMPATIBILITY AnyNewerVersion) -install(FILES ${CMAKE_BINARY_DIR}/sdbus-c++-config-version.cmake DESTINATION ${SDBUSCPP_CONFIG_INSTALL_DIR} COMPONENT dev) +configure_package_config_file(cmake/sdbus-c++-config.cmake.in cmake/sdbus-c++-config.cmake + INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/sdbus-c++) +write_basic_package_version_file(cmake/sdbus-c++-config-version.cmake COMPATIBILITY SameMajorVersion) +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/cmake/sdbus-c++-config.cmake + ${CMAKE_CURRENT_BINARY_DIR}/cmake/sdbus-c++-config-version.cmake + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/sdbus-c++ + COMPONENT dev) -configure_file(sdbus-c++.pc.in sdbus-c++.pc @ONLY) -install(FILES ${CMAKE_BINARY_DIR}/sdbus-c++.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig COMPONENT dev) +configure_file(pkgconfig/sdbus-c++.pc.in pkgconfig/sdbus-c++.pc @ONLY) +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/pkgconfig/sdbus-c++.pc + DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig COMPONENT dev) diff --git a/cmake/LibsystemdExternalProject.cmake b/cmake/LibsystemdExternalProject.cmake index 6ac94f6..33ec2af 100644 --- a/cmake/LibsystemdExternalProject.cmake +++ b/cmake/LibsystemdExternalProject.cmake @@ -49,6 +49,6 @@ set(SYSTEMD_INCLUDE_DIRS ${SOURCE_DIR}/src) ExternalProject_Get_property(LibsystemdBuildProject BINARY_DIR) set(SYSTEMD_LIBRARY_DIRS ${BINARY_DIR}) -add_library(libsystemd-static STATIC IMPORTED) -set_target_properties(libsystemd-static PROPERTIES IMPORTED_LOCATION ${SYSTEMD_LIBRARY_DIRS}/libsystemd.a) -set(SYSTEMD_LIBRARIES libsystemd-static ${CAP_LIBRARIES} ${GLIBC_RT_LIBRARY} ${MOUNT_LIBRARIES}) +add_library(Systemd::Libsystemd STATIC IMPORTED) +set_target_properties(Systemd::Libsystemd PROPERTIES IMPORTED_LOCATION ${SYSTEMD_LIBRARY_DIRS}/libsystemd.a) +set(SYSTEMD_LIBRARIES Systemd::Libsystemd ${CAP_LIBRARIES} ${GLIBC_RT_LIBRARY} ${MOUNT_LIBRARIES}) diff --git a/cmake/sdbus-c++-config.cmake.in b/cmake/sdbus-c++-config.cmake.in new file mode 100644 index 0000000..ba7c192 --- /dev/null +++ b/cmake/sdbus-c++-config.cmake.in @@ -0,0 +1,11 @@ +@PACKAGE_INIT@ + +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@-targets.cmake") +check_required_components("@PROJECT_NAME@") + +# This is here for backwards-compatibility. Please use more modern target-based approach. +set(SDBUSCPP_VERSION "@SDBUSCPP_VERSION@") +set(SDBUSCPP_FOUND "TRUE") +set_and_check(SDBUSCPP_INCLUDE_DIRS "@CMAKE_INSTALL_FULL_INCLUDEDIR@") +set_and_check(SDBUSCPP_LIBRARY_DIR "@CMAKE_INSTALL_FULL_LIBDIR@") +set(SDBUSCPP_LIBRARIES sdbus-c++) diff --git a/sdbus-c++.pc.in b/pkgconfig/sdbus-c++.pc.in similarity index 100% rename from sdbus-c++.pc.in rename to pkgconfig/sdbus-c++.pc.in diff --git a/sdbus-c++-config.cmake.in b/sdbus-c++-config.cmake.in deleted file mode 100644 index e6af7a7..0000000 --- a/sdbus-c++-config.cmake.in +++ /dev/null @@ -1,14 +0,0 @@ -# Config file for the sdbus-c++ package. -# -# It defines the following variables: -# SDBUSCPP_VERSION - version of sdbus-c++ -# SDBUSCPP_FOUND - set to true -# SDBUSCPP_INCLUDE_DIRS - include directories for sdbus-c++ -# SDBUSCPP_LIBRARY_DIR - library directories for sdbus-c++ -# SDBUSCPP_LIBRARIES - libraries to link against - -set(SDBUSCPP_VERSION "@SDBUSCPP_VERSION@") -set(SDBUSCPP_FOUND "TRUE") -set(SDBUSCPP_INCLUDE_DIRS "@CMAKE_INSTALL_FULL_INCLUDEDIR@") -set(SDBUSCPP_LIBRARY_DIR "@CMAKE_INSTALL_FULL_LIBDIR@") -set(SDBUSCPP_LIBRARIES sdbus-c++) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index db0f260..e387c42 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -84,8 +84,10 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}) # BUILD INFORMATION #---------------------------------- -add_executable(sdbus-c++-unit-tests ${UNITTESTS_SRCS} $) -target_include_directories(sdbus-c++-unit-tests PUBLIC ${SYSTEMD_INCLUDE_DIRS}) +add_executable(sdbus-c++-unit-tests ${UNITTESTS_SRCS} $) +target_include_directories(sdbus-c++-unit-tests PRIVATE ${SYSTEMD_INCLUDE_DIRS} + ${CMAKE_SOURCE_DIR}/src + ${CMAKE_SOURCE_DIR}/include) target_link_libraries(sdbus-c++-unit-tests ${SYSTEMD_LIBRARIES} gmock gmock_main) add_executable(sdbus-c++-integration-tests ${INTEGRATIONTESTS_SRCS})