mirror of
https://github.com/reactos/CMake.git
synced 2025-02-28 16:05:38 +00:00
CTestCoverageCollectGCOV: run gcov only once
Running gcov once per .gcda file is not only inefficient, it also generates wrong data since .gcov files can get overwritten and in general gcov works with less information. fakegcov.cmake needs to be able to handle multiple .gcda files for the test to be meaningful.
This commit is contained in:
parent
d170a3177f
commit
911b97867b
@ -95,7 +95,7 @@ function(ctest_coverage_collect_gcov)
|
||||
set(gcda_files)
|
||||
set(label_files)
|
||||
if (GCOV_GLOB)
|
||||
file(GLOB_RECURSE gfiles RELATIVE ${binary_dir} "${binary_dir}/*.gcda")
|
||||
file(GLOB_RECURSE gfiles "${binary_dir}/*.gcda")
|
||||
list(LENGTH gfiles len)
|
||||
# if we have gcda files then also grab the labels file for that target
|
||||
if(${len} GREATER 0)
|
||||
@ -109,7 +109,7 @@ function(ctest_coverage_collect_gcov)
|
||||
file(STRINGS "${binary_dir}/CMakeFiles/TargetDirectories.txt" target_dirs
|
||||
ENCODING UTF-8)
|
||||
foreach(target_dir ${target_dirs})
|
||||
file(GLOB_RECURSE gfiles RELATIVE ${binary_dir} "${target_dir}/*.gcda")
|
||||
file(GLOB_RECURSE gfiles "${target_dir}/*.gcda")
|
||||
list(LENGTH gfiles len)
|
||||
# if we have gcda files then also grab the labels file for that target
|
||||
if(${len} GREATER 0)
|
||||
@ -132,27 +132,21 @@ function(ctest_coverage_collect_gcov)
|
||||
# setup the dir for the coverage files
|
||||
set(coverage_dir "${binary_dir}/Testing/CoverageInfo")
|
||||
file(MAKE_DIRECTORY "${coverage_dir}")
|
||||
# call gcov on each .gcda file
|
||||
foreach (gcda_file ${gcda_files})
|
||||
# get the directory of the gcda file
|
||||
get_filename_component(gcda_file ${binary_dir}/${gcda_file} ABSOLUTE)
|
||||
get_filename_component(gcov_dir ${gcda_file} DIRECTORY)
|
||||
# run gcov, this will produce the .gcov file in the current
|
||||
# working directory
|
||||
if(NOT DEFINED GCOV_GCOV_OPTIONS)
|
||||
set(GCOV_GCOV_OPTIONS -b)
|
||||
endif()
|
||||
execute_process(COMMAND
|
||||
${gcov_command} ${GCOV_GCOV_OPTIONS} -o ${gcov_dir} ${gcda_file}
|
||||
OUTPUT_VARIABLE out
|
||||
RESULT_VARIABLE res
|
||||
WORKING_DIRECTORY ${coverage_dir})
|
||||
# run gcov, this will produce the .gcov files in the current
|
||||
# working directory
|
||||
if(NOT DEFINED GCOV_GCOV_OPTIONS)
|
||||
set(GCOV_GCOV_OPTIONS -b)
|
||||
endif()
|
||||
execute_process(COMMAND
|
||||
${gcov_command} ${GCOV_GCOV_OPTIONS} ${gcda_files}
|
||||
OUTPUT_VARIABLE out
|
||||
RESULT_VARIABLE res
|
||||
WORKING_DIRECTORY ${coverage_dir})
|
||||
|
||||
if (GCOV_DELETE)
|
||||
file(REMOVE ${gcda_file})
|
||||
endif()
|
||||
if (GCOV_DELETE)
|
||||
file(REMOVE ${gcda_files})
|
||||
endif()
|
||||
|
||||
endforeach()
|
||||
if(NOT "${res}" EQUAL 0)
|
||||
if (NOT GCOV_QUIET)
|
||||
message(STATUS "Error running gcov: ${res} ${out}")
|
||||
|
@ -1,14 +1,17 @@
|
||||
function(create_gcov_file gcda_full_path)
|
||||
get_filename_component(gcda_name ${gcda_full_path} NAME)
|
||||
string(REPLACE ".gcda" ".gcov" gcov_name "${gcda_name}")
|
||||
|
||||
file(STRINGS "${gcda_full_path}" source_file LIMIT_COUNT 1 ENCODING UTF-8)
|
||||
|
||||
file(WRITE "${CMAKE_SOURCE_DIR}/${gcov_name}"
|
||||
" -: 0:Source:${source_file}"
|
||||
)
|
||||
endfunction()
|
||||
|
||||
foreach(I RANGE 0 ${CMAKE_ARGC})
|
||||
if("${CMAKE_ARGV${I}}" MATCHES ".*\\.gcda")
|
||||
set(gcda_file "${CMAKE_ARGV${I}}")
|
||||
create_gcov_file(${gcda_file})
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
get_filename_component(gcda_name ${gcda_file} NAME)
|
||||
string(REPLACE ".gcda" ".gcov" gcov_name "${gcda_name}")
|
||||
|
||||
file(STRINGS "${gcda_file}" source_file LIMIT_COUNT 1 ENCODING UTF-8)
|
||||
|
||||
file(WRITE "${CMAKE_SOURCE_DIR}/${gcov_name}"
|
||||
" -: 0:Source:${source_file}"
|
||||
)
|
||||
|
Loading…
x
Reference in New Issue
Block a user