| # Bazel build |
| |
| ## Using the Pico SDK in a Bazel project. |
| |
| ### Add pico-sdk as a dependency |
| First, in your `MODULE.bazel` file, add a dependency on the Pico SDK and |
| `rules_cc`: |
| ```python |
| bazel_dep(name = "pico-sdk", version = "2.1.0") |
| ``` |
| |
| ### Register toolchains |
| These toolchains tell Bazel how to compile for ARM cores. Add the following |
| to the `MODULE.bazel` for your project: |
| ```python |
| register_toolchains( |
| "@pico-sdk//bazel/toolchain:linux-x86_64-rp2040", |
| "@pico-sdk//bazel/toolchain:linux-x86_64-rp2350", |
| "@pico-sdk//bazel/toolchain:win-x86_64-rp2040", |
| "@pico-sdk//bazel/toolchain:win-x86_64-rp2350", |
| "@pico-sdk//bazel/toolchain:mac-x86_64-rp2040", |
| "@pico-sdk//bazel/toolchain:mac-x86_64-rp2350", |
| "@pico-sdk//bazel/toolchain:mac-aarch64-rp2040", |
| "@pico-sdk//bazel/toolchain:mac-aarch64-rp2350", |
| ) |
| ``` |
| |
| ### Ready to build! |
| You're now ready to start building Pico Projects in Bazel! When building, |
| don't forget to specify `--platforms` so Bazel knows you're targeting the |
| Raspberry Pi Pico: |
| ```console |
| $ bazelisk build --platforms=@pico-sdk//bazel/platform:rp2040 //... |
| ``` |
| |
| ## SDK configuration |
| An exhaustive list of build system configuration options is available in |
| `//bazel/config:BUILD.bazel`. |
| |
| ### Selecting a different board |
| A different board can be selected specifying `--@pico-sdk//bazel/config:PICO_BOARD`: |
| ```console |
| $ bazelisk build --platforms=//bazel/platform:rp2040 --@pico-sdk//bazel/config:PICO_BOARD=pico_w //... |
| ``` |
| |
| If you have a bespoke board definition, you can configure the Pico SDK to use it |
| by pointing `--@pico-sdk//bazel/config:PICO_CONFIG_HEADER` to a `cc_library` |
| that defines `PICO_BOARD` and either a `PICO_CONFIG_HEADER` define or a |
| `pico/config_autogen.h` header. Make sure any required `includes`, `hdrs`, and |
| `deps` are also provided. |
| |
| ## Generating UF2 firmware images |
| Creation of UF2 images can be done as explicit build steps on a per-binary |
| rule basis, or through an aspect. Running a wildcard build with the |
| `pico_uf2_aspect` enabled is the easiest way to create a UF2 for every ELF |
| firmware image. |
| |
| ```console |
| $ bazelisk build --platforms=@pico-sdk//bazel/platform:rp2040 \ |
| --aspects @pico-sdk//tools:uf2_aspect.bzl%pico_uf2_aspect \ |
| --output_groups=+pico_uf2_files \ |
| //... |
| ``` |
| |
| ## Building the Pico SDK itself |
| |
| ### First time setup |
| You'll need Bazel (v7.0.0 or higher) or Bazelisk (a self-updating Bazel |
| launcher) to build the Pico SDK. |
| |
| We strongly recommend you set up |
| [Bazelisk](https://bazel.build/install/bazelisk). |
| |
| You will also need a working compiler configured if you wish to build Picotool |
| or pioasm. |
| |
| * Linux: `sudo apt-get install build-essential` or similar. |
| * macOS: `xcode-select --install` |
| * Windows: [Install MSVC](https://visualstudio.microsoft.com/vs/features/cplusplus/) |
| |
| ### Building |
| To build all of the Pico SDK, run the following command: |
| ```console |
| $ bazelisk build --platforms=//bazel/platform:rp2040 //... |
| ``` |
| |
| ## Known issues and limitations |
| The Bazel build for the Pico SDK is relatively new, but most features and |
| configuration options available in the CMake build are also available in Bazel. |
| You are welcome and encouraged to file issues for any problems and limitations |
| you encounter along the way. |
| |
| Currently, the following features are not supported: |
| |
| * Pico W wireless libraries work, but may not have complete feature parity with |
| the CMake build. |
| * Bazel does not yet provide RISC-V support for Pico 2/RP2350. |
| * The pioasm parser cannot be built from source via Bazel. |
| * Windows MSVC wildcard build (`bazel build //...`) does not work when targeting |
| host. |
| |
| ## Contributing |
| When making changes to the Bazel build, please run the Bazel validation script |
| to ensure all supported configurations build properly: |
| |
| ```console |
| $ ./tools/run_all_bazel_checks.py |
| ``` |
| |
| If you need to check against a local version of Picotool, you can run the script |
| with `--picotool-dir`: |
| |
| ```console |
| $ ./tools/run_all_bazel_checks.py --picotool-dir=/path/to/picotool |
| ``` |