• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright (c) 2021-2024 Huawei Device Co., Ltd.
2# Licensed under the Apache License, Version 2.0 (the "License");
3# you may not use this file except in compliance with the License.
4# You may obtain a copy of the License at
5#
6# http://www.apache.org/licenses/LICENSE-2.0
7#
8# Unless required by applicable law or agreed to in writing, software
9# distributed under the License is distributed on an "AS IS" BASIS,
10# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11# See the License for the specific language governing permissions and
12# limitations under the License.
13
14find_program(
15    LCOV
16    NAMES "lcov"
17    DOC "Path to lcov executable")
18if(NOT LCOV)
19    message(SEND_ERROR "lcov not found, please install")
20endif()
21
22find_program(
23    GENHTML
24    NAMES "genhtml"
25    DOC "Path to genhtml executable")
26if(NOT GENHTML)
27    message(SEND_ERROR "genhtml not found, please install")
28endif()
29
30if(ENABLE_UNIT_TESTS_FULL_COVERAGE
31    OR ENABLE_BYTECODE_OPTIMIZER_COVERAGE
32    OR ENABLE_COMPILER_COVERAGE
33    OR ENABLE_LIBPANDABASE_COVERAGE
34    OR ENABLE_ES2PANDA_COVERAGE
35    AND NOT IS_USED_COMMON_COVERAGE_TOOLCHAIN)
36
37    set(USE_GCOV_TOOLS true)
38    set(COVERAGE_FLAGS "-fprofile-arcs -ftest-coverage")
39    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COVERAGE_FLAGS}")
40endif()
41
42set(LCOV_FLAGS --quiet --rc lcov_branch_coverage=1)
43set(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
44
45if(ENABLE_UNIT_TESTS_FULL_COVERAGE)
46    set(ENABLE_BYTECODE_OPTIMIZER_COVERAGE true)
47    set(ENABLE_COMPILER_COVERAGE true)
48endif()
49
50function(collect_coverage_for_target)
51    set(prefix ARG)
52    set(oneValueArgs TARGET_NAME)
53    set(multiValueArgs INCLUDE_DIR_PATTERN EXCLUDE_DIR_PATTERN)
54    cmake_parse_arguments(${prefix} "${novalue}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
55
56    set(HTML_REPORT_DIRECTORY ${PANDA_BINARY_ROOT}/coverage_reports/${ARG_TARGET_NAME})
57    set(COVERAGE_INTERMEDIATE_REPORT ${HTML_REPORT_DIRECTORY}/${ARG_TARGET_NAME}.info)
58
59    if(ARG_INCLUDE_DIR_PATTERN)
60        message(STATUS "INCLUDE_DIR_PATTERN=${ARG_INCLUDE_DIR_PATTERN}")
61        set(EXTRACT_DATA_FROM_TRACEFILE COMMAND lcov --extract ${COVERAGE_INTERMEDIATE_REPORT} -o ${COVERAGE_INTERMEDIATE_REPORT} ${ARG_INCLUDE_DIR_PATTERN})
62    endif()
63
64    if(ARG_EXCLUDE_DIR_PATTERN)
65        message(STATUS "EXCLUDE_DIR_PATTERN=${ARG_EXCLUDE_DIR_PATTERN}")
66        set(REMOVE_DATA_FROM_TRACEFILE COMMAND lcov --remove ${COVERAGE_INTERMEDIATE_REPORT} -o ${COVERAGE_INTERMEDIATE_REPORT} ${ARG_EXCLUDE_DIR_PATTERN})
67    endif()
68
69    add_custom_command(
70        TARGET ${ARG_TARGET_NAME} POST_BUILD
71        WORKING_DIRECTORY ${PANDA_BINARY_ROOT}
72        COMMAND mkdir -p ${HTML_REPORT_DIRECTORY}
73        COMMAND lcov -c -b ${PANDA_BINARY_ROOT} -d ${DIRECTORY} -o ${COVERAGE_INTERMEDIATE_REPORT} ${LCOV_FLAGS}
74        ${EXTRACT_DATA_FROM_TRACEFILE}
75        ${REMOVE_DATA_FROM_TRACEFILE}
76        COMMAND genhtml -o ${HTML_REPORT_DIRECTORY} ${COVERAGE_INTERMEDIATE_REPORT} --ignore-errors source ${LCOV_FLAGS}
77        COMMAND echo "Coverage report: ${HTML_REPORT_DIRECTORY}/index.html"
78        COMMAND lcov --zerocounters --directory ${PANDA_BINARY_ROOT}
79    )
80endfunction()
81