blob: 0cb1c841edf2c672329fb6b3e35004d2454385e2 [file] [log] [blame]
# Copyright 2023 The Pigweed Authors
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.
"""Implementation of `pw build` for Gonk."""
import logging
from pathlib import Path
import shutil
import sys
from pw_build.build_recipe import (
BuildCommand,
BuildRecipe,
)
from pw_build.project_builder_presubmit_runner import main
from pw_build.build_recipe import should_gn_gen_with_args
from pw_presubmit.build import gn_args
_LOG = logging.getLogger('pw_build')
_ENABLE_FPGA_BUILD = (
shutil.which('nextpnr-ice40')
and shutil.which('yosys')
and shutil.which('icepack')
and shutil.which('icetime')
)
def build_project(force_pw_watch: bool = False) -> int:
"""Use pw_build to compile Gonk.
Defines BuildRecipes and passes them to Pigweed's
project_builder_presubmit_runner.main to start a ``pw build`` invocation.
Returns:
An int representing the success or failure status of the build; 0 if
successful, 1 if failed.
Command line usage examples:
.. code-block:: bash
pw build --list
pw build --recipe default
pw build -C out --watch
"""
default_gn_gen_command = [
'gn',
'gen',
'{build_dir}',
'--export-compile-commands',
]
default_gn_args: dict[str, str] = {}
default_gn_gen_command.append(gn_args(**default_gn_args))
default_targets = ['default']
if _ENABLE_FPGA_BUILD:
# Build the FPGA image, gonk tools bundle, and pip install the
# gonk_firmware package into the bootstrap venv.
default_targets += ['fpga', 'gonk_bundle', 'pip_install_gonk_firmware']
else:
_LOG.warning(
'FPGA build disabled. The following tools were not found: '
'icepack, icetime, nextpnr-ice40, yosys.'
)
default_build_steps = [
BuildCommand(
run_if=should_gn_gen_with_args(default_gn_args),
command=default_gn_gen_command,
),
BuildCommand(
build_system_command='ninja',
targets=default_targets,
),
]
build_recipes = [
BuildRecipe(
build_dir=Path('out/gn'),
title='default',
steps=default_build_steps,
),
]
# This project doesn't pass forward presubmit steps as they introduce some
# clutter that is more likely to get in the way rather than help users.
# If more comprehensive presubmit programs are added, they should be added
# to `presubmit_programs` here.
return main(
build_recipes=build_recipes,
default_build_recipe_names=['default'],
default_root_logfile=Path('out/build.txt'),
force_pw_watch=force_pw_watch,
)
def watch_project() -> int:
"""Use ``pw watch`` to build this project."""
sys.exit(build_project(force_pw_watch=True))
if __name__ == '__main__':
sys.exit(build_project())