gyp_skia revision 4962140c9e6623b29417a2fb9ad903641fb0159c
11e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com#!/usr/bin/python 2fd03db0fe9c7a7f72df560b2039f2c3050c2fab9epoger@google.com 3fd03db0fe9c7a7f72df560b2039f2c3050c2fab9epoger@google.com# Copyright 2011 The Android Open Source Project 41e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com# 5fd03db0fe9c7a7f72df560b2039f2c3050c2fab9epoger@google.com# Use of this source code is governed by a BSD-style license that can be 6fd03db0fe9c7a7f72df560b2039f2c3050c2fab9epoger@google.com# found in the LICENSE file. 71e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com 81e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com# This script is a wrapper which invokes gyp with the correct --depth argument, 91e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com# and supports the automatic regeneration of build files if all.gyp is 101e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com# changed (Linux-only). 111e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com 121e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.comimport glob 131e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.comimport os 14ab5e91184b01fcfebbb7a4ae5723ede5367832dddjsollen@google.comimport platform 151e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.comimport shlex 161e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.comimport sys 171e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com 18bf6f6ae2e25f3def5874674caa3c8552ee4b7313commit-bot@chromium.orgscript_dir = os.path.abspath(os.path.dirname(__file__)) 191e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com 201e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com# Directory within which we can find the gyp source. 210ae27e0911c2f22bf8a5001fa54c2346911b70ffepoger@google.comgyp_source_dir = os.path.join(script_dir, 'third_party', 'externals', 'gyp') 221e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com 231e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com# Directory within which we can find most of Skia's gyp configuration files. 241e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.comgyp_config_dir = os.path.join(script_dir, 'gyp') 251e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com 2648af8a0a6aab8d64a1fca44e1dc4b9f57ca96bd2digit@google.com# Ensure we import our current gyp source's module, not any version 2748af8a0a6aab8d64a1fca44e1dc4b9f57ca96bd2digit@google.com# pre-installed in your PYTHONPATH. 2848af8a0a6aab8d64a1fca44e1dc4b9f57ca96bd2digit@google.comsys.path.insert(0, os.path.join(gyp_source_dir, 'pylib')) 291e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.comimport gyp 301e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com 317225506621e7102e8c3c5b4c9f29ac20851bc25acommit-bot@chromium.orgENVVAR_GYP_GENERATORS = 'GYP_GENERATORS' 324962140c9e6623b29417a2fb9ad903641fb0159cjvanverthENVVAR_GYP_GENERATOR_FLAGS = 'GYP_GENERATOR_FLAGS' 337225506621e7102e8c3c5b4c9f29ac20851bc25acommit-bot@chromium.org 347225506621e7102e8c3c5b4c9f29ac20851bc25acommit-bot@chromium.org 351e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.comdef additional_include_files(args=[]): 361e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com # Determine the include files specified on the command line. 371e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com # This doesn't cover all the different option formats you can use, 381e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com # but it's mainly intended to avoid duplicating flags on the automatic 391e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com # makefile regeneration which only uses this format. 401e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com specified_includes = set() 411e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com for arg in args: 421e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com if arg.startswith('-I') and len(arg) > 2: 431e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com specified_includes.add(os.path.realpath(arg[2:])) 441e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com 451e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com result = [] 461e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com def AddInclude(path): 471e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com if os.path.realpath(path) not in specified_includes: 481e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com result.append(path) 491e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com 50aa3b6a965e462eccf3d9b5c750816e6c534433fbepoger@google.com # Always include common.gypi. 51aa3b6a965e462eccf3d9b5c750816e6c534433fbepoger@google.com # We do this, rather than including common.gypi explicitly in all our gyp 52aa3b6a965e462eccf3d9b5c750816e6c534433fbepoger@google.com # files, so that gyp files we use but do not maintain (e.g., 53aa3b6a965e462eccf3d9b5c750816e6c534433fbepoger@google.com # third_party/externals/libjpeg/libjpeg.gyp) will include common.gypi too. 54aa3b6a965e462eccf3d9b5c750816e6c534433fbepoger@google.com AddInclude(os.path.join(gyp_config_dir, 'common.gypi')) 55aa3b6a965e462eccf3d9b5c750816e6c534433fbepoger@google.com 561e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com return result 571e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com 582b0126b3e800cd6ea5b1bd576580dc2a4b0c9cc8tfarina@chromium.org# Return the directory where all the build files are to be written. 59ab5e91184b01fcfebbb7a4ae5723ede5367832dddjsollen@google.comdef get_output_dir(): 60ab5e91184b01fcfebbb7a4ae5723ede5367832dddjsollen@google.com # SKIA_OUT can be any directory either as a child of the standard out/ 61ab5e91184b01fcfebbb7a4ae5723ede5367832dddjsollen@google.com # directory or any given location on the file system (e.g. /tmp/skia) 62ab5e91184b01fcfebbb7a4ae5723ede5367832dddjsollen@google.com output_dir = os.getenv('SKIA_OUT') 63ab5e91184b01fcfebbb7a4ae5723ede5367832dddjsollen@google.com 64ab5e91184b01fcfebbb7a4ae5723ede5367832dddjsollen@google.com if not output_dir: 65ab5e91184b01fcfebbb7a4ae5723ede5367832dddjsollen@google.com return os.path.join(os.path.abspath(script_dir), 'out') 66ab5e91184b01fcfebbb7a4ae5723ede5367832dddjsollen@google.com 677225506621e7102e8c3c5b4c9f29ac20851bc25acommit-bot@chromium.org if (sys.platform.startswith('darwin') and 687225506621e7102e8c3c5b4c9f29ac20851bc25acommit-bot@chromium.org (not os.getenv(ENVVAR_GYP_GENERATORS) or 697225506621e7102e8c3c5b4c9f29ac20851bc25acommit-bot@chromium.org 'xcode' in os.getenv(ENVVAR_GYP_GENERATORS))): 70072ee7d45cd0ee62c3fc2998072b78198c25984eborenet@google.com print 'ERROR: variable SKIA_OUT is not valid on Mac (using xcodebuild)' 71ab5e91184b01fcfebbb7a4ae5723ede5367832dddjsollen@google.com sys.exit(-1); 72ab5e91184b01fcfebbb7a4ae5723ede5367832dddjsollen@google.com 73ab5e91184b01fcfebbb7a4ae5723ede5367832dddjsollen@google.com if os.path.isabs(output_dir): 74ab5e91184b01fcfebbb7a4ae5723ede5367832dddjsollen@google.com return output_dir 75ab5e91184b01fcfebbb7a4ae5723ede5367832dddjsollen@google.com else: 76ab5e91184b01fcfebbb7a4ae5723ede5367832dddjsollen@google.com return os.path.join(os.path.abspath(script_dir), output_dir) 77ab5e91184b01fcfebbb7a4ae5723ede5367832dddjsollen@google.com 78ab5e91184b01fcfebbb7a4ae5723ede5367832dddjsollen@google.com 791e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.comif __name__ == '__main__': 801e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com args = sys.argv[1:] 811e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com 827225506621e7102e8c3c5b4c9f29ac20851bc25acommit-bot@chromium.org if not os.getenv(ENVVAR_GYP_GENERATORS): 837225506621e7102e8c3c5b4c9f29ac20851bc25acommit-bot@chromium.org print ('%s environment variable not set, using default' % 847225506621e7102e8c3c5b4c9f29ac20851bc25acommit-bot@chromium.org ENVVAR_GYP_GENERATORS) 857225506621e7102e8c3c5b4c9f29ac20851bc25acommit-bot@chromium.org if sys.platform.startswith('darwin'): 8658d69d846071ff9a84e879041f2f092006bfcd14epoger@google.com default_gyp_generators = 'ninja,xcode' 877225506621e7102e8c3c5b4c9f29ac20851bc25acommit-bot@chromium.org elif sys.platform.startswith('win'): 8858d69d846071ff9a84e879041f2f092006bfcd14epoger@google.com default_gyp_generators = 'ninja,msvs' 897225506621e7102e8c3c5b4c9f29ac20851bc25acommit-bot@chromium.org elif sys.platform.startswith('cygwin'): 9058d69d846071ff9a84e879041f2f092006bfcd14epoger@google.com default_gyp_generators = 'ninja,msvs' 917225506621e7102e8c3c5b4c9f29ac20851bc25acommit-bot@chromium.org else: 9258d69d846071ff9a84e879041f2f092006bfcd14epoger@google.com default_gyp_generators = 'ninja' 937225506621e7102e8c3c5b4c9f29ac20851bc25acommit-bot@chromium.org os.environ[ENVVAR_GYP_GENERATORS] = default_gyp_generators 947225506621e7102e8c3c5b4c9f29ac20851bc25acommit-bot@chromium.org print '%s is "%s"' % (ENVVAR_GYP_GENERATORS, os.getenv(ENVVAR_GYP_GENERATORS)) 957225506621e7102e8c3c5b4c9f29ac20851bc25acommit-bot@chromium.org 962d75cc0c163d60276f5f9e39299a4225fd0e2f8depoger@google.com # Set CWD to the directory containing this script. 972d75cc0c163d60276f5f9e39299a4225fd0e2f8depoger@google.com # This allows us to launch it from other directories, in spite of gyp's 982d75cc0c163d60276f5f9e39299a4225fd0e2f8depoger@google.com # finickyness about the current working directory. 992d75cc0c163d60276f5f9e39299a4225fd0e2f8depoger@google.com # See http://b.corp.google.com/issue?id=5019517 ('Linux make build 1002d75cc0c163d60276f5f9e39299a4225fd0e2f8depoger@google.com # (from out dir) no longer runs skia_gyp correctly') 1017fd589cfef0e6c82526e1064eab8ff4f6f9dbedcepoger@google.com os.chdir(os.path.abspath(script_dir)) 1022d75cc0c163d60276f5f9e39299a4225fd0e2f8depoger@google.com 1031e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com # This could give false positives since it doesn't actually do real option 1041e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com # parsing. Oh well. 1051e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com gyp_file_specified = False 1061e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com for arg in args: 1071e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com if arg.endswith('.gyp'): 1081e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com gyp_file_specified = True 1091e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com break 1101e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com 1111e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com # If we didn't get a file, then fall back to assuming 'skia.gyp' from the 1121e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com # same directory as the script. 1132d75cc0c163d60276f5f9e39299a4225fd0e2f8depoger@google.com # The gypfile must be passed as a relative path, not an absolute path, 1142d75cc0c163d60276f5f9e39299a4225fd0e2f8depoger@google.com # or else the gyp code doesn't write into the proper output dir. 1151e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com if not gyp_file_specified: 1162d75cc0c163d60276f5f9e39299a4225fd0e2f8depoger@google.com args.append('skia.gyp') 1171e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com 1181e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com args.extend(['-I' + i for i in additional_include_files(args)]) 1191e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com args.extend(['--depth', '.']) 1201e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com 1212b0126b3e800cd6ea5b1bd576580dc2a4b0c9cc8tfarina@chromium.org # Tell gyp to write the build files into output_dir. 122ab5e91184b01fcfebbb7a4ae5723ede5367832dddjsollen@google.com args.extend(['--generator-output', os.path.abspath(get_output_dir())]) 1231e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com 1242b0126b3e800cd6ea5b1bd576580dc2a4b0c9cc8tfarina@chromium.org # Tell ninja to write its output into the same directory. 1251e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com args.extend(['-Goutput_dir=.']) 1261e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com 1279c875d34ff13d82f581448ced0d9eb5b067368b9epoger@google.com # By default, we build 'most' instead of 'all' or 'everything'. See skia.gyp. 1289c875d34ff13d82f581448ced0d9eb5b067368b9epoger@google.com args.extend(['-Gdefault_target=most']) 1299c875d34ff13d82f581448ced0d9eb5b067368b9epoger@google.com 1304962140c9e6623b29417a2fb9ad903641fb0159cjvanverth # Fail if any files specified in the project are missing 1314962140c9e6623b29417a2fb9ad903641fb0159cjvanverth if sys.platform.startswith('win'): 1324962140c9e6623b29417a2fb9ad903641fb0159cjvanverth gyp_generator_flags = os.getenv(ENVVAR_GYP_GENERATOR_FLAGS, '') 1334962140c9e6623b29417a2fb9ad903641fb0159cjvanverth if not 'msvs_error_on_missing_sources' in gyp_generator_flags: 1344962140c9e6623b29417a2fb9ad903641fb0159cjvanverth os.environ[ENVVAR_GYP_GENERATOR_FLAGS] = ( 1354962140c9e6623b29417a2fb9ad903641fb0159cjvanverth gyp_generator_flags + ' msvs_error_on_missing_sources=1') 1364962140c9e6623b29417a2fb9ad903641fb0159cjvanverth 1371e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com print 'Updating projects from gyp files...' 1381e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com sys.stdout.flush() 1391e8e056afc6a7fc533f696e93771bde861a53db7epoger@google.com 140bbce730df9b43726ffe9b1cf7553b59434551306bungeman@google.com if '--dry-run' in args: 141bbce730df9b43726ffe9b1cf7553b59434551306bungeman@google.com args.remove('--dry-run') 142bbce730df9b43726ffe9b1cf7553b59434551306bungeman@google.com print gyp_source_dir, ' '.join(args) 143bbce730df9b43726ffe9b1cf7553b59434551306bungeman@google.com else: 144bbce730df9b43726ffe9b1cf7553b59434551306bungeman@google.com # Off we go... 145bbce730df9b43726ffe9b1cf7553b59434551306bungeman@google.com sys.exit(gyp.main(args)) 146