VS: Use ClangCL toolset with coverage flag
Windows 10 Visual Studio 17 2022 Community Edition (bug also appears in Visual Studio 2019 Professional)
It appears that cmake generates an invalid MSVC solution/project file(s) when using the integrated LLVM toolkit. Resultant coverage files have no file name only a suffix, resulting in errors generating coverage data.
While searching for workaround for issue in #24021 I ran the following:
PS C:\Users\me\source\scratch\build> cmake -T ClangCL -D COVERAGE:BOOL=ON ..
-- Building for: Visual Studio 17 2022
-- Selecting Windows SDK version 10.0.19041.0 to target Windows 10.0.19044.
-- The C compiler identification is Clang 14.0.5 with MSVC-like command-line
-- The CXX compiler identification is Clang 14.0.5 with MSVC-like command-line
-- Detecting C compiler ABI info
-- Check for working C compiler: C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/Llvm/x64/bin/clang-cl.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/Llvm/x64/bin/clang-cl.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: C:/Users/me/source/scratch/build
PS C:\Users\me\source\scratch\build> cmake --build . --config Debug
(builds)
Running the generated executable results in
PS C:\Users\me\source\scratch\build> .\Debug\test1.exe
it is smaller
profiling: C:\Users\me\source\scratch\build\test1.dir\Debug\.gcda: cannot merge previous GCDA file: mismatched number of counters (2)
profiling: C:\Users\me\source\scratch\build\test1.dir\Debug\.gcda: cannot merge previous GCDA file: corrupt arc tag (0x00000000)
profiling: C:\Users\me\source\scratch\build\test1.dir\Debug\.gcda: cannot merge previous GCDA file: corrupt arc tag (0x00000000)
profiling: C:\Users\me\source\scratch\build\test1.dir\Debug\.gcda: cannot merge previous GCDA file: corrupt arc tag (0x00000000)
profiling: C:\Users\me\source\scratch\build\test1.dir\Debug\.gcda: cannot merge previous GCDA file: corrupt arc tag (0x00000000)
profiling: C:\Users\me\source\scratch\build\test1.dir\Debug\.gcda: cannot merge previous GCDA file: corrupt arc tag (0x00000000)
profiling: C:\Users\me\source\scratch\build\test1.dir\Debug\.gcda: cannot merge previous GCDA file: corrupt arc tag (0x00000000)
profiling: C:\Users\me\source\scratch\build\test1.dir\Debug\.gcda: cannot merge previous run count: corrupt object tag (0x00000000)
I note the following coverage files are generated:
PS C:\Users\me\source\scratch\build> dir C:\Users\me\source\scratch\build\test1.dir\Debug
Directory: C:\Users\me\source\scratch\build\test1.dir\Debug
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 10/4/2022 9:23 AM test1.tlog
-a---- 10/4/2022 9:24 AM 76 .gcda << there should be a test1.gcda and a main.gcda
-a---- 10/3/2022 4:00 PM 3268 .gcno << there should be a test1.gcno and a main.gcno
-a---- 10/3/2022 4:00 PM 7224 main.obj
-a---- 10/4/2022 9:23 AM 428 test1.exe.recipe
-a---- 10/3/2022 4:00 PM 34668 test1.obj
CMakeLists.txt
cmake_minimum_required (VERSION 3.20)
project (test1)
set (CMAKE_CXX_STANDARD 14)
option(COVERAGE "Generate Coverage Data" OFF)
add_executable(test1 main.cpp test1.cpp)
if(COVERAGE)
set(MY_DEBUG_OPTIONS "--coverage")
target_compile_options(test1 PUBLIC "${MY_DEBUG_OPTIONS}")
target_link_libraries(test1 "clang_rt.profile-x86_64.lib")
endif(COVERAGE)
test1.h
#pragma once
bool iffy(int i);
test1.cpp
#include <iostream>
#include "test1.h"
bool iffy(int i)
{
auto ret = true;
if( i > 100 ) {
std::cout << "it is larger" << std::endl;
}
else {
std::cout << "it is smaller" << std::endl;
ret = false;
}
return ret;
}
main.cpp
#include "test1.h"
int main()
{
iffy(1);
return 0;
}
Possibly related to:
Edited by gatkinso