#!/usr/bin/env python3 # # Copyright (c) 2018 Intel Corporation # # SPDX-License-Identifier: Apache-2.0 # This script will parse the serial console log file and create the required # gcda files. # Usage python3 ${ZEPHYR_BASE}/scripts/gen_gcov_files.py -i console_output.log # Add -v for verbose import argparse import os import re def retrieve_data(input_file): extracted_coverage_info = {} capture_data = False reached_end = False with open(input_file, 'r') as fp: for line in fp.readlines(): if re.search("GCOV_COVERAGE_DUMP_START", line): capture_data = True continue if re.search("GCOV_COVERAGE_DUMP_END", line): reached_end = True break # Loop until the coverage data is found. if not capture_data: continue # Remove the leading delimiter "*" file_name = line.split("<")[0][1:] # Remove the trailing new line char hex_dump = line.split("<")[1][:-1] extracted_coverage_info.update({file_name:hex_dump}) if not reached_end: print("incomplete data captured from %s" %input_file) return extracted_coverage_info def create_gcda_files(extracted_coverage_info): if args.verbose: print("Generating gcda files") for filename, hexdump_val in extracted_coverage_info.items(): if args.verbose: print(filename) # if kobject_hash is given for coverage gcovr fails # hence skipping it problem only in gcovr v4.1 if "kobject_hash" in filename: filename = filename[:-4] + "gcno" try: os.remove(filename) except Exception: pass continue with open(filename, 'wb') as fp: fp.write(bytes.fromhex(hexdump_val)) def parse_args(): global args parser = argparse.ArgumentParser( description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) parser.add_argument("-i", "--input", required=True, help="Input dump data") parser.add_argument("-v", "--verbose", action="count", default=0, help="Verbose Output") args = parser.parse_args() def main(): parse_args() input_file = args.input extracted_coverage_info = retrieve_data(input_file) create_gcda_files(extracted_coverage_info) if __name__ == '__main__': main()