1b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#!/usr/bin/python 2b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch# 3b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch# Copyright 2010 the V8 project authors. All rights reserved. 4b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch# Redistribution and use in source and binary forms, with or without 5b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch# modification, are permitted provided that the following conditions are 6b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch# met: 7b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch# 8b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch# * Redistributions of source code must retain the above copyright 9b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch# notice, this list of conditions and the following disclaimer. 10b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch# * Redistributions in binary form must reproduce the above 11b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch# copyright notice, this list of conditions and the following 12b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch# disclaimer in the documentation and/or other materials provided 13b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch# with the distribution. 14b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch# * Neither the name of Google Inc. nor the names of its 15b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch# contributors may be used to endorse or promote products derived 16b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch# from this software without specific prior written permission. 17b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch# 18b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 30b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch# This script is wrapper for V8 that adds some support for how GYP 31b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch# is invoked by V8 beyond what can be done in the gclient hooks. 32b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 33b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochimport glob 34b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochimport os 35b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochimport shlex 36b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochimport sys 37b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 38b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochscript_dir = os.path.dirname(__file__) 39b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochv8_root = os.path.normpath(os.path.join(script_dir, os.pardir)) 40b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochsys.path.insert(0, os.path.join(v8_root, 'tools')) 423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochimport utils 433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 44b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochsys.path.insert(0, os.path.join(v8_root, 'build', 'gyp', 'pylib')) 45b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochimport gyp 46b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 48b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochdef apply_gyp_environment(file_path=None): 49b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch """ 50b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Reads in a *.gyp_env file and applies the valid keys to os.environ. 51b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch """ 52b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if not file_path or not os.path.exists(file_path): 53b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return 54b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch file_contents = open(file_path).read() 55b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch try: 56b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch file_data = eval(file_contents, {'__builtins__': None}, None) 57b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch except SyntaxError, e: 58b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch e.filename = os.path.abspath(file_path) 59b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch raise 60b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch supported_vars = ( 'V8_GYP_FILE', 61b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 'V8_GYP_SYNTAX_CHECK', 62b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 'GYP_DEFINES', 63b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 'GYP_GENERATOR_FLAGS', 64b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 'GYP_GENERATOR_OUTPUT', ) 65b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch for var in supported_vars: 66b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch val = file_data.get(var) 67b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if val: 68b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if var in os.environ: 69b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch print 'INFO: Environment value for "%s" overrides value in %s.' % ( 70b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch var, os.path.abspath(file_path) 71b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ) 72b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch else: 73b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch os.environ[var] = val 74b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 76b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochdef additional_include_files(args=[]): 77b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch """ 78b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Returns a list of additional (.gypi) files to include, without 79b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch duplicating ones that are already specified on the command line. 80b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch """ 81b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch # Determine the include files specified on the command line. 82b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch # This doesn't cover all the different option formats you can use, 83b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch # but it's mainly intended to avoid duplicating flags on the automatic 84b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch # makefile regeneration which only uses this format. 85b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch specified_includes = set() 86b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch for arg in args: 87b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if arg.startswith('-I') and len(arg) > 2: 88b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch specified_includes.add(os.path.realpath(arg[2:])) 89b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 90b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch result = [] 91b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch def AddInclude(path): 92b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if os.path.realpath(path) not in specified_includes: 93b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch result.append(path) 94b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 9569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch # Always include standalone.gypi 9669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch AddInclude(os.path.join(script_dir, 'standalone.gypi')) 97b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 98b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch # Optionally add supplemental .gypi files if present. 99b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch supplements = glob.glob(os.path.join(v8_root, '*', 'supplement.gypi')) 100b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch for supplement in supplements: 101b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch AddInclude(supplement) 102b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 103b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return result 104b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1063fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochdef run_gyp(args): 1073fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch rc = gyp.main(args) 1083fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch if rc != 0: 1093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch print 'Error running GYP' 1103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch sys.exit(rc) 1113fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 113b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochif __name__ == '__main__': 114b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch args = sys.argv[1:] 115b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 116b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if 'SKIP_V8_GYP_ENV' not in os.environ: 117b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch # Update the environment based on v8.gyp_env 118b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch gyp_env_path = os.path.join(os.path.dirname(v8_root), 'v8.gyp_env') 119b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch apply_gyp_environment(gyp_env_path) 120b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 121b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch # This could give false positives since it doesn't actually do real option 122b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch # parsing. Oh well. 123b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch gyp_file_specified = False 124b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch for arg in args: 125b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if arg.endswith('.gyp'): 126b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch gyp_file_specified = True 127b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch break 128b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 129b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch # If we didn't get a file, check an env var, and then fall back to 130b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch # assuming 'all.gyp' from the same directory as the script. 131b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if not gyp_file_specified: 132b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch gyp_file = os.environ.get('V8_GYP_FILE') 133b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if gyp_file: 134b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch # Note that V8_GYP_FILE values can't have backslashes as 135b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch # path separators even on Windows due to the use of shlex.split(). 136b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch args.extend(shlex.split(gyp_file)) 137b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch else: 138b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch args.append(os.path.join(script_dir, 'all.gyp')) 139b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 140b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch args.extend(['-I' + i for i in additional_include_files(args)]) 141b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 142b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch # There shouldn't be a circular dependency relationship between .gyp files 143b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch args.append('--no-circular-check') 144b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 145b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch # Set the GYP DEPTH variable to the root of the V8 project. 146b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch args.append('--depth=' + v8_root) 147b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 148b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch # If V8_GYP_SYNTAX_CHECK is set to 1, it will invoke gyp with --check 149b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch # to enfore syntax checking. 150b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch syntax_check = os.environ.get('V8_GYP_SYNTAX_CHECK') 151b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if syntax_check and int(syntax_check): 152b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch args.append('--check') 153b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 154b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch print 'Updating projects from gyp files...' 155b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch sys.stdout.flush() 156b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch # Generate for the architectures supported on the given platform. 1583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch gyp_args = list(args) 1593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch gyp_args.append('-Dtarget_arch=ia32') 1603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch if utils.GuessOS() == 'linux': 1613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch gyp_args.append('-S-ia32') 1623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch run_gyp(gyp_args) 1633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch if utils.GuessOS() == 'linux': 1653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch gyp_args = list(args) 1663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch gyp_args.append('-Dtarget_arch=x64') 1673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch gyp_args.append('-S-x64') 1683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch run_gyp(gyp_args) 1693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch gyp_args = list(args) 1713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch gyp_args.append('-I' + v8_root + '/build/armu.gypi') 1723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch gyp_args.append('-S-armu') 1733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch run_gyp(gyp_args) 1743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch gyp_args = list(args) 1763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch gyp_args.append('-I' + v8_root + '/build/mipsu.gypi') 1773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch gyp_args.append('-S-mipsu') 1783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch run_gyp(gyp_args) 179