| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 1 | #! /usr/bin/env python | 
|  | 2 | # -*- coding: utf-8 -*- | 
|  | 3 |  | 
| Rohit Vaswani | 116bcf0 | 2012-02-02 16:01:39 -0800 | [diff] [blame] | 4 | # Copyright (c) 2011-2012, Code Aurora Forum. All rights reserved. | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 5 | # | 
|  | 6 | # Redistribution and use in source and binary forms, with or without | 
|  | 7 | # modification, are permitted provided that the following conditions are met: | 
|  | 8 | #     * Redistributions of source code must retain the above copyright | 
|  | 9 | #       notice, this list of conditions and the following disclaimer. | 
|  | 10 | #     * Redistributions in binary form must reproduce the above copyright | 
|  | 11 | #       notice, this list of conditions and the following disclaimer in the | 
|  | 12 | #       documentation and/or other materials provided with the distribution. | 
|  | 13 | #     * Neither the name of Code Aurora nor | 
|  | 14 | #       the names of its contributors may be used to endorse or promote | 
|  | 15 | #       products derived from this software without specific prior written | 
|  | 16 | #       permission. | 
|  | 17 | # | 
|  | 18 | # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | 
|  | 19 | # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | 
|  | 20 | # IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | 
|  | 21 | # NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR | 
|  | 22 | # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | 
|  | 23 | # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | 
|  | 24 | # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; | 
|  | 25 | # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, | 
|  | 26 | # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR | 
|  | 27 | # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF | 
|  | 28 | # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
|  | 29 |  | 
|  | 30 | # Invoke gcc, looking for warnings, and causing a failure if there are | 
|  | 31 | # non-whitelisted warnings. | 
|  | 32 |  | 
|  | 33 | import errno | 
|  | 34 | import re | 
|  | 35 | import os | 
|  | 36 | import sys | 
|  | 37 | import subprocess | 
|  | 38 |  | 
|  | 39 | # Note that gcc uses unicode, which may depend on the locale.  TODO: | 
|  | 40 | # force LANG to be set to en_US.UTF-8 to get consistent warnings. | 
|  | 41 |  | 
|  | 42 | allowed_warnings = set([ | 
| Sridhar Parasuram | 32cd2e9 | 2012-06-11 10:22:19 -0700 | [diff] [blame] | 43 | "alignment.c:327", | 
| Steve Muckle | f132c6c | 2012-06-06 18:30:57 -0700 | [diff] [blame] | 44 | "mmu.c:602", | 
| Sridhar Parasuram | 32cd2e9 | 2012-06-11 10:22:19 -0700 | [diff] [blame] | 45 | "return_address.c:62", | 
| Bryan Huntsman | 3f2bc4d | 2011-08-16 17:27:22 -0700 | [diff] [blame] | 46 | ]) | 
|  | 47 |  | 
|  | 48 | # Capture the name of the object file, can find it. | 
|  | 49 | ofile = None | 
|  | 50 |  | 
|  | 51 | warning_re = re.compile(r'''(.*/|)([^/]+\.[a-z]+:\d+):(\d+:)? warning:''') | 
|  | 52 | def interpret_warning(line): | 
|  | 53 | """Decode the message from gcc.  The messages we care about have a filename, and a warning""" | 
|  | 54 | line = line.rstrip('\n') | 
|  | 55 | m = warning_re.match(line) | 
|  | 56 | if m and m.group(2) not in allowed_warnings: | 
|  | 57 | print "error, forbidden warning:", m.group(2) | 
|  | 58 |  | 
|  | 59 | # If there is a warning, remove any object if it exists. | 
|  | 60 | if ofile: | 
|  | 61 | try: | 
|  | 62 | os.remove(ofile) | 
|  | 63 | except OSError: | 
|  | 64 | pass | 
|  | 65 | sys.exit(1) | 
|  | 66 |  | 
|  | 67 | def run_gcc(): | 
|  | 68 | args = sys.argv[1:] | 
|  | 69 | # Look for -o | 
|  | 70 | try: | 
|  | 71 | i = args.index('-o') | 
|  | 72 | global ofile | 
|  | 73 | ofile = args[i+1] | 
|  | 74 | except (ValueError, IndexError): | 
|  | 75 | pass | 
|  | 76 |  | 
|  | 77 | compiler = sys.argv[0] | 
|  | 78 |  | 
|  | 79 | try: | 
|  | 80 | proc = subprocess.Popen(args, stderr=subprocess.PIPE) | 
|  | 81 | for line in proc.stderr: | 
|  | 82 | print line, | 
|  | 83 | interpret_warning(line) | 
|  | 84 |  | 
|  | 85 | result = proc.wait() | 
|  | 86 | except OSError as e: | 
|  | 87 | result = e.errno | 
|  | 88 | if result == errno.ENOENT: | 
|  | 89 | print args[0] + ':',e.strerror | 
|  | 90 | print 'Is your PATH set correctly?' | 
|  | 91 | else: | 
|  | 92 | print ' '.join(args), str(e) | 
|  | 93 |  | 
|  | 94 | return result | 
|  | 95 |  | 
|  | 96 | if __name__ == '__main__': | 
|  | 97 | status = run_gcc() | 
|  | 98 | sys.exit(status) |