diff --git a/CMakeLists.txt b/CMakeLists.txt
index 114ceecc5d49685a513708dced3dcffea83bff29..95f96478b331b3790fb57946a031cea15fe73d67 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -367,6 +367,20 @@ add_custom_target(run_unit_tests
 # unit tests coverage
 
 if("${CMAKE_BUILD_TYPE}" STREQUAL "Coverage")
+  file(GLOB_RECURSE GCNO_FILE_LIST RELATIVE "${PUGS_BINARY_DIR}"  "*.gcno")
+  list(FILTER GCNO_FILE_LIST EXCLUDE REGEX "^\.\./.*" )
+  file(GLOB_RECURSE GCDA_FILE_LIST RELATIVE "${PUGS_BINARY_DIR}"  "*.gcda")
+  list(FILTER GCDA_FILE_LIST EXCLUDE REGEX "^\.\./.*" )
+  foreach(COV_INFO_FILE IN LISTS GCNO_FILE_LIST GCDA_FILE_LIST)
+    string(REGEX REPLACE "/CMakeFiles/.*\.dir/" "/" COV_SRC_FILE "${PUGS_SOURCE_DIR}/${COV_INFO_FILE}")
+    string(REGEX REPLACE "\.gcda$" "" COV_SRC_FILE "${COV_SRC_FILE}")
+    string(REGEX REPLACE "\.gcno$" "" COV_SRC_FILE "${COV_SRC_FILE}")
+    if (NOT EXISTS "${COV_SRC_FILE}")
+      file(REMOVE "${PUGS_BINARY_DIR}/${COV_INFO_FILE}")
+      message(STATUS "removed file ${COV_INFO_FILE}: no longer needed")
+    endif()
+  endforeach()
+
   find_program(LCOV lcov)
   if(NOT LCOV)
     message(FATAL_ERROR "lcov not found, cannot perform coverage.")