diff --git a/CMakeLists.txt b/CMakeLists.txt
index 8fa0c944464ccefe6f2db36c76246fbe6be02116..3a444de3af9c1e3ba5d7f07c00c4f8ab91c9cce1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -132,7 +132,6 @@ include_directories(src/scheme)
 
 include_directories(src/experimental)
 
-
 # Pastis tests
 
 set(CATCH_MODULE_PATH "${PASTIS_SOURCE_DIR}/packages/Catch2")
@@ -144,6 +143,35 @@ add_subdirectory("${CATCH_MODULE_PATH}")
 add_subdirectory(tests)
 enable_testing()
 
+# unit tests coverage
+
+if("${CMAKE_BUILD_TYPE}" STREQUAL "Coverage")
+  find_program(GCOVR gcovr)
+  if(NOT GCOVR)
+    message(FATAL_ERROR "gcovr not found, cannot perform coverage.")
+  endif()
+
+  set(GCOVR_OPTIONS --object-directory="${PASTIS_BINARY_DIR}" -r "${PASTIS_SOURCE_DIR}/src"  -e "${PASTIS_SOURCE_DIR}/src/experimental" -e "${PASTIS_SOURCE_DIR}/src/main.cpp")
+  add_custom_target(coverage
+    ALL
+    # COMMAND ${unit_test_EXECUTABLE}
+    COMMAND ${GCOVR} ${GCOVR_OPTIONS}
+    DEPENDS unit_tests pastis
+    COMMENT "Running gcovr to build coverage report."
+    )
+
+  add_custom_target(coverage-report
+    ALL
+    COMMAND ${CMAKE_COMMAND} -E remove_directory "${PASTIS_BINARY_DIR}/coverage"
+    COMMAND ${CMAKE_COMMAND} -E make_directory "${PASTIS_BINARY_DIR}/coverage"
+    COMMAND ${GCOVR} ${GCOVR_OPTIONS} --html --html-details -o "${PASTIS_BINARY_DIR}/coverage/coverage.html"
+    DEPENDS coverage
+    COMMENT "Building coverage html report."
+    WORKING_DIRECTORY "${PASTIS_BINARY_DIR}"
+    )
+
+endif()
+
 # -----------------------------------------------------
 
 link_libraries("-rdynamic")