#!/usr/bin/python3 # Copyright lowRISC contributors. # Licensed under the Apache License, Version 2.0, see LICENSE for details. # SPDX-License-Identifier: Apache-2.0 from distutils.version import StrictVersion import logging as log import os import subprocess import sys # Display INFO log messages and up. log.basicConfig(level=log.INFO, format="%(levelname)s: %(message)s") # Populate __TOOL_REQUIREMENTS__ topsrcdir = os.path.join(os.path.dirname(__file__), '..') exec(open(os.path.join(topsrcdir, 'tool_requirements.py')).read()) def get_verilator_version(): try: # Note: "verilator" needs to be called through a shell and with all # arguments in a string, as it doesn't have a shebang, but instead # relies on perl magic to parse command line arguments. version_str = subprocess.run('verilator --version', shell=True, check=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True) return version_str.stdout.split(' ')[1].strip() except subprocess.CalledProcessError as e: log.error("Unable to call Verilator to check version: " + str(e)) log.error(e.stdout) return None def check_version(tool_name, required_version, actual_version): if required_version is None or actual_version is None: return False if StrictVersion(actual_version) < StrictVersion(required_version): log.error("%s is too old: found version %s, need at least %s", tool_name, actual_version, required_version) return False else: log.info("Found sufficiently recent version of %s (found %s, need %s)", tool_name, actual_version, required_version) return True def main(): any_failed = False if not check_version('verilator', __TOOL_REQUIREMENTS__['verilator'], get_verilator_version()): any_failed = True if any_failed: log.error("Tool requirements not fulfilled. " "Please update the tools and retry.") return 1 return 0 if __name__ == "__main__": sys.exit(main())