| # 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()) |