|  | #! /usr/bin/env python | 
|  | # -*- coding: utf-8 -*- | 
|  |  | 
|  | # Copyright (c) 2011, Code Aurora Forum. All rights reserved. | 
|  | # | 
|  | # Redistribution and use in source and binary forms, with or without | 
|  | # modification, are permitted provided that the following conditions are met: | 
|  | #     * Redistributions of source code must retain the above copyright | 
|  | #       notice, this list of conditions and the following disclaimer. | 
|  | #     * Redistributions in binary form must reproduce the above copyright | 
|  | #       notice, this list of conditions and the following disclaimer in the | 
|  | #       documentation and/or other materials provided with the distribution. | 
|  | #     * Neither the name of Code Aurora nor | 
|  | #       the names of its contributors may be used to endorse or promote | 
|  | #       products derived from this software without specific prior written | 
|  | #       permission. | 
|  | # | 
|  | # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | 
|  | # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | 
|  | # IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | 
|  | # NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR | 
|  | # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | 
|  | # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | 
|  | # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; | 
|  | # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, | 
|  | # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR | 
|  | # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF | 
|  | # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
|  |  | 
|  | # Invoke gcc, looking for warnings, and causing a failure if there are | 
|  | # non-whitelisted warnings. | 
|  |  | 
|  | import errno | 
|  | import re | 
|  | import os | 
|  | import sys | 
|  | import subprocess | 
|  |  | 
|  | # Note that gcc uses unicode, which may depend on the locale.  TODO: | 
|  | # force LANG to be set to en_US.UTF-8 to get consistent warnings. | 
|  |  | 
|  | allowed_warnings = set([ | 
|  | "alignment.c:720", | 
|  | "async.c:122", | 
|  | "async.c:270", | 
|  | "dir.c:43", | 
|  | "dm.c:1053", | 
|  | "dm.c:1080", | 
|  | "dm-table.c:1120", | 
|  | "dm-table.c:1126", | 
|  | "drm_edid.c:1303", | 
|  | "eventpoll.c:1143", | 
|  | "f_mass_storage.c:3368", | 
|  | "inode.c:72", | 
|  | "inode.c:73", | 
|  | "inode.c:74", | 
|  | "msm_sdcc.c:126", | 
|  | "msm_sdcc.c:128", | 
|  | "nf_conntrack_netlink.c:790", | 
|  | "nf_nat_standalone.c:118", | 
|  | "return_address.c:62", | 
|  | "soc-core.c:1719", | 
|  | "xt_log.h:50", | 
|  | "vx6953.c:3124", | 
|  | ]) | 
|  |  | 
|  | # Capture the name of the object file, can find it. | 
|  | ofile = None | 
|  |  | 
|  | warning_re = re.compile(r'''(.*/|)([^/]+\.[a-z]+:\d+):(\d+:)? warning:''') | 
|  | def interpret_warning(line): | 
|  | """Decode the message from gcc.  The messages we care about have a filename, and a warning""" | 
|  | line = line.rstrip('\n') | 
|  | m = warning_re.match(line) | 
|  | if m and m.group(2) not in allowed_warnings: | 
|  | print "error, forbidden warning:", m.group(2) | 
|  |  | 
|  | # If there is a warning, remove any object if it exists. | 
|  | if ofile: | 
|  | try: | 
|  | os.remove(ofile) | 
|  | except OSError: | 
|  | pass | 
|  | sys.exit(1) | 
|  |  | 
|  | def run_gcc(): | 
|  | args = sys.argv[1:] | 
|  | # Look for -o | 
|  | try: | 
|  | i = args.index('-o') | 
|  | global ofile | 
|  | ofile = args[i+1] | 
|  | except (ValueError, IndexError): | 
|  | pass | 
|  |  | 
|  | compiler = sys.argv[0] | 
|  |  | 
|  | try: | 
|  | proc = subprocess.Popen(args, stderr=subprocess.PIPE) | 
|  | for line in proc.stderr: | 
|  | print line, | 
|  | interpret_warning(line) | 
|  |  | 
|  | result = proc.wait() | 
|  | except OSError as e: | 
|  | result = e.errno | 
|  | if result == errno.ENOENT: | 
|  | print args[0] + ':',e.strerror | 
|  | print 'Is your PATH set correctly?' | 
|  | else: | 
|  | print ' '.join(args), str(e) | 
|  |  | 
|  | return result | 
|  |  | 
|  | if __name__ == '__main__': | 
|  | status = run_gcc() | 
|  | sys.exit(status) |