Index: build/toolchain/clang_static_analyzer_wrapper.py |
diff --git a/build/toolchain/clang_static_analyzer_wrapper.py b/build/toolchain/clang_static_analyzer_wrapper.py |
new file mode 100755 |
index 0000000000000000000000000000000000000000..cc13888f3c28ccda32266a3f7ca9e5996602cd5e |
--- /dev/null |
+++ b/build/toolchain/clang_static_analyzer_wrapper.py |
@@ -0,0 +1,61 @@ |
+#!/usr/bin/env python |
+# Copyright 2016 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+"""Invokes the Clang static analysis command using arguments provided on the |
+command line. |
+""" |
+ |
+import argparse |
+import fnmatch |
+import os |
+import shutil |
+import sys |
+import tempfile |
+ |
+import wrapper_utils |
+ |
+ |
+def main(): |
+ parser = argparse.ArgumentParser(description=__doc__) |
+ parser.add_argument('--clang-cc-path', |
+ help='Path to the clang compiler.', |
+ metavar='PATH') |
+ parser.add_argument('--clang-cxx-path', |
+ help='Path to the clang++ compiler', |
+ metavar='PATH') |
+ parser.add_argument('--analyzer', |
+ help='Path to the language-specific Clang analysis tool.', |
+ required=True, |
+ metavar='PATH') |
+ args, compile_args = parser.parse_known_args() |
+ |
+ # Check that only one of --clang-cc-path or --clang-cxx-path are set. |
+ assert ((args.clang_cc_path != None) != (args.clang_cxx_path != None)) |
+ |
+ is_cxx = args.clang_cxx_path != None |
+ env = os.environ |
+ env['CCC_ANALYZER_FORCE_ANALYZE_DEBUG_CODE'] = '0' |
+ env['CCC_ANALYZER_OUTPUT_FORMAT'] = 'text' |
+ clang_path = args.clang_cxx_path or args.clang_cc_path |
+ if is_cxx: |
+ env['CCC_CXX'] = clang_path |
+ env['CLANG_CXX'] = clang_path |
+ else: |
+ env['CCC_CC'] = clang_path |
+ env['CLANG'] = clang_path |
+ |
+ # TODO(kmarshall): Place the summarized output in a useful directory. |
+ temp_dir = tempfile.mkdtemp() |
+ try: |
+ env['CCC_ANALYZER_HTML'] = temp_dir |
+ returncode, stderr = wrapper_utils.CaptureCommandStderr( |
+ wrapper_utils.CommandToRun([args.analyzer] + compile_args), env) |
+ sys.stderr.write(stderr) |
+ return returncode |
+ finally: |
+ shutil.rmtree(temp_dir) |
+ |
+if __name__ == "__main__": |
+ sys.exit(main()) |