@@ -56,6 +56,7 @@ option(MSCCLPP_USE_ROCM "Use AMD/ROCm." OFF)
5656option (MSCCLPP_USE_IB "Use InfiniBand." ON )
5757option (MSCCLPP_BYPASS_GPU_CHECK "Bypass GPU check." OFF )
5858option (MSCCLPP_NPKIT_FLAGS "Set NPKIT flags" OFF )
59+ option (MSCCLPP_ENABLE_COVERAGE "Enable code coverage" OFF )
5960set (MSCCLPP_GPU_ARCHS "" CACHE STRING "Specify GPU architectures with delimiters (comma, space, or semicolon)." )
6061
6162if (MSCCLPP_BYPASS_GPU_CHECK)
@@ -98,6 +99,69 @@ else()
9899 message (FATAL_ERROR "No compatible GPU found. Set MSCCLPP_USE_CUDA or MSCCLPP_USE_ROCM to ON." )
99100 endif ()
100101endif ()
102+
103+ # Code coverage setup
104+ if (MSCCLPP_ENABLE_COVERAGE)
105+ if (NOT CMAKE_BUILD_TYPE STREQUAL "Debug" )
106+ message (WARNING "Code coverage results with an optimized (non-Debug) build may be misleading" )
107+ endif ()
108+
109+ if (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang" )
110+ message (STATUS "Code coverage enabled" )
111+
112+ # Add coverage flags to all targets
113+ add_compile_options (--coverage -O0 -g )
114+ add_link_options (--coverage )
115+
116+ # Find lcov
117+ find_program (LCOV_PATH lcov )
118+ find_program (GENHTML_PATH genhtml )
119+
120+ if (NOT LCOV_PATH)
121+ message (WARNING "lcov not found. Install lcov to generate coverage reports." )
122+ endif ()
123+
124+ if (NOT GENHTML_PATH)
125+ message (WARNING "genhtml not found. Install lcov to generate HTML coverage reports." )
126+ endif ()
127+
128+ if (LCOV_PATH AND GENHTML_PATH)
129+ # Add coverage target
130+ add_custom_target (coverage
131+ COMMAND ${CMAKE_COMMAND } -E echo "Removing old coverage data..."
132+ COMMAND ${LCOV_PATH} --directory . --zerocounters
133+
134+ COMMAND ${CMAKE_COMMAND } -E echo "Running tests..."
135+ COMMAND ${CMAKE_CTEST_COMMAND } --output-on-failure
136+
137+ COMMAND ${CMAKE_COMMAND } -E echo "Collecting coverage data..."
138+ COMMAND ${LCOV_PATH} --directory . --capture --output-file coverage.info
139+
140+ COMMAND ${CMAKE_COMMAND } -E echo "Filtering coverage data..."
141+ COMMAND ${LCOV_PATH} --remove coverage.info '/usr/*' '*/test/*' '*/build/*' --output-file coverage.info
142+
143+ COMMAND ${CMAKE_COMMAND } -E echo "Generating HTML report..."
144+ COMMAND ${GENHTML_PATH} coverage.info --output-directory coverage_html
145+
146+ COMMAND ${CMAKE_COMMAND } -E echo "Coverage report generated in coverage_html/index.html"
147+
148+ WORKING_DIRECTORY ${CMAKE_BINARY_DIR }
149+ COMMENT "Generating code coverage report"
150+ )
151+
152+ # Add coverage clean target
153+ add_custom_target (coverage-clean
154+ COMMAND ${CMAKE_COMMAND } -E remove_directory coverage_html
155+ COMMAND ${CMAKE_COMMAND } -E remove coverage.info
156+ COMMAND ${LCOV_PATH} --directory . --zerocounters
157+ WORKING_DIRECTORY ${CMAKE_BINARY_DIR }
158+ COMMENT "Cleaning coverage data"
159+ )
160+ endif ()
161+ else ()
162+ message (WARNING "Code coverage is only supported with GCC or Clang compilers" )
163+ endif ()
164+ endif ()
101165if (MSCCLPP_GPU_ARCHS)
102166 string (STRIP "${MSCCLPP_GPU_ARCHS} " MSCCLPP_GPU_ARCHS)
103167 string (REPLACE " " ";" MSCCLPP_GPU_ARCHS "${MSCCLPP_GPU_ARCHS} " )
0 commit comments