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