.. _docs-bazel-integration: =================================================== Using a Pigweed module in an existing Bazel project =================================================== This guide explains how to start using a Pigweed module in your existing Bazel-based C or C++ project. We'll assume you're familiar with the build system at the level of the `Bazel tutorial `__. ------------------------------------- Add Pigweed as a WORKSPACE dependency ------------------------------------- Add Pigweed as a `git_repository `__ in your ``WORKSPACE``: .. code-block:: python git_repository( name = "pigweed", commit = "c00e9e430addee0c8add16c32eb6d8ab94189b9e", remote = "https://pigweed.googlesource.com/pigweed/pigweed.git", ) (You can find the latest tip-of-tree commit in the History tab in `CodeSearch `__.) If you manage your dependencies as submodules, you can add Pigweed as a submodule, too, and then add it to the ``WORKSPACE`` as a `local_repository `__: .. code-block:: python local_repository( name = "pigweed", path = "third_party/pigweed", ) We don't yet publish releases that could be pulled in using `http_archive `__. We don't support `bzlmod `__ yet. See http://pwbug.dev/258836641. If either of these limitations is important to you, please reach out to us on `chat `__. --------------------------- Use Pigweed in your project --------------------------- Let's say you want to use ``pw::Vector`` from :ref:`module-pw_containers`, our embedded-friendly replacement for ``std::vector``. #. Include the header you want in your code: .. code-block:: cpp #include "pw_containers/vector.h" #. Look at the module's `build file `__ to figure out which build target you need to provide the header and implementation. For ``pw_containers/vector.h``, it's ``//pw_containers:vector``. #. Add this target to the ``deps`` of your `cc_library `__ or `cc_binary `__: .. code-block:: python cc_library( name = "my_library", srcs = ["my_library.cc"], hdrs = ["my_library.h"], deps = [ "@pigweed//pw_containers:vector", # <-- The new dependency ], ) #. Add a dependency on ``@pigweed//pw_build:default_link_extra_lib`` to your final *binary* target. See :ref:`docs-build_system-bazel_link-extra-lib` for a discussion of why this is necessary, and what the alternatives are. .. code-block:: python cc_binary( name = "my_binary", srcs = ["my_binary.cc"], deps = [ ":my_library", "@pigweed//pw_build:default_link_extra_lib", # <-- The new dependency ], ) -------------------------------------------- Configure backends for facades you depend on -------------------------------------------- Pigweed makes extensive use of :ref:`docs-facades`, and any module you choose to use will likely have a transitive dependency on some facade (typically :ref:`module-pw_assert` or :ref:`module-pw_log`). Continuing with our example, ``pw::Vector`` depends on :ref:`module-pw_assert`. In Bazel, facades already have a default backend (implementation) that works for host builds (builds targeting your local development machine). But to build a binary for your embedded target, you'll need to select a suitable backend yourself. Fortunately, the default backend for :ref:`module-pw_assert` is :ref:`module-pw_assert_basic`, which is a suitable place to start for most embedded targets, too. But it depends on :ref:`module-pw_sys_io`, another facade for which you *will* have to choose a backend yourself. The simplest way to do so is to set the corresponding `label flag `__ when invoking Bazel. For example, to use the :ref:`module-pw_sys_io_baremetal_stm32f429` backend for :ref:`module-pw_sys_io` provided in upstream Pigweed: .. code-block:: console $ bazel build \ --@pigweed//targets/pw_sys_io_backend=@pigweed//pw_sys_io_baremetal_stm32f429 \ //path/to/your:target You can also define backends within your own project. (If Pigweed doesn't include a :ref:`module-pw_sys_io` backend suitable for your embedded platform, that's what you should do now.) See :ref:`docs-build_system-bazel_configuration` for a tutorial that dives deeper into facade configuration with Bazel.