I'm on a linux machine, trying to build a project using cmake that does out of source builds. For code coverage, I looked into gcov and followed a simple tutorial that generate appropriate files for a sample helloWorld.cpp
program. The only requirement were to compile with -fprofile-arcs -ftest-coverage
flags & link with -lgcov
flag, which can be done altogether with -coverage
flag.
Now here comes the tricky part. I have a CMakeLists.txt
wit contents as shown below:
cmake_minimum_required (VERSION 2.8)
project (SomeName)
SET(GCC_COVERAGE_COMPILE_FLAGS "-g -O0 -coverage -fprofile-arcs -ftest-coverage")
SET(GCC_COVERAGE_LINK_FLAGS "-coverage -lgcov")
SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}" )
SET( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${GCC_COVERAGE_LINK_FLAGS}" )
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
include_directories(include)
set(CATCH_HEADER_PATH ${PROJECT_SOURCE_DIR}/test/catch.hpp)
add_executable(runTest ${PROJECT_SOURCE_DIR}/test/test.cpp ${CATCH_HEADER_PATH})
So I've included appropriate compile time flags as well as linker flags too and appended them correctly. Another thing to note is set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
line which says that executables will be generated inside bin
directory.
Now everything works as intended except that coverage files aren't generated properly. I follow these steps :
mkdir build && cd build
cmake ..
make -j4
./bin/runTest
and no other file is generated inside bin
folder. However on more inspection I found out that there is another location build/CMakeFiles/runTest.dir/test
where test.cpp.o
resides initially and after the final step ./bin/runTest
, two new files - test.cpp.gcda
& test.cpp.gcno
are generated.
I've already tried copying test/test.cpp
to build/CMakeFiles/runTest.dir/test
and running gcov test.cpp
but it fails stating - test.gcno:cannot open notes file
A mismatch in gcov and gcc version was making this happen. gcc
symlink /usr/bin/gcc
was set to newest gcc
, same for g++
but gcov
in $PATH
was still pointing to older version of gcov
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With