diff --git a/CMakeLists.txt b/CMakeLists.txt index a379da6..b0ea186 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,61 +1,56 @@ -cmake_minimum_required (VERSION 3.2) +# Support version 3.2 and above, but use policy settings up to 3.14. +cmake_minimum_required(VERSION 3.2...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() + project(gitea2rss VERSION 0.4.4 - LANGUAGES CXX -) + LANGUAGES CXX) -set(WITH_MAN "YES" CACHE STRING "WITH_MAN defaults to \"YES\"") -set(WITH_TESTS "NO" CACHE STRING "WITH_TESTS defaults to \"NO\"") +# DESCRIPTION was introduced in version 3.9. +if(NOT (${CMAKE_VERSION} VERSION_LESS 3.9)) + set(PROJECT_DESCRIPTION + "Generates RSS feeds from Gitea releases or tags.") +endif() -include(GNUInstallDirs) -find_package(PkgConfig REQUIRED) -pkg_check_modules(CURLPP REQUIRED curlpp) -pkg_check_modules(JSONCPP REQUIRED jsoncpp) +option(WITH_MAN "Compile and install manpage." YES) +option(WITH_TESTS "Compile tests." NO) 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") +set(DEBUG_CXXFLAGS + "-Wall" + "-Wextra" + "-Wpedantic" + "-ftrapv" + "-fsanitize=undefined" + "-g" + "-Og" + "-fno-omit-frame-pointer") +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}) +find_package(jsoncpp CONFIG REQUIRED) +find_package(PkgConfig REQUIRED) +pkg_check_modules(curlpp REQUIRED IMPORTED_TARGET curlpp) -include_directories(${CURLPP_INCLUDE_DIRS}) -include_directories(${JSONCPP_INCLUDE_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" -) - -file(GLOB sources src/*.cpp) -add_executable(${PROJECT_NAME} "${sources}") -target_link_libraries(${PROJECT_NAME} ${CURLPP_LIBRARIES} ${JSONCPP_LIBRARIES}) -install(TARGETS ${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_BINDIR}) +add_subdirectory(src) if (WITH_MAN) - add_custom_command( - OUTPUT "${PROJECT_BINARY_DIR}/${PROJECT_NAME}.1" - WORKING_DIRECTORY "${PROJECT_BINARY_DIR}" - DEPENDS "${CMAKE_SOURCE_DIR}/${PROJECT_NAME}.1.adoc" - COMMAND ${CMAKE_SOURCE_DIR}/build_manpage.sh - ARGS ${PROJECT_VERSION}) - add_custom_target(run ALL DEPENDS "${PROJECT_BINARY_DIR}/${PROJECT_NAME}.1") - install( - FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.1 - DESTINATION ${CMAKE_INSTALL_MANDIR}/man1) + add_subdirectory(man) endif() if(WITH_TESTS) - add_library(${PROJECT_NAME}_testlib SHARED ${sources}) - target_link_libraries(${PROJECT_NAME}_testlib - ${CURLPP_LIBRARIES} ${JSONCPP_LIBRARIES}) - include(tests.CMakeLists.txt) + add_subdirectory(tests) endif() diff --git a/config/nginx-example.conf b/config/nginx-example.conf index 7cb5916..4a8c6ee 100644 --- a/config/nginx-example.conf +++ b/config/nginx-example.conf @@ -11,6 +11,7 @@ server { ssl_certificate /var/lib/dehydrated/certs/rss.example.com/fullchain.pem; ssl_certificate_key /var/lib/dehydrated/certs/rss.example.com/privkey.pem; + # Tell clients to cache for 1 hour. expires 1h; location / { diff --git a/man/CMakeLists.txt b/man/CMakeLists.txt new file mode 100644 index 0000000..9fb0b7b --- /dev/null +++ b/man/CMakeLists.txt @@ -0,0 +1,14 @@ +include(GNUInstallDirs) + +add_custom_command( + OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.1" + WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" + DEPENDS "${PROJECT_NAME}.1.adoc" + COMMAND "${PROJECT_SOURCE_DIR}/man/build_manpage.sh" + ARGS "${PROJECT_VERSION}") + +add_custom_target(man ALL + DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.1") + +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.1 + DESTINATION ${CMAKE_INSTALL_MANDIR}/man1) diff --git a/build_manpage.sh b/man/build_manpage.sh similarity index 92% rename from build_manpage.sh rename to man/build_manpage.sh index 72b8ce4..1f87940 100755 --- a/build_manpage.sh +++ b/man/build_manpage.sh @@ -3,7 +3,7 @@ name="gitea2rss" if [ -n "${1}" ]; then - dir="$(dirname ${0})" + dir=$(dirname "${0}") version=${1} cp -vf "${dir}/${name}.1.adoc" . sed -Ei "s/(Revision: +)[0-9]+\.[0-9]\.[0-9]/\1${version}/" "${name}.1.adoc" diff --git a/gitea2rss.1.adoc b/man/gitea2rss.1.adoc similarity index 100% rename from gitea2rss.1.adoc rename to man/gitea2rss.1.adoc diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..9a142fa --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,16 @@ +include(GNUInstallDirs) + +# Write version in header +configure_file("version.hpp.in" + "${CMAKE_CURRENT_BINARY_DIR}/version.hpp") + +file(GLOB sources *.cpp) +add_executable(${PROJECT_NAME} "${sources}" "gitea2rss.hpp") + +target_include_directories(${PROJECT_NAME} + PRIVATE "$") + +target_link_libraries(${PROJECT_NAME} + PRIVATE PkgConfig::curlpp jsoncpp_lib) + +install(TARGETS ${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_BINDIR}) diff --git a/tests.CMakeLists.txt b/tests.CMakeLists.txt deleted file mode 100644 index 164eb2d..0000000 --- a/tests.CMakeLists.txt +++ /dev/null @@ -1,24 +0,0 @@ -include(CTest) -file(GLOB sources_tests tests/test_*.cpp) - -find_package(Catch2) -if(Catch2_FOUND) # Catch 2.x - include(Catch) - add_executable(all_tests tests/main.cpp ${sources_tests}) - target_link_libraries(all_tests Catch2::Catch2 ${PROJECT_NAME}_testlib) - target_include_directories(all_tests PRIVATE "/usr/include/catch2") - catch_discover_tests(all_tests EXTRA_ARGS "${EXTRA_TEST_ARGS}") -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} tests/main.cpp ${src}) - target_link_libraries(${bin} ${PROJECT_NAME}_testlib) - add_test(${bin} ${bin} "${EXTRA_TEST_ARGS}") - endforeach() - else() - message(FATAL_ERROR - "Neither Catch 2.x nor Catch 1.x could be found.") - endif() -endif() diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt new file mode 100644 index 0000000..2b8737d --- /dev/null +++ b/tests/CMakeLists.txt @@ -0,0 +1,38 @@ +include(CTest) + +file(GLOB sources_testlib ../src/*.cpp) +add_library(${PROJECT_NAME}_testlib SHARED ${sources_testlib}) + +target_include_directories(${PROJECT_NAME}_testlib + PUBLIC + "$" + "$") + +target_link_libraries(${PROJECT_NAME}_testlib + PRIVATE PkgConfig::curlpp jsoncpp_lib) + +file(GLOB sources_tests test_*.cpp) + +find_package(Catch2 CONFIG) +if(Catch2_FOUND) # Catch 2.x + include(Catch) + add_executable(all_tests main.cpp ${sources_tests}) + target_link_libraries(all_tests + PRIVATE Catch2::Catch2 ${PROJECT_NAME}_testlib) + target_include_directories(all_tests PRIVATE "/usr/include/catch2") + catch_discover_tests(all_tests EXTRA_ARGS "${EXTRA_TEST_ARGS}") +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} + PRIVATE ${PROJECT_NAME}_testlib) + add_test(${bin} ${bin} "${EXTRA_TEST_ARGS}") + endforeach() + else() + message(FATAL_ERROR + "Neither Catch 2.x nor Catch 1.x could be found.") + endif() +endif()