diff --git a/testing/scripts/checkdeps.py b/testing/scripts/checkdeps.py
index 83abfdf..d6140da 100755
--- a/testing/scripts/checkdeps.py
+++ b/testing/scripts/checkdeps.py
@@ -3,41 +3,18 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-import argparse
-import contextlib
 import json
 import os
-import subprocess
 import sys
-import tempfile
 
 
-SCRIPT_DIR = os.path.abspath(os.path.dirname(__file__))
-SRC_DIR = os.path.abspath(
-    os.path.join(SCRIPT_DIR, os.path.pardir, os.path.pardir))
+import common
 
 
-def run_command(argv):
-  print 'Running %r' % argv
-  rc = subprocess.call(argv)
-  print 'Command %r returned exit code %d' % (argv, rc)
-  return rc
-
-
-@contextlib.contextmanager
-def temporary_file():
-  fd, path = tempfile.mkstemp()
-  os.close(fd)
-  try:
-    yield path
-  finally:
-    os.remove(path)
-
-
-def mode_run(args):
-  with temporary_file() as tempfile_path:
-    rc = run_command([
-        os.path.join(SRC_DIR, 'buildtools', 'checkdeps', 'checkdeps.py'),
+def main_run(args):
+  with common.temporary_file() as tempfile_path:
+    rc = common.run_command([
+        os.path.join(common.SRC_DIR, 'buildtools', 'checkdeps', 'checkdeps.py'),
         '--json', tempfile_path
     ])
 
@@ -49,27 +26,21 @@
     for violation in result['violations']:
       result_set.add((result['dependee_path'], violation['include_path']))
 
-  with open(args.output, 'w') as f:
-    json.dump({
-        'valid': True,
-        'failures': ['%s: %s' % (r[0], r[1]) for r in result_set],
-    }, f)
+  json.dump({
+      'valid': True,
+      'failures': ['%s: %s' % (r[0], r[1]) for r in result_set],
+  }, args.output)
 
   return rc
 
 
-def main(argv):
-  parser = argparse.ArgumentParser()
-
-  subparsers = parser.add_subparsers()
-
-  run_parser = subparsers.add_parser('run')
-  run_parser.add_argument('--output', required=True)
-  run_parser.set_defaults(func=mode_run)
-
-  args = parser.parse_args(argv)
-  return args.func(args)
+def main_compile_targets(args):
+  json.dump([], args.output)
 
 
 if __name__ == '__main__':
-  sys.exit(main(sys.argv[1:]))
+  funcs = {
+    'run': main_run,
+    'compile_targets': main_compile_targets,
+  }
+  sys.exit(common.run_script(sys.argv[1:], funcs))
