From 3e68fee4cd8de9c6c19699f43f28128f9770b467 Mon Sep 17 00:00:00 2001 From: sangelovic Date: Sat, 1 Feb 2020 23:45:28 +0100 Subject: [PATCH] Switch to more modern CMake --- CMakeLists.txt | 39 ++++++++++--------- cmake/LibsystemdExternalProject.cmake | 15 ++++---- cmake/sdbus-c++-config.cmake.in | 7 ---- tests/CMakeLists.txt | 55 +++++++++++---------------- 4 files changed, 51 insertions(+), 65 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 23a6534..d64456f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ # PROJECT INFORMATION #------------------------------- -cmake_minimum_required(VERSION 3.6) +cmake_minimum_required(VERSION 3.12) project(sdbus-c++ VERSION 0.8.0 LANGUAGES C CXX) @@ -16,12 +16,14 @@ option(BUILD_LIBSYSTEMD "Build libsystemd static library and incorporate it into if(NOT BUILD_LIBSYSTEMD) find_package(PkgConfig REQUIRED) - pkg_check_modules(SYSTEMD libsystemd>=236) - if(NOT SYSTEMD_FOUND) + pkg_check_modules(Systemd IMPORTED_TARGET GLOBAL libsystemd>=236) + if(NOT TARGET PkgConfig::Systemd) message(FATAL_ERROR "libsystemd of version at least 236 is required, but was not found " "(you may turn BUILD_LIBSYSTEMD on for sdbus-c++ to try downloading " "and building libsystemd in as part of sdbus-c++ during configuration)") endif() + add_library(Systemd::Libsystemd ALIAS PkgConfig::Systemd) + set(LIBSYSTEMD_VERSION ${Systemd_VERSION}) else() # Build static libsystemd library as an external project include(cmake/LibsystemdExternalProject.cmake) @@ -80,11 +82,7 @@ set(SDBUSCPP_SRCS ${SDBUSCPP_CPP_SRCS} ${SDBUSCPP_HDR_SRCS} ${SDBUSCPP_PUBLIC_HD # GENERAL COMPILER CONFIGURATION #------------------------------- -if(${CMAKE_VERSION} VERSION_LESS "3.8.0") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17") -else() - set(CMAKE_CXX_STANDARD 17) # Supported in CMake>=3.8 -endif() +set(CMAKE_CXX_STANDARD 17) #---------------------------------- # LIBRARY BUILD INFORMATION @@ -93,22 +91,25 @@ endif() set(SDBUSCPP_VERSION_MAJOR "${PROJECT_VERSION_MAJOR}") set(SDBUSCPP_VERSION "${PROJECT_VERSION}") -option(BUILD_SHARED_LIBS "Build shared libraries (.so) instead of static ones (.a)" ON) +# We promote BUILD_SHARED_LIBS flags to (global) option only if we are the main project +if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR) + option(BUILD_SHARED_LIBS "Build shared libraries (.so) instead of static ones (.a)" ON) +endif() # 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 BUILD_LIB=1 LIBSYSTEMD_VERSION=${SYSTEMD_VERSION}) +target_compile_definitions(sdbus-c++-objlib PRIVATE BUILD_LIB=1 LIBSYSTEMD_VERSION=${LIBSYSTEMD_VERSION}) target_include_directories(sdbus-c++-objlib PUBLIC $ - $ - $) -if(BUILD_SHARED_LIBS) - set_target_properties(sdbus-c++-objlib PROPERTIES POSITION_INDEPENDENT_CODE ON) + $) +if(DEFINED BUILD_SHARED_LIBS) + set_target_properties(sdbus-c++-objlib PROPERTIES POSITION_INDEPENDENT_CODE ${BUILD_SHARED_LIBS}) endif() if(BUILD_LIBSYSTEMD) add_dependencies(sdbus-c++-objlib LibsystemdBuildProject) endif() +target_link_libraries(sdbus-c++-objlib PUBLIC Systemd::Libsystemd) -add_library(sdbus-c++ $) +add_library(sdbus-c++) target_include_directories(sdbus-c++ PUBLIC $ $) set_target_properties(sdbus-c++ @@ -116,13 +117,17 @@ set_target_properties(sdbus-c++ VERSION "${SDBUSCPP_VERSION}" SOVERSION "${SDBUSCPP_VERSION_MAJOR}" OUTPUT_NAME "sdbus-c++") -target_link_libraries(sdbus-c++ PRIVATE ${SYSTEMD_LIBRARIES}) +target_link_libraries(sdbus-c++ PRIVATE sdbus-c++-objlib) #---------------------------------- # INSTALLATION #---------------------------------- +set(EXPORT_SET sdbus-c++) +if(NOT BUILD_SHARED_LIBS) + list(APPEND EXPORT_SET "sdbus-c++-objlib") +endif() -install(TARGETS sdbus-c++ +install(TARGETS ${EXPORT_SET} EXPORT sdbus-c++-targets RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT libraries LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT libraries diff --git a/cmake/LibsystemdExternalProject.cmake b/cmake/LibsystemdExternalProject.cmake index d30d1ad..239868e 100644 --- a/cmake/LibsystemdExternalProject.cmake +++ b/cmake/LibsystemdExternalProject.cmake @@ -38,20 +38,19 @@ ExternalProject_Add(LibsystemdBuildProject GIT_SHALLOW 1 UPDATE_COMMAND "" CONFIGURE_COMMAND ${CMAKE_COMMAND} -E remove /* - COMMAND ${MESON} --buildtype=${LIBSYSTEMD_BUILD_TYPE} -Dstatic-libsystemd=pic + COMMAND ${MESON} --prefix= --buildtype=${LIBSYSTEMD_BUILD_TYPE} -Dstatic-libsystemd=pic BUILD_COMMAND ${BUILD_VERSION_H} COMMAND ${NINJA} -C libsystemd.a BUILD_ALWAYS 1 - INSTALL_COMMAND "" + INSTALL_COMMAND ${CMAKE_COMMAND} -E copy_directory /src/libsystemd /include LOG_DOWNLOAD 1 LOG_UPDATE 1 LOG_CONFIGURE 1 LOG_BUILD 1) ExternalProject_Get_property(LibsystemdBuildProject SOURCE_DIR) -set(SYSTEMD_INCLUDE_DIRS ${SOURCE_DIR}/src) ExternalProject_Get_property(LibsystemdBuildProject BINARY_DIR) -set(SYSTEMD_LIBRARY_DIRS ${BINARY_DIR}) - -set(SYSTEMD_VERSION ${LIBSYSTEMD_VERSION}) +ExternalProject_Get_property(LibsystemdBuildProject INSTALL_DIR) 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}) +set_target_properties(Systemd::Libsystemd PROPERTIES IMPORTED_LOCATION ${BINARY_DIR}/libsystemd.a) +file(MAKE_DIRECTORY ${INSTALL_DIR}/include) # Trick for CMake to stop complaining about non-existent ${INSTALL_DIR}/include directory +target_include_directories(Systemd::Libsystemd INTERFACE ${INSTALL_DIR}/include) +target_link_libraries(Systemd::Libsystemd INTERFACE ${CAP_LIBRARIES} ${GLIBC_RT_LIBRARY} ${MOUNT_LIBRARIES}) diff --git a/cmake/sdbus-c++-config.cmake.in b/cmake/sdbus-c++-config.cmake.in index ba7c192..035dc0f 100644 --- a/cmake/sdbus-c++-config.cmake.in +++ b/cmake/sdbus-c++-config.cmake.in @@ -2,10 +2,3 @@ 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/tests/CMakeLists.txt b/tests/CMakeLists.txt index 0313b80..b226eac 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1,37 +1,29 @@ #------------------------------- # DOWNLOAD AND BUILD OF GOOGLETEST -# https://github.com/google/googletest/blob/master/googletest/README.md#incorporating-into-an-existing-cmake-project #------------------------------- -configure_file(googletest-download/CMakeLists.txt.in googletest-download/CMakeLists.txt) +include(FetchContent) -execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" . - RESULT_VARIABLE result - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/googletest-download) +message("Fetching googletest...") +FetchContent_Declare(googletest + GIT_REPOSITORY https://github.com/google/googletest.git + GIT_TAG master + GIT_SHALLOW 1 + UPDATE_COMMAND "") -if(result) - message(FATAL_ERROR "CMake step for googletest failed: ${result}") +#FetchContent_MakeAvailable(googletest) # Not available in CMake 3.13 :-( Let's do it manually: +FetchContent_GetProperties(googletest) +if(NOT googletest_POPULATED) + FetchContent_Populate(googletest) + set(gtest_force_shared_crt ON CACHE INTERNAL "" FORCE) + set(BUILD_GMOCK ON CACHE INTERNAL "" FORCE) + set(INSTALL_GTEST OFF CACHE INTERNAL "" FORCE) + set(BUILD_SHARED_LIBS_BAK ${BUILD_SHARED_LIBS}) + set(BUILD_SHARED_LIBS OFF) + add_subdirectory(${googletest_SOURCE_DIR} ${googletest_BINARY_DIR}) + set(BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS_BAK}) endif() -execute_process(COMMAND ${CMAKE_COMMAND} --build . - RESULT_VARIABLE result - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/googletest-download) - -if(result) - message(FATAL_ERROR "Build step for googletest failed: ${result}") -endif() - -set(gtest_force_shared_crt ON CACHE INTERNAL "" FORCE) -set(BUILD_GMOCK ON CACHE INTERNAL "" FORCE) -set(INSTALL_GTEST OFF CACHE INTERNAL "" FORCE) - -set(BUILD_SHARED_LIBS_BAK ${BUILD_SHARED_LIBS}) -set(BUILD_SHARED_LIBS OFF) -add_subdirectory(${CMAKE_CURRENT_BINARY_DIR}/googletest-src - ${CMAKE_CURRENT_BINARY_DIR}/googletest-build - EXCLUDE_FROM_ALL) -set(BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS_BAK}) - #------------------------------- # SOURCE FILES CONFIGURATION #------------------------------- @@ -84,15 +76,12 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}) # BUILD INFORMATION #---------------------------------- -add_executable(sdbus-c++-unit-tests ${UNITTESTS_SRCS} $) -target_compile_definitions(sdbus-c++-unit-tests PRIVATE LIBSYSTEMD_VERSION=${SYSTEMD_VERSION}) -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++-unit-tests ${UNITTESTS_SRCS}) +target_compile_definitions(sdbus-c++-unit-tests PRIVATE LIBSYSTEMD_VERSION=${LIBSYSTEMD_VERSION}) +target_link_libraries(sdbus-c++-unit-tests sdbus-c++-objlib gmock gmock_main) add_executable(sdbus-c++-integration-tests ${INTEGRATIONTESTS_SRCS}) -target_compile_definitions(sdbus-c++-integration-tests PRIVATE LIBSYSTEMD_VERSION=${SYSTEMD_VERSION}) +target_compile_definitions(sdbus-c++-integration-tests PRIVATE LIBSYSTEMD_VERSION=${LIBSYSTEMD_VERSION}) target_link_libraries(sdbus-c++-integration-tests sdbus-c++ gmock gmock_main) # Manual performance and stress tests