1 #!/usr/bin/env python 2 # 3 # Copyright 2013 The Chromium Authors. All rights reserved. 4 # Use of this source code is governed by a BSD-style license that can be 5 # found in the LICENSE file. 6 7 """An Ant wrapper that suppresses useless Ant output. 8 9 Ant build scripts output "BUILD SUCCESSFUL" and build timing at the end of 10 every build. In the Android build, this just adds a lot of useless noise to the 11 build output. This script forwards its arguments to ant, and prints Ant's 12 output up until the BUILD SUCCESSFUL line. 13 14 Also, when a command fails, this script will re-run that ant command with the 15 '-verbose' argument so that the failure is easier to debug. 16 """ 17 18 import optparse 19 import sys 20 import traceback 21 22 from util import build_utils 23 24 25 def main(argv): 26 option_parser = optparse.OptionParser() 27 build_utils.AddDepfileOption(option_parser) 28 options, args = option_parser.parse_args(argv[1:]) 29 30 try: 31 stdout = build_utils.CheckOutput(['ant'] + args) 32 except build_utils.CalledProcessError: 33 # It is very difficult to diagnose ant failures without the '-verbose' 34 # argument. So, when an ant command fails, re-run it with '-verbose' so that 35 # the cause of the failure is easier to identify. 36 verbose_args = ['-verbose'] + [a for a in args if a != '-quiet'] 37 try: 38 stdout = build_utils.CheckOutput(['ant'] + verbose_args) 39 except build_utils.CalledProcessError: 40 traceback.print_exc() 41 sys.exit(1) 42 43 # If this did sys.exit(1), building again would succeed (which would be 44 # awkward). Instead, just print a big warning. 45 build_utils.PrintBigWarning( 46 'This is unexpected. `ant ' + ' '.join(args) + '` failed.' + 47 'But, running `ant ' + ' '.join(verbose_args) + '` passed.') 48 49 stdout = stdout.strip().split('\n') 50 for line in stdout: 51 if line.strip() == 'BUILD SUCCESSFUL': 52 break 53 print line 54 55 if options.depfile: 56 assert '-buildfile' in args 57 ant_buildfile = args[args.index('-buildfile') + 1] 58 59 build_utils.WriteDepfile( 60 options.depfile, 61 [ant_buildfile] + build_utils.GetPythonDependencies()) 62 63 64 if __name__ == '__main__': 65 sys.exit(main(sys.argv)) 66