1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# Copyright 2014 the V8 project authors. All rights reserved.
2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# Use of this source code is governed by a BSD-style license that can be
3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch# found in the LICENSE file.
4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochimport functools
7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochimport logging
8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochimport os
9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochimport shlex
10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochimport sys
11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochdef memoize(default=None):
14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  """This decorator caches the return value of a parameterless pure function"""
15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  def memoizer(func):
16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    val = []
17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    @functools.wraps(func)
18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    def inner():
19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      if not val:
20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        ret = func()
21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        val.append(ret if ret is not None else default)
22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        if logging.getLogger().isEnabledFor(logging.INFO):
23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch          print '%s -> %r' % (func.__name__, val[0])
24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return val[0]
25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return inner
26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return memoizer
27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch@memoize()
30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochdef IsWindows():
31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return sys.platform in ['win32', 'cygwin']
32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch@memoize()
35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochdef IsLinux():
36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return sys.platform.startswith(('linux', 'freebsd'))
37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch@memoize()
40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochdef IsMac():
41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return sys.platform == 'darwin'
42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch@memoize()
45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochdef gyp_defines():
46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  """Parses and returns GYP_DEFINES env var as a dictionary."""
47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return dict(arg.split('=', 1)
48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      for arg in shlex.split(os.environ.get('GYP_DEFINES', '')))
49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
50014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
51014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch@memoize()
52014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochdef gyp_generator_flags():
53014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  """Parses and returns GYP_GENERATOR_FLAGS env var as a dictionary."""
54014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return dict(arg.split('=', 1)
55014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      for arg in shlex.split(os.environ.get('GYP_GENERATOR_FLAGS', '')))
56014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
57014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch@memoize()
59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochdef gyp_msvs_version():
60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return os.environ.get('GYP_MSVS_VERSION', '')
61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
62014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch@memoize()
64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochdef distributor():
65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  """
66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Returns a string which is the distributed build engine in use (if any).
67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Possible values: 'goma', 'ib', ''
68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  """
69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if 'goma' in gyp_defines():
70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return 'goma'
71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  elif IsWindows():
72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if 'CHROME_HEADLESS' in os.environ:
73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return 'ib' # use (win and !goma and headless) as approximation of ib
74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch@memoize()
77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochdef platform():
78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  """
79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Returns a string representing the platform this build is targetted for.
80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Possible values: 'win', 'mac', 'linux', 'ios', 'android'
81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  """
82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if 'OS' in gyp_defines():
83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if 'android' in gyp_defines()['OS']:
84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return 'android'
85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    else:
86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return gyp_defines()['OS']
87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  elif IsWindows():
88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return 'win'
89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  elif IsLinux():
90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return 'linux'
91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  else:
92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    return 'mac'
93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch@memoize()
96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochdef builder():
97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  """
98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Returns a string representing the build engine (not compiler) to use.
99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Possible values: 'make', 'ninja', 'xcode', 'msvs', 'scons'
100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  """
101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  if 'GYP_GENERATORS' in os.environ:
102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    # for simplicity, only support the first explicit generator
103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    generator = os.environ['GYP_GENERATORS'].split(',')[0]
104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if generator.endswith('-android'):
105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return generator.split('-')[0]
106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    elif generator.endswith('-ninja'):
107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return 'ninja'
108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    else:
109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return generator
110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  else:
111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    if platform() == 'android':
112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      # Good enough for now? Do any android bots use make?
113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return 'make'
114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    elif platform() == 'ios':
115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return 'xcode'
116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    elif IsWindows():
117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return 'msvs'
118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    elif IsLinux():
119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return 'make'
120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    elif IsMac():
121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      return 'xcode'
122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    else:
123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      assert False, 'Don\'t know what builder we\'re using!'
124