| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 |
- #.rst:
- # CTestCoverageCollectGCOV
- # ------------------------
- #
- # This module provides the function ``ctest_coverage_collect_gcov``.
- # The function will run gcov on the .gcda files in a binary tree and then
- # package all of the .gcov files into a tar file with a data.json that
- # contains the source and build directories for CDash to use in parsing
- # the coverage data. In addtion the Labels.json files for targets that
- # have coverage information are also put in the tar file for CDash to
- # asign the correct labels. This file can be sent to a CDash server for
- # display with the
- # :command:`ctest_submit(CDASH_UPLOAD)` command.
- #
- # .. command:: cdash_coverage_collect_gcov
- #
- # ::
- #
- # ctest_coverage_collect_gcov(TARBALL <tarfile>
- # [SOURCE <source_dir>][BUILD <build_dir>]
- # [GCOV_COMMAND <gcov_command>]
- # [GCOV_OPTIONS <options>...]
- # )
- #
- # Run gcov and package a tar file for CDash. The options are:
- #
- # ``TARBALL <tarfile>``
- # Specify the location of the ``.tar`` file to be created for later
- # upload to CDash. Relative paths will be interpreted with respect
- # to the top-level build directory.
- #
- # ``SOURCE <source_dir>``
- # Specify the top-level source directory for the build.
- # Default is the value of :variable:`CTEST_SOURCE_DIRECTORY`.
- #
- # ``BUILD <build_dir>``
- # Specify the top-level build directory for the build.
- # Default is the value of :variable:`CTEST_BINARY_DIRECTORY`.
- #
- # ``GCOV_COMMAND <gcov_command>``
- # Specify the full path to the ``gcov`` command on the machine.
- # Default is the value of :variable:`CTEST_COVERAGE_COMMAND`.
- #
- # ``GCOV_OPTIONS <options>...``
- # Specify options to be passed to gcov. The ``gcov`` command
- # is run as ``gcov <options>... -o <gcov-dir> <file>.gcda``.
- # If not specified, the default option is just ``-b``.
- #=============================================================================
- # Copyright 2014-2015 Kitware, Inc.
- #
- # Distributed under the OSI-approved BSD License (the "License");
- # see accompanying file Copyright.txt for details.
- #
- # This software is distributed WITHOUT ANY WARRANTY; without even the
- # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- # See the License for more information.
- #=============================================================================
- # (To distribute this file outside of CMake, substitute the full
- # License text for the above reference.)
- include(CMakeParseArguments)
- function(ctest_coverage_collect_gcov)
- set(options "")
- set(oneValueArgs TARBALL SOURCE BUILD GCOV_COMMAND)
- set(multiValueArgs GCOV_OPTIONS)
- cmake_parse_arguments(GCOV "${options}" "${oneValueArgs}"
- "${multiValueArgs}" "" ${ARGN} )
- if(NOT DEFINED GCOV_TARBALL)
- message(FATAL_ERROR
- "TARBALL must be specified. for ctest_coverage_collect_gcov")
- endif()
- if(NOT DEFINED GCOV_SOURCE)
- set(source_dir "${CTEST_SOURCE_DIRECTORY}")
- else()
- set(source_dir "${GCOV_SOURCE}")
- endif()
- if(NOT DEFINED GCOV_BUILD)
- set(binary_dir "${CTEST_BINARY_DIRECTORY}")
- else()
- set(binary_dir "${GCOV_BUILD}")
- endif()
- if(NOT DEFINED GCOV_GCOV_COMMAND)
- set(gcov_command "${CTEST_COVERAGE_COMMAND}")
- else()
- set(gcov_command "${GCOV_GCOV_COMMAND}")
- endif()
- # run gcov on each gcda file in the binary tree
- set(gcda_files)
- set(label_files)
- # look for gcda files in the target directories
- # could do a glob from the top of the binary tree but
- # this will be faster and only look where the files will be
- 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")
- list(LENGTH gfiles len)
- # if we have gcda files then also grab the labels file for that target
- if(${len} GREATER 0)
- file(GLOB_RECURSE lfiles RELATIVE ${binary_dir}
- "${target_dir}/Labels.json")
- list(APPEND gcda_files ${gfiles})
- list(APPEND label_files ${lfiles})
- endif()
- endforeach()
- # return early if no coverage files were found
- list(LENGTH gcda_files len)
- if(len EQUAL 0)
- message("ctest_coverage_collect_gcov: No .gcda files found, "
- "ignoring coverage request.")
- return()
- endif()
- # 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})
- endforeach()
- if(NOT "${res}" EQUAL 0)
- message(STATUS "Error running gcov: ${res} ${out}")
- endif()
- # create json file with project information
- file(WRITE ${coverage_dir}/data.json
- "{
- \"Source\": \"${source_dir}\",
- \"Binary\": \"${binary_dir}\"
- }")
- # collect the gcov files
- set(gcov_files)
- file(GLOB_RECURSE gcov_files RELATIVE ${binary_dir} "${coverage_dir}/*.gcov")
- # tar up the coverage info with the same date so that the md5
- # sum will be the same for the tar file independent of file time
- # stamps
- string(REPLACE ";" "\n" gcov_files "${gcov_files}")
- string(REPLACE ";" "\n" label_files "${label_files}")
- file(WRITE "${coverage_dir}/coverage_file_list.txt"
- "${gcov_files}
- ${coverage_dir}/data.json
- ${label_files}
- ")
- execute_process(COMMAND
- ${CMAKE_COMMAND} -E tar cvfj ${GCOV_TARBALL}
- "--mtime=1970-01-01 0:0:0 UTC"
- --files-from=${coverage_dir}/coverage_file_list.txt
- WORKING_DIRECTORY ${binary_dir})
- endfunction()
|