#!/usr/bin/env python3
#
# Arm SCP/MCP Software
# Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause
#

"""
    A wrapper around cppcheck which will be called from CMake's context.

    CMake doesn't give any mechanism to execute any programs or
    commands prior or after cppcheck's invocation.

    Usually CMAKE_C_CPPCHECK will contain the path to cppcheck binary
    on the build system, instead CMAKE_C_CPPCHECK will now contain
    path to this script which in turn calls cppcheck but this enables
    to inject any commands prior to and after actual invocation of
    cppcheck.

    One use case would be to mark cppcheck's invocation as below

    [CPPCHECK] ------>
    ....
    ....
    [CPPCHECK] <------

    This script also prints a warning if the version of the cppcheck
    does not match the required version.

"""

import sys
import subprocess
import re

# Holds required version info.
required_tool_version = "1.90"

tool_name = "CPPCHECK"


# Helper function
def print_msg(message, output):
    if output:
        print("[{}]  {}".format(tool_name, message))


if __name__ == '__main__':
    # CMake create a list of argument which include path of the
    # tool(e.g. cppcheck) binary and its arguments.
    tool_path = sys.argv[1]
    tool_args = ' '.join(sys.argv[2:])
    cmd = "{} {}".format(tool_path, tool_args)

    # Check if output of the tool (e.g. cppcheck) is to be displayed
    if re.search("verbose", tool_args):
        verbose = True
    else:
        verbose = False

    # If yes, then remove verbose string from argument list.
    if verbose:
        tool_args.replace("verbose", "")

    # Check version
    r = subprocess.Popen(tool_path + " --version",
                         shell=True,
                         stdout=subprocess.PIPE,
                         stderr=subprocess.PIPE)

    out, err = r.communicate()

    tool_version = out.decode("utf-8", "ignore")

    if out:
        print_msg("------>", output=verbose)
        print_msg("cppcheck {}"
                  " version {} ".format(tool_path, tool_version),
                  output=verbose)

        if not re.search(required_tool_version, tool_version):
            print_msg("Warning: recommended"
                      " {} version is"
                      " but found {}".format(tool_name,
                                             required_tool_version,
                                             tool_version),
                      output=True)
    if err:
        print_msg("Error: failed to find"
                  " binary at {}".format(tool_path),
                  output=True)
        exit(1)

    print_msg(cmd, output=verbose)

    r = subprocess.Popen(cmd,
                         shell=True,
                         stdout=subprocess.PIPE,
                         stderr=subprocess.PIPE)

    out, err = r.communicate()

    if out:
        print_msg("" + out.decode("utf-8", "ignore"), output=verbose)
    if err:
        print_msg("" + err.decode("utf-8", "ignore"), output=True)

    print_msg("<------", output=verbose)

#!/usr/bin/env python3
#
# Arm SCP/MCP Software
# Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause
#

"""
    A wrapper around cppcheck which will be called from CMake's context.

    CMake doesn't give any mechanism to execute any programs or
    commands prior or after cppcheck's invocation.

    Usually CMAKE_C_CPPCHECK will contain the path to cppcheck binary
    on the build system, instead CMAKE_C_CPPCHECK will now contain
    path to this script which in turn calls cppcheck but this enables
    to inject any commands prior to and after actual invocation of
    cppcheck.

    One use case would be to mark cppcheck's invocation as below

    [CPPCHECK] ------>
    ....
    ....
    [CPPCHECK] <------

    This script also prints a warning if the version of the cppcheck
    does not match the required version.

"""

import sys
import subprocess
import re

# Holds required version info.
required_tool_version = "1.90"

tool_name = "CPPCHECK"


# Helper function
def print_msg(message, output):
    if output:
        print("[{}]  {}".format(tool_name, message))


if __name__ == '__main__':
    # CMake create a list of argument which include path of the
    # tool(e.g. cppcheck) binary and its arguments.
    tool_path = sys.argv[1]
    tool_args = ' '.join(sys.argv[2:])
    cmd = "{} {}".format(tool_path, tool_args)

    # Check if output of the tool (e.g. cppcheck) is to be displayed
    if re.search("verbose", tool_args):
        verbose = True
    else:
        verbose = False

    # If yes, then remove verbose string from argument list.
    if verbose:
        tool_args.replace("verbose", "")

    # Check version
    r = subprocess.Popen(tool_path + " --version",
                         shell=True,
                         stdout=subprocess.PIPE,
                         stderr=subprocess.PIPE)

    out, err = r.communicate()

    tool_version = out.decode("utf-8", "ignore")

    if out:
        print_msg("------>", output=verbose)
        print_msg("cppcheck {}"
                  " version {} ".format(tool_path, tool_version),
                  output=verbose)

        if not re.search(required_tool_version, tool_version):
            print_msg("Warning: recommended"
                      " {} version is"
                      " but found {}".format(tool_name,
                                             required_tool_version,
                                             tool_version),
                      output=True)
    if err:
        print_msg("Error: failed to find"
                  " binary at {}".format(tool_path),
                  output=True)
        exit(1)

    print_msg(cmd, output=verbose)

    r = subprocess.Popen(cmd,
                         shell=True,
                         stdout=subprocess.PIPE,
                         stderr=subprocess.PIPE)

    out, err = r.communicate()

    if out:
        print_msg("" + out.decode("utf-8", "ignore"), output=verbose)
    if err:
        print_msg("" + err.decode("utf-8", "ignore"), output=True)

    print_msg("<------", output=verbose)

#!/usr/bin/env python3 # # Arm SCP/MCP Software # Copyright (c) 2021, Arm Limited and Contributors. All rights reserved. # # SPDX-License-Identifier: BSD-3-Clause # A wrapper around cppcheck which will be called from CMake's context.      CMake doesn't give any mechanism to execute any programs or     commands prior or after cppcheck's invocation.      Usually CMAKE_C_CPPCHECK will contain the path to cppcheck binary     on the build system, instead CMAKE_C_CPPCHECK will now contain     path to this script which in turn calls cppcheck but this enables     to inject any commands prior to and after actual invocation of     cppcheck.      One use case would be to mark cppcheck's invocation as below      [CPPCHECK] ------>     ....     ....     [CPPCHECK] <------      This script also prints a warning if the version of the cppcheck     does not match the required version. # Holds required version info. # Helper function # CMake create a list of argument which include path of the # tool(e.g. cppcheck) binary and its arguments. # Check if output of the tool (e.g. cppcheck) is to be displayed # If yes, then remove verbose string from argument list. # Check version