-
-
Save madebr/07ebd0de59e789cd819643b58db25df9 to your computer and use it in GitHub Desktop.
| cmake_minimum_required(VERSION 3.9) | |
| project(cmake_coverage) | |
| file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/main.c" "int main() {return 0;}") | |
| add_executable(main | |
| main.c | |
| ) | |
| target_compile_options(main | |
| PUBLIC | |
| "-O0" | |
| "-fprofile-arcs" | |
| "-ftest-coverage" | |
| ) | |
| target_link_libraries(main | |
| gcov | |
| ) | |
| include(CTest) | |
| enable_testing() | |
| add_test(NAME test | |
| COMMAND main | |
| ) |
| set(CTEST_PROJECT_NAME "Simple ctest_coverage project") |
| # This command succeeds | |
| $ ls && mkdir build && cd build && cmake .. && make && make test && make ExperimentalCoverage && cd .. | |
| CMakeLists.txt CTestConfig.cmake test.ctest | |
| -- The C compiler identification is GNU 7.2.1 | |
| -- The CXX compiler identification is GNU 7.2.1 | |
| -- Check for working C compiler: /usr/bin/cc | |
| -- Check for working C compiler: /usr/bin/cc -- works | |
| -- Detecting C compiler ABI info | |
| -- Detecting C compiler ABI info - done | |
| -- Detecting C compile features | |
| -- Detecting C compile features - done | |
| -- Check for working CXX compiler: /usr/bin/c++ | |
| -- Check for working CXX compiler: /usr/bin/c++ -- works | |
| -- Detecting CXX compiler ABI info | |
| -- Detecting CXX compiler ABI info - done | |
| -- Detecting CXX compile features | |
| -- Detecting CXX compile features - done | |
| -- Configuring done | |
| -- Generating done | |
| -- Build files have been written to: /home/maarten/programming/minumum_examples/cmake_coverage/build | |
| Scanning dependencies of target main | |
| [ 50%] Building C object CMakeFiles/main.dir/main.c.o | |
| [100%] Linking C executable main | |
| [100%] Built target main | |
| Running tests... | |
| Test project /home/maarten/programming/minumum_examples/cmake_coverage/build | |
| Start 1: test | |
| 1/1 Test #1: test ............................. Passed 0.00 sec | |
| 100% tests passed, 0 tests failed out of 1 | |
| Total Test time (real) = 0.00 sec | |
| Scanning dependencies of target ExperimentalCoverage | |
| Site: maarten-acer | |
| Build name: Linux-c++ | |
| Create new tag: 20171028-0543 - Experimental | |
| Performing coverage | |
| Processing coverage (each . represents one file): | |
| . | |
| Accumulating results (each . represents one file): | |
| . | |
| Covered LOC: 1 | |
| Not covered LOC: 0 | |
| Total LOC: 1 | |
| Percentage Coverage: 100.00% | |
| Built target ExperimentalCoverage | |
| # This command fails | |
| $ ctest -S test.ctest | |
| Each . represents 1024 bytes of output | |
| . Size of output: 0K | |
| Each symbol represents 1024 bytes of output. | |
| '!' represents an error and '*' a warning. | |
| . Size of output: 0K | |
| Cannot find file: /home/maarten/programming/minumum_examples/cmake_coverage/build/ctest/Testing/CoverageInfo/main.c | |
| # Why is that? |
| set(CTEST_SOURCE_DIRECTORY "${CTEST_SCRIPT_DIRECTORY}") | |
| set(CTEST_BINARY_DIRECTORY "${CTEST_SCRIPT_DIRECTORY}/build/ctest") | |
| ctest_empty_binary_directory("${CTEST_BINARY_DIRECTORY}") | |
| set(CTEST_SITE "${CMAKE_SYSTEM_NAME}") | |
| set(CTEST_BUILD_NAME "experimental build") | |
| set(CTEST_CMAKE_GENERATOR "Ninja") | |
| set(CTEST_COVERAGE_COMMAND "gcov") | |
| ctest_start("Experimental") | |
| ctest_configure() | |
| ctest_build() | |
| ctest_test() | |
| ctest_coverage() |
The problem is ninja: set(CTEST_CMAKE_GENERATOR "Ninja")
In my case removing -Gninja from cmake configure removed the issue.
Indeed, gcov creates intermediate files in common folders that fail when building in parallel.
ninja -j1 would also work fine.
I stumbled over the same problem. Solution is a real out-of-tree build, no build in a source subdirectory:
set(CTEST_SOURCE_DIRECTORY "/home/user/testproject")
set(CTEST_BINARY_DIRECTORY "/home/user/testproject_build")
The step ctest_coverage() is executed sequentially after ctest_build() (and other steps) are finished. So it doesn't matter, if the build step with Ninja uses multiple jobs parallel or only one.
Hello, I try to follow your example. But i use cmake+ninja instead of make so I use cmake commands instead of plain make commands:
ls
mkdir build
cd build
cmake -GNinja ..
cmake --build . --target all
cmake test
[0/1] Running tests...
Test project /home/ubuntu/sources/gcov_coverage/build
Start 1: test
1/1 Test #1: test ............................. Passed 0.00 sec
100% tests passed, 0 tests failed out of 1
Total Test time (real) = 0.00 sec
cmake --build . --target ExperimentalCoverage
[0/1] cd /home/ubuntu/sources/gcov_coverage/build && /usr/bin/ctest -D ExperimentalCoverage
Site: ubuntu
Build name: Linux-c++
Performing coverage
Processing coverage (each . represents one file):
.
Accumulating results (each . represents one file):
.Cannot find file: /home/ubuntu/sources/gcov_coverage/build/Testing/CoverageInfo/main.c
Covered LOC: 0
Not covered LOC: 0
Total LOC: 0
Percentage Coverage: 0.00%
Your example works with plain make commands but it's not useful if u dont use make. So i tried to use cmake cmds. What I do wrong? Can you help?
Is this still a problem?
Yep, i couldn't find solution
Hi,
Have you found a solution to this problem ?
I have something really similar.
My temporary solution was creating a symbolic link in the CoverageInfo folder to the sources.
It works well but that's not the right way to do it. How did you ?