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