| #!/usr/bin/env python3 |
| # Copyright lowRISC contributors. |
| # Licensed under the Apache License, Version 2.0, see LICENSE for details. |
| # SPDX-License-Identifier: Apache-2.0 |
| r"""Parses lint report and dump filtered messages in hjson format. |
| """ |
| import argparse |
| import logging as log |
| import sys |
| |
| from pathlib import Path |
| from LintParser import LintParser |
| |
| |
| # TODO(#9079): this script will be removed long term once the |
| # parser has been merged with the Dvsim core code. |
| def main(): |
| parser = argparse.ArgumentParser( |
| description="""This script parses AscentLint log and report files from |
| a lint run, filters the messages and creates an aggregated result |
| .hjson file with lint messages and their severities. |
| |
| The script returns nonzero status if any warnings or errors are |
| present. |
| """) |
| parser.add_argument('--repdir', |
| type=lambda p: Path(p).resolve(), |
| default="./", |
| help="""The script searches the 'ascentlint.log' and |
| 'ascentlint.rpt' files in this directory. |
| Defaults to './'""") |
| |
| parser.add_argument('--outfile', |
| type=lambda p: Path(p).resolve(), |
| default="./results.hjson", |
| help="""Path to the results Hjson file. |
| Defaults to './results.hjson'""") |
| |
| args = parser.parse_args() |
| |
| # Define warning/error patterns for each logfile |
| parser_args = {} |
| |
| # Patterns for lint.log |
| parser_args.update({ |
| args.repdir.joinpath('ascentlint.log'): [ |
| # If lint warnings have been found, the lint tool will exit |
| # with a nonzero status code and fusesoc will always spit out |
| # an error like |
| # |
| # ERROR: Failed to build ip:core:name:0.1 : 'make' exited with an error code |
| # |
| # If we found any other warnings or errors, there's no point in |
| # listing this too. BUT we want to make sure we *do* see this |
| # error if there are no other errors or warnings, since that |
| # shows something has come unstuck. (Probably the lint tool |
| # spat out a warning that we don't understand) |
| ("fusesoc-error", |
| r"^ERROR: Failed to build .* : 'make' exited with an error code") |
| ] |
| }) |
| |
| # Patterns for ascentlint.log |
| parser_args.update({ |
| args.repdir.joinpath('lint-ascentlint/ascentlint.log'): [ |
| ("flow_error", r"^FlexNet Licensing error.*"), |
| ("flow_error", r"^Error: .*"), |
| ("flow_error", r"^ERROR.*"), |
| ("flow_error", r"^ ERR .*"), |
| ("flow_warning", r"^Warning: .*"), |
| # TODO: struct assignment labels within concatenation |
| # not supported. check with newer ascentlint version. |
| ("flow_warning", r"^ (?!WARN \[#39024\])WARN .*") |
| ] |
| }) |
| |
| # Patterns for ascentlint.rpt |
| parser_args.update({ |
| args.repdir.joinpath('lint-ascentlint/ascentlint.rpt'): [ |
| ("lint_error", r"^E .*"), |
| ("lint_warning", r"^W .*"), |
| ("lint_info", r"^I .*") |
| ] |
| }) |
| |
| # Parse logs |
| parser = LintParser() |
| num_messages = parser.get_results(parser_args) |
| |
| # Write out results file |
| parser.write_results_as_hjson(args.outfile) |
| |
| # return nonzero status if any warnings or errors are present |
| # lint infos do not count as failures |
| if num_messages['error'] > 0 or num_messages['warning'] > 0: |
| log.info("Found %d lint errors and %d lint warnings", |
| num_messages['error'], |
| num_messages['warning']) |
| sys.exit(1) |
| |
| log.info("Lint logfile parsed succesfully") |
| sys.exit(0) |
| |
| |
| if __name__ == "__main__": |
| main() |