landmine_utils.py 2.93 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
# Copyright 2014 the V8 project authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.


import functools
import logging
import os
import shlex
import sys


def memoize(default=None):
  """This decorator caches the return value of a parameterless pure function"""
  def memoizer(func):
    val = []
    @functools.wraps(func)
    def inner():
      if not val:
        ret = func()
        val.append(ret if ret is not None else default)
        if logging.getLogger().isEnabledFor(logging.INFO):
          print '%s -> %r' % (func.__name__, val[0])
      return val[0]
    return inner
  return memoizer


@memoize()
def IsWindows():
  return sys.platform in ['win32', 'cygwin']


@memoize()
def IsLinux():
  return sys.platform.startswith(('linux', 'freebsd'))


@memoize()
def IsMac():
  return sys.platform == 'darwin'


@memoize()
def gyp_defines():
  """Parses and returns GYP_DEFINES env var as a dictionary."""
  return dict(arg.split('=', 1)
      for arg in shlex.split(os.environ.get('GYP_DEFINES', '')))

50 51 52 53 54 55 56 57

@memoize()
def gyp_generator_flags():
  """Parses and returns GYP_GENERATOR_FLAGS env var as a dictionary."""
  return dict(arg.split('=', 1)
      for arg in shlex.split(os.environ.get('GYP_GENERATOR_FLAGS', '')))


58 59 60 61
@memoize()
def gyp_msvs_version():
  return os.environ.get('GYP_MSVS_VERSION', '')

62

63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
@memoize()
def distributor():
  """
  Returns a string which is the distributed build engine in use (if any).
  Possible values: 'goma', 'ib', ''
  """
  if 'goma' in gyp_defines():
    return 'goma'
  elif IsWindows():
    if 'CHROME_HEADLESS' in os.environ:
      return 'ib' # use (win and !goma and headless) as approximation of ib


@memoize()
def platform():
  """
79
  Returns a string representing the platform this build is targeted for.
80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
  Possible values: 'win', 'mac', 'linux', 'ios', 'android'
  """
  if 'OS' in gyp_defines():
    if 'android' in gyp_defines()['OS']:
      return 'android'
    else:
      return gyp_defines()['OS']
  elif IsWindows():
    return 'win'
  elif IsLinux():
    return 'linux'
  else:
    return 'mac'


@memoize()
def builder():
  """
  Returns a string representing the build engine (not compiler) to use.
  Possible values: 'make', 'ninja', 'xcode', 'msvs', 'scons'
  """
  if 'GYP_GENERATORS' in os.environ:
    # for simplicity, only support the first explicit generator
    generator = os.environ['GYP_GENERATORS'].split(',')[0]
    if generator.endswith('-android'):
      return generator.split('-')[0]
    elif generator.endswith('-ninja'):
      return 'ninja'
    else:
      return generator
  else:
    if platform() == 'android':
      # Good enough for now? Do any android bots use make?
      return 'make'
    elif platform() == 'ios':
      return 'xcode'
    elif IsWindows():
      return 'msvs'
    elif IsLinux():
      return 'make'
    elif IsMac():
      return 'xcode'
    else:
      assert False, 'Don\'t know what builder we\'re using!'