diff --git a/cmake/FindGcov.cmake b/cmake/FindGcov.cmake index a6ef6fd..68fa43e 100644 --- a/cmake/FindGcov.cmake +++ b/cmake/FindGcov.cmake @@ -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() diff --git a/cmake/FindLcov.cmake b/cmake/FindLcov.cmake index 1d48b55..d3bc1be 100644 --- a/cmake/FindLcov.cmake +++ b/cmake/FindLcov.cmake @@ -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}" @@ -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}) @@ -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() @@ -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} @@ -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}" @@ -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