From 5f730200567ef1cd0761adc08aaf77e72b425dcf Mon Sep 17 00:00:00 2001 From: tastytea Date: Wed, 14 Aug 2019 00:15:04 +0200 Subject: [PATCH] Modernized CMake recipes. --- CMakeLists.txt | 149 +++++++++++------------------- cmake/CMakeLists.txt | 19 ++++ cmake/mastodon-cppConfig.cmake.in | 8 ++ cmake/packages.cmake | 40 ++++++++ examples/CMakeLists.txt | 11 +++ packages.CMakeLists.txt | 54 ----------- src/CMakeLists.txt | 53 +++++++++++ tests/CMakeLists.txt | 13 ++- 8 files changed, 194 insertions(+), 153 deletions(-) create mode 100644 cmake/CMakeLists.txt create mode 100644 cmake/mastodon-cppConfig.cmake.in create mode 100644 cmake/packages.cmake create mode 100644 examples/CMakeLists.txt delete mode 100644 packages.CMakeLists.txt create mode 100644 src/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index bf7f5d9..126d66d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,124 +1,85 @@ -cmake_minimum_required (VERSION 3.6) -project (mastodon-cpp - VERSION 0.106.0 - LANGUAGES CXX - ) - -set(WITH_EASY "YES" CACHE STRING "WITH_EASY defaults to \"YES\"") -set(WITH_EXAMPLES "NO" CACHE STRING "WITH_EXAMPLES defaults to \"NO\"") -set(WITH_TESTS "NO" CACHE STRING "WITH_TESTS defaults to \"NO\"") -set(WITH_DOC "YES" CACHE STRING "WITH_DOC defaults to \"YES\"") -set(WITH_DEB "NO" CACHE STRING "WITH_DEB defaults to \"NO\"") -set(WITH_RPM "NO" CACHE STRING "WITH_RPM defaults to \"NO\"") +# Support version 3.6 and above, but use policy settings up to 3.14. +# 3.6 is needed because of IMPORTED_TARGET in pkg_check_modules(). +cmake_minimum_required(VERSION 3.6...3.14) +# Ranges are supported from 3.12, set policy to current for < 3.12. +if(${CMAKE_VERSION} VERSION_LESS 3.12) + cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}) +endif() include(GNUInstallDirs) -find_package(PkgConfig REQUIRED) -find_package(PkgConfig REQUIRED) -pkg_check_modules(CURLPP REQUIRED curlpp) -if(WITH_EASY) - pkg_check_modules(JSONCPP REQUIRED jsoncpp) + +project (mastodon-cpp + VERSION 0.106.0 + LANGUAGES CXX) + +# DESCRIPTION was introduced in version 3.9. +if(NOT (${CMAKE_VERSION} VERSION_LESS 3.9)) + set(PROJECT_DESCRIPTION + "C++ wrapper for the Mastodon API.") endif() +option(WITH_EASY "Compile Easy interface." YES) +option(WITH_EXAMPLES "Compile examples." NO) +option(WITH_TESTS "Compile tests." NO) +option(WITH_DOC "Generate HTML documentation." YES) +option(WITH_DEB "Prepare for the building of .deb packages." NO) +option(WITH_RPM "Prepare for the building of .rpm packages." NO) +option(BUILD_SHARED_LIBS "Build shared libraries." YES) +set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Build type, Release or Debug.") + set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) -set(CMAKE_CXX_FLAGS_DEBUG - "${CMAKE_CXX_FLAGS_DEBUG} -Wall -Wextra -Wpedantic -ftrapv -fsanitize=undefined -g -Og -fno-omit-frame-pointer") - -# Do not complain about compatibility-wrapper -if(NOT CMAKE_BUILD_TYPE STREQUAL "Debug") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations") +set(DEBUG_CXXFLAGS + "-Wall" + "-Wextra" + "-Wpedantic" + "-ftrapv" + "-fsanitize=undefined" + "-g" + "-Og" + "-fno-omit-frame-pointer" + "-Wno-deprecated-declarations") +set(DEBUG_LDFLAGS + "-fsanitize=undefined") +add_compile_options("$<$:${DEBUG_CXXFLAGS}>") +# add_link_options was introduced in version 3.13. +if(${CMAKE_VERSION} VERSION_LESS 3.13) + set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${DEBUG_LDFLAGS}") +else() + add_link_options("$<$:${DEBUG_LDFLAGS}>") endif() -include_directories(${PROJECT_SOURCE_DIR}/src) -include_directories(${PROJECT_BINARY_DIR}) - -include_directories(${CURL_INCLUDE_DIRS}) -include_directories(${CURLPP_INCLUDE_DIRS}) -include_directories(${JSONCPP_INCLUDE_DIRS}) - -link_directories(${CURL_LIBRARY_DIRS}) -link_directories(${CURLPP_LIBRARY_DIRS}) -link_directories(${JSONCPP_LIBRARY_DIRS}) - -# Write version in header -configure_file ( - "${PROJECT_SOURCE_DIR}/src/version.hpp.in" - "${PROJECT_BINARY_DIR}/version.hpp" -) - +# Turn on debug output. if(CMAKE_BUILD_TYPE STREQUAL "Debug") - add_definitions(-DDEBUG=1) + add_definitions("-DDEBUG=1") endif() if(NOT WITH_EASY) - add_definitions(-DWITHOUT_EASY=1) + add_definitions("-DWITHOUT_EASY=1") endif() -# Compile library -if(WITH_EASY) - file(GLOB sources src/*.cpp src/api/*.cpp - src/easy/*.cpp src/easy/entities/*.cpp) -else() - file(GLOB sources src/*.cpp src/api/*.cpp) -endif() -add_library(${PROJECT_NAME} SHARED ${sources}) -set_target_properties(${PROJECT_NAME} PROPERTIES - VERSION ${PROJECT_VERSION} - SOVERSION ${${PROJECT_NAME}_VERSION_MAJOR} - ) +add_subdirectory("src") -if(WITH_EASY) - target_link_libraries(${PROJECT_NAME} - ${CURLPP_LIBRARIES} pthread ${JSONCPP_LIBRARIES}) -else() - target_link_libraries(${PROJECT_NAME} - ${CURLPP_LIBRARIES} pthread) -endif() - -# Compile examples if(WITH_EXAMPLES) - file(GLOB sources_examples examples/*.cpp) - foreach(src ${sources_examples}) - get_filename_component(bin ${src} NAME_WE) - add_executable(${bin} ${src}) - target_link_libraries(${bin} pthread ${JSONCPP_LIBRARIES} ${PROJECT_NAME}) - endforeach() + add_subdirectory("examples") endif() -# Compile tests if(WITH_TESTS) - configure_file("tests/test.gif" "${CMAKE_CURRENT_BINARY_DIR}" COPYONLY) - add_subdirectory(tests) + add_subdirectory("tests") endif() -# Install library and header files -install(TARGETS ${PROJECT_NAME} LIBRARY - DESTINATION ${CMAKE_INSTALL_LIBDIR}) -install(FILES src/mastodon-cpp.hpp src/return_types.hpp src/types.hpp - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}) -if(WITH_EASY) - file(GLOB easy_header src/easy/*.hpp) - install(FILES ${easy_header} - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/easy) - file(GLOB easy_entities_header src/easy/entities/*.hpp) - install(FILES ${easy_entities_header} - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/easy/entities) -endif() - -# Compile & install documentation if(WITH_DOC) add_custom_command(OUTPUT ${PROJECT_SOURCE_DIR}/doc/html - COMMAND ./build_doc.sh WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}) + COMMAND "./build_doc.sh" WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}) add_custom_target(doc DEPENDS doc/html) add_dependencies(${PROJECT_NAME} doc) + install(DIRECTORY ${PROJECT_SOURCE_DIR}/doc/html - DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/doc/${PROJECT_NAME}-${PROJECT_VERSION}) - file(GLOB examples examples/example*.cpp) - install(FILES ${examples} - DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/doc/${PROJECT_NAME}-${PROJECT_VERSION}/examples) + DESTINATION "${CMAKE_INSTALL_DOCDIR}") endif() -# Packages -include(packages.CMakeLists.txt) +add_subdirectory("cmake") + +include("cmake/packages.cmake") diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt new file mode 100644 index 0000000..33a0740 --- /dev/null +++ b/cmake/CMakeLists.txt @@ -0,0 +1,19 @@ +include(CMakePackageConfigHelpers) +include(GNUInstallDirs) + +write_basic_package_version_file("${PROJECT_NAME}ConfigVersion.cmake" + VERSION ${PACKAGE_VERSION} + COMPATIBILITY ExactVersion) # TODO: Set to SameMajorVersion when stable. + +install(EXPORT ${PROJECT_NAME}Targets + FILE "${PROJECT_NAME}Targets.cmake" + NAMESPACE "${PROJECT_NAME}::" + DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}") + +configure_file("${PROJECT_NAME}Config.cmake.in" + "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" @ONLY) + +install(FILES + "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake" + "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake" + DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}") diff --git a/cmake/mastodon-cppConfig.cmake.in b/cmake/mastodon-cppConfig.cmake.in new file mode 100644 index 0000000..c3cffe3 --- /dev/null +++ b/cmake/mastodon-cppConfig.cmake.in @@ -0,0 +1,8 @@ +include(CMakeFindDependencyMacro) +include(GNUInstallDirs) + +find_depencency(jsoncpp REQUIRED CONFIG) +find_dependency(PkgConfig REQUIRED) +pkg_check_modules(curlpp REQUIRED IMPORTED_TARGET curlpp) + +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") diff --git a/cmake/packages.cmake b/cmake/packages.cmake new file mode 100644 index 0000000..743b52b --- /dev/null +++ b/cmake/packages.cmake @@ -0,0 +1,40 @@ +set(CPACK_PACKAGE_NAME ${PROJECT_NAME}) +set(CPACK_PACKAGE_VERSION_MAJOR ${${PROJECT_NAME}_VERSION_MAJOR}) +set(CPACK_PACKAGE_VERSION_MINOR ${${PROJECT_NAME}_VERSION_MINOR}) +set(CPACK_PACKAGE_VERSION_PATCH ${${PROJECT_NAME}_VERSION_PATCH}) +set(CPACK_PACKAGE_VERSION ${mastodon-cpp_VERSION}) +set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "${PROJECT_DESCRIPTION}") +set(CPACK_PACKAGE_CONTACT "tastytea ") +set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE") +set(CPACK_RESOURCE_FILE_README "${PROJECT_SOURCE_DIR}/README.adoc") + +execute_process(COMMAND uname -m + OUTPUT_VARIABLE CPACK_PACKAGE_ARCHITECTURE OUTPUT_STRIP_TRAILING_WHITESPACE) +set(CPACK_PACKAGE_FILE_NAME + "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}_${CPACK_PACKAGE_ARCHITECTURE}") +set(CPACK_GENERATOR "TGZ") + +if (WITH_DEB) + set(CPACK_PACKAGE_NAME "lib${PROJECT_NAME}") + set(CPACK_GENERATOR "DEB") + set(CPACK_DEBIAN_PACKAGE_HOMEPAGE + "https://schlomp.space/tastytea/${PROJECT_NAME}") + set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON) + execute_process(COMMAND dpkg --print-architecture + OUTPUT_VARIABLE CPACK_DEBIAN_PACKAGE_ARCHITECTURE + OUTPUT_STRIP_TRAILING_WHITESPACE) + set(CPACK_PACKAGE_FILE_NAME + "${CPACK_PACKAGE_NAME}_${CPACK_PACKAGE_VERSION}-0_${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}") +endif() + +if (WITH_RPM) + set(CPACK_PACKAGE_NAME "lib${PROJECT_NAME}") + set(CPACK_GENERATOR "RPM") + set(CPACK_RPM_PACKAGE_LICENSE "GPL-3") + set(CPACK_RPM_PACKAGE_URL "https://schlomp.space/tastytea/${PROJECT_NAME}") + set(CPACK_RPM_PACKAGE_REQUIRES "curlpp >= 0.8.1 jsoncpp, >= 1.7.4") + set(CPACK_PACKAGE_FILE_NAME + "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-0.${CPACK_PACKAGE_ARCHITECTURE}") +endif() + +include(CPack) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt new file mode 100644 index 0000000..23cc73a --- /dev/null +++ b/examples/CMakeLists.txt @@ -0,0 +1,11 @@ +file(GLOB sources_examples *.cpp) +foreach(src ${sources_examples}) + get_filename_component(bin ${src} NAME_WE) + add_executable(${bin} ${src}) + target_link_libraries(${bin} PRIVATE ${PROJECT_NAME}) +endforeach() + +if(WITH_DOC) + install(FILES ${sources_examples} + DESTINATION "${CMAKE_INSTALL_DOCDIR}/examples") +endif() diff --git a/packages.CMakeLists.txt b/packages.CMakeLists.txt deleted file mode 100644 index 505f667..0000000 --- a/packages.CMakeLists.txt +++ /dev/null @@ -1,54 +0,0 @@ -set(CPACK_PACKAGE_NAME ${PROJECT_NAME}) -set(CPACK_PACKAGE_VERSION_MAJOR ${${PROJECT_NAME}_VERSION_MAJOR}) -set(CPACK_PACKAGE_VERSION_MINOR ${${PROJECT_NAME}_VERSION_MINOR}) -set(CPACK_PACKAGE_VERSION_PATCH ${${PROJECT_NAME}_VERSION_PATCH}) -set(CPACK_PACKAGE_VERSION ${mastodon-cpp_VERSION}) -set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "C++ wrapper for the Mastodon API") -set(CPACK_PACKAGE_CONTACT "tastytea ") -set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE") -set(CPACK_RESOURCE_FILE_README "${PROJECT_SOURCE_DIR}/README.adoc") -list(APPEND CPACK_SOURCE_IGNORE_FILES "/\\\\.git" - "/.gitignore" - "/build/" - "/doc/" - "\\\\.sublime-" - "/update_doc.sh" - "/.drone.yml" - "/ISSUE_TEMPLATE.md$") -execute_process(COMMAND uname -m - OUTPUT_VARIABLE CPACK_PACKAGE_ARCHITECTURE - OUTPUT_STRIP_TRAILING_WHITESPACE) -set(CPACK_PACKAGE_FILE_NAME - "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}_${CPACK_PACKAGE_ARCHITECTURE}") -set(CPACK_GENERATOR "TGZ") -set(CPACK_SOURCE_GENERATOR "TGZ") - -if (WITH_DEB) - set(CPACK_PACKAGE_NAME "lib${PROJECT_NAME}") - set(CPACK_GENERATOR "DEB") - set(CPACK_SOURCE_GENERATOR "DEB") - set(CPACK_DEBIAN_PACKAGE_HOMEPAGE "https://schlomp.space/tastytea/mastodon-cpp") - set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON) - execute_process(COMMAND dpkg --print-architecture - OUTPUT_VARIABLE CPACK_DEBIAN_PACKAGE_ARCHITECTURE - OUTPUT_STRIP_TRAILING_WHITESPACE) - set(CPACK_PACKAGE_FILE_NAME - "${CPACK_PACKAGE_NAME}_${CPACK_PACKAGE_VERSION}-0_${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}") - set(CPACK_SOURCE_PACKAGE_FILE_NAME - "${CPACK_PACKAGE_NAME}_${CPACK_PACKAGE_VERSION}-0_src") -endif() - -if (WITH_RPM) - set(CPACK_PACKAGE_NAME "lib${PROJECT_NAME}") - set(CPACK_GENERATOR "RPM") - set(CPACK_SOURCE_GENERATOR "RPM") - set(CPACK_RPM_PACKAGE_LICENSE "GPL-3") - set(CPACK_RPM_PACKAGE_URL "https://schlomp.space/tastytea/mastodon-cpp") - set(CPACK_RPM_PACKAGE_REQUIRES "curlpp >= 0.8.1 jsoncpp, >= 1.7.4") - set(CPACK_PACKAGE_FILE_NAME - "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-0.${CPACK_PACKAGE_ARCHITECTURE}") - set(CPACK_SOURCE_PACKAGE_FILE_NAME - "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-0.src") -endif() - -include(CPack) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..cf39f14 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,53 @@ +include(GNUInstallDirs) + +find_package(PkgConfig REQUIRED) +pkg_check_modules(curlpp REQUIRED IMPORTED_TARGET curlpp) +if(WITH_EASY) + find_package(jsoncpp REQUIRED CONFIG) +endif() + +if(WITH_EASY) + file(GLOB_RECURSE sources *.cpp *.hpp) +else() + file(GLOB sources *.cpp api/*.cpp *.hpp api/*.hpp) +endif() + +# Write version in header +configure_file ("version.hpp.in" + "${CMAKE_CURRENT_BINARY_DIR}/version.hpp") + +add_library(${PROJECT_NAME} ${sources}) +set_target_properties(${PROJECT_NAME} PROPERTIES + VERSION ${PROJECT_VERSION} + SOVERSION ${${PROJECT_NAME}_VERSION_MAJOR}) + +target_include_directories(${PROJECT_NAME} + PRIVATE + "$" + PUBLIC + "$" + "$") + +if(WITH_EASY) + target_link_libraries(${PROJECT_NAME} + PUBLIC pthread PkgConfig::curlpp jsoncpp_lib) +else() + target_link_libraries(${PROJECT_NAME} + PUBLIC pthread PkgConfig::curlpp) +endif() + +install(TARGETS ${PROJECT_NAME} + EXPORT "${PROJECT_NAME}Targets" + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}") + +install(FILES mastodon-cpp.hpp return_types.hpp types.hpp + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}) +if(WITH_EASY) + file(GLOB easy_header easy/*.hpp) + install(FILES ${easy_header} + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/easy) + file(GLOB easy_entities_header easy/entities/*.hpp) + install(FILES ${easy_entities_header} + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/easy/entities) +endif() diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index bc5ab0c..8cd0771 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1,20 +1,23 @@ include(CTest) -file(GLOB sources_tests test_*.cpp */test_*.cpp) + +file(GLOB_RECURSE sources_tests test_*.cpp) + +configure_file("test.gif" "${CMAKE_CURRENT_BINARY_DIR}" COPYONLY) find_package(Catch2) -if(Catch2_FOUND) # Catch 2.x +if(Catch2_FOUND) # Catch 2.x include(Catch) add_executable(all_tests main.cpp ${sources_tests}) - target_link_libraries(all_tests ${PROJECT_NAME} Catch2::Catch2) + target_link_libraries(all_tests PRIVATE ${PROJECT_NAME} Catch2::Catch2) target_include_directories(all_tests PRIVATE "/usr/include/catch2") catch_discover_tests(all_tests EXTRA_ARGS "${EXTRA_TEST_ARGS}") -else() # Catch 1.x +else() # Catch 1.x if(EXISTS "/usr/include/catch.hpp") message(STATUS "Catch 1.x found.") foreach(src ${sources_tests}) get_filename_component(bin ${src} NAME_WE) add_executable(${bin} main.cpp ${src}) - target_link_libraries(${bin} ${PROJECT_NAME}) + target_link_libraries(${bin} PRIVATE ${PROJECT_NAME}) add_test(${bin} ${bin} "${EXTRA_TEST_ARGS}") endforeach() else()