Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 10 additions & 5 deletions cmake/FindGcov.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -139,16 +139,21 @@ function (add_gcov_target TNAME)
set(NULL_DEVICE "NUL")
endif()
foreach(FILE ${SOURCES})
get_filename_component(FILE_PATH "${TDIR}/${FILE}" PATH)
get_target_property(T_SOURCE_DIR ${TNAME} SOURCE_DIR)
get_filename_component(ABS_FILE "${FILE}" ABSOLUTE BASE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
file(RELATIVE_PATH REL_FILE "${T_SOURCE_DIR}" "${ABS_FILE}")

set(OUTFILE "${TDIR}/${REL_FILE}.info.init")
list(APPEND GENINFO_FILES ${OUTFILE})

# call gcov
add_custom_command(OUTPUT ${TDIR}/${FILE}.gcov
COMMAND ${GCOV_ENV} ${GCOV_BIN} -p ${TDIR}/${FILE}.gcno > ${NULL_DEVICE}
DEPENDS ${TNAME} ${TDIR}/${FILE}.gcno
add_custom_command(OUTPUT ${TDIR}/${REL_FILE}.gcov
COMMAND ${GCOV_ENV} ${GCOV_BIN} -p ${TDIR}/${REL_FILE}.gcno > ${NULL_DEVICE}
DEPENDS ${TNAME} ${TDIR}/${REL_FILE}.gcno
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
)

list(APPEND BUFFER ${TDIR}/${FILE}.gcov)
list(APPEND BUFFER ${TDIR}/${REL_FILE}.gcov)
endforeach()


Expand Down
49 changes: 31 additions & 18 deletions cmake/FindLcov.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -106,9 +106,9 @@ function (lcov_merge_files OUTFILE ...)
)

add_custom_command(OUTPUT "${OUTFILE}"
COMMAND ${LCOV_BIN} --quiet -a ${OUTFILE}.raw --output-file ${OUTFILE}
COMMAND ${LCOV_BIN} --quiet --rc lcov_branch_coverage=1 -a ${OUTFILE}.raw --output-file ${OUTFILE}
--base-directory ${PROJECT_SOURCE_DIR} ${LCOV_EXTRA_FLAGS}
COMMAND ${LCOV_BIN} --quiet -r ${OUTFILE} ${LCOV_REMOVE_PATTERNS}
COMMAND ${LCOV_BIN} --quiet --rc lcov_branch_coverage=1 -r ${OUTFILE} ${LCOV_REMOVE_PATTERNS}
--output-file ${OUTFILE} ${LCOV_EXTRA_FLAGS}
DEPENDS ${OUTFILE}.raw
COMMENT "Post-processing ${FILE_REL}"
Expand Down Expand Up @@ -164,22 +164,27 @@ function (lcov_capture_initial_tgt TNAME)

set(GENINFO_FILES "")
foreach(FILE ${SOURCES})
# generate empty coverage files
set(OUTFILE "${TDIR}/${FILE}.info.init")
list(APPEND GENINFO_FILES ${OUTFILE})
get_target_property(T_SOURCE_DIR ${TNAME} SOURCE_DIR)
get_filename_component(ABS_FILE "${FILE}" ABSOLUTE BASE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
file(RELATIVE_PATH REL_FILE "${T_SOURCE_DIR}" "${ABS_FILE}")

set(OUTFILE "${TDIR}/${REL_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
--rc lcov_branch_coverage=1
${GENINFO_EXTERN_FLAG} ${TDIR}/${REL_FILE}.gcno
${GENINFO_EXTRA_FLAGS}
DEPENDS ${TNAME}
COMMENT "Capturing initial coverage data for ${FILE}"
COMMENT "Capturing initial coverage data for ${REL_FILE}"
)
endforeach()

# Concatenate all files generated by geninfo to a single file per target.
set(OUTFILE "${LCOV_DATA_PATH_INIT}/${TNAME}.info")

list(APPEND LCOV_EXTRA_FLAGS "--initial")
lcov_merge_files("${OUTFILE}" ${GENINFO_FILES})
add_custom_target(${TNAME}-capture-init ALL DEPENDS ${OUTFILE})
Expand Down Expand Up @@ -257,26 +262,32 @@ function (lcov_capture_tgt TNAME)

set(GENINFO_FILES "")
foreach(FILE ${SOURCES})
get_target_property(T_SOURCE_DIR ${TNAME} SOURCE_DIR)
get_filename_component(ABS_FILE "${FILE}" ABSOLUTE BASE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
file(RELATIVE_PATH REL_FILE "${T_SOURCE_DIR}" "${ABS_FILE}")

# Generate coverage files. If no .gcda file was generated during
# execution, the empty coverage file will be used instead.
set(OUTFILE "${TDIR}/${FILE}.info")
set(OUTFILE "${TDIR}/${REL_FILE}.info")
list(APPEND GENINFO_FILES ${OUTFILE})

# Create an empty .gcda file, so the target capture file can have a dependency on it.
# The capture file will only use this .gcda if it has a non-zero size (test -s).
add_custom_command(OUTPUT "${TDIR}/${FILE}.gcda"
COMMAND "${CMAKE_COMMAND}" -E touch "${TDIR}/${FILE}.gcda"
add_custom_command(OUTPUT "${TDIR}/${REL_FILE}.gcda"
COMMAND "${CMAKE_COMMAND}" -E touch "${TDIR}/${REL_FILE}.gcda"
)

add_custom_command(OUTPUT ${OUTFILE}
COMMAND test -s "${TDIR}/${FILE}.gcda"
COMMAND test -s "${TDIR}/${REL_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 ${GENINFO_EXTRA_FLAGS}
--output-filename ${OUTFILE}
--rc lcov_branch_coverage=1
${GENINFO_EXTERN_FLAG}
${TDIR}/${REL_FILE}.gcda ${GENINFO_EXTRA_FLAGS}
|| cp ${OUTFILE}.init ${OUTFILE}
DEPENDS ${TNAME} ${TNAME}-capture-init "${TDIR}/${FILE}.gcda"
COMMENT "Capturing coverage data for ${FILE}"
DEPENDS ${TNAME} ${TNAME}-capture-init "${TDIR}/${REL_FILE}.gcda"
COMMENT "Capturing coverage data for ${REL_FILE}"
)
endforeach()

Expand All @@ -294,7 +305,7 @@ function (lcov_capture_tgt TNAME)
# Add target for generating html output for this target only.
file(MAKE_DIRECTORY ${LCOV_HTML_PATH}/${TNAME})
add_custom_target(${TNAME}-genhtml
COMMAND ${GENHTML_BIN} --quiet --sort ${GENHTML_CPPFILT_FLAG}
COMMAND ${GENHTML_BIN} --quiet --legend --branch-coverage --sort ${GENHTML_CPPFILT_FLAG}
--prefix ${PROJECT_SOURCE_DIR}
--baseline-file ${LCOV_DATA_PATH_INIT}/${TNAME}.info
--output-directory ${LCOV_HTML_PATH}/${TNAME}
Expand Down Expand Up @@ -328,7 +339,8 @@ function (lcov_capture)
if (NOT TARGET lcov)
file(MAKE_DIRECTORY ${LCOV_HTML_PATH}/all_targets)
add_custom_target(lcov
COMMAND ${GENHTML_BIN} --quiet --sort ${GENHTML_CPPFILT_FLAG}
COMMAND ${GENHTML_BIN} --quiet --sort --legend --branch-coverage
${GENHTML_CPPFILT_FLAG}
--baseline-file ${LCOV_DATA_PATH_INIT}/all_targets.info
--output-directory ${LCOV_HTML_PATH}/all_targets
--title "${CMAKE_PROJECT_NAME}" --prefix "${PROJECT_SOURCE_DIR}"
Expand All @@ -351,7 +363,8 @@ file(MAKE_DIRECTORY ${LCOV_HTML_PATH}/selected_targets)
if (NOT TARGET lcov-genhtml)
add_custom_target(lcov-genhtml
COMMAND ${GENHTML_BIN}
--quiet
--quiet --legend
--branch-coverage
--output-directory ${LCOV_HTML_PATH}/selected_targets
--title \"${CMAKE_PROJECT_NAME} - targets `find
${LCOV_DATA_PATH_CAPTURE} -name \"*.info\" ! -name
Expand Down