blob: 877297caeb4a6077817229c5195edec04eaf8d1c [file] [log] [blame] [edit]
# Copyright 2018 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.
DEPS = [
'depot_tools/bot_update',
'depot_tools/depot_tools',
'depot_tools/gclient',
'depot_tools/osx_sdk',
'goma',
'depot_tools/gsutil',
'recipe_engine/context',
'recipe_engine/file',
'recipe_engine/json',
'recipe_engine/path',
'recipe_engine/platform',
'recipe_engine/properties',
'recipe_engine/python',
'recipe_engine/step',
'recipe_engine/time',
]
from recipe_engine.recipe_api import Property
PROPERTIES = {
'target_cpu': Property(default=None, kind=str),
'debug': Property(default=False, kind=bool),
'clang': Property(default=None, kind=bool),
}
def _CheckoutSteps(api):
# Checkout angle and its dependencies (specified in DEPS) using gclient.
solution_path = api.path['cache'].join('builder')
api.file.ensure_directory('init cache if not exists', solution_path)
with api.context(cwd=solution_path):
api.gclient.set_config('angle')
api.gclient.c.got_revision_mapping['angle'] = 'got_revision'
# Standalone developer angle builds want the angle checkout in the same
# directory the .gclient file is in. Bots want it in a directory called
# 'angle'. To make both cases work, the angle DEPS file pulls deps and runs
# hooks relative to the variable "root" which is set to . by default and
# then to 'angle' on bots here:
api.gclient.c.solutions[0].custom_vars['angle_root'] = 'angle'
api.gclient.c.solutions[0].custom_vars['checkout_src_internal'] = True
api.bot_update.ensure_checkout()
api.gclient.runhooks()
def _OutPath(target_cpu, debug, clang):
out_dir = 'debug' if debug else 'release'
if clang:
out_dir += '_clang'
if target_cpu:
out_dir += '_' + target_cpu
return out_dir
# _GNGenBuilds calls 'gn gen'.
def _GNGenBuilds(api, target_cpu, debug, clang, out_dir):
api.goma.ensure_goma()
gn_bool = {True: 'true', False: 'false'}
# Generate build files by GN.
checkout = api.path['checkout']
gn_cmd = api.depot_tools.gn_py_path
# Prepare the arguments to pass in.
args = [
'build_angle_gles1_conform_tests=true',
'is_debug=%s' % gn_bool[debug],
'is_component_build=false',
'use_goma=true',
'goma_dir="%s"' % api.goma.goma_dir,
]
if clang is not None:
args.append('is_clang=%s' % gn_bool[clang])
if target_cpu:
args.append('target_cpu="%s"' % target_cpu)
with api.context(cwd=checkout):
api.python('gn gen', gn_cmd,
['--root=' + str(checkout), 'gen', '//out/' + out_dir,
'--args=' + ' '.join(args), '--check'])
def _GetCompilerName(api, clang):
# Clang is used as the default compiler.
if clang or clang is None:
return 'clang'
# The non-Clang compiler is OS-dependent.
if api.platform.is_win:
return 'msvc'
else:
return 'gcc'
def _BuildSteps(api, out_dir, clang):
debug_path = api.path['checkout'].join('out', out_dir)
ninja_cmd = [api.depot_tools.ninja_path, '-C', debug_path,
'-j', api.goma.recommended_goma_jobs]
api.goma.build_with_goma(
name='compile with ninja',
ninja_command=ninja_cmd,
ninja_log_outdir=debug_path,
ninja_log_compiler=_GetCompilerName(api, clang))
def RunSteps(api, target_cpu, debug, clang):
env = {}
if api.platform.is_win:
env['DEPOT_TOOLS_WIN_TOOLCHAIN_ROOT'] = (
api.path['cache'].join('win_toolchain'))
with api.context(env=env):
_CheckoutSteps(api)
out_dir = _OutPath(target_cpu, debug, clang)
with api.osx_sdk('mac'):
_GNGenBuilds(api, target_cpu, debug, clang, out_dir)
_BuildSteps(api, out_dir, clang)
def GenTests(api):
yield (
api.test('linux') +
api.platform('linux', 64) +
api.properties(mastername='client.angle',
buildername='linux',
buildnumber='1234',
bot_id='test_slave')
)
yield (
api.test('linux_gcc') +
api.platform('linux', 64) +
api.properties(clang=False,
mastername='client.angle',
buildername='linux',
buildnumber='1234',
bot_id='test_slave')
)
yield (
api.test('win') +
api.platform('win', 64) +
api.properties(mastername='client.angle',
buildername='windows',
buildnumber='1234',
bot_id='test_slave')
)
yield (
api.test('win_clang') +
api.platform('win', 64) +
api.properties(clang=True,
mastername='client.angle',
buildername='windows',
buildnumber='1234',
bot_id='test_slave')
)
yield (
api.test('win_rel_msvc_x86') +
api.platform('win', 64) +
api.properties(clang=False,
debug=False,
target_cpu='x86',
mastername='client.angle',
buildername='windows',
buildnumber='1234',
bot_id='test_slave')
)