Browse Source

Integrate gcov

- Add rules for coverage
- Add gcovr as html generator
Alexey Edelev 5 years ago
parent
commit
c881978a1e

+ 0 - 4
CMakeLists.txt

@@ -104,10 +104,6 @@ elseif(NOT DEFINED MAKE_COVERAGE)
     set(MAKE_COVERAGE OFF)
 endif()
 
-if(MAKE_COVERAGE)
-    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage")
-endif()
-
 if(NOT gRPC_FOUND)
     message(WARNING "gRPC not found: some tests and examples cannot be built.")
     message(STATUS "Force disable test")

+ 40 - 0
cmake/Coverage.cmake

@@ -0,0 +1,40 @@
+if(DEFINED $ENV{MAKE_COVERAGE})
+    set(MAKE_COVERAGE $ENV{MAKE_COVERAGE})
+elseif(NOT DEFINED MAKE_COVERAGE)
+    set(MAKE_COVERAGE ON)
+endif()
+
+if(MAKE_COVERAGE AND UNIX)
+    message(STATUS "Enable gcov")
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage")
+    set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} --coverage")
+endif()
+
+function(add_coverage_target)
+    set(options)
+    set(oneValueArgs TARGET)
+    set(multiValueArgs)
+    cmake_parse_arguments(add_coverage_target "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
+    set(GCOV_OUTPUT_DIR ${CMAKE_BINARY_DIR}/gcov/${add_coverage_target_TARGET})
+    set(OBJECTS_DIR ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${add_coverage_target_TARGET}.dir)
+    set(COVERAGE_TARGET ${add_coverage_target_TARGET}_coverage)
+    if(MAKE_COVERAGE AND UNIX)
+        find_program(GCOV_EXECUTABLE "gcov")
+        if(GCOV_EXECUTABLE STREQUAL GCOV_EXECUTABLE-NOTFOUND)
+            message(FATAL_ERROR "Coverage enabled for target ${add_coverage_target_TARGET}, but gcov is not installed")
+        endif()
+        file(MAKE_DIRECTORY ${GCOV_OUTPUT_DIR})
+        add_custom_target(${COVERAGE_TARGET} DEPENDS ${add_coverage_target_TARGET})
+        add_custom_command(TARGET ${COVERAGE_TARGET} COMMAND ${GCOV_EXECUTABLE} ${OBJECTS_DIR}/*.o
+            WORKING_DIRECTORY ${GCOV_OUTPUT_DIR})
+    endif()
+
+    find_program(GCOVR_EXECUTABLE "gcovr")
+    if(NOT GCOVR_EXECUTABLE STREQUAL GCOVR_EXECUTABLE-NOTFOUND)
+        set(GCOVR_OUTPUT_DIR ${GCOV_OUTPUT_DIR}/html)
+        file(MAKE_DIRECTORY ${GCOVR_OUTPUT_DIR})
+        add_custom_command(TARGET ${COVERAGE_TARGET} COMMAND ${GCOVR_EXECUTABLE} -g -k -r
+            ${CMAKE_SOURCE_DIR} --html --html-details -o ${GCOVR_OUTPUT_DIR}/${add_coverage_target_TARGET}.html ${OBJECTS_DIR} .
+            WORKING_DIRECTORY ${GCOV_OUTPUT_DIR})
+    endif()
+endfunction(add_coverage_target)

+ 0 - 1
src/generator/CMakeLists.txt

@@ -40,7 +40,6 @@ if(WIN32)
     link_directories(${PROTOBUF_LIBRARIES_PATH} ${GRPC_LIBRARIES})
 endif()
 
-# TODO: include dirs should be attached to a corresponding target and this should not be required 
 if(DEFINED Protobuf_INCLUDE_DIRS)
     target_include_directories(${TARGET} PUBLIC ${Protobuf_INCLUDE_DIRS})
 endif()

+ 4 - 0
src/grpc/CMakeLists.txt

@@ -10,6 +10,8 @@ set(TARGET_CMAKE_DIR ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME})
 set(CMAKE_AUTOMOC ON)
 set(CMAKE_AUTORCC ON)
 
+include(${CMAKE_SOURCE_DIR}/cmake/Coverage.cmake)
+
 file(GLOB SOURCES asyncreply.cpp
     abstractchannel.cpp
     http2channel.cpp
@@ -64,3 +66,5 @@ export(TARGETS ${TARGET} NAMESPACE ${QTPROTOBUF_COMMON_NAMESPACE}:: FILE ${TARGE
 
 configure_file("${CMAKE_SOURCE_DIR}/cmake/gRPCLookup.cmake" "${CMAKE_BINARY_DIR}/gRPCLookup.cmake" COPYONLY)
 install(FILES "${CMAKE_BINARY_DIR}/gRPCLookup.cmake" DESTINATION "${TARGET_CMAKE_DIR}")
+
+add_coverage_target(TARGET ${TARGET})

+ 4 - 0
src/protobuf/CMakeLists.txt

@@ -12,6 +12,8 @@ set(CMAKE_AUTORCC ON)
 
 find_package(Qt5 COMPONENTS Core Qml REQUIRED)
 
+include(${CMAKE_SOURCE_DIR}/cmake/Coverage.cmake)
+
 file(GLOB SOURCES
     qtprotobuf.cpp
     qtprotobuflogging.cpp
@@ -74,3 +76,5 @@ install(FILES "${CMAKE_BINARY_DIR}/ProtobufLookup.cmake" DESTINATION "${TARGET_C
 
 # TODO: keep quick plugin for future development, but it's useless for now
 #add_subdirectory("quick")
+
+add_coverage_target(TARGET ${TARGET})

+ 1 - 1
src/protobuf/qprotobufserializer_p.h

@@ -392,7 +392,7 @@ public:
         qProtoDebug() << __func__ << "currentByte:" << QString::number((*it), 16);
 
         unsigned int length = deserializeVarintCommon<uint32>(it);
-        QByteArray result((QByteArray::const_iterator&)it, length); //TODO it's possible to void buffeer copying by setupimg new "end of QByteArray";
+        QByteArray result((QByteArray::const_iterator&)it, length); //TODO: it's possible to void buffeer copying by setupimg new "end of QByteArray";
         it += length;
         return result;
     }