blob: efdba3bef4ff13981ba32246480eb2cc64602e05 [file] [log] [blame]
Imre Kise6bf9e62020-01-20 11:34:24 +01001#
2# Copyright (c) 2020, Arm Limited. All rights reserved.
3#
4# SPDX-License-Identifier: BSD-3-Clause
5#
6
7include_guard(DIRECTORY)
8
9# Checking GCC
10if (NOT CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
11 message(FATAL_ERROR "Coverage measurement is only supported when using GCC")
12endif()
13
14# Checking lcov
15find_program(LCOV_COMMAND "lcov")
16if (NOT LCOV_COMMAND)
17 message(FATAL_ERROR "Please install lcov")
18endif()
19
20# Checking c-picker-coverage-mapper
21find_program(CPICKER_COVERAGE_MAPPER_COMMAND "c-picker-coverage-mapper")
22if (NOT CPICKER_COVERAGE_MAPPER_COMMAND)
23 message(FATAL_ERROR "Please install c-picker-coverage-mapper using pip (part of c-picker)")
24endif()
25
26# Checking genhtml
27find_program(GENHTML_COMMAND "genhtml")
28if (NOT GENHTML_COMMAND)
29 message(FATAL_ERROR "Please install genhtml with genhtml (part of lcov)")
30endif()
31
32# Including this file enables code coverage measurement by adding the necessary compiler and
33# linker flags.
34set(CMAKE_C_FLAGS "-g -O0 -fprofile-arcs -ftest-coverage")
35set(CMAKE_CXX_FLAGS "-g -O0 -fprofile-arcs -ftest-coverage -fno-exceptions")
36set(CMAKE_EXE_LINKER_FLAGS "-fprofile-arcs -ftest-coverage")
37
38# Adding custom targets
39add_custom_target(coverage)
40add_custom_target(coverage_report)
41
42# Generates LCOV coverage info file by processing the .gcda and .gcno files.
43# The function also maps coverage of the c-picker generated files to the original source lines
44# Global dependencies:
45# CPICKER_CACHE_PATH: root directory of the c-picker generated files
46function(coverage_generate)
47 set(_OPTIONS_ARGS)
48 set(_ONE_VALUE_ARGS NAME OUTPUT_FILE)
49 set(_MULTI_VALUE_ARGS)
50 cmake_parse_arguments(_MY_PARAMS "${_OPTIONS_ARGS}" "${_ONE_VALUE_ARGS}" "${_MULTI_VALUE_ARGS}" ${ARGN})
51
52 set(TEST_NAME ${_MY_PARAMS_NAME})
53 set(TEMP_FILE temp_${_MY_PARAMS_OUTPUT_FILE})
54 set(OUTPUT_FILE ${_MY_PARAMS_OUTPUT_FILE})
55
Imre Kise6bf9e62020-01-20 11:34:24 +010056 # Collecting information from .gcda and .gcno files into an lcov .info file
57 # Mapping c-picker generated files' coverage info to the original source lines
58 add_custom_command(
59 OUTPUT ${TEMP_FILE} ${OUTPUT_FILE}
60 COMMAND ${LCOV_COMMAND}
61 --capture
62 --test-name ${TEST_NAME}
63 --directory ${CMAKE_CURRENT_BINARY_DIR}
64 --base-directory ${TF_A_PATH}
65 --output-file ${TEMP_FILE}
66 COMMAND ${CPICKER_COVERAGE_MAPPER_COMMAND}
67 --input ${TEMP_FILE}
68 --output ${OUTPUT_FILE}
69 --mapping-path ${CPICKER_CACHE_PATH}
Imre Kise6bf9e62020-01-20 11:34:24 +010070 )
71endfunction()
72
73# Filters coverage info of files from the matching directory
74function(coverage_filter)
75 set(_OPTIONS_ARGS)
76 set(_ONE_VALUE_ARGS INPUT_FILE OUTPUT_FILE INCLUDE_DIRECTORY)
77 set(_MULTI_VALUE_ARGS)
78 cmake_parse_arguments(_MY_PARAMS "${_OPTIONS_ARGS}" "${_ONE_VALUE_ARGS}" "${_MULTI_VALUE_ARGS}" ${ARGN})
79
80 # The pattern must be an absolute path ending with an asterisk
81 get_filename_component(INCLUDE_DIRECTORY_ABSPATH "${_MY_PARAMS_INCLUDE_DIRECTORY}" ABSOLUTE)
82 set(INCLUDE_DIRECTORY_ABSPATH "${INCLUDE_DIRECTORY_ABSPATH}/*")
83
84 add_custom_command(
85 OUTPUT ${_MY_PARAMS_OUTPUT_FILE}
86 COMMAND ${LCOV_COMMAND}
87 --extract ${_MY_PARAMS_INPUT_FILE} \"${INCLUDE_DIRECTORY_ABSPATH}\"
88 --output-file ${_MY_PARAMS_OUTPUT_FILE}
89 DEPENDS ${_MY_PARAMS_INPUT_FILE}
90 )
91
92 add_custom_target(coverage_target_${_MY_PARAMS_OUTPUT_FILE} DEPENDS ${_MY_PARAMS_OUTPUT_FILE})
93 add_dependencies(coverage coverage_target_${_MY_PARAMS_OUTPUT_FILE})
94endfunction()
95
96# Generated an HTML report from the LCOV info file
97function(coverage_generate_report)
98 set(_OPTIONS_ARGS)
99 set(_ONE_VALUE_ARGS INPUT_FILE OUTPUT_DIRECTORY)
100 set(_MULTI_VALUE_ARGS)
101 cmake_parse_arguments(_MY_PARAMS "${_OPTIONS_ARGS}" "${_ONE_VALUE_ARGS}" "${_MULTI_VALUE_ARGS}" ${ARGN})
102
103 add_custom_command(
104 OUTPUT ${_MY_PARAMS_OUTPUT_DIRECTORY}
105 COMMAND genhtml ${_MY_PARAMS_INPUT_FILE}
106 --show-details
107 --output-directory ${_MY_PARAMS_OUTPUT_DIRECTORY}
108 DEPENDS ${_MY_PARAMS_INPUT_FILE}
109 )
110
111 add_custom_target(coverage_report_target_${_MY_PARAMS_INPUT_FILE} DEPENDS ${_MY_PARAMS_OUTPUT_DIRECTORY})
112 add_dependencies(coverage_report coverage_report_target_${_MY_PARAMS_INPUT_FILE})
113endfunction()