1 #!/usr/bin/env python 2 # Copyright 2013 The Chromium Authors. All rights reserved. 3 # Use of this source code is governed by a BSD-style license that can be 4 # found in the LICENSE file. 5 6 """A script to find a recently-built Chrome, in the likely places. 7 This script is used for automated testing, don't trust it for anything more 8 than that!""" 9 10 11 import optparse 12 import os 13 import sys 14 15 16 def FindChrome(src_dir, configs, verbose=False): 17 # List of places that chrome could live. 18 # In theory we should be more careful about what platform we're actually 19 # building for. 20 # As currently constructed, this will also hork people who have debug and 21 # release builds sitting side by side who build locally. 22 chrome_locations = [] 23 24 for config in configs: 25 chrome_locations.extend([ 26 'build/%s/chrome.exe' % config, 27 'chrome/%s/chrome.exe' % config, 28 # Windows Chromium ninja builder 29 'out/%s/chrome.exe' % config, 30 # Linux 31 'out/%s/chrome' % config, 32 # Mac Chromium ninja builder 33 'out/%s/Chromium.app/Contents/MacOS/Chromium' % config, 34 # Mac release ninja builder 35 'out/%s/Google Chrome.app/Contents/MacOS/Google Chrome' % config, 36 # Mac Chromium xcode builder 37 'xcodebuild/%s/Chromium.app/Contents/MacOS/Chromium' % config, 38 # Mac release xcode builder 39 'xcodebuild/%s/Google Chrome.app/Contents/MacOS/Google Chrome' % config, 40 ]) 41 42 # Pick the one with the newest timestamp. 43 latest_mtime = 0 44 latest_path = None 45 for chrome in chrome_locations: 46 chrome_filename = os.path.join(src_dir, chrome) 47 if verbose: 48 print 'Looking for %r...' % chrome_filename, 49 if os.path.exists(chrome_filename): 50 if verbose: 51 print 'YES.' 52 mtime = os.path.getmtime(chrome_filename) 53 if mtime > latest_mtime: 54 latest_mtime = mtime 55 latest_path = chrome_filename 56 else: 57 if verbose: 58 print 'NO.' 59 if latest_path is not None: 60 if verbose: 61 print 'Most recent is %r.' % latest_path 62 return latest_path 63 return None 64 65 66 def main(args): 67 usage = 'Usage: %prog [options] <src dir>' 68 description = __doc__ 69 parser = optparse.OptionParser(usage, description=description) 70 parser.add_option('-c', '--config', 71 action='append', 72 help='Which configuration of Chrome to look for. ' 73 'One of [Debug, Release]. The default is to try both. ' 74 'You can specify this multiple times.') 75 parser.add_option('-v', '--verbose', action='store_true', 76 help='Verbose output') 77 78 options, args = parser.parse_args(args[1:]) 79 80 if not len(args): 81 parser.error('Expected source directory as first argument.') 82 83 if not options.config: 84 options.config = ['Debug', 'Release'] 85 86 invalid_configs = set(options.config) - set(['Debug', 'Release']) 87 if invalid_configs: 88 parser.error('Expected config to be one of [Debug, Release]. ' 89 'Got the following invalid configs: %s. ' % 90 ', '.invalid_configs) 91 92 src_dir = args[0] 93 chrome_path = FindChrome(src_dir, options.config, options.verbose) 94 if not chrome_path: 95 sys.stderr.write('Error: Cannot find Chrome. ' 96 'Run again with -v to see where was searched.\n') 97 return 1 98 99 print chrome_path 100 return 0 101 102 103 if __name__ == '__main__': 104 sys.exit(main(sys.argv)) 105