1*46035553Spatrickfind_program(CODE_COVERAGE_LCOV lcov) 2*46035553Spatrickif (NOT CODE_COVERAGE_LCOV) 3*46035553Spatrick message(FATAL_ERROR "Cannot find lcov...") 4*46035553Spatrickendif() 5*46035553Spatrick 6*46035553Spatrickfind_program(CODE_COVERAGE_LLVM_COV llvm-cov) 7*46035553Spatrickif (NOT CODE_COVERAGE_LLVM_COV) 8*46035553Spatrick message(FATAL_ERROR "Cannot find llvm-cov...") 9*46035553Spatrickendif() 10*46035553Spatrick 11*46035553Spatrickfind_program(CODE_COVERAGE_GENHTML genhtml) 12*46035553Spatrickif (NOT CODE_COVERAGE_GENHTML) 13*46035553Spatrick message(FATAL_ERROR "Cannot find genhtml...") 14*46035553Spatrickendif() 15*46035553Spatrick 16*46035553Spatrickset(CMAKE_CXX_FLAGS_COVERAGE "-g -O0 --coverage") 17*46035553Spatrick 18*46035553Spatrickfunction(setup_lcov_test_target_coverage target_name output_dir capture_dirs source_dirs) 19*46035553Spatrick if (NOT DEFINED LIBCXX_BINARY_DIR) 20*46035553Spatrick message(FATAL_ERROR "Variable must be set") 21*46035553Spatrick endif() 22*46035553Spatrick 23*46035553Spatrick set(GCOV_TOOL "${LIBCXX_BINARY_DIR}/llvm-cov-wrapper") 24*46035553Spatrick file(GENERATE OUTPUT ${GCOV_TOOL} 25*46035553Spatrick CONTENT "#!/usr/bin/env bash\n${CODE_COVERAGE_LLVM_COV} gcov \"$@\"\n") 26*46035553Spatrick 27*46035553Spatrick file(MAKE_DIRECTORY ${output_dir}) 28*46035553Spatrick 29*46035553Spatrick set(CAPTURE_DIRS "") 30*46035553Spatrick foreach(cdir ${capture_dirs}) 31*46035553Spatrick list(APPEND CAPTURE_DIRS "-d;${cdir}") 32*46035553Spatrick endforeach() 33*46035553Spatrick 34*46035553Spatrick set(EXTRACT_DIRS "") 35*46035553Spatrick foreach(sdir ${source_dirs}) 36*46035553Spatrick list(APPEND EXTRACT_DIRS "'${sdir}/*'") 37*46035553Spatrick endforeach() 38*46035553Spatrick 39*46035553Spatrick message(STATUS "Capture Directories: ${CAPTURE_DIRS}") 40*46035553Spatrick message(STATUS "Extract Directories: ${EXTRACT_DIRS}") 41*46035553Spatrick 42*46035553Spatrick add_custom_target(generate-lib${target_name}-coverage 43*46035553Spatrick COMMAND chmod +x ${GCOV_TOOL} 44*46035553Spatrick COMMAND ${CODE_COVERAGE_LCOV} --gcov-tool ${GCOV_TOOL} --capture ${CAPTURE_DIRS} -o test_coverage.info 45*46035553Spatrick COMMAND ${CODE_COVERAGE_LCOV} --gcov-tool ${GCOV_TOOL} --extract test_coverage.info ${EXTRACT_DIRS} -o test_coverage.info 46*46035553Spatrick COMMAND ${CODE_COVERAGE_GENHTML} --demangle-cpp test_coverage.info -o test_coverage 47*46035553Spatrick COMMAND ${CMAKE_COMMAND} -E remove test_coverage.info 48*46035553Spatrick WORKING_DIRECTORY ${output_dir} 49*46035553Spatrick COMMENT "Generating coverage results") 50*46035553Spatrickendfunction() 51