blob: 731c735f7ea4264f368b5321a45bc96bab609129 [file] [log] [blame]
# Copyright 2018 The Fuchsia Authors. 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 NinjaApi(recipe_api.RecipeApi):
"""APIs for interacting with Ninja.
Clients must call set_path before using this module, to point to the prebuilt Ninja
binary.
"""
def __init__(self, *args, **kwargs):
super(NinjaApi, self).__init__(*args, **kwargs)
self._exe = None
def __call__(self,
build_dir,
targets,
job_count=None,
build_file=None,
fail_threshold=None,
verbose=False):
"""Runs Ninja.
Args:
build_dir (Path): CD into this directory before executing.
job_count (int): No. parallel jobs (Ninja default is to guess from available CPUs).
targets (List(string)): List of targets to build.
build_file (Path): Ninja build file (default=build.ninja)
fail_threshold (int): Keep going until this many jobs fail (Ninja default of 1).
verbose (bool): Show all command lines when building.
Returns:
The step result of running Ninja.
"""
assert self._exe, "missing executable. Did you call set_path?"
# Construct command for ninja
ninja_command = [
self._exe,
'-C',
build_dir,
]
if job_count:
ninja_command.extend(['-j', job_count])
if build_file:
ninja_command.extend(['-f', build_file])
if fail_threshold:
ninja_command.extend(['-k', fail_threshold])
if verbose:
ninja_command.append('-v')
ninja_command.extend(targets)
# Use ninja_wrapper to run ninja build
ninja_wrapper_args = [
'--ninja_info_output',
self.m.json.output(
add_json_log='on_failure', name='failure_json_summary'),
'--failure_output',
self.m.raw_io.output(
add_output_log='on_failure', name='failure_raw_summary'),
]
ninja_wrapper_args.append('--')
ninja_wrapper_args.extend(ninja_command)
test_json = {
'failures': [{
'output_nodes': ['a.o'],
'rule': 'CXX',
'output': 'error info',
'dependencies': ['b/a.cc']
}]
}
test_failure_output = '[1/1] CXX a.o\nerror info\n'
step_test_data = (lambda: self.m.json.test_api.output(
test_json, name='ninja_info') +
self.m.raw_io.test_api.output(
test_failure_output, name='failure_summary'))
return self.m.python(
'ninja',
script=self.resource('ninja_wrapper.py'),
args=ninja_wrapper_args,
step_test_data=step_test_data)
def set_path(self, path):
"""Sets the path to the Ninja executable."""
self._exe = path