| #!/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() |