From ebbb14811e04564d767976cc6b2f09f5b983b5fb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Del=20Pino?= <stephane.delpino44@gmail.com>
Date: Tue, 9 Mar 2021 16:29:30 +0100
Subject: [PATCH] Add a mechanism to remove old corverage data files

The idea is that if a source file is removed, its associated .gcno and
.gcda files remained, leading to a crash of lcov (non finding expected
sources)
---
 CMakeLists.txt | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 114ceecc5..95f96478b 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.")
-- 
GitLab