diff --git a/script/static-checks/utils.py b/script/static-checks/utils.py
new file mode 100644
index 0000000..c6a7fdd
--- /dev/null
+++ b/script/static-checks/utils.py
@@ -0,0 +1,86 @@
+#!/usr/bin/env python3
+#
+# Copyright (c) 2019, Arm Limited. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+
+import os
+import subprocess
+import sys
+import textwrap
+
+
+def dir_is_ignored(relative_path, ignored_folders):
+    '''Checks if a directory is on the ignore list or inside one of the ignored
+    directories. relative_path mustn't end in "/".'''
+
+    # Check if directory is in ignore list
+    if relative_path in ignored_folders:
+        return True
+
+    # Check if directory is a subdirectory of one in ignore list
+    return (relative_path + '/').startswith(ignored_folders)
+
+
+def file_is_ignored(relative_path, valid_file_extensions, ignored_files, ignored_folders):
+    '''Checks if a file is ignored based on its folder, name and extension.'''
+    if not relative_path.endswith(valid_file_extensions):
+        return True
+
+    if relative_path in ignored_files:
+        return True
+
+    return dir_is_ignored(os.path.dirname(relative_path), ignored_folders)
+
+
+def print_exception_info():
+    '''Print some information about the cause of an exception.'''
+    print("ERROR: Exception:")
+    print(textwrap.indent(str(sys.exc_info()[0]),"      "))
+    print(textwrap.indent(str(sys.exc_info()[1]),"      "))
+
+
+def decode_string(string):
+    '''Tries to decode a binary string into ASCII. It gives an error if it
+    finds non-ASCII characters, but it will return the string converted
+    anyway, ignoring these characters.'''
+    try:
+        string = string.decode("ascii")
+    except UnicodeDecodeError:
+        # Capture exceptions caused by non-ASCII characters.
+        print("ERROR:Non-ASCII characters detected.")
+        print_exception_info()
+        string = string.decode("ascii", "ignore")
+
+    return string
+
+
+def shell_command(cmd_line):
+    '''Executes a shell command. Returns (returncode, stdout, stderr), where
+    stdout and stderr are ASCII-encoded strings.'''
+
+    try:
+        p = subprocess.Popen(cmd_line, stdout=subprocess.PIPE,
+                         stderr=subprocess.PIPE)
+        (stdout, stderr) = p.communicate()
+        # No need for p.wait(), p.communicate() does it by default.
+    except:
+        print("ERROR: Shell command: ", end="")
+        print(cmd_line)
+        print_exception_info()
+        return (1, None, None)
+
+    stdout = decode_string(stdout)
+    stderr = decode_string(stderr)
+
+    if p.returncode != 0:
+        print("ERROR: Shell command failed:")
+        print(textwrap.indent(str(cmd_line),"      "))
+        print("ERROR: stdout:")
+        print(textwrap.indent(stdout,"      "))
+        print("ERROR: stderr:")
+        print(textwrap.indent(stderr,"      "))
+
+    return (p.returncode, stdout, stderr)
+
