#!/usr/bin/env python import os import plistlib def main(): from optparse import OptionParser, OptionGroup parser = OptionParser("""\ Usage: %prog [options] <path> Utility for dumping Clang-style logged diagnostics.\ """) parser.add_option("-a", "--all", action="store_true", dest="all", default=False, help="dump all messages.") parser.add_option("-e", "--error", action="store_true", dest="error", default=False, help="dump 'error' messages.") parser.add_option("-f", "--fatal", action="store_true", dest="fatal", default=False, help="dump 'fatal error' messages.") parser.add_option("-i", "--ignored", action="store_true", dest="ignored", default=False, help="dump 'ignored' messages.") parser.add_option("-n", "--note", action="store_true", dest="note", default=False, help="dump 'note' messages.") parser.add_option("-w", "--warning", action="store_true", dest="warning", default=False, help="dump 'warning' messages.") (opts, args) = parser.parse_args() if len(args) != 1: parser.error("invalid number of arguments") levels = {'error': False, 'fatal error': False, 'ignored': False, 'note': False, 'warning': False} if opts.error: levels['error'] = True if opts.fatal: levels['fatal error'] = True if opts.ignored: levels['ignored'] = True if opts.note: levels['note'] = True if opts.warning: levels['warning'] = True path, = args # Read the diagnostics log. f = open(path) try: data = f.read() finally: f.close() # Complete the plist (the log itself is just the chunks). data = """\ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" \ "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <array> %s </array> </plist>""" % data # Get the list of files and diagnostics to report. to_report = [] diags = plistlib.readPlistFromString(data) for file_diags in diags: file = file_diags.get('main-file') # Diagnostics from modules don't have a main-file listed. if not file: file = '<module-includes>' # Ignore diagnostics for 'conftest.c', which is the file autoconf uses # for its tests (which frequently will have warnings). if os.path.basename(file) == 'conftest.c': continue # Get the diagnostics for the selected levels. selected_diags = [d for d in file_diags.get('diagnostics', ()) if levels[d.get('level')] or opts.all] if selected_diags: to_report.append((file, selected_diags)) # If there are no diagnostics to report, show nothing. if not to_report: return # Otherwise, print out the diagnostics. print print "**** BUILD DIAGNOSTICS ****" for file,selected_diags in to_report: print "*** %s ***" % file for d in selected_diags: print " %s:%s:%s: %s: %s" % ( d.get('filename'), d.get('line'), d.get('column'), d.get('level'), d.get('message')) if __name__ == "__main__": main()