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