]> granicus.if.org Git - clang/commitdiff
[utils] Improvements to check_cfc.py to work better with some build systems.
authorRussell Gallop <russell.gallop@gmail.com>
Wed, 3 Jun 2015 15:09:13 +0000 (15:09 +0000)
committerRussell Gallop <russell.gallop@gmail.com>
Wed, 3 Jun 2015 15:09:13 +0000 (15:09 +0000)
Recognise options to output dependency files and don't perform checks.
Report input file name when reporting a check failure so it is more obvious in large build logs.

Differential Revision: http://reviews.llvm.org/D10183

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@238928 91177308-0d34-0410-b5e6-96231b3b80d8

utils/check_cfc/check_cfc.py
utils/check_cfc/test_check_cfc.py

index df586e9eab44314c3adebbdf05630263fae9b128..c6ab9abf235289671fd6bf0897135562d544e7fc 100755 (executable)
@@ -213,16 +213,18 @@ def set_input_file(args, input_file):
 
 def is_normal_compile(args):
     """Check if this is a normal compile which will output an object file rather
-    than a preprocess or link."""
+    than a preprocess or link. args is a list of command line arguments."""
     compile_step = '-c' in args
     # Bitcode cannot be disassembled in the same way
     bitcode = '-flto' in args or '-emit-llvm' in args
     # Version and help are queries of the compiler and override -c if specified
     query = '--version' in args or '--help' in args
+    # Options to output dependency files for make
+    dependency = '-M' in args or '-MM' in args
     # Check if the input is recognised as a source file (this may be too
     # strong a restriction)
     input_is_valid = bool(get_input_file(args))
-    return compile_step and not bitcode and not query and input_is_valid
+    return compile_step and not bitcode and not query and not dependency and input_is_valid
 
 def run_step(command, my_env, error_on_failure):
     """Runs a step of the compilation. Reports failure as exception."""
@@ -379,7 +381,7 @@ if __name__ == '__main__':
                 checker.perform_check(arguments_a, my_env)
             except WrapperCheckException as e:
                 # Check failure
-                print(e.msg, file=sys.stderr)
+                print("{} {}".format(get_input_file(arguments_a), e.msg), file=sys.stderr)
 
                 # Remove file to comply with build system expectations (no
                 # output file if failed)
index 0eee5b83842b31d0ba6cd7d13ae47cbf6e7de28c..e304ff59277d0f44474de85d1d18b12001c183d4 100755 (executable)
@@ -103,6 +103,16 @@ class TestCheckCFC(unittest.TestCase):
             check_cfc.is_normal_compile(['clang', '-c', 'test.cpp', '--version']))
         self.assertFalse(
             check_cfc.is_normal_compile(['clang', '-c', 'test.cpp', '--help']))
+        # Outputting dependency files is not a normal compile
+        self.assertFalse(
+            check_cfc.is_normal_compile(['clang', '-c', '-M', 'test.cpp']))
+        self.assertFalse(
+            check_cfc.is_normal_compile(['clang', '-c', '-MM', 'test.cpp']))
+        # Creating a dependency file as a side effect still outputs an object file
+        self.assertTrue(
+            check_cfc.is_normal_compile(['clang', '-c', '-MD', 'test.cpp']))
+        self.assertTrue(
+            check_cfc.is_normal_compile(['clang', '-c', '-MMD', 'test.cpp']))
 
     def test_replace_output_file(self):
         self.assertEqual(check_cfc.replace_output_file(