diff --git a/.gersemirc b/.gersemirc new file mode 100644 index 000000000..5cb634d6f --- /dev/null +++ b/.gersemirc @@ -0,0 +1,3 @@ +indent: 2 +line_length: 120 +warn_about_unknown_commands: false diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f0f06d784..7782f27b0 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -33,7 +33,7 @@ repos: rev: 0.17.1 hooks: - id: gersemi - args: ['--line-length', '120'] + args: ['-c'] - repo: https://github.com/lovesegfault/beautysh rev: v6.2.1 hooks: diff --git a/CMakeLists.txt b/CMakeLists.txt index 260dd7f1c..4caecbc94 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -60,7 +60,8 @@ set(SENTRY_BACKEND none) # Disable backend to manually use crashpad configure_file(Version.h.in "Version.h") # Define sources -file(GLOB ProjectSources +file( + GLOB ProjectSources ${PROJECT_SOURCE_DIR}/src/connection/Http.cpp ${PROJECT_SOURCE_DIR}/src/connection/RawSocket.cpp ${PROJECT_SOURCE_DIR}/src/logging/Logger.cpp @@ -105,34 +106,37 @@ include_directories(${PROJECT_SOURCE_DIR}/thirdparty/sentry/external/crashpad/th # Add breakpad to compile dump_syms and minidump_stackwalk if(XXX_ENABLE_SYMBOL_GENERATION) - file(COPY ${PROJECT_SOURCE_DIR}/thirdparty/sentry/external/third_party - DESTINATION ${PROJECT_SOURCE_DIR}/thirdparty/sentry/external/breakpad/src/) + file( + COPY ${PROJECT_SOURCE_DIR}/thirdparty/sentry/external/third_party + DESTINATION ${PROJECT_SOURCE_DIR}/thirdparty/sentry/external/breakpad/src/ + ) - ExternalProject_Add(breakpad + ExternalProject_Add( + breakpad SOURCE_DIR ${PROJECT_SOURCE_DIR}/thirdparty/sentry/external/breakpad BINARY_DIR ${CMAKE_BINARY_DIR}/breakpad_bin CONFIGURE_COMMAND "/configure" - BUILD_COMMAND make -j2 # Prevent OOM for the virtual machines when parallel compilation invoked - INSTALL_COMMAND "") + BUILD_COMMAND + make -j2 # Prevent OOM for the virtual machines when parallel compilation invoked + INSTALL_COMMAND "" + ) endif() # Set Targets add_library(${PROJECT_NAME}-lib SHARED ${ProjectSources}) set_target_properties( ${PROJECT_NAME}-lib - PROPERTIES OUTPUT_NAME ${PROJECT_NAME} - VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH} - SOVERSION ${PROJECT_VERSION_MAJOR}) + PROPERTIES + OUTPUT_NAME ${PROJECT_NAME} + VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH} + SOVERSION ${PROJECT_VERSION_MAJOR} +) target_compile_options(${PROJECT_NAME}-lib PRIVATE -Wall -Wextra -g -Wl,--build-id) target_include_directories(${PROJECT_NAME}-lib PRIVATE ${PROJECT_BINARY_DIR}) target_link_libraries( - ${PROJECT_NAME}-lib PUBLIC - cppzmq - crashpad::client - CURL::libcurl - prometheus-cpp::pull - sentry::sentry - spdlog::spdlog) + ${PROJECT_NAME}-lib + PUBLIC cppzmq crashpad::client CURL::libcurl prometheus-cpp::pull sentry::sentry spdlog::spdlog +) enable_security_flags_for_target(${PROJECT_NAME}-lib) if(XXX_ENABLE_SYMBOL_GENERATION) @@ -176,9 +180,12 @@ if(XXX_ENABLE_PACKAGING) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.service DESTINATION /etc/systemd/system) set(CPACK_PACKAGE_CONTACT "Ege Cetin ") - set(CPACK_PACKAGE_DESCRIPTION "C++ Application Template. It has already integrated a Telnet and ZeroMQ server to \ + set( + CPACK_PACKAGE_DESCRIPTION + "C++ Application Template. It has already integrated a Telnet and ZeroMQ server to \ receive commands, Crashpad handler to generate minidump, a Prometheus server to broadcast performance metrics. \ -Also, it can send logs to syslog using Spdlog, to a Sentry server and Grafana Loki instance") +Also, it can send logs to syslog using Spdlog, to a Sentry server and Grafana Loki instance" + ) set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Repository template for C++ applications") set(CPACK_PACKAGE_NAME "${PROJECT_NAME}") set(CPACK_PACKAGE_RELEASE 1) @@ -209,8 +216,9 @@ Also, it can send logs to syslog using Spdlog, to a Sentry server and Grafana Lo add_custom_command( TARGET ${PROJECT_NAME} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E tar cfvz ${CMAKE_BINARY_DIR}/${PROJECT_NAME}-${PROJECT_VERSION}-syms.tar.gz - --format=gnutar ${CMAKE_BINARY_DIR}/syms + COMMAND + ${CMAKE_COMMAND} -E tar cfvz ${CMAKE_BINARY_DIR}/${PROJECT_NAME}-${PROJECT_VERSION}-syms.tar.gz --format=gnutar + ${CMAKE_BINARY_DIR}/syms COMMENT "Creating tar gz archive from ${CMAKE_BINARY_DIR}/syms" ) endif() @@ -232,33 +240,35 @@ if(XXX_BUILD_TESTS) if(XXX_ENABLE_COVERAGE) setup_target_for_coverage_gcovr_html( - NAME - coverage - EXECUTABLE - ${TestExecutables} - DEPENDENCIES - ${TestExecutables} - EXCLUDE - "${PROJECT_SOURCE_DIR}/src/main.cpp" - "${PROJECT_SOURCE_DIR}/thirdparty/*" - "${PROJECT_SOURCE_DIR}/build/*" - "${PROJECT_SOURCE_DIR}/tests/gtest/*" - "${PROJECT_SOURCE_DIR}/tests/unittests/*" - "${PROJECT_SOURCE_DIR}/tests/fuzztests/*") + NAME + coverage + EXECUTABLE + ${TestExecutables} + DEPENDENCIES + ${TestExecutables} + EXCLUDE + "${PROJECT_SOURCE_DIR}/src/main.cpp" + "${PROJECT_SOURCE_DIR}/thirdparty/*" + "${PROJECT_SOURCE_DIR}/build/*" + "${PROJECT_SOURCE_DIR}/tests/gtest/*" + "${PROJECT_SOURCE_DIR}/tests/unittests/*" + "${PROJECT_SOURCE_DIR}/tests/fuzztests/*" + ) setup_target_for_coverage_gcovr_xml( - NAME - coverage-xml - EXECUTABLE - ${TestExecutables} - DEPENDENCIES - ${TestExecutables} - EXCLUDE - "${PROJECT_SOURCE_DIR}/src/main.cpp" - "${PROJECT_SOURCE_DIR}/thirdparty/*" - "${PROJECT_SOURCE_DIR}/build/*" - "${PROJECT_SOURCE_DIR}/tests/gtest/*" - "${PROJECT_SOURCE_DIR}/tests/unittests/*" - "${PROJECT_SOURCE_DIR}/tests/fuzztests/*") + NAME + coverage-xml + EXECUTABLE + ${TestExecutables} + DEPENDENCIES + ${TestExecutables} + EXCLUDE + "${PROJECT_SOURCE_DIR}/src/main.cpp" + "${PROJECT_SOURCE_DIR}/thirdparty/*" + "${PROJECT_SOURCE_DIR}/build/*" + "${PROJECT_SOURCE_DIR}/tests/gtest/*" + "${PROJECT_SOURCE_DIR}/tests/unittests/*" + "${PROJECT_SOURCE_DIR}/tests/fuzztests/*" + ) endif() endif() diff --git a/cmake/CodeCoverage.cmake b/cmake/CodeCoverage.cmake index 2fb84c3f4..51596e9cf 100644 --- a/cmake/CodeCoverage.cmake +++ b/cmake/CodeCoverage.cmake @@ -165,9 +165,7 @@ elseif(NOT CMAKE_COMPILER_IS_GNUCXX) endif() endif() -set(COVERAGE_COMPILER_FLAGS - "-g -fprofile-arcs -ftest-coverage" - CACHE INTERNAL "") +set(COVERAGE_COMPILER_FLAGS "-g -fprofile-arcs -ftest-coverage" CACHE INTERNAL "") if(CMAKE_CXX_COMPILER_ID MATCHES "(GNU|Clang)") include(CheckCXXCompilerFlag) check_cxx_compiler_flag(-fprofile-abs-path HAVE_fprofile_abs_path) @@ -176,23 +174,42 @@ if(CMAKE_CXX_COMPILER_ID MATCHES "(GNU|Clang)") endif() endif() -set(CMAKE_Fortran_FLAGS_COVERAGE - ${COVERAGE_COMPILER_FLAGS} - CACHE STRING "Flags used by the Fortran compiler during coverage builds." FORCE) -set(CMAKE_CXX_FLAGS_COVERAGE - ${COVERAGE_COMPILER_FLAGS} - CACHE STRING "Flags used by the C++ compiler during coverage builds." FORCE) -set(CMAKE_C_FLAGS_COVERAGE - ${COVERAGE_COMPILER_FLAGS} - CACHE STRING "Flags used by the C compiler during coverage builds." FORCE) -set(CMAKE_EXE_LINKER_FLAGS_COVERAGE - "" - CACHE STRING "Flags used for linking binaries during coverage builds." FORCE) -set(CMAKE_SHARED_LINKER_FLAGS_COVERAGE - "" - CACHE STRING "Flags used by the shared libraries linker during coverage builds." FORCE) -mark_as_advanced(CMAKE_Fortran_FLAGS_COVERAGE CMAKE_CXX_FLAGS_COVERAGE CMAKE_C_FLAGS_COVERAGE - CMAKE_EXE_LINKER_FLAGS_COVERAGE CMAKE_SHARED_LINKER_FLAGS_COVERAGE) +set( + CMAKE_Fortran_FLAGS_COVERAGE + ${COVERAGE_COMPILER_FLAGS} + CACHE STRING + "Flags used by the Fortran compiler during coverage builds." + FORCE +) +set( + CMAKE_CXX_FLAGS_COVERAGE + ${COVERAGE_COMPILER_FLAGS} + CACHE STRING + "Flags used by the C++ compiler during coverage builds." + FORCE +) +set( + CMAKE_C_FLAGS_COVERAGE + ${COVERAGE_COMPILER_FLAGS} + CACHE STRING + "Flags used by the C compiler during coverage builds." + FORCE +) +set(CMAKE_EXE_LINKER_FLAGS_COVERAGE "" CACHE STRING "Flags used for linking binaries during coverage builds." FORCE) +set( + CMAKE_SHARED_LINKER_FLAGS_COVERAGE + "" + CACHE STRING + "Flags used by the shared libraries linker during coverage builds." + FORCE +) +mark_as_advanced( + CMAKE_Fortran_FLAGS_COVERAGE + CMAKE_CXX_FLAGS_COVERAGE + CMAKE_C_FLAGS_COVERAGE + CMAKE_EXE_LINKER_FLAGS_COVERAGE + CMAKE_SHARED_LINKER_FLAGS_COVERAGE +) get_property(GENERATOR_IS_MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) if(NOT (CMAKE_BUILD_TYPE STREQUAL "Debug" OR GENERATOR_IS_MULTI_CONFIG)) @@ -220,10 +237,17 @@ endif() # # even if c++filt is found # ) function(setup_target_for_coverage_lcov) - set(options NO_DEMANGLE) set(oneValueArgs BASE_DIRECTORY NAME) - set(multiValueArgs EXCLUDE EXECUTABLE EXECUTABLE_ARGS DEPENDENCIES LCOV_ARGS GENHTML_ARGS) + set( + multiValueArgs + EXCLUDE + EXECUTABLE + EXECUTABLE_ARGS + DEPENDENCIES + LCOV_ARGS + GENHTML_ARGS + ) cmake_parse_arguments(Coverage "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) if(NOT LCOV_PATH) @@ -257,71 +281,88 @@ function(setup_target_for_coverage_lcov) endif() # Setting up commands which will be run to generate coverage data. Cleanup lcov - set(LCOV_CLEAN_CMD - ${LCOV_PATH} - ${Coverage_LCOV_ARGS} - --gcov-tool - ${GCOV_PATH} - -directory - . - -b - ${BASEDIR} - --zerocounters) + set( + LCOV_CLEAN_CMD + ${LCOV_PATH} + ${Coverage_LCOV_ARGS} + --gcov-tool + ${GCOV_PATH} + -directory + . + -b + ${BASEDIR} + --zerocounters + ) # Create baseline to make sure untouched files show up in the report - set(LCOV_BASELINE_CMD - ${LCOV_PATH} - ${Coverage_LCOV_ARGS} - --gcov-tool - ${GCOV_PATH} - -c - -i - -d - . - -b - ${BASEDIR} - -o - ${Coverage_NAME}.base) + set( + LCOV_BASELINE_CMD + ${LCOV_PATH} + ${Coverage_LCOV_ARGS} + --gcov-tool + ${GCOV_PATH} + -c + -i + -d + . + -b + ${BASEDIR} + -o + ${Coverage_NAME}.base + ) # Run tests set(LCOV_EXEC_TESTS_CMD ${Coverage_EXECUTABLE} ${Coverage_EXECUTABLE_ARGS}) # Capturing lcov counters and generating report - set(LCOV_CAPTURE_CMD - ${LCOV_PATH} - ${Coverage_LCOV_ARGS} - --gcov-tool - ${GCOV_PATH} - --directory - . - -b - ${BASEDIR} - --capture - --output-file - ${Coverage_NAME}.capture) + set( + LCOV_CAPTURE_CMD + ${LCOV_PATH} + ${Coverage_LCOV_ARGS} + --gcov-tool + ${GCOV_PATH} + --directory + . + -b + ${BASEDIR} + --capture + --output-file + ${Coverage_NAME}.capture + ) # add baseline counters - set(LCOV_BASELINE_COUNT_CMD - ${LCOV_PATH} - ${Coverage_LCOV_ARGS} - --gcov-tool - ${GCOV_PATH} - -a - ${Coverage_NAME}.base - -a - ${Coverage_NAME}.capture - --output-file - ${Coverage_NAME}.total) + set( + LCOV_BASELINE_COUNT_CMD + ${LCOV_PATH} + ${Coverage_LCOV_ARGS} + --gcov-tool + ${GCOV_PATH} + -a + ${Coverage_NAME}.base + -a + ${Coverage_NAME}.capture + --output-file + ${Coverage_NAME}.total + ) # filter collected data to final coverage report - set(LCOV_FILTER_CMD - ${LCOV_PATH} - ${Coverage_LCOV_ARGS} - --gcov-tool - ${GCOV_PATH} - --remove - ${Coverage_NAME}.total - ${LCOV_EXCLUDES} - --output-file - ${Coverage_NAME}.info) + set( + LCOV_FILTER_CMD + ${LCOV_PATH} + ${Coverage_LCOV_ARGS} + --gcov-tool + ${GCOV_PATH} + --remove + ${Coverage_NAME}.total + ${LCOV_EXCLUDES} + --output-file + ${Coverage_NAME}.info + ) # Generate HTML output - set(LCOV_GEN_HTML_CMD ${GENHTML_PATH} ${GENHTML_EXTRA_ARGS} ${Coverage_GENHTML_ARGS} -o ${Coverage_NAME} - ${Coverage_NAME}.info) + set( + LCOV_GEN_HTML_CMD + ${GENHTML_PATH} + ${GENHTML_EXTRA_ARGS} + ${Coverage_GENHTML_ARGS} + -o + ${Coverage_NAME} + ${Coverage_NAME}.info + ) if(CODE_COVERAGE_VERBOSE) message(STATUS "Executed command report") @@ -365,27 +406,33 @@ function(setup_target_for_coverage_lcov) COMMAND ${LCOV_FILTER_CMD} COMMAND ${LCOV_GEN_HTML_CMD} # Set output files as GENERATED (will be removed on 'make clean') - BYPRODUCTS ${Coverage_NAME}.base ${Coverage_NAME}.capture ${Coverage_NAME}.total ${Coverage_NAME}.info - ${Coverage_NAME}/index.html + BYPRODUCTS + ${Coverage_NAME}.base + ${Coverage_NAME}.capture + ${Coverage_NAME}.total + ${Coverage_NAME}.info + ${Coverage_NAME}/index.html WORKING_DIRECTORY ${PROJECT_BINARY_DIR} DEPENDS ${Coverage_DEPENDENCIES} VERBATIM # Protect arguments to commands - COMMENT "Resetting code coverage counters to zero.\nProcessing code coverage counters and generating report.") + COMMENT "Resetting code coverage counters to zero.\nProcessing code coverage counters and generating report." + ) # Show where to find the lcov info report add_custom_command( TARGET ${Coverage_NAME} POST_BUILD COMMAND ; - COMMENT "Lcov code coverage info report saved in ${Coverage_NAME}.info.") + COMMENT "Lcov code coverage info report saved in ${Coverage_NAME}.info." + ) # Show info where to find the report add_custom_command( TARGET ${Coverage_NAME} POST_BUILD COMMAND ; - COMMENT "Open ./${Coverage_NAME}/index.html in your browser to view the coverage report.") - + COMMENT "Open ./${Coverage_NAME}/index.html in your browser to view the coverage report." + ) endfunction() # setup_target_for_coverage_lcov # Defines a target for running and collection code coverage information @@ -405,7 +452,6 @@ endfunction() # setup_target_for_coverage_lcov # The user can set the variable GCOVR_ADDITIONAL_ARGS to supply additional flags to the # GCVOR command. function(setup_target_for_coverage_gcovr_xml) - set(options NONE) set(oneValueArgs BASE_DIRECTORY NAME) set(multiValueArgs EXCLUDE EXECUTABLE EXECUTABLE_ARGS DEPENDENCIES) @@ -442,18 +488,20 @@ function(setup_target_for_coverage_gcovr_xml) # Set up commands which will be run to generate coverage data Run tests set(GCOVR_XML_EXEC_TESTS_CMD ${Coverage_EXECUTABLE} ${Coverage_EXECUTABLE_ARGS}) # Running gcovr - set(GCOVR_XML_CMD - ${GCOVR_PATH} - --sonarqube - ${Coverage_NAME}-sonar.xml - --xml - ${Coverage_NAME}.xml - --print-summary - -r - ${BASEDIR} - ${GCOVR_ADDITIONAL_ARGS} - ${GCOVR_EXCLUDE_ARGS} - --object-directory=${PROJECT_BINARY_DIR}) + set( + GCOVR_XML_CMD + ${GCOVR_PATH} + --sonarqube + ${Coverage_NAME}-sonar.xml + --xml + ${Coverage_NAME}.xml + --print-summary + -r + ${BASEDIR} + ${GCOVR_ADDITIONAL_ARGS} + ${GCOVR_EXCLUDE_ARGS} + --object-directory=${PROJECT_BINARY_DIR} + ) if(CODE_COVERAGE_VERBOSE) message(STATUS "Executed command report") @@ -475,14 +523,16 @@ function(setup_target_for_coverage_gcovr_xml) WORKING_DIRECTORY ${PROJECT_BINARY_DIR} DEPENDS ${Coverage_DEPENDENCIES} VERBATIM # Protect arguments to commands - COMMENT "Running gcovr to produce code coverage report.") + COMMENT "Running gcovr to produce code coverage report." + ) # Show info where to find the report add_custom_command( TARGET ${Coverage_NAME} POST_BUILD COMMAND ; - COMMENT "Code coverage report saved in ${Coverage_NAME}.xml.") + COMMENT "Code coverage report saved in ${Coverage_NAME}.xml." + ) endfunction() # setup_target_for_coverage_gcovr_xml # Defines a target for running and collection code coverage information @@ -502,7 +552,6 @@ endfunction() # setup_target_for_coverage_gcovr_xml # The user can set the variable GCOVR_ADDITIONAL_ARGS to supply additional flags to the # GCVOR command. function(setup_target_for_coverage_gcovr_html) - set(options NONE) set(oneValueArgs BASE_DIRECTORY NAME) set(multiValueArgs EXCLUDE EXECUTABLE EXECUTABLE_ARGS DEPENDENCIES) @@ -541,16 +590,18 @@ function(setup_target_for_coverage_gcovr_html) # Create folder set(GCOVR_HTML_FOLDER_CMD ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/${Coverage_NAME}) # Running gcovr - set(GCOVR_HTML_CMD - ${GCOVR_PATH} - --html - ${Coverage_NAME}/index.html - --html-details - -r - ${BASEDIR} - ${GCOVR_ADDITIONAL_ARGS} - ${GCOVR_EXCLUDE_ARGS} - --object-directory=${PROJECT_BINARY_DIR}) + set( + GCOVR_HTML_CMD + ${GCOVR_PATH} + --html + ${Coverage_NAME}/index.html + --html-details + -r + ${BASEDIR} + ${GCOVR_ADDITIONAL_ARGS} + ${GCOVR_EXCLUDE_ARGS} + --object-directory=${PROJECT_BINARY_DIR} + ) if(CODE_COVERAGE_VERBOSE) message(STATUS "Executed command report") @@ -573,19 +624,21 @@ function(setup_target_for_coverage_gcovr_html) COMMAND ${GCOVR_HTML_EXEC_TESTS_CMD} COMMAND ${GCOVR_HTML_FOLDER_CMD} COMMAND ${GCOVR_HTML_CMD} - BYPRODUCTS ${PROJECT_BINARY_DIR}/${Coverage_NAME}/index.html # report directory + BYPRODUCTS + ${PROJECT_BINARY_DIR}/${Coverage_NAME}/index.html # report directory WORKING_DIRECTORY ${PROJECT_BINARY_DIR} DEPENDS ${Coverage_DEPENDENCIES} VERBATIM # Protect arguments to commands - COMMENT "Running gcovr to produce HTML code coverage report.") + COMMENT "Running gcovr to produce HTML code coverage report." + ) # Show info where to find the report add_custom_command( TARGET ${Coverage_NAME} POST_BUILD COMMAND ; - COMMENT "Open ./${Coverage_NAME}/index.html in your browser to view the coverage report.") - + COMMENT "Open ./${Coverage_NAME}/index.html in your browser to view the coverage report." + ) endfunction() # setup_target_for_coverage_gcovr_html # Defines a target for running and collection code coverage information @@ -606,17 +659,18 @@ endfunction() # setup_target_for_coverage_gcovr_html # POST_CMD perl -i -pe s!${PROJECT_SOURCE_DIR}/!!g ctest_coverage.json # ) function(setup_target_for_coverage_fastcov) - set(options NO_DEMANGLE SKIP_HTML) set(oneValueArgs BASE_DIRECTORY NAME) - set(multiValueArgs - EXCLUDE - EXECUTABLE - EXECUTABLE_ARGS - DEPENDENCIES - FASTCOV_ARGS - GENHTML_ARGS - POST_CMD) + set( + multiValueArgs + EXCLUDE + EXECUTABLE + EXECUTABLE_ARGS + DEPENDENCIES + FASTCOV_ARGS + GENHTML_ARGS + POST_CMD + ) cmake_parse_arguments(Coverage "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) if(NOT FASTCOV_PATH) @@ -649,28 +703,45 @@ function(setup_target_for_coverage_fastcov) # Set up commands which will be run to generate coverage data set(FASTCOV_EXEC_TESTS_CMD ${Coverage_EXECUTABLE} ${Coverage_EXECUTABLE_ARGS}) - set(FASTCOV_CAPTURE_CMD - ${FASTCOV_PATH} - ${Coverage_FASTCOV_ARGS} - --gcov - ${GCOV_PATH} - --search-directory - ${BASEDIR} - --process-gcno - --output - ${Coverage_NAME}.json - --exclude - ${FASTCOV_EXCLUDES} - --exclude - ${FASTCOV_EXCLUDES}) - - set(FASTCOV_CONVERT_CMD ${FASTCOV_PATH} -C ${Coverage_NAME}.json --lcov --output ${Coverage_NAME}.info) + set( + FASTCOV_CAPTURE_CMD + ${FASTCOV_PATH} + ${Coverage_FASTCOV_ARGS} + --gcov + ${GCOV_PATH} + --search-directory + ${BASEDIR} + --process-gcno + --output + ${Coverage_NAME}.json + --exclude + ${FASTCOV_EXCLUDES} + --exclude + ${FASTCOV_EXCLUDES} + ) + + set( + FASTCOV_CONVERT_CMD + ${FASTCOV_PATH} + -C + ${Coverage_NAME}.json + --lcov + --output + ${Coverage_NAME}.info + ) if(Coverage_SKIP_HTML) set(FASTCOV_HTML_CMD ";") else() - set(FASTCOV_HTML_CMD ${GENHTML_PATH} ${GENHTML_EXTRA_ARGS} ${Coverage_GENHTML_ARGS} -o ${Coverage_NAME} - ${Coverage_NAME}.info) + set( + FASTCOV_HTML_CMD + ${GENHTML_PATH} + ${GENHTML_EXTRA_ARGS} + ${Coverage_GENHTML_ARGS} + -o + ${Coverage_NAME} + ${Coverage_NAME}.info + ) endif() set(FASTCOV_POST_CMD ";") @@ -716,35 +787,32 @@ function(setup_target_for_coverage_fastcov) COMMAND ${FASTCOV_HTML_CMD} COMMAND ${FASTCOV_POST_CMD} # Set output files as GENERATED (will be removed on 'make clean') - BYPRODUCTS ${Coverage_NAME}.info ${Coverage_NAME}.json ${Coverage_NAME}/index.html # report directory + BYPRODUCTS + ${Coverage_NAME}.info + ${Coverage_NAME}.json + ${Coverage_NAME}/index.html # report directory WORKING_DIRECTORY ${PROJECT_BINARY_DIR} DEPENDS ${Coverage_DEPENDENCIES} VERBATIM # Protect arguments to commands - COMMENT "Resetting code coverage counters to zero. Processing code coverage counters and generating report.") + COMMENT "Resetting code coverage counters to zero. Processing code coverage counters and generating report." + ) set(INFO_MSG "fastcov code coverage info report saved in ${Coverage_NAME}.info and ${Coverage_NAME}.json.") if(NOT Coverage_SKIP_HTML) - string(APPEND INFO_MSG - " Open ${PROJECT_BINARY_DIR}/${Coverage_NAME}/index.html in your browser to view the coverage report.") + string( + APPEND + INFO_MSG + " Open ${PROJECT_BINARY_DIR}/${Coverage_NAME}/index.html in your browser to view the coverage report." + ) endif() # Show where to find the fastcov info report - add_custom_command( - TARGET ${Coverage_NAME} - POST_BUILD - COMMAND ${CMAKE_COMMAND} -E echo ${INFO_MSG}) - + add_custom_command(TARGET ${Coverage_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E echo ${INFO_MSG}) endfunction() # setup_target_for_coverage_fastcov function(append_coverage_compiler_flags) - set(CMAKE_C_FLAGS - "${CMAKE_C_FLAGS} ${COVERAGE_COMPILER_FLAGS}" - PARENT_SCOPE) - set(CMAKE_CXX_FLAGS - "${CMAKE_CXX_FLAGS} ${COVERAGE_COMPILER_FLAGS}" - PARENT_SCOPE) - set(CMAKE_Fortran_FLAGS - "${CMAKE_Fortran_FLAGS} ${COVERAGE_COMPILER_FLAGS}" - PARENT_SCOPE) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COVERAGE_COMPILER_FLAGS}" PARENT_SCOPE) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COVERAGE_COMPILER_FLAGS}" PARENT_SCOPE) + set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${COVERAGE_COMPILER_FLAGS}" PARENT_SCOPE) message(STATUS "Appending code coverage compiler flags: ${COVERAGE_COMPILER_FLAGS}") endfunction() # append_coverage_compiler_flags diff --git a/cmake/CompilerSecurityOptions.cmake b/cmake/CompilerSecurityOptions.cmake index 1f7008591..57306f01e 100644 --- a/cmake/CompilerSecurityOptions.cmake +++ b/cmake/CompilerSecurityOptions.cmake @@ -1,12 +1,28 @@ - -option(ENABLE_RECOMMENDED_SECURITY_FLAGS "Compile all targets with recommended security hardening flags. Check \ +option( + ENABLE_RECOMMENDED_SECURITY_FLAGS + "Compile all targets with recommended security hardening flags. Check \ https://best.openssf.org/Compiler-Hardening-Guides/Compiler-Options-Hardening-Guide-for-C-and-C++ \ -for information" OFF) +for information" + OFF +) -set(COMPILER_SECURE_FLAGS_ENABLED -Wconversion -Wtrampolines -Wimplicit-fallthrough - -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=3 -D_GLIBCXX_ASSERTIONS -fstrict-flex-arrays=3 - -fstack-clash-protection -fstack-protector-strong -Wl,-z,nodlopen -Wl,-z,noexecstack - -Wl,-z,relro -Wl,-z,now -fcf-protection=full) +set( + COMPILER_SECURE_FLAGS_ENABLED + -Wconversion + -Wtrampolines + -Wimplicit-fallthrough + -U_FORTIFY_SOURCE + -D_FORTIFY_SOURCE=3 + -D_GLIBCXX_ASSERTIONS + -fstrict-flex-arrays=3 + -fstack-clash-protection + -fstack-protector-strong + -Wl,-z,nodlopen + -Wl,-z,noexecstack + -Wl,-z,relro + -Wl,-z,now + -fcf-protection=full +) set(COMPILER_SECURE_FLAGS_DISABLED "") if(CMAKE_CXX_COMPILER_ID MATCHES "GNU") diff --git a/cmake/Doxy.cmake b/cmake/Doxy.cmake index 943d84501..396e913e3 100644 --- a/cmake/Doxy.cmake +++ b/cmake/Doxy.cmake @@ -15,7 +15,8 @@ if(DOXYGEN_FOUND) COMMAND ${DOXYGEN_EXECUTABLE} ${DOXYGEN_OUT} WORKING_DIRECTORY ${CMAKE_BINARY_DIR} COMMENT "Generating API documentation with Doxygen" - VERBATIM) + VERBATIM + ) else() message(WARNING "Doxygen need to be installed to generate the doxygen documentation!") endif() diff --git a/cmake/GenerateSymbols.cmake b/cmake/GenerateSymbols.cmake index 454113bfe..ea0f7a89c 100644 --- a/cmake/GenerateSymbols.cmake +++ b/cmake/GenerateSymbols.cmake @@ -1,12 +1,13 @@ - macro(generate_symbols_for_target target) - message(STATUS "Enabling symbol file generation for ${target}") - add_custom_command(TARGET ${target} POST_BUILD - COMMAND - ${PROJECT_SOURCE_DIR}/scripts/dump_syms.py - --dump-syms ${CMAKE_BINARY_DIR}/breakpad_bin/src/tools/linux/dump_syms/dump_syms - --binary-dir $ - --output-dir ${CMAKE_BINARY_DIR}/syms - COMMENT "Creating symbols ${target}") - add_dependencies(${target} breakpad) + message(STATUS "Enabling symbol file generation for ${target}") + add_custom_command( + TARGET ${target} + POST_BUILD + COMMAND + ${PROJECT_SOURCE_DIR}/scripts/dump_syms.py --dump-syms + ${CMAKE_BINARY_DIR}/breakpad_bin/src/tools/linux/dump_syms/dump_syms --binary-dir $ + --output-dir ${CMAKE_BINARY_DIR}/syms + COMMENT "Creating symbols ${target}" + ) + add_dependencies(${target} breakpad) endmacro() diff --git a/cmake/GitVersion.cmake b/cmake/GitVersion.cmake index 1a9b3e50e..2ed44fee6 100644 --- a/cmake/GitVersion.cmake +++ b/cmake/GitVersion.cmake @@ -10,7 +10,8 @@ if(GIT_FOUND) WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} RESULT_VARIABLE res_var OUTPUT_VARIABLE GIT_COM_ID - ERROR_QUIET) + ERROR_QUIET + ) if(NOT ${res_var} EQUAL 0) message(AUTHOR_WARNING " Git failed (not a repo). Build will not contain git revision info.") else() diff --git a/cmake/GraphViz.cmake b/cmake/GraphViz.cmake index cbbd291cb..60b2340c2 100644 --- a/cmake/GraphViz.cmake +++ b/cmake/GraphViz.cmake @@ -18,20 +18,21 @@ else() message(STATUS "dot not found!") endif() -set(DOT_OUTPUT_TYPE - "svg" - CACHE STRING "Build a dependency graph. Options are dot output types: ps, png, pdf...") +set(DOT_OUTPUT_TYPE "svg" CACHE STRING "Build a dependency graph. Options are dot output types: ps, png, pdf...") if(DOT_EXE) add_custom_target( dependency-graph COMMAND ${CMAKE_COMMAND} ${PROJECT_SOURCE_DIR} --graphviz=${PROJECT_BINARY_DIR}/graphviz/${PROJECT_NAME}.dot - COMMAND ${DOT_EXE} -T${DOT_OUTPUT_TYPE} ${PROJECT_BINARY_DIR}/graphviz/${PROJECT_NAME}.dot -o - ${PROJECT_BINARY_DIR}/${PROJECT_NAME}-tree.${DOT_OUTPUT_TYPE}) + COMMAND + ${DOT_EXE} -T${DOT_OUTPUT_TYPE} ${PROJECT_BINARY_DIR}/graphviz/${PROJECT_NAME}.dot -o + ${PROJECT_BINARY_DIR}/${PROJECT_NAME}-tree.${DOT_OUTPUT_TYPE} + ) add_custom_command( TARGET dependency-graph POST_BUILD COMMAND ; - COMMENT "Dependency graph generated and located at ${CMAKE_BINARY_DIR}/${PROJECT_NAME}-tree.${DOT_OUTPUT_TYPE}") + COMMENT "Dependency graph generated and located at ${CMAKE_BINARY_DIR}/${PROJECT_NAME}-tree.${DOT_OUTPUT_TYPE}" + ) endif() diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 73d8f657f..67f479eaa 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1,11 +1,13 @@ - if(XXX_ENABLE_MEMLEAK_CHECK) include_directories(MemPlumber) add_subdirectory(MemPlumber) # Disable MemPlumber tests from parent - add_custom_target(ExcludeMemPlumberTests ALL - COMMAND rm -f "${PROJECT_BINARY_DIR}/tests/MemPlumber/CTestTestfile.cmake") + add_custom_target( + ExcludeMemPlumberTests + ALL + COMMAND rm -f "${PROJECT_BINARY_DIR}/tests/MemPlumber/CTestTestfile.cmake" + ) endif() configure_file(test-static-definitions.h.in test-static-definitions.h) diff --git a/tests/fuzztests/CMakeLists.txt b/tests/fuzztests/CMakeLists.txt index ec5509e16..24825fb4c 100644 --- a/tests/fuzztests/CMakeLists.txt +++ b/tests/fuzztests/CMakeLists.txt @@ -7,10 +7,13 @@ include_directories(${PROJECT_SOURCE_DIR}/include) include_directories(${PROJECT_BINARY_DIR}/tests) # Fuzz sources -set(ProjectFuzzTestSources "\ +set( + ProjectFuzzTestSources + "\ Hasher_FuzzTests;\ Http_FuzzTests;\ -Telnet_FuzzTests;") +Telnet_FuzzTests;" +) # Create fuzz targets foreach(SourceEntry ${ProjectFuzzTestSources}) diff --git a/tests/unittests/CMakeLists.txt b/tests/unittests/CMakeLists.txt index 37d7ee878..26a473953 100644 --- a/tests/unittests/CMakeLists.txt +++ b/tests/unittests/CMakeLists.txt @@ -1,12 +1,13 @@ # Add sources -file(GLOB ProjectUnitTestSources - Connection_UnitTests.cpp - Logger_UnitTests.cpp - Metrics_UnitTests.cpp - Telnet_UnitTests.cpp - Utils_UnitTests.cpp - ZeroMQ_UnitTests.cpp - gtest_main.cpp +file( + GLOB ProjectUnitTestSources + Connection_UnitTests.cpp + Logger_UnitTests.cpp + Metrics_UnitTests.cpp + Telnet_UnitTests.cpp + Utils_UnitTests.cpp + ZeroMQ_UnitTests.cpp + gtest_main.cpp ) include_directories(${PROJECT_SOURCE_DIR}/include) @@ -16,7 +17,7 @@ target_include_directories(UnitTestMain PRIVATE "${PROJECT_BINARY_DIR}/tests") target_link_libraries(UnitTestMain PRIVATE GTest::gtest_main "${PROJECT_NAME}-lib") if(XXX_ENABLE_MEMLEAK_CHECK) - target_link_libraries(UnitTestMain PRIVATE memplumber) + target_link_libraries(UnitTestMain PRIVATE memplumber) endif() include(GoogleTest)