1 #!/usr/bin/env python 2 # Copyright (C) 2010 Google Inc. All rights reserved. 3 # 4 # Redistribution and use in source and binary forms, with or without 5 # modification, are permitted provided that the following conditions are 6 # met: 7 # 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 11 # copyright notice, this list of conditions and the following disclaimer 12 # in the documentation and/or other materials provided with the 13 # distribution. 14 # * Neither the name of Google Inc. nor the names of its 15 # contributors may be used to endorse or promote products derived from 16 # this software without specific prior written permission. 17 # 18 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 30 """Factory method to retrieve the appropriate port implementation.""" 31 32 33 import sys 34 35 36 def all_port_names(): 37 """Return a list of all valid, fully-specified, "real" port names. 38 39 This is the list of directories that are used as actual baseline_paths() 40 by real ports. This does not include any "fake" names like "test" 41 or "mock-mac", and it does not include any directories that are not .""" 42 # FIXME: There's probably a better way to generate this list ... 43 return ['chromium-gpu-linux', 44 'chromium-gpu-mac-snowleopard', 'chromium-gpu-mac-leopard', 45 'chromium-gpu-win-xp', 'chromium-gpu-win-vista', 'chromium-gpu-win-win7', 46 'chromium-linux-x86_64', 'chromium-linux-x86', 47 'chromium-mac-leopard', 'chromium-mac-snowleopard', 48 'chromium-win-xp', 'chromium-win-vista', 'chromium-win-win7', 49 'google-chrome-linux32', 'google-chrome-linux64', 50 'gtk', 51 'mac-tiger', 'mac-leopard', 'mac-snowleopard', 'mac-wk2', 52 'qt-linux', 'qt-mac', 'qt-win', 'qt-wk2', 53 'win-xp', 'win', 'win-wk2', 54 ] 55 56 57 def get(port_name=None, options=None, **kwargs): 58 """Returns an object implementing the Port interface. If 59 port_name is None, this routine attempts to guess at the most 60 appropriate port on this platform.""" 61 # Wrapped for backwards-compatibility 62 if port_name: 63 kwargs['port_name'] = port_name 64 if options: 65 kwargs['options'] = options 66 return _get_kwargs(**kwargs) 67 68 69 def _get_kwargs(**kwargs): 70 port_to_use = kwargs.get('port_name', None) 71 options = kwargs.get('options', None) 72 if port_to_use is None: 73 if sys.platform == 'win32' or sys.platform == 'cygwin': 74 if options and hasattr(options, 'chromium') and options.chromium: 75 port_to_use = 'chromium-win' 76 else: 77 port_to_use = 'win' 78 elif sys.platform == 'linux2': 79 port_to_use = 'chromium-linux' 80 elif sys.platform == 'darwin': 81 if options and hasattr(options, 'chromium') and options.chromium: 82 port_to_use = 'chromium-mac' 83 else: 84 port_to_use = 'mac' 85 86 if port_to_use is None: 87 raise NotImplementedError('unknown port; sys.platform = "%s"' % 88 sys.platform) 89 90 if port_to_use.startswith('test'): 91 import test 92 maker = test.TestPort 93 elif port_to_use.startswith('dryrun'): 94 import dryrun 95 maker = dryrun.DryRunPort 96 elif port_to_use.startswith('mock-'): 97 import mock_drt 98 maker = mock_drt.MockDRTPort 99 elif port_to_use.startswith('mac'): 100 import mac 101 maker = mac.MacPort 102 elif port_to_use.startswith('win'): 103 import win 104 maker = win.WinPort 105 elif port_to_use.startswith('gtk'): 106 import gtk 107 maker = gtk.GtkPort 108 elif port_to_use.startswith('qt'): 109 import qt 110 maker = qt.QtPort 111 elif port_to_use.startswith('chromium-gpu'): 112 import chromium_gpu 113 maker = chromium_gpu.get 114 elif port_to_use.startswith('chromium-mac'): 115 import chromium_mac 116 maker = chromium_mac.ChromiumMacPort 117 elif port_to_use.startswith('chromium-linux'): 118 import chromium_linux 119 maker = chromium_linux.ChromiumLinuxPort 120 elif port_to_use.startswith('chromium-win'): 121 import chromium_win 122 maker = chromium_win.ChromiumWinPort 123 elif port_to_use.startswith('google-chrome'): 124 import google_chrome 125 maker = google_chrome.GetGoogleChromePort 126 else: 127 raise NotImplementedError('unsupported port: %s' % port_to_use) 128 return maker(**kwargs) 129