| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
|
|
| |
| set(LCOV_DATA_PATH "${CMAKE_BINARY_DIR}/lcov/data") |
| set(LCOV_DATA_PATH_INIT "${LCOV_DATA_PATH}/init") |
| set(LCOV_DATA_PATH_CAPTURE "${LCOV_DATA_PATH}/capture") |
| set(LCOV_HTML_PATH "${CMAKE_BINARY_DIR}/lcov/html") |
|
|
|
|
|
|
|
|
| |
| find_package(Gcov) |
|
|
|
|
|
|
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| function (add_lcov_target TNAME) |
| if (LCOV_FOUND) |
| |
| lcov_capture_initial_tgt(${TNAME}) |
|
|
| |
| lcov_capture_tgt(${TNAME}) |
| endif () |
| endfunction (add_lcov_target) |
|
|
|
|
|
|
|
|
| |
| include(FindPackageHandleStandardArgs) |
|
|
| |
| find_program(LCOV_BIN lcov) |
| find_program(GENINFO_BIN geninfo) |
| find_program(GENHTML_BIN genhtml) |
| find_package_handle_standard_args(lcov |
| REQUIRED_VARS LCOV_BIN GENINFO_BIN GENHTML_BIN |
| ) |
|
|
| |
| set(GENHTML_CPPFILT_FLAG "") |
| find_program(CPPFILT_BIN c++filt) |
| if (NOT CPPFILT_BIN STREQUAL "") |
| set(GENHTML_CPPFILT_FLAG "--demangle-cpp") |
| endif (NOT CPPFILT_BIN STREQUAL "") |
|
|
| |
| if (GENINFO_BIN AND NOT DEFINED GENINFO_EXTERN_FLAG) |
| set(FLAG "") |
| execute_process(COMMAND ${GENINFO_BIN} --help OUTPUT_VARIABLE GENINFO_HELP) |
| string(REGEX MATCH "external" GENINFO_RES "${GENINFO_HELP}") |
| if (GENINFO_RES) |
| set(FLAG "--no-external") |
| endif () |
|
|
| set(GENINFO_EXTERN_FLAG "${FLAG}" |
| CACHE STRING "Geninfo flag to exclude system sources.") |
| endif () |
|
|
| |
| if (NOT LCOV_FOUND) |
| return() |
| endif (NOT LCOV_FOUND) |
|
|
|
|
|
|
|
|
| |
| file(MAKE_DIRECTORY ${LCOV_DATA_PATH_INIT}) |
| file(MAKE_DIRECTORY ${LCOV_DATA_PATH_CAPTURE}) |
|
|
| set(LCOV_REMOVE_PATTERNS "") |
|
|
| |
| |
| function (lcov_merge_files OUTFILE ...) |
| |
| list(REMOVE_AT ARGV 0) |
|
|
| |
| string(REPLACE "${CMAKE_BINARY_DIR}/" "" FILE_REL "${OUTFILE}") |
| add_custom_command(OUTPUT "${OUTFILE}.raw" |
| COMMAND cat ${ARGV} > ${OUTFILE}.raw |
| DEPENDS ${ARGV} |
| COMMENT "Generating ${FILE_REL}" |
| ) |
|
|
| add_custom_command(OUTPUT "${OUTFILE}" |
| COMMAND ${LCOV_BIN} --quiet -a ${OUTFILE}.raw --output-file ${OUTFILE} |
| --base-directory ${PROJECT_SOURCE_DIR} ${LCOV_EXTRA_FLAGS} |
| COMMAND ${LCOV_BIN} --quiet -r ${OUTFILE} ${LCOV_REMOVE_PATTERNS} |
| --output-file ${OUTFILE} ${LCOV_EXTRA_FLAGS} |
| DEPENDS ${OUTFILE}.raw |
| COMMENT "Post-processing ${FILE_REL}" |
| ) |
| endfunction () |
|
|
|
|
|
|
|
|
| |
| |
| |
| if (NOT TARGET lcov-capture-init) |
| add_custom_target(lcov-capture-init) |
| set(LCOV_CAPTURE_INIT_FILES "" CACHE INTERNAL "") |
| endif (NOT TARGET lcov-capture-init) |
|
|
|
|
| |
| |
| |
| |
| function (lcov_capture_initial_tgt TNAME) |
| |
| |
| |
| get_target_property(TSOURCES ${TNAME} SOURCES) |
| set(SOURCES "") |
| set(TCOMPILER "") |
| foreach (FILE ${TSOURCES}) |
| codecov_path_of_source(${FILE} FILE) |
| if (NOT "${FILE}" STREQUAL "") |
| codecov_lang_of_source(${FILE} LANG) |
| if (NOT "${LANG}" STREQUAL "") |
| list(APPEND SOURCES "${FILE}") |
| set(TCOMPILER ${CMAKE_${LANG}_COMPILER_ID}) |
| endif () |
| endif () |
| endforeach () |
|
|
| |
| if (NOT GCOV_${TCOMPILER}_BIN) |
| message(WARNING "No coverage evaluation binary found for ${TCOMPILER}.") |
| return() |
| endif () |
|
|
| set(GCOV_BIN "${GCOV_${TCOMPILER}_BIN}") |
| set(GCOV_ENV "${GCOV_${TCOMPILER}_ENV}") |
|
|
|
|
| set(TDIR ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${TNAME}.dir) |
| set(GENINFO_FILES "") |
| foreach(FILE ${SOURCES}) |
| |
| set(OUTFILE "${TDIR}/${FILE}.info.init") |
| list(APPEND GENINFO_FILES ${OUTFILE}) |
|
|
| add_custom_command(OUTPUT ${OUTFILE} COMMAND ${GCOV_ENV} ${GENINFO_BIN} |
| --quiet --base-directory ${PROJECT_SOURCE_DIR} --initial |
| --gcov-tool ${GCOV_BIN} --output-filename ${OUTFILE} |
| ${GENINFO_EXTERN_FLAG} ${TDIR}/${FILE}.gcno |
| DEPENDS ${TNAME} |
| COMMENT "Capturing initial coverage data for ${FILE}" |
| ) |
| endforeach() |
|
|
| |
| set(OUTFILE "${LCOV_DATA_PATH_INIT}/${TNAME}.info") |
| set(LCOV_EXTRA_FLAGS "--initial") |
| lcov_merge_files("${OUTFILE}" ${GENINFO_FILES}) |
| add_custom_target(${TNAME}-capture-init ALL DEPENDS ${OUTFILE}) |
|
|
| |
| add_dependencies(lcov-capture-init ${TNAME}-capture-init) |
| set(LCOV_CAPTURE_INIT_FILES "${LCOV_CAPTURE_INIT_FILES}" |
| "${OUTFILE}" CACHE INTERNAL "" |
| ) |
| endfunction (lcov_capture_initial_tgt) |
|
|
|
|
| |
| |
| |
| function (lcov_capture_initial) |
| |
| |
| if ("${LCOV_CAPTURE_INIT_FILES}" STREQUAL "") |
| return() |
| endif () |
|
|
| |
| set(OUTFILE "${LCOV_DATA_PATH_INIT}/all_targets.info") |
| lcov_merge_files("${OUTFILE}" ${LCOV_CAPTURE_INIT_FILES}) |
| add_custom_target(lcov-geninfo-init ALL DEPENDS ${OUTFILE} |
| lcov-capture-init |
| ) |
| endfunction (lcov_capture_initial) |
|
|
|
|
|
|
|
|
| |
| |
| if (NOT TARGET lcov-capture) |
| add_custom_target(lcov-capture) |
| set(LCOV_CAPTURE_FILES "" CACHE INTERNAL "") |
| endif (NOT TARGET lcov-capture) |
|
|
|
|
| |
| |
| |
| |
| function (lcov_capture_tgt TNAME) |
| |
| |
| |
| get_target_property(TSOURCES ${TNAME} SOURCES) |
| set(SOURCES "") |
| set(TCOMPILER "") |
| foreach (FILE ${TSOURCES}) |
| codecov_path_of_source(${FILE} FILE) |
| if (NOT "${FILE}" STREQUAL "") |
| codecov_lang_of_source(${FILE} LANG) |
| if (NOT "${LANG}" STREQUAL "") |
| list(APPEND SOURCES "${FILE}") |
| set(TCOMPILER ${CMAKE_${LANG}_COMPILER_ID}) |
| endif () |
| endif () |
| endforeach () |
|
|
| |
| if (NOT GCOV_${TCOMPILER}_BIN) |
| message(WARNING "No coverage evaluation binary found for ${TCOMPILER}.") |
| return() |
| endif () |
|
|
| set(GCOV_BIN "${GCOV_${TCOMPILER}_BIN}") |
| set(GCOV_ENV "${GCOV_${TCOMPILER}_ENV}") |
|
|
|
|
| set(TDIR ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${TNAME}.dir) |
| set(GENINFO_FILES "") |
| foreach(FILE ${SOURCES}) |
| |
| |
| set(OUTFILE "${TDIR}/${FILE}.info") |
| list(APPEND GENINFO_FILES ${OUTFILE}) |
|
|
| add_custom_command(OUTPUT ${OUTFILE} |
| COMMAND test -f "${TDIR}/${FILE}.gcda" |
| && ${GCOV_ENV} ${GENINFO_BIN} --quiet --base-directory |
| ${PROJECT_SOURCE_DIR} --gcov-tool ${GCOV_BIN} |
| --output-filename ${OUTFILE} ${GENINFO_EXTERN_FLAG} |
| ${TDIR}/${FILE}.gcda |
| || cp ${OUTFILE}.init ${OUTFILE} |
| DEPENDS ${TNAME} ${TNAME}-capture-init |
| COMMENT "Capturing coverage data for ${FILE}" |
| ) |
| endforeach() |
|
|
| |
| set(OUTFILE "${LCOV_DATA_PATH_CAPTURE}/${TNAME}.info") |
| lcov_merge_files("${OUTFILE}" ${GENINFO_FILES}) |
| add_custom_target(${TNAME}-geninfo DEPENDS ${OUTFILE}) |
|
|
| |
| add_dependencies(lcov-capture ${TNAME}-geninfo) |
| set(LCOV_CAPTURE_FILES "${LCOV_CAPTURE_FILES}" "${OUTFILE}" CACHE INTERNAL |
| "" |
| ) |
|
|
| |
| file(MAKE_DIRECTORY ${LCOV_HTML_PATH}/${TNAME}) |
| add_custom_target(${TNAME}-genhtml |
| COMMAND ${GENHTML_BIN} --quiet --sort --prefix ${PROJECT_SOURCE_DIR} |
| --baseline-file ${LCOV_DATA_PATH_INIT}/${TNAME}.info |
| --output-directory ${LCOV_HTML_PATH}/${TNAME} |
| --title "${CMAKE_PROJECT_NAME} - target ${TNAME}" |
| ${GENHTML_CPPFILT_FLAG} ${OUTFILE} |
| DEPENDS ${TNAME}-geninfo ${TNAME}-capture-init |
| ) |
| endfunction (lcov_capture_tgt) |
|
|
|
|
| |
| |
| |
| function (lcov_capture) |
| |
| |
| if ("${LCOV_CAPTURE_FILES}" STREQUAL "") |
| return() |
| endif () |
|
|
| |
| set(OUTFILE "${LCOV_DATA_PATH_CAPTURE}/all_targets.info") |
| lcov_merge_files("${OUTFILE}" ${LCOV_CAPTURE_FILES}) |
| add_custom_target(lcov-geninfo DEPENDS ${OUTFILE} lcov-capture) |
|
|
| |
| |
| |
| |
| |
| if (NOT TARGET lcov) |
| file(MAKE_DIRECTORY ${LCOV_HTML_PATH}/all_targets) |
| add_custom_target(lcov |
| COMMAND ${GENHTML_BIN} --quiet --sort |
| --baseline-file ${LCOV_DATA_PATH_INIT}/all_targets.info |
| --output-directory ${LCOV_HTML_PATH}/all_targets |
| --title "${CMAKE_PROJECT_NAME}" --prefix "${PROJECT_SOURCE_DIR}" |
| ${GENHTML_CPPFILT_FLAG} ${OUTFILE} |
| DEPENDS lcov-geninfo-init lcov-geninfo |
| ) |
| endif () |
| endfunction (lcov_capture) |
|
|
|
|
|
|
|
|
| |
| |
| |
| |
| |
| |
| file(MAKE_DIRECTORY ${LCOV_HTML_PATH}/selected_targets) |
| if (NOT TARGET lcov-genhtml) |
| add_custom_target(lcov-genhtml |
| COMMAND ${GENHTML_BIN} |
| --quiet |
| --output-directory ${LCOV_HTML_PATH}/selected_targets |
| --title \"${CMAKE_PROJECT_NAME} - targets `find |
| ${LCOV_DATA_PATH_CAPTURE} -name \"*.info\" ! -name |
| \"all_targets.info\" -exec basename {} .info \\\;`\" |
| --prefix ${PROJECT_SOURCE_DIR} |
| --sort |
| ${GENHTML_CPPFILT_FLAG} |
| `find ${LCOV_DATA_PATH_CAPTURE} -name \"*.info\" ! -name |
| \"all_targets.info\"` |
| ) |
| endif (NOT TARGET lcov-genhtml) |
| |