option(ENABLE_CODE_COVERAGE "Enable code coverage support" OFF) find_program(LCOV_EXE NAMES lcov) find_program(GENHTML_EXE NAMES genhtml) function(add_code_coverage) list(GET ARGN 0 _target) if(ENABLE_CODE_COVERAGE) if(CMAKE_CXX_COMPILER_IS_GCC) target_compile_options(${_target} PUBLIC "--coverage") get_target_property(LF ${_target} LINK_FLAGS) string(APPEND LF " --coverage") set_target_properties(${_target} PROPERTIES LINK_FLAGS ${LF}) if(LCOV_EXE) add_custom_target( coverage-${_target} WORKING_DIRECTORY ${CMAKE_BINARY_DIR} COMMAND ${LCOV_EXE} --test-name ${_target} --output "${_target}.lcov" --capture --directory ${CMAKE_BINARY_DIR}) add_dependencies(coverage-${_target} ${_target}) if(GENHTML_EXE) add_custom_target(coverage-report-${_target} WORKING_DIRECTORY ${CMAKE_BINARY_DIR} COMMAND ${GENHTML_EXE} --output-directory "report-${_target}" "${_target}.lcov") add_dependencies(coverage-report-${_target} coverage-${_target}) endif() endif() else() message("Only GCC is supported for code coverage") endif() endif() endfunction()