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