blob: 1521be1ddfe07c556886dbc5a1cc1efd0d83e928 [file] [log] [blame]
# Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
# for details. All rights reserved. Use of this source code is governed by a
# BSD-style license that can be found in the LICENSE file.
from recipe_engine import recipe_api
class BuildApi(recipe_api.RecipeApi):
"""Recipe module for building the Dart SDK with and without goma."""
def __init__(self, properties, *args, **kwargs):
super(BuildApi, self).__init__(*args, **kwargs)
self._goma = not properties.disable_goma
# No need to download goma if it's disabled.
self._goma_ensured = properties.disable_goma
self._timeout = properties.timeout or 50 * 60 # 50 minutes
self._python = None
def build(self, name='build dart', args=None):
"""Builds dart using the specified args"""
if not args: # pragma: no cover
args = []
with self.m.depot_tools.on_path(), self.m.context(
cwd=self.m.path['checkout']):
if self._goma:
self._build_with_goma(name, args)
else:
if '--no-goma' not in args:
args = args + ['--no-goma']
self._run_build_py(name, args)
def gn(self, name='gn', args=None):
"""Runs gn.py using the specified args"""
self._ensure_goma()
with self.m.context(env=self._build_env):
if not self._goma and '--no-goma' not in args:
args = args + ['--no-goma']
gn_py = self.m.path['checkout'].join('tools', 'gn.py')
self.m.step(name, [self.python, '-u', gn_py] + args)
def _run_build_py(self, name, args):
with self.m.context(infra_steps=False):
build_py = self.m.path['checkout'].join('tools', 'build.py')
self.m.step(
name, [self.python, '-u', build_py] + args, timeout=self._timeout)
def _build_with_goma(self, name, args):
self._ensure_goma()
build_exit_status = None
with self.m.context(env=self._build_env):
try:
self.m.goma.start()
args = args + ['--no-start-goma', '-j200']
try:
self._run_build_py(name, args)
finally:
build_exit_status = self.m.step.active_result.retcode
finally:
self.m.goma.stop(build_exit_status=build_exit_status)
def _ensure_goma(self):
if not self._goma_ensured:
self.m.goma.ensure_goma()
self._goma_ensured = True
@property
def _build_env(self):
return {'GOMA_DIR': self.m.goma.goma_dir} if self._goma else {}
@property
def python(self):
if self._python:
return self._python
# TODO(athom): remove after python3 migration is complete.
build_py = self.m.path['checkout'].join('tools', 'build.py')
is_python3 = self.m.file.read_text(
'detect python version', build_py).startswith('#!/usr/bin/env python3')
detected_python = 'python3' if is_python3 else 'python'
python = self.m.properties.get('python_version', detected_python)
assert (python in ['python', 'python3'])
self._python = python
return self._python