import glob
import os
+import re
import shlex
import subprocess
import string
sys.path.insert(0, os.path.join(chrome_src, 'build'))
import gyp_helper
-import vs_toolchain
import landmine_utils
+import vs_toolchain
# Assume this file is in a one-level-deep subdirectory of the source root.
SRC_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
return glob.glob(os.path.join(chrome_src, '*', 'supplement.gypi'))
-def FormatKeyForGN(key):
- """Returns the given GYP key reformatted for GN.
-
- GYP dictionary keys can be almost anything, but in GN they are identifiers
- and must follow the same rules. This reformats such keys to be valid GN
- identifiers."""
- return ''.join([c if c in string.ascii_letters else '_' for c in key])
-
-
-def EscapeStringForGN(s):
- """Converts a string to a GN string literal."""
- # Escape $ characters which have special meaning to GN.
- for old, new in [('\\', '\\\\'), ('$', '\\$'), ('"', '\\"')]:
- s = s.replace(old, new)
- return '"' + s + '"'
-
-
def ProcessGypDefinesItems(items):
"""Converts a list of strings to a list of key-value pairs."""
result = []
for item in items:
tokens = item.split('=', 1)
# Some GYP variables have hyphens, which we don't support.
- key = FormatKeyForGN(tokens[0])
if len(tokens) == 2:
- result += [(key, tokens[1])]
+ result += [(tokens[0], tokens[1])]
else:
# No value supplied, treat it as a boolean and set it. Note that we
# use the string '1' here so we have a consistent definition whether
# you do 'foo=1' or 'foo'.
- result += [(key, '1')]
+ result += [(tokens[0], '1')]
return result
-def GetGypVarsForGN(supplemental_files):
- """Returns a dictionary of all GYP vars that we will be passing to GN."""
+def GetGypVars(supplemental_files):
+ """Returns a dictionary of all GYP vars."""
# Find the .gyp directory in the user's home directory.
home_dot_gyp = os.environ.get('GYP_CONFIG_DIR', None)
if home_dot_gyp:
raise
variables = file_data.get('variables', [])
for v in variables:
- supp_items += [(FormatKeyForGN(v), str(variables[v]))]
+ supp_items += [(v, str(variables[v]))]
# GYP defines from the environment.
env_items = ProcessGypDefinesItems(
cmdline_items = ProcessGypDefinesItems(cmdline_input_items)
vars_dict = dict(supp_items + env_items + cmdline_items)
- # It's not possible to set a default value for cpu_arch in GN, so do it here
- # for now (http://crbug.com/344767).
- if vars_dict.get('OS') == 'android' and not 'target_arch' in vars_dict:
- vars_dict['target_arch'] = 'arm'
return vars_dict
def GetOutputDirectory():
return "out"
-def GetArgsStringForGN(supplemental_files):
- """Returns the args to pass to GN.
- Based on a subset of the GYP variables that have been rewritten a bit."""
- gn_args = ''
-
- # Note: These are the additional flags passed to various builds by builders
- # on the main waterfall. We'll probably need to add these at some point:
- # mac_strip_release=1 http://crbug.com/330301
- # linux_dump_symbols=0 http://crbug.com/330300
- # host_os=linux Probably can skip, GN knows the host OS.
- # order_text_section=<path> http://crbug.com/330299
- # chromium_win_pch=0 http://crbug.com/297678
- # chromium_ios_signing=0 http://crbug.com/330302
- # use_allocator=tcmalloc http://crbug.com/330303, 345554
- # release_extra_flags=... http://crbug.com/330305
-
- # These tuples of (key, value, gn_arg_string) use the gn_arg_string for
- # gn when the key is set to the given value in the GYP arguments.
- remap_cases = [
- ('android_webview_build', '1', 'is_android_webview_build=true'),
- ('branding', 'Chrome', 'is_chrome_branded=true'),
- ('build_for_tool', 'drmemory', 'disable_iterator_debugging=true'),
- ('build_for_tool', 'tsan', 'disable_iterator_debugging=true'),
- ('buildtype', 'Official', 'is_official_build=true'),
- ('component', 'shared_library', 'is_component_build=true'),
- ('clang', '1', 'is_clang=true'),
- ('clang_use_chrome_plugins', '0', 'clang_use_chrome_plugins=false'),
- ('disable_glibcxx_debug', '1', 'disable_iterator_debugging=true'),
- ('enable_mdns', '0', 'enable_mdns=false'),
- ('enable_mdns', '1', 'enable_mdns=true'),
- ('enable_plugins', '0', 'enable_plugins=false'),
- ('enable_plugins', '1', 'enable_plugins=true'),
- ('target_arch', 'ia32', 'cpu_arch="x86"'),
- ('target_arch', 'x64', 'cpu_arch="x64" force_win64=true'),
- ('target_arch', 'arm', 'cpu_arch="arm"'),
- ('target_arch', 'mipsel', 'cpu_arch="mipsel"'),
- ('fastbuild', '0', 'symbol_level=2'),
- ('fastbuild', '1', 'symbol_level=1'),
- ('fastbuild', '2', 'symbol_level=0'),
- ('OS', 'ios', 'os="ios"'),
- ('OS', 'android', 'os="android"'),
- ('chromeos', '1', 'os="chromeos"'),
- ('use_aura', '1', 'use_aura=true'),
- ('use_goma', '1', 'use_goma=true'),
- ('use_openssl', '0', 'use_openssl=false'),
- ('use_openssl', '1', 'use_openssl=true'),
- ('asan', '1', 'is_asan=true'),
- ('lsan', '1', 'is_lsan=true'),
- ('msan', '1', 'is_msan=true'),
- ('tsan', '1', 'is_tsan=true'),
- ]
- for i in remap_cases:
- if i[0] in vars_dict and vars_dict[i[0]] == i[1]:
- gn_args += ' ' + i[2]
-
- # These string arguments get passed directly as GN strings.
- for v in ['android_src', 'arm_float_abi', 'ios_deployment_target',
- 'ios_sdk_path', 'windows_sdk_path']:
- if v in vars_dict:
- gn_args += ' ' + v + '=' + EscapeStringForGN(vars_dict[v])
-
- # gomadir is renamed goma_dir in the GN build.
- if 'gomadir' in vars_dict:
- gn_args += ' goma_dir=%s' % EscapeStringForGN(vars_dict['gomadir'])
-
- # Set the "use_ios_simulator" flag if the ios_sdk_path is set.
- if 'ios_sdk_path' in vars_dict:
- if os.path.basename(vars_dict['ios_sdk_path']).lower().startswith(
- 'iphonesimulator'):
- gn_args += ' use_ios_simulator=true'
- else:
- gn_args += ' use_ios_simulator=false'
-
- # These arguments get passed directly as integers (avoiding the quoting and
- # escaping of the string ones above).
- for v in ['arm_version']:
- if v in vars_dict:
- gn_args += ' %s=%s' % (v, vars_dict[v])
-
- # Some other flags come from GYP environment variables.
- gyp_msvs_version = os.environ.get('GYP_MSVS_VERSION', '')
- if gyp_msvs_version:
- gn_args += ' visual_studio_version=' + EscapeStringForGN(gyp_msvs_version)
- gyp_msvs_override_path = os.environ.get('GYP_MSVS_OVERRIDE_PATH', '')
- if gyp_msvs_override_path:
- gn_args += ' visual_studio_path=' + \
- EscapeStringForGN(gyp_msvs_override_path)
-
- # Set the GYP flag so BUILD files know they're being invoked in GYP mode.
- gn_args += ' is_gyp=true'
-
- gyp_outdir = GetOutputDirectory()
- gn_args += ' gyp_output_dir=\"%s\"' % gyp_outdir
-
- return gn_args.strip()
-
def additional_include_files(supplemental_files, args=[]):
"""
return result
-def RunGN(supplemental_includes):
- """Runs GN, returning True if it succeeded, printing an error and returning
- false if not."""
-
- # The binaries in platform-specific subdirectories in src/tools/gn/bin.
- gnpath = SRC_DIR + '/tools/gn/bin/'
- if sys.platform in ('cygwin', 'win32'):
- gnpath += 'win/gn.exe'
- elif sys.platform.startswith('linux'):
- # On Linux we have 32-bit and 64-bit versions.
- if subprocess.check_output(["getconf", "LONG_BIT"]).find("64") >= 0:
- gnpath += 'linux/gn'
- else:
- gnpath += 'linux/gn32'
- elif sys.platform == 'darwin':
- gnpath += 'mac/gn'
- else:
- print 'Unknown platform for GN: ', sys.platform
- return False
-
- print 'Generating gyp files from GN...'
-
- # Need to pass both the source root (the bots don't run this command from
- # within the source tree) as well as set the is_gyp value so the BUILD files
- # to know they're being run under GYP.
- args = [gnpath, 'gyp', '-q',
- '--root=' + chrome_src,
- '--args=' + GetArgsStringForGN(vars_dict),
- '--output=//' + GetOutputDirectory() + '/gn_build/']
- return subprocess.call(args) == 0
-
-
if __name__ == '__main__':
args = sys.argv[1:]
if ip_media_codecs == True:
args.append('-Dffmpeg_branding=Chrome')
- # Enable Web Audio by default on Android x86
- if landmine_utils.platform() == 'android':
- args.append('-Duse_openmax_dl_fft=1')
-
- # Enable Aura by default on all platforms except Android
- if landmine_utils.platform() != 'android' and landmine_utils.platform() != 'mac':
- args.append('-Duse_aura=1')
-
- if landmine_utils.platform() == 'android':
- args.append('-Dnotifications=1')
- args.append('-Drelease_unwind_tables=0')
-
# Use the Psyco JIT if available.
if psyco:
psyco.profile()
# We explicitly don't support the make gyp generator (crbug.com/348686). Be
# nice and fail here, rather than choking in gyp.
- if 'make' in os.environ.get('GYP_GENERATORS', ''):
+ if re.search(r'(^|,|\s)make($|,|\s)', os.environ.get('GYP_GENERATORS', '')):
print 'Error: make gyp generator not supported (check GYP_GENERATORS).'
sys.exit(1)
not 'OS=ios' in os.environ.get('GYP_DEFINES', []):
os.environ['GYP_GENERATORS'] = 'ninja'
- vs2013_runtime_dll_dirs = vs_toolchain.DownloadVsToolchain()
+ vs2013_runtime_dll_dirs = vs_toolchain.SetEnvironmentAndGetRuntimeDllDirs()
# If CHROMIUM_GYP_SYNTAX_CHECK is set to 1, it will invoke gyp with --check
# to enfore syntax checking.
args.append('--check')
supplemental_includes = GetSupplementalFiles()
- gn_vars_dict = GetGypVarsForGN(supplemental_includes)
+ gyp_vars_dict = GetGypVars(supplemental_includes)
# Automatically turn on crosscompile support for platforms that need it.
# (The Chrome OS build sets CC_host / CC_target which implicitly enables
# this mode.)
if all(('ninja' in os.environ.get('GYP_GENERATORS', ''),
- gn_vars_dict.get('OS') in ['android', 'ios'],
+ gyp_vars_dict.get('OS') in ['android', 'ios'],
'GYP_CROSSCOMPILE' not in os.environ)):
os.environ['GYP_CROSSCOMPILE'] = '1'
+ if gyp_vars_dict.get('OS') == 'android':
+ args.append('--check')
- # TODO(brettw) bug 350974 either turn back on GN or delete all of this code.
- #if not RunGN(gn_vars_dict):
- # sys.exit(1)
args.extend(
['-I' + i for i in additional_include_files(supplemental_includes, args)])
args.extend(['-D', 'gyp_output_dir=' + GetOutputDirectory()])
+ # Enable Web Audio by default on Android x86
+ if gyp_vars_dict.get('OS') == 'android':
+ args.append('-Duse_openmax_dl_fft=1')
+
+ # Enable Aura by default on all platforms except Android
+ if gyp_vars_dict.get('OS') != 'android' and gyp_vars_dict.get('OS') != 'mac':
+ args.append('-Duse_aura=1')
+
+ if gyp_vars_dict.get('OS') == 'android':
+ args.append('-Dnotifications=1')
+ args.append('-Drelease_unwind_tables=0')
+
print 'Updating projects from gyp files...'
sys.stdout.flush()