[Tarantool-patches] [PATCH 1/2 v2] cmake: add code coverage support
Maxim Kokryashkin
m.kokryashkin at tarantool.org
Wed Aug 2 11:06:48 MSK 2023
Hi, Sergey!
Thanks for the fixes!
LGTM, except for a few comments below.
Side note: I see that coverage job in CI is red. Why is that
happening?
On Tue, Aug 01, 2023 at 09:46:08PM +0300, Sergey Bronnikov via Tarantool-patches wrote:
> From: Sergey Bronnikov <sergeyb at tarantool.org>
>
> The patch adds building code coverage report using gcovr [1] and gcov.
> gcovr is a better version of lcov, see [2]. There were two new CMake
> targets added: LuaJIT-coverage proccess *.gcno and *.gcda files with
Typo: s/process/processes/
> gcov, builds a detailed HTML report and prints a summary, target
> coverage executes LuaJIT-tests and then runs LuaJIT-coverage. Target
> LuaJIT-coverage is useful for building code coverage report for a custom
> set of regression tests.
>
> ```
> $ cmake -S . -B build -DENABLE_COVERAGE=ON
> $ cmake --build build --parallel --target coverage
>
> <snipped>
>
> lines: 84.1% (26056 out of 30997)
> functions: 88.8% (2055 out of 2314)
> branches: 71.5% (14801 out of 20703)
> ```
>
> 1. https://gcovr.com/
> 2. https://gcovr.com/en/stable/faq.html#what-is-the-difference-between-lcov-and-gcovr
> ---
> CMakeLists.txt | 9 ++++++
> cmake/CodeCoverage.cmake | 45 +++++++++++++++++++++++++++
> test/CMakeLists.txt | 7 +++++
> test/tarantool-c-tests/CMakeLists.txt | 6 +++-
> 4 files changed, 66 insertions(+), 1 deletion(-)
> create mode 100644 cmake/CodeCoverage.cmake
>
> diff --git a/CMakeLists.txt b/CMakeLists.txt
> index 6ef24bba..fe6582fa 100644
> --- a/CMakeLists.txt
> +++ b/CMakeLists.txt
> @@ -116,6 +116,15 @@ if(LUAJIT_ENABLE_WARNINGS)
> )
> endif()
>
> +set(LUAJIT_ENABLE_COVERAGE_DEFAULT OFF)
> +option(LUAJIT_ENABLE_COVERAGE
> + "Enable integration with gcovr, a code coverage program"
> + ${LUAJIT_ENABLE_COVERAGE_DEFAULT})
> +if (LUAJIT_ENABLE_COVERAGE)
> + AppendFlags(CMAKE_C_FLAGS --coverage)
> + include(CodeCoverage)
> +endif(LUAJIT_ENABLE_COVERAGE)
> +
> # Auxiliary flags for main targets (libraries, binaries).
> AppendFlags(TARGET_C_FLAGS
> -D_FILE_OFFSET_BITS=64
> diff --git a/cmake/CodeCoverage.cmake b/cmake/CodeCoverage.cmake
> new file mode 100644
> index 00000000..2be7d129
> --- /dev/null
> +++ b/cmake/CodeCoverage.cmake
> @@ -0,0 +1,45 @@
> +find_program(GCOVR gcovr)
> +find_program(GCOV gcov)
> +
> +set(COVERAGE_DIR "${PROJECT_BINARY_DIR}/coverage")
> +set(COVERAGE_HTML_REPORT "${COVERAGE_DIR}/luajit.html")
> +set(COVERAGE_XML_REPORT "${COVERAGE_DIR}/luajit.xml")
> +
> +if(NOT GCOVR OR NOT GCOV)
> + add_custom_target(${PROJECT_NAME}-coverage
> + COMMAND ${CMAKE_COMMAND} -E cmake_echo_color --red "LuaJIT-coverage is a dummy target"
> + )
> + message(WARNING "Either `gcovr' or `gcov` not found, \
> +so ${PROJECT_NAME}-coverage target is dummy")
Nit: Something is wrong with alignment here.
> + return()
> +endif()
> +
> +file(MAKE_DIRECTORY ${COVERAGE_DIR})
> +add_custom_target(${PROJECT_NAME}-coverage)
> +add_custom_command(TARGET ${PROJECT_NAME}-coverage
> + COMMENT "Building coverage report"
> + COMMAND
> + ${GCOVR}
> + # See https://gcovr.com/en/stable/guide/configuration.html
> + --root ${PROJECT_SOURCE_DIR}
> + --object-directory ${PROJECT_BINARY_DIR}
> + --filter ${PROJECT_SOURCE_DIR}/src
> + # Exclude DynASM files, that contain a low-level VM code for CPUs.
> + --exclude ".*\.dasc"
> + # Exclude buildvm source code, it's the project's infrastructure.
> + --exclude ".*/host/"
> + --print-summary
> + --output ${COVERAGE_HTML_REPORT}
> + --cobertura ${COVERAGE_XML_REPORT}
> + --html
> + --html-title "Tarantool LuaJIT Code Coverage Report"
> + --html-details
> + --sort-percentage
> + --branches
> + --decisions
> + -j ${CMAKE_BUILD_PARALLEL_LEVEL}
> + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
> +)
> +
> +message(STATUS "Code coverage HTML report: ${COVERAGE_HTML_REPORT}")
> +message(STATUS "Code coverage XML report: ${COVERAGE_XML_REPORT}")
> diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
> index 47296a22..e23d6d45 100644
> --- a/test/CMakeLists.txt
> +++ b/test/CMakeLists.txt
> @@ -76,4 +76,11 @@ if(LUAJIT_USE_TEST)
> ${PROJECT_NAME}-test
> ${PROJECT_NAME}-luacheck
> )
> +
> + if (LUAJIT_ENABLE_COVERAGE)
> + add_custom_target(coverage DEPENDS
> + ${PROJECT_NAME}-test
> + ${PROJECT_NAME}-coverage
> + )
> + endif (LUAJIT_ENABLE_COVERAGE)
> endif()
> diff --git a/test/tarantool-c-tests/CMakeLists.txt b/test/tarantool-c-tests/CMakeLists.txt
> index 17255345..d74e99fc 100644
> --- a/test/tarantool-c-tests/CMakeLists.txt
> +++ b/test/tarantool-c-tests/CMakeLists.txt
> @@ -45,7 +45,11 @@ foreach(test_source ${tests})
> OUTPUT_NAME "${exe}${C_TEST_SUFFIX}"
> RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
> )
> - target_link_libraries(${exe} libtest ${LUAJIT_LIBRARY})
> + set(libtest-libs libtest ${LUAJIT_LIBRARY})
> + if (LUAJIT_ENABLE_COVERAGE)
> + set(libtest-libs ${libtest-libs} --coverage)
> + endif (LUAJIT_ENABLE_COVERAGE)
> + target_link_libraries(${exe} ${libtest-libs})
> LIST(APPEND TESTS_COMPILED ${exe})
> endforeach()
>
> --
> 2.34.1
>
More information about the Tarantool-patches
mailing list