CTest在make <target>后生成gcov.tar并提交给CDash

Tim*_*chl 6 branch code-coverage cmake ctest cdash

我已经在我的本地机器上设置了 CDash,我正在使用 CTest 将测试结果上传到 CDash - 生成包含分支覆盖信息的 .gcov 文件并将它们预先打包到 gcov.tar (这是来自https的示例的修改版本://blog.kitware.com/additional-coverage-features-in-cdash/):

CMakeLists.txt:

cmake_minimum_required(VERSION 3.2)
project(branch_coverage_example)

add_executable(foo foo.cxx)
include(CTest)
add_test(NAME foo COMMAND foo)

include(BranchCoverage)
Run Code Online (Sandbox Code Playgroud)

我的 CMake 模块路径中的BranchCoverage.cmake

if(${CMAKE_BUILD_TYPE} STREQUAL "Profiling")
    option(ALWAYS_GENERATE_BRANCH_COVERAGE_INFO "Run gcov branch coverage as part of the ALL target" ON)

    if(ALWAYS_GENERATE_BRANCH_COVERAGE_INFO)
        add_custom_target(BranchCoverage)

        add_custom_command(TARGET BranchCoverage
            POST_BUILD
            COMMAND ${CMAKE_CTEST_COMMAND} -D ExperimentalSubmit -S cdash_tarball.cmake
            WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
            COMMENT "Generating gcov.tar containing branch coverage info..."
            )

        add_dependencies(BranchCoverage Experimental)
    endif()
endif()
Run Code Online (Sandbox Code Playgroud)

CTestConfig.cmake:

## This file should be placed in the root directory of your project.
## Then modify the CMakeLists.txt file in the root directory of your
## project to incorporate the testing dashboard.
##
## # The following are required to submit to the CDash dashboard:
##   ENABLE_TESTING()
##   INCLUDE(CTest)

set(CTEST_PROJECT_NAME "BranchCoverageExample")
set(CTEST_NIGHTLY_START_TIME "01:00:00 UTC")

set(CTEST_DROP_METHOD "http")
set(CTEST_DROP_SITE "localhost")
set(CTEST_DROP_LOCATION "/CDash/public/submit.php?project=BranchCoverageExample")
set(CTEST_DROP_SITE_CDASH TRUE)
Run Code Online (Sandbox Code Playgroud)

cdash_upload.cmake:

# start, configure, build, test, coverage and submit
# have been executed by make <target> beforehand!

# generate a GCOV tarball and upload it to CDash.
include(CTestCoverageCollectGCOV)
ctest_coverage_collect_gcov(
  TARBALL gcov.tar
  SOURCE ${CTEST_SOURCE_DIRECTORY}
  BUILD ${CTEST_BINARY_DIRECTORY}
  GCOV_COMMAND ${CTEST_COVERAGE_COMMAND}
  GCOV_OPTIONS -l -p -b
)
if(EXISTS "${CTEST_BINARY_DIRECTORY}/gcov.tar")
  ctest_submit(CDASH_UPLOAD "${CTEST_BINARY_DIRECTORY}/gcov.tar"
    CDASH_UPLOAD_TYPE GcovTar)
endif()
Run Code Online (Sandbox Code Playgroud)

当我直接使用 ctest 从示例中调用脚本时,它会起作用:

ctest -V -S run_example.cmake
Run Code Online (Sandbox Code Playgroud)

这给了我很好的 CDash 分支覆盖信息。然而,这不会:

make Experimental
Run Code Online (Sandbox Code Playgroud)

它最终说:

Generating gcov.tar containing branch coverage info...
CMake Error at /usr/local/share/cmake-3.6/Modules/CTestCoverageCollectGCOV.cmake:118 (file):
  file STRINGS file "/CMakeFiles/TargetDirectories.txt" cannot be read.
Call Stack (most recent call first):
  cdash_tarball.cmake:2 (ctest_coverage_collect_gcov)


ctest_coverage_collect_gcov: No .gcda files found, ignoring coverage request.
Run Code Online (Sandbox Code Playgroud)

我想这事做与路径/ env的瓦尔我需要给cdash_upload.cmake,当我这样做,使用-DCTEST_SOURCE_DIRECTORYadd_custom_commandBranchCoverage.cmake,CDASH返回一个“错误的HTTP响应”,但不给我任何指示我应该修复什么以及在哪里。

你们有什么想法吗?提前致谢!

spi*_*ght 1

你正在得到

file STRINGS file "/CMakeFiles/TargetDirectories.txt" cannot be read.
Run Code Online (Sandbox Code Playgroud)

因为在这个函数中调用:

ctest_coverage_collect_gcov(
  TARBALL gcov.tar
  SOURCE ${CTEST_SOURCE_DIRECTORY}
  BUILD ${CTEST_BINARY_DIRECTORY}
  GCOV_COMMAND ${CTEST_COVERAGE_COMMAND}
  GCOV_OPTIONS -l -p -b
)
Run Code Online (Sandbox Code Playgroud)

CTEST_BINARY_DIRECTORY没有定义,

它应该设置为项目的构建目录,事实证明它不是,否则你应该得到而不是

"/CMakeFiles/TargetDirectories.txt"
Run Code Online (Sandbox Code Playgroud)

像这样:

"build/Debug/CMakeFiles/TargetDirectories.txt"
Run Code Online (Sandbox Code Playgroud)

一旦设置完毕,一切都应该正常工作。

你可以在这里查看如何使用