text: #################################################################
  # Adds a build target called "coverage" for code coverage.
  #
  # This compiles the code using special GCC flags, run the tests,
  # and then generates a nice HTML output. This new "coverage" make
  # target will only be available if you build using GCC in Debug
  # mode. If any of the required programs (lcov and genhtml) were
  # not found, a FATAL_ERROR message is printed.
  #
  # If not already done, this code will set ENABLE_TEST to ON.
  #
  # To build the code coverage and open it in your browser do this:
  #
  #    mkdir debug
  #    cd debug
  #    cmake -DCMAKE_BUILD_TYPE=Debug -DENABLE_COVERAGE=ON ..
  #    make -j4
  #    make coverage
  #    xdg-open coverage/index.html
  #################################################################
  
  # Find programs we need 
  FIND_PROGRAM(LCOV_EXECUTABLE lcov DOC "Full path to lcov executable")
  FIND_PROGRAM(GENHTML_EXECUTABLE genhtml DOC "Full path to genhtml executable")
  MARK_AS_ADVANCED(LCOV_EXECUTABLE GENHTML_EXECUTABLE)
  
  # Check, compiler, build types and programs are available
  IF(NOT CMAKE_COMPILER_IS_GNUCC)
  MESSAGE(FATAL_ERROR "Coverage can only be built on GCC")
  ELSEIF(NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
  MESSAGE(FATAL_ERROR "Coverage can only be built in Debug mode")
  ELSEIF(NOT LCOV_EXECUTABLE)
  MESSAGE(FATAL_ERROR "lcov executable not found")
  ELSEIF(NOT GENHTML_EXECUTABLE)
  MESSAGE(FATAL_ERROR "genhtml executable not found")
  ENDIF(NOT CMAKE_COMPILER_IS_GNUCC)
  
  # Enable testing if not already done
  SET(ENABLE_TEST ON)
  
  #################################################################
  # Set special compiler and linker flags for test coverage
  #################################################################
  # 0. Enable debug: -g
  SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g")
  # 1. Disable optimizations: -O0
  SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0")
  # 2. Enable all kind of warnings:
  SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -W")
  # 3. Enable special coverage flag (HINT: --coverage is a synonym for -fprofile-arcs -ftest-coverage)
  SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --coverage")
  SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} --coverage")
  SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --coverage")
  #################################################################
  
  ADD_CUSTOM_TARGET(coverage
  COMMAND ${CMAKE_COMMAND} -E echo "Beginning test coverage. Output is written to coverage.log."
  COMMAND ${CMAKE_COMMAND} -E echo "COVERAGE-STEP-1/5: Reset all execution counts to zero"
  COMMAND ${LCOV_EXECUTABLE} --directory . --zerocounters > coverage.log 2>&1
  COMMAND ${CMAKE_COMMAND} -E echo "COVERAGE-STEP-2/5: Run testrunner"
  COMMAND ${CMAKE_CTEST_COMMAND} >> coverage.log 2>&1
  COMMAND ${CMAKE_COMMAND} -E echo "COVERAGE-STEP-3/5: Collect coverage data"
  COMMAND ${LCOV_EXECUTABLE} --capture --directory . --output-file "./coverage.info" >> coverage.log 2>&1
  COMMAND ${CMAKE_COMMAND} -E echo "COVERAGE-STEP-4/5: Generate HTML from coverage data"
  COMMAND ${GENHTML_EXECUTABLE} "coverage.info" --title="libarchive-${LIBARCHIVE_VERSION_STRING}" --show-details --legend --output-directory "./coverage"  >> coverage.log 2>&1
  COMMAND ${CMAKE_COMMAND} -E echo "COVERAGE-STEP-5/5: Open test coverage HTML output in browser: xdg-open ./coverage/index.html"
  COMMENT "Runs testrunner and generates coverage output (formats: .info and .html)")
  
  