#!/usr/bin/python | |
# Copyright (c) 2009 The Chromium Authors. All rights reserved. | |
# Use of this source code is governed by a BSD-style license that can be | |
# found in the LICENSE file. | |
# This script is wrapper for Chromium that adds some support for how GYP | |
# is invoked by Chromium beyond what can be done in the gclient hooks. | |
import glob | |
import os | |
import shlex | |
import sys | |
script_dir = os.path.dirname(__file__) | |
chrome_src = '../..';#os.path.normpath(os.path.join(script_dir, os.pardir)) | |
sys.path.insert(0, os.path.join(chrome_src, 'tools', 'gyp', 'pylib')) | |
import gyp | |
def apply_gyp_environment(file_path=None): | |
""" | |
Reads in a *.gyp_env file and applies the valid keys to os.environ. | |
""" | |
if not file_path or not os.path.exists(file_path): | |
return | |
file_contents = open(file_path).read() | |
try: | |
file_data = eval(file_contents, {'__builtins__': None}, None) | |
except SyntaxError, e: | |
e.filename = os.path.abspath(file_path) | |
raise | |
supported_vars = ( 'CHROMIUM_GYP_FILE', | |
'CHROMIUM_GYP_SYNTAX_CHECK', | |
'GYP_DEFINES', | |
'GYP_GENERATOR_FLAGS', | |
'GYP_GENERATOR_OUTPUT', ) | |
for var in supported_vars: | |
val = file_data.get(var) | |
if val: | |
if var in os.environ: | |
print 'INFO: Environment value for "%s" overrides value in %s.' % ( | |
var, os.path.abspath(file_path) | |
) | |
else: | |
os.environ[var] = val | |
def additional_include_files(args=[]): | |
""" | |
Returns a list of additional (.gypi) files to include, without | |
duplicating ones that are already specified on the command line. | |
""" | |
# Determine the include files specified on the command line. | |
# This doesn't cover all the different option formats you can use, | |
# but it's mainly intended to avoid duplicating flags on the automatic | |
# makefile regeneration which only uses this format. | |
specified_includes = set() | |
for arg in args: | |
if arg.startswith('-I') and len(arg) > 2: | |
specified_includes.add(os.path.realpath(arg[2:])) | |
result = [] | |
def AddInclude(path): | |
if os.path.realpath(path) not in specified_includes: | |
result.append(path) | |
# Always include common.gypi & features_override.gypi | |
AddInclude(os.path.join(script_dir, '../../build/common.gypi')) | |
AddInclude(os.path.join(script_dir, '../../build/features_override.gypi')) | |
# Optionally add supplemental .gypi files if present. | |
supplements = glob.glob(os.path.join(chrome_src, '*', 'supplement.gypi')) | |
for supplement in supplements: | |
AddInclude(supplement) | |
return result | |
if __name__ == '__main__': | |
args = sys.argv[1:] | |
if 'SKIP_CHROMIUM_GYP_ENV' not in os.environ: | |
# Update the environment based on chromium.gyp_env | |
gyp_env_path = os.path.join(os.path.dirname(chrome_src), 'chromium.gyp_env') | |
apply_gyp_environment(gyp_env_path) | |
# This could give false positives since it doesn't actually do real option | |
# parsing. Oh well. | |
gyp_file_specified = False | |
for arg in args: | |
if arg.endswith('.gyp'): | |
gyp_file_specified = True | |
break | |
# If we didn't get a file, check an env var, and then fall back to | |
# assuming 'all.gyp' from the same directory as the script. | |
if not gyp_file_specified: | |
gyp_file = os.environ.get('CHROMIUM_GYP_FILE') | |
if gyp_file: | |
# Note that CHROMIUM_GYP_FILE values can't have backslashes as | |
# path separators even on Windows due to the use of shlex.split(). | |
args.extend(shlex.split(gyp_file)) | |
else: | |
args.append(os.path.join(script_dir, 'video_engine.gyp')) | |
args.extend(['-I' + i for i in additional_include_files(args)]) | |
# There shouldn't be a circular dependency relationship between .gyp files, | |
# but in Chromium's .gyp files, on non-Mac platforms, circular relationships | |
# currently exist. The check for circular dependencies is currently | |
# bypassed on other platforms, but is left enabled on the Mac, where a | |
# violation of the rule causes Xcode to misbehave badly. | |
# TODO(mark): Find and kill remaining circular dependencies, and remove this | |
# option. http://crbug.com/35878. | |
# TODO(tc): Fix circular dependencies in ChromiumOS then add linux2 to the | |
# list. | |
if sys.platform not in ('darwin',): | |
args.append('--no-circular-check') | |
# If CHROMIUM_GYP_SYNTAX_CHECK is set to 1, it will invoke gyp with --check | |
# to enfore syntax checking. | |
syntax_check = os.environ.get('CHROMIUM_GYP_SYNTAX_CHECK') | |
if syntax_check and int(syntax_check): | |
args.append('--check') | |
print 'Updating projects from gyp files...' | |
sys.stdout.flush() | |
# Off we go... | |
sys.exit(gyp.main(args)) |