xref: /aosp_15_r20/external/pigweed/pw_build/bazel.rst (revision 61c4878ac05f98d0ceed94b57d316916de578985)
1*61c4878aSAndroid Build Coastguard Worker.. _module-pw_build-bazel:
2*61c4878aSAndroid Build Coastguard Worker
3*61c4878aSAndroid Build Coastguard WorkerBazel
4*61c4878aSAndroid Build Coastguard Worker=====
5*61c4878aSAndroid Build Coastguard Worker.. pigweed-module-subpage::
6*61c4878aSAndroid Build Coastguard Worker   :name: pw_build
7*61c4878aSAndroid Build Coastguard Worker
8*61c4878aSAndroid Build Coastguard WorkerBazel is currently very experimental, and only builds for host and ARM Cortex-M
9*61c4878aSAndroid Build Coastguard Workermicrocontrollers.
10*61c4878aSAndroid Build Coastguard Worker
11*61c4878aSAndroid Build Coastguard Worker.. _module-pw_build-bazel-wrapper-rules:
12*61c4878aSAndroid Build Coastguard Worker
13*61c4878aSAndroid Build Coastguard WorkerWrapper rules
14*61c4878aSAndroid Build Coastguard Worker-------------
15*61c4878aSAndroid Build Coastguard WorkerThe common configuration for Bazel for all modules is in the ``pigweed.bzl``
16*61c4878aSAndroid Build Coastguard Workerfile. The built-in Bazel rules ``cc_binary``, ``cc_test``, ``py_binary`` and
17*61c4878aSAndroid Build Coastguard Worker``py_test`` are wrapped with ``pw_cc_binary``, ``pw_cc_test`` ``pw_py_binary``
18*61c4878aSAndroid Build Coastguard Workerand ``pw_py_test``, respectively.
19*61c4878aSAndroid Build Coastguard Worker
20*61c4878aSAndroid Build Coastguard Worker.. _module-pw_build-bazel-pw_linker_script:
21*61c4878aSAndroid Build Coastguard Worker
22*61c4878aSAndroid Build Coastguard Workerpw_linker_script
23*61c4878aSAndroid Build Coastguard Worker----------------
24*61c4878aSAndroid Build Coastguard WorkerIn addition to wrapping the built-in rules, Pigweed also provides a custom
25*61c4878aSAndroid Build Coastguard Workerrule for handling linker scripts with Bazel. e.g.
26*61c4878aSAndroid Build Coastguard Worker
27*61c4878aSAndroid Build Coastguard Worker.. code-block:: python
28*61c4878aSAndroid Build Coastguard Worker
29*61c4878aSAndroid Build Coastguard Worker   pw_linker_script(
30*61c4878aSAndroid Build Coastguard Worker     name = "some_linker_script",
31*61c4878aSAndroid Build Coastguard Worker     linker_script = ":some_configurable_linker_script.ld",
32*61c4878aSAndroid Build Coastguard Worker     defines = [
33*61c4878aSAndroid Build Coastguard Worker         "PW_BOOT_FLASH_BEGIN=0x08000200",
34*61c4878aSAndroid Build Coastguard Worker         "PW_BOOT_FLASH_SIZE=1024K",
35*61c4878aSAndroid Build Coastguard Worker         "PW_BOOT_HEAP_SIZE=112K",
36*61c4878aSAndroid Build Coastguard Worker         "PW_BOOT_MIN_STACK_SIZE=1K",
37*61c4878aSAndroid Build Coastguard Worker         "PW_BOOT_RAM_BEGIN=0x20000000",
38*61c4878aSAndroid Build Coastguard Worker         "PW_BOOT_RAM_SIZE=192K",
39*61c4878aSAndroid Build Coastguard Worker         "PW_BOOT_VECTOR_TABLE_BEGIN=0x08000000",
40*61c4878aSAndroid Build Coastguard Worker         "PW_BOOT_VECTOR_TABLE_SIZE=512",
41*61c4878aSAndroid Build Coastguard Worker     ],
42*61c4878aSAndroid Build Coastguard Worker     deps = [":some_header_library"],
43*61c4878aSAndroid Build Coastguard Worker   )
44*61c4878aSAndroid Build Coastguard Worker
45*61c4878aSAndroid Build Coastguard Worker   # You can include headers provided by targets specified in deps.
46*61c4878aSAndroid Build Coastguard Worker   cc_library(
47*61c4878aSAndroid Build Coastguard Worker     name = "some_header_library",
48*61c4878aSAndroid Build Coastguard Worker     hdrs = ["test_header.h"],
49*61c4878aSAndroid Build Coastguard Worker     includes = ["."],
50*61c4878aSAndroid Build Coastguard Worker   )
51*61c4878aSAndroid Build Coastguard Worker
52*61c4878aSAndroid Build Coastguard Worker   # You can include the linker script in the deps.
53*61c4878aSAndroid Build Coastguard Worker   cc_binary(
54*61c4878aSAndroid Build Coastguard Worker     name = "some_binary",
55*61c4878aSAndroid Build Coastguard Worker     srcs = ["some_source.cc"],
56*61c4878aSAndroid Build Coastguard Worker     deps = [":some_linker_script"],
57*61c4878aSAndroid Build Coastguard Worker   )
58*61c4878aSAndroid Build Coastguard Worker
59*61c4878aSAndroid Build Coastguard Worker   # Alternatively, you can use additional_linker_inputs and linkopts. This
60*61c4878aSAndroid Build Coastguard Worker   # allows you to explicitly specify the command line order of linker scripts,
61*61c4878aSAndroid Build Coastguard Worker   # and may be useful if your project defines more than one.
62*61c4878aSAndroid Build Coastguard Worker   cc_binary(
63*61c4878aSAndroid Build Coastguard Worker     name = "some_binary",
64*61c4878aSAndroid Build Coastguard Worker     srcs = ["some_source.cc"],
65*61c4878aSAndroid Build Coastguard Worker     additional_linker_inputs = [":some_linker_script"],
66*61c4878aSAndroid Build Coastguard Worker     linkopts = ["-T $(location :some_linker_script)"],
67*61c4878aSAndroid Build Coastguard Worker   )
68*61c4878aSAndroid Build Coastguard Worker
69*61c4878aSAndroid Build Coastguard Worker.. _module-pw_build-bazel-pw_facade:
70*61c4878aSAndroid Build Coastguard Worker
71*61c4878aSAndroid Build Coastguard Workerpw_facade
72*61c4878aSAndroid Build Coastguard Worker---------
73*61c4878aSAndroid Build Coastguard WorkerIn Bazel, a :ref:`facade <docs-module-structure-facades>` module has a few
74*61c4878aSAndroid Build Coastguard Workercomponents:
75*61c4878aSAndroid Build Coastguard Worker
76*61c4878aSAndroid Build Coastguard Worker#. The **facade target**, i.e. the interface to the module. This is what
77*61c4878aSAndroid Build Coastguard Worker   *backend implementations* depend on to know what interface they're supposed
78*61c4878aSAndroid Build Coastguard Worker   to implement.
79*61c4878aSAndroid Build Coastguard Worker
80*61c4878aSAndroid Build Coastguard Worker#. The **library target**, i.e. both the facade (interface) and backend
81*61c4878aSAndroid Build Coastguard Worker   (implementation). This is what *users of the module* depend on. It's a
82*61c4878aSAndroid Build Coastguard Worker   regular ``cc_library`` that exposes the same headers as the facade, but
83*61c4878aSAndroid Build Coastguard Worker   has a dependency on the "backend label flag" (discussed next). It may also
84*61c4878aSAndroid Build Coastguard Worker   include some source files (if these are backend-independent).
85*61c4878aSAndroid Build Coastguard Worker
86*61c4878aSAndroid Build Coastguard Worker   Both the facade and library targets are created using the
87*61c4878aSAndroid Build Coastguard Worker   ``pw_facade`` macro. For example, consider the following
88*61c4878aSAndroid Build Coastguard Worker   macro invocation:
89*61c4878aSAndroid Build Coastguard Worker
90*61c4878aSAndroid Build Coastguard Worker   .. code-block:: python
91*61c4878aSAndroid Build Coastguard Worker
92*61c4878aSAndroid Build Coastguard Worker      pw_facade(
93*61c4878aSAndroid Build Coastguard Worker          name = "binary_semaphore",
94*61c4878aSAndroid Build Coastguard Worker          # A backend-independent source file.
95*61c4878aSAndroid Build Coastguard Worker          srcs = [
96*61c4878aSAndroid Build Coastguard Worker              "binary_semaphore.cc",
97*61c4878aSAndroid Build Coastguard Worker          ],
98*61c4878aSAndroid Build Coastguard Worker          # The facade header.
99*61c4878aSAndroid Build Coastguard Worker          hdrs = [
100*61c4878aSAndroid Build Coastguard Worker              "public/pw_sync/binary_semaphore.h",
101*61c4878aSAndroid Build Coastguard Worker          ],
102*61c4878aSAndroid Build Coastguard Worker          # Dependencies of this header.
103*61c4878aSAndroid Build Coastguard Worker          deps = [
104*61c4878aSAndroid Build Coastguard Worker              "//pw_chrono:system_clock",
105*61c4878aSAndroid Build Coastguard Worker              "//pw_preprocessor",
106*61c4878aSAndroid Build Coastguard Worker          ],
107*61c4878aSAndroid Build Coastguard Worker          # The backend, hidden behind a label_flag; see below.
108*61c4878aSAndroid Build Coastguard Worker          backend = [
109*61c4878aSAndroid Build Coastguard Worker              ":binary_semaphore_backend",
110*61c4878aSAndroid Build Coastguard Worker          ],
111*61c4878aSAndroid Build Coastguard Worker      )
112*61c4878aSAndroid Build Coastguard Worker
113*61c4878aSAndroid Build Coastguard Worker   This macro expands to both the library target, named ``binary_semaphore``,
114*61c4878aSAndroid Build Coastguard Worker   and the facade target, named ``binary_semaphore.facade``.
115*61c4878aSAndroid Build Coastguard Worker
116*61c4878aSAndroid Build Coastguard Worker#. The **backend label flag**. This is a `label_flag
117*61c4878aSAndroid Build Coastguard Worker   <https://bazel.build/extending/config#label-typed-build-settings>`_: a
118*61c4878aSAndroid Build Coastguard Worker   dependency edge in the build graph that can be overridden by downstream projects.
119*61c4878aSAndroid Build Coastguard Worker
120*61c4878aSAndroid Build Coastguard Worker#. The **backend target** implements a particular backend for a facade. It's
121*61c4878aSAndroid Build Coastguard Worker   just a plain ``cc_library``, with a dependency on the facade target. For example,
122*61c4878aSAndroid Build Coastguard Worker
123*61c4878aSAndroid Build Coastguard Worker   .. code-block:: python
124*61c4878aSAndroid Build Coastguard Worker
125*61c4878aSAndroid Build Coastguard Worker      cc_library(
126*61c4878aSAndroid Build Coastguard Worker          name = "binary_semaphore",
127*61c4878aSAndroid Build Coastguard Worker          srcs = [
128*61c4878aSAndroid Build Coastguard Worker              "binary_semaphore.cc",
129*61c4878aSAndroid Build Coastguard Worker          ],
130*61c4878aSAndroid Build Coastguard Worker          hdrs = [
131*61c4878aSAndroid Build Coastguard Worker              "public/pw_sync_stl/binary_semaphore_inline.h",
132*61c4878aSAndroid Build Coastguard Worker              "public/pw_sync_stl/binary_semaphore_native.h",
133*61c4878aSAndroid Build Coastguard Worker              "public_overrides/pw_sync_backend/binary_semaphore_inline.h",
134*61c4878aSAndroid Build Coastguard Worker              "public_overrides/pw_sync_backend/binary_semaphore_native.h",
135*61c4878aSAndroid Build Coastguard Worker          ],
136*61c4878aSAndroid Build Coastguard Worker          includes = [
137*61c4878aSAndroid Build Coastguard Worker              "public",
138*61c4878aSAndroid Build Coastguard Worker              "public_overrides",
139*61c4878aSAndroid Build Coastguard Worker          ],
140*61c4878aSAndroid Build Coastguard Worker          deps = [
141*61c4878aSAndroid Build Coastguard Worker              # Dependencies of the backend's headers and sources.
142*61c4878aSAndroid Build Coastguard Worker              "//pw_assert",
143*61c4878aSAndroid Build Coastguard Worker              "//pw_chrono:system_clock",
144*61c4878aSAndroid Build Coastguard Worker              # A dependency on the facade target, which defines the interface
145*61c4878aSAndroid Build Coastguard Worker              # this backend target implements.
146*61c4878aSAndroid Build Coastguard Worker              "//pw_sync:binary_semaphore.facade",
147*61c4878aSAndroid Build Coastguard Worker          ],
148*61c4878aSAndroid Build Coastguard Worker      )
149*61c4878aSAndroid Build Coastguard Worker
150*61c4878aSAndroid Build Coastguard WorkerThe backend label flag should point at the backend target. Typically, the
151*61c4878aSAndroid Build Coastguard Workerbackend you want to use depends on the platform you are building for. See the
152*61c4878aSAndroid Build Coastguard Worker:ref:`docs-build_system-bazel_configuration` for advice on how to set this up.
153*61c4878aSAndroid Build Coastguard Worker
154*61c4878aSAndroid Build Coastguard Workerpw_cc_blob_library
155*61c4878aSAndroid Build Coastguard Worker------------------
156*61c4878aSAndroid Build Coastguard WorkerThe ``pw_cc_blob_library`` rule is useful for embedding binary data into a
157*61c4878aSAndroid Build Coastguard Workerprogram. The rule takes in a mapping of symbol names to file paths, and
158*61c4878aSAndroid Build Coastguard Workergenerates a set of C++ source and header files that embed the contents of the
159*61c4878aSAndroid Build Coastguard Workerpassed-in files as arrays of ``std::byte``.
160*61c4878aSAndroid Build Coastguard Worker
161*61c4878aSAndroid Build Coastguard WorkerThe blob byte arrays are constant initialized and are safe to access at any
162*61c4878aSAndroid Build Coastguard Workertime, including before ``main()``.
163*61c4878aSAndroid Build Coastguard Worker
164*61c4878aSAndroid Build Coastguard Worker``pw_cc_blob_library`` is also available in the :ref:`GN <module-pw_build-cc_blob_library>`
165*61c4878aSAndroid Build Coastguard Workerand CMake builds.
166*61c4878aSAndroid Build Coastguard Worker
167*61c4878aSAndroid Build Coastguard WorkerArguments
168*61c4878aSAndroid Build Coastguard Worker^^^^^^^^^
169*61c4878aSAndroid Build Coastguard Worker* ``blobs``: A list of ``pw_cc_blob_info`` targets, where each target
170*61c4878aSAndroid Build Coastguard Worker  corresponds to a binary blob to be transformed from file to byte array. This
171*61c4878aSAndroid Build Coastguard Worker  is a required field. ``pw_cc_blob_info`` attributes include:
172*61c4878aSAndroid Build Coastguard Worker
173*61c4878aSAndroid Build Coastguard Worker  * ``symbol_name``: The C++ symbol for the byte array.
174*61c4878aSAndroid Build Coastguard Worker  * ``file_path``: The file path for the binary blob.
175*61c4878aSAndroid Build Coastguard Worker  * ``linker_section``: If present, places the byte array in the specified
176*61c4878aSAndroid Build Coastguard Worker    linker section.
177*61c4878aSAndroid Build Coastguard Worker  * ``alignas``: If present, uses the specified string verbatim in
178*61c4878aSAndroid Build Coastguard Worker    the ``alignas()`` specifier for the byte array.
179*61c4878aSAndroid Build Coastguard Worker
180*61c4878aSAndroid Build Coastguard Worker* ``out_header``: The header file to generate. Users will include this file
181*61c4878aSAndroid Build Coastguard Worker  exactly as it is written here to reference the byte arrays.
182*61c4878aSAndroid Build Coastguard Worker* ``namespace``: C++ namespace to place the generated blobs within.
183*61c4878aSAndroid Build Coastguard Worker* ``alwayslink``: Whether this library should always be linked. Defaults to false.
184*61c4878aSAndroid Build Coastguard Worker
185*61c4878aSAndroid Build Coastguard WorkerExample
186*61c4878aSAndroid Build Coastguard Worker^^^^^^^
187*61c4878aSAndroid Build Coastguard Worker**BUILD.bazel**
188*61c4878aSAndroid Build Coastguard Worker
189*61c4878aSAndroid Build Coastguard Worker.. code-block:: python
190*61c4878aSAndroid Build Coastguard Worker
191*61c4878aSAndroid Build Coastguard Worker   pw_cc_blob_info(
192*61c4878aSAndroid Build Coastguard Worker     name = "foo_blob",
193*61c4878aSAndroid Build Coastguard Worker     file_path = "foo.bin",
194*61c4878aSAndroid Build Coastguard Worker     symbol_name = "kFooBlob",
195*61c4878aSAndroid Build Coastguard Worker   )
196*61c4878aSAndroid Build Coastguard Worker
197*61c4878aSAndroid Build Coastguard Worker   pw_cc_blob_info(
198*61c4878aSAndroid Build Coastguard Worker     name = "bar_blob",
199*61c4878aSAndroid Build Coastguard Worker     file_path = "bar.bin",
200*61c4878aSAndroid Build Coastguard Worker     symbol_name = "kBarBlob",
201*61c4878aSAndroid Build Coastguard Worker     linker_section = ".bar_section",
202*61c4878aSAndroid Build Coastguard Worker   )
203*61c4878aSAndroid Build Coastguard Worker
204*61c4878aSAndroid Build Coastguard Worker   pw_cc_blob_library(
205*61c4878aSAndroid Build Coastguard Worker     name = "foo_bar_blobs",
206*61c4878aSAndroid Build Coastguard Worker     blobs = [
207*61c4878aSAndroid Build Coastguard Worker       ":foo_blob",
208*61c4878aSAndroid Build Coastguard Worker       ":bar_blob",
209*61c4878aSAndroid Build Coastguard Worker     ],
210*61c4878aSAndroid Build Coastguard Worker     out_header = "my/stuff/foo_bar_blobs.h",
211*61c4878aSAndroid Build Coastguard Worker     namespace = "my::stuff",
212*61c4878aSAndroid Build Coastguard Worker   )
213*61c4878aSAndroid Build Coastguard Worker
214*61c4878aSAndroid Build Coastguard Worker.. note:: If the binary blobs are generated as part of the build, be sure to
215*61c4878aSAndroid Build Coastguard Worker          list them as deps to the pw_cc_blob_library target.
216*61c4878aSAndroid Build Coastguard Worker
217*61c4878aSAndroid Build Coastguard Worker**Generated Header**
218*61c4878aSAndroid Build Coastguard Worker
219*61c4878aSAndroid Build Coastguard Worker.. code-block::
220*61c4878aSAndroid Build Coastguard Worker
221*61c4878aSAndroid Build Coastguard Worker   #pragma once
222*61c4878aSAndroid Build Coastguard Worker
223*61c4878aSAndroid Build Coastguard Worker   #include <array>
224*61c4878aSAndroid Build Coastguard Worker   #include <cstddef>
225*61c4878aSAndroid Build Coastguard Worker
226*61c4878aSAndroid Build Coastguard Worker   namespace my::stuff {
227*61c4878aSAndroid Build Coastguard Worker
228*61c4878aSAndroid Build Coastguard Worker   extern const std::array<std::byte, 100> kFooBlob;
229*61c4878aSAndroid Build Coastguard Worker
230*61c4878aSAndroid Build Coastguard Worker   extern const std::array<std::byte, 50> kBarBlob;
231*61c4878aSAndroid Build Coastguard Worker
232*61c4878aSAndroid Build Coastguard Worker   }  // namespace my::stuff
233*61c4878aSAndroid Build Coastguard Worker
234*61c4878aSAndroid Build Coastguard Worker**Generated Source**
235*61c4878aSAndroid Build Coastguard Worker
236*61c4878aSAndroid Build Coastguard Worker.. code-block::
237*61c4878aSAndroid Build Coastguard Worker
238*61c4878aSAndroid Build Coastguard Worker   #include "my/stuff/foo_bar_blobs.h"
239*61c4878aSAndroid Build Coastguard Worker
240*61c4878aSAndroid Build Coastguard Worker   #include <array>
241*61c4878aSAndroid Build Coastguard Worker   #include <cstddef>
242*61c4878aSAndroid Build Coastguard Worker
243*61c4878aSAndroid Build Coastguard Worker   #include "pw_preprocessor/compiler.h"
244*61c4878aSAndroid Build Coastguard Worker
245*61c4878aSAndroid Build Coastguard Worker   namespace my::stuff {
246*61c4878aSAndroid Build Coastguard Worker
247*61c4878aSAndroid Build Coastguard Worker   const std::array<std::byte, 100> kFooBlob = { ... };
248*61c4878aSAndroid Build Coastguard Worker
249*61c4878aSAndroid Build Coastguard Worker   PW_PLACE_IN_SECTION(".bar_section")
250*61c4878aSAndroid Build Coastguard Worker   const std::array<std::byte, 50> kBarBlob = { ... };
251*61c4878aSAndroid Build Coastguard Worker
252*61c4878aSAndroid Build Coastguard Worker   }  // namespace my::stuff
253*61c4878aSAndroid Build Coastguard Worker
254*61c4878aSAndroid Build Coastguard Worker.. _module-pw_build-bazel-pw_cc_binary_with_map:
255*61c4878aSAndroid Build Coastguard Worker
256*61c4878aSAndroid Build Coastguard Workerpw_cc_binary_with_map
257*61c4878aSAndroid Build Coastguard Worker---------------------
258*61c4878aSAndroid Build Coastguard WorkerThe ``pw_cc_binary_with_map`` rule can be used to build a binary like
259*61c4878aSAndroid Build Coastguard Worker``cc_binary`` does but also generate a .map file from the linking step.
260*61c4878aSAndroid Build Coastguard Worker
261*61c4878aSAndroid Build Coastguard Worker.. code-block:: python
262*61c4878aSAndroid Build Coastguard Worker
263*61c4878aSAndroid Build Coastguard Worker   pw_cc_binary_with_map(
264*61c4878aSAndroid Build Coastguard Worker     name = "test",
265*61c4878aSAndroid Build Coastguard Worker     srcs = ["empty_main.cc"],
266*61c4878aSAndroid Build Coastguard Worker   )
267*61c4878aSAndroid Build Coastguard Worker
268*61c4878aSAndroid Build Coastguard WorkerThis should result in a ``test.map`` file generated next to the ``test`` binary.
269*61c4878aSAndroid Build Coastguard Worker
270*61c4878aSAndroid Build Coastguard WorkerNote that it's only partially compatible with the ``cc_binary`` interface and
271*61c4878aSAndroid Build Coastguard Workercertain things are not implemented like make variable substitution.
272*61c4878aSAndroid Build Coastguard Worker
273*61c4878aSAndroid Build Coastguard Worker.. _module-pw_build-bazel-pw_elf_to_bin:
274*61c4878aSAndroid Build Coastguard Worker
275*61c4878aSAndroid Build Coastguard Workerpw_elf_to_bin
276*61c4878aSAndroid Build Coastguard Worker-------------
277*61c4878aSAndroid Build Coastguard WorkerThe ``pw_elf_to_bin`` rule takes in a binary executable target and produces a
278*61c4878aSAndroid Build Coastguard Workerfile using the ``-Obinary`` option to ``objcopy``. This is only suitable for use
279*61c4878aSAndroid Build Coastguard Workerwith binaries where all the segments are non-overlapping. A common use case for
280*61c4878aSAndroid Build Coastguard Workerthis type of file is booting directly on hardware with no bootloader.
281*61c4878aSAndroid Build Coastguard Worker
282*61c4878aSAndroid Build Coastguard Worker.. code-block:: python
283*61c4878aSAndroid Build Coastguard Worker
284*61c4878aSAndroid Build Coastguard Worker   load("@pigweed//pw_build:binary_tools.bzl", "pw_elf_to_bin")
285*61c4878aSAndroid Build Coastguard Worker
286*61c4878aSAndroid Build Coastguard Worker   pw_elf_to_bin(
287*61c4878aSAndroid Build Coastguard Worker     name = "bin",
288*61c4878aSAndroid Build Coastguard Worker     elf_input = ":main",
289*61c4878aSAndroid Build Coastguard Worker     bin_out = "main.bin",
290*61c4878aSAndroid Build Coastguard Worker   )
291*61c4878aSAndroid Build Coastguard Worker
292*61c4878aSAndroid Build Coastguard Worker.. _module-pw_build-bazel-pw_elf_to_dump:
293*61c4878aSAndroid Build Coastguard Worker
294*61c4878aSAndroid Build Coastguard Workerpw_elf_to_dump
295*61c4878aSAndroid Build Coastguard Worker--------------
296*61c4878aSAndroid Build Coastguard WorkerThe ``pw_elf_to_dump`` rule takes in a binary executable target and produces a
297*61c4878aSAndroid Build Coastguard Workertext file containing the output of the toolchain's ``objdump -xd`` command. This
298*61c4878aSAndroid Build Coastguard Workercontains the full binary layout, symbol table and disassembly which is often
299*61c4878aSAndroid Build Coastguard Workeruseful when debugging embedded firmware.
300*61c4878aSAndroid Build Coastguard Worker
301*61c4878aSAndroid Build Coastguard Worker.. code-block:: python
302*61c4878aSAndroid Build Coastguard Worker
303*61c4878aSAndroid Build Coastguard Worker   load("@pigweed//pw_build:binary_tools.bzl", "pw_elf_to_dump")
304*61c4878aSAndroid Build Coastguard Worker
305*61c4878aSAndroid Build Coastguard Worker   pw_elf_to_dump(
306*61c4878aSAndroid Build Coastguard Worker     name = "dump",
307*61c4878aSAndroid Build Coastguard Worker     elf_input = ":main",
308*61c4878aSAndroid Build Coastguard Worker     dump_out = "main.dump",
309*61c4878aSAndroid Build Coastguard Worker   )
310*61c4878aSAndroid Build Coastguard Worker
311*61c4878aSAndroid Build Coastguard Workerpw_copy_and_patch_file
312*61c4878aSAndroid Build Coastguard Worker----------------------
313*61c4878aSAndroid Build Coastguard WorkerProvides the ability to patch a file as part of the build.
314*61c4878aSAndroid Build Coastguard Worker
315*61c4878aSAndroid Build Coastguard WorkerThe source file will not be patched in place, but instead copied before
316*61c4878aSAndroid Build Coastguard Workerpatching. The output of this target will be the patched file.
317*61c4878aSAndroid Build Coastguard Worker
318*61c4878aSAndroid Build Coastguard WorkerArguments
319*61c4878aSAndroid Build Coastguard Worker^^^^^^^^^
320*61c4878aSAndroid Build Coastguard Worker- ``name``: The name of the target.
321*61c4878aSAndroid Build Coastguard Worker
322*61c4878aSAndroid Build Coastguard Worker- ``source``: The source file to be patched.
323*61c4878aSAndroid Build Coastguard Worker
324*61c4878aSAndroid Build Coastguard Worker- ``out``: The output file containing the patched contents.
325*61c4878aSAndroid Build Coastguard Worker
326*61c4878aSAndroid Build Coastguard Worker- ``patch_file``: The patch file.
327*61c4878aSAndroid Build Coastguard Worker
328*61c4878aSAndroid Build Coastguard WorkerExample
329*61c4878aSAndroid Build Coastguard Worker^^^^^^^
330*61c4878aSAndroid Build Coastguard Worker
331*61c4878aSAndroid Build Coastguard WorkerTo apply the patch `changes.patch` to the file `data/file.txt` which is located
332*61c4878aSAndroid Build Coastguard Workerin the bazel dependency `@external-sdk//`.
333*61c4878aSAndroid Build Coastguard Worker
334*61c4878aSAndroid Build Coastguard Worker.. code-block::
335*61c4878aSAndroid Build Coastguard Worker
336*61c4878aSAndroid Build Coastguard Worker   pw_copy_and_patch_file(
337*61c4878aSAndroid Build Coastguard Worker       name = "apply_patch",
338*61c4878aSAndroid Build Coastguard Worker       src = "@external-sdk//data/file.txt",
339*61c4878aSAndroid Build Coastguard Worker       out = "data/patched_file.txt",
340*61c4878aSAndroid Build Coastguard Worker       patch_file = "changes.patch",
341*61c4878aSAndroid Build Coastguard Worker   )
342*61c4878aSAndroid Build Coastguard Worker
343*61c4878aSAndroid Build Coastguard Worker
344*61c4878aSAndroid Build Coastguard WorkerPlatform compatibility rules
345*61c4878aSAndroid Build Coastguard Worker----------------------------
346*61c4878aSAndroid Build Coastguard WorkerMacros and rules related to platform compatibility are provided in
347*61c4878aSAndroid Build Coastguard Worker``//pw_build:compatibility.bzl``.
348*61c4878aSAndroid Build Coastguard Worker
349*61c4878aSAndroid Build Coastguard Worker.. _module-pw_build-bazel-boolean_constraint_value:
350*61c4878aSAndroid Build Coastguard Worker
351*61c4878aSAndroid Build Coastguard Workerboolean_constraint_value
352*61c4878aSAndroid Build Coastguard Worker^^^^^^^^^^^^^^^^^^^^^^^^
353*61c4878aSAndroid Build Coastguard WorkerThis macro is syntactic sugar for declaring a `constraint setting
354*61c4878aSAndroid Build Coastguard Worker<https://bazel.build/reference/be/platforms-and-toolchains#constraint_setting>`__
355*61c4878aSAndroid Build Coastguard Workerwith just two possible `constraint values
356*61c4878aSAndroid Build Coastguard Worker<https://bazel.build/reference/be/platforms-and-toolchains#constraint_value>`__.
357*61c4878aSAndroid Build Coastguard WorkerThe only exposed target is the ``constraint_value`` corresponding to ``True``;
358*61c4878aSAndroid Build Coastguard Workerthe default value of the setting is ``False``.
359*61c4878aSAndroid Build Coastguard Worker
360*61c4878aSAndroid Build Coastguard WorkerThis macro is meant to simplify declaring
361*61c4878aSAndroid Build Coastguard Worker:ref:`docs-bazel-compatibility-module-specific`.
362*61c4878aSAndroid Build Coastguard Worker
363*61c4878aSAndroid Build Coastguard Workerhost_backend_alias
364*61c4878aSAndroid Build Coastguard Worker^^^^^^^^^^^^^^^^^^
365*61c4878aSAndroid Build Coastguard WorkerAn alias that resolves to the backend for host platforms. This is useful when
366*61c4878aSAndroid Build Coastguard Workerdeclaring a facade that provides a default backend for host platform use.
367*61c4878aSAndroid Build Coastguard Worker
368*61c4878aSAndroid Build Coastguard WorkerFlag merging rules
369*61c4878aSAndroid Build Coastguard Worker------------------
370*61c4878aSAndroid Build Coastguard WorkerMacros that help with using platform-based flags are in
371*61c4878aSAndroid Build Coastguard Worker``//pw_build:merge_flags.bzl``. These are useful, for example, when you wish to
372*61c4878aSAndroid Build Coastguard Worker:ref:`docs-bazel-compatibility-facade-backend-dict`.
373*61c4878aSAndroid Build Coastguard Worker
374*61c4878aSAndroid Build Coastguard WorkerMiscellaneous utilities
375*61c4878aSAndroid Build Coastguard Worker-----------------------
376*61c4878aSAndroid Build Coastguard Worker
377*61c4878aSAndroid Build Coastguard Worker.. _module-pw_build-bazel-empty_cc_library:
378*61c4878aSAndroid Build Coastguard Worker
379*61c4878aSAndroid Build Coastguard Workerempty_cc_library
380*61c4878aSAndroid Build Coastguard Worker^^^^^^^^^^^^^^^^
381*61c4878aSAndroid Build Coastguard WorkerThis empty library is used as a placeholder for label flags that need to point
382*61c4878aSAndroid Build Coastguard Workerto a library of some kind, but don't actually need the dependency to amount to
383*61c4878aSAndroid Build Coastguard Workeranything.
384*61c4878aSAndroid Build Coastguard Worker
385*61c4878aSAndroid Build Coastguard Workerdefault_link_extra_lib
386*61c4878aSAndroid Build Coastguard Worker^^^^^^^^^^^^^^^^^^^^^^
387*61c4878aSAndroid Build Coastguard WorkerThis library groups together all libraries commonly required at link time by
388*61c4878aSAndroid Build Coastguard WorkerPigweed modules. See :ref:`docs-build_system-bazel_link-extra-lib` for more
389*61c4878aSAndroid Build Coastguard Workerdetails.
390*61c4878aSAndroid Build Coastguard Worker
391*61c4878aSAndroid Build Coastguard Workerunspecified_backend
392*61c4878aSAndroid Build Coastguard Worker^^^^^^^^^^^^^^^^^^^
393*61c4878aSAndroid Build Coastguard WorkerA special target used instead of a cc_library as the default condition in
394*61c4878aSAndroid Build Coastguard Workerbackend multiplexer select statements to signal that a facade is in an
395*61c4878aSAndroid Build Coastguard Workerunconfigured state. This produces better error messages than e.g. using an
396*61c4878aSAndroid Build Coastguard Workerinvalid label.
397*61c4878aSAndroid Build Coastguard Worker
398*61c4878aSAndroid Build Coastguard Workerglob_dirs
399*61c4878aSAndroid Build Coastguard Worker^^^^^^^^^
400*61c4878aSAndroid Build Coastguard WorkerA starlark helper for performing ``glob()`` operations strictly on directories.
401*61c4878aSAndroid Build Coastguard Worker
402*61c4878aSAndroid Build Coastguard Worker.. py:function:: glob_dirs(include: List[str], exclude: List[str] = [], allow_empty: bool = True) -> List[str]
403*61c4878aSAndroid Build Coastguard Worker
404*61c4878aSAndroid Build Coastguard Worker   Matches the provided glob pattern to identify a list of directories.
405*61c4878aSAndroid Build Coastguard Worker
406*61c4878aSAndroid Build Coastguard Worker   This helper follows the same semantics as Bazel's native ``glob()`` function,
407*61c4878aSAndroid Build Coastguard Worker   but only matches directories.
408*61c4878aSAndroid Build Coastguard Worker
409*61c4878aSAndroid Build Coastguard Worker   Args:
410*61c4878aSAndroid Build Coastguard Worker     include: A list of wildcard patterns to match against.
411*61c4878aSAndroid Build Coastguard Worker     exclude: A list of wildcard patterns to exclude.
412*61c4878aSAndroid Build Coastguard Worker     allow_empty: Whether or not to permit an empty list of matches.
413*61c4878aSAndroid Build Coastguard Worker
414*61c4878aSAndroid Build Coastguard Worker   Returns:
415*61c4878aSAndroid Build Coastguard Worker     List of directory paths that match the specified constraints.
416*61c4878aSAndroid Build Coastguard Worker
417*61c4878aSAndroid Build Coastguard Workermatch_dir
418*61c4878aSAndroid Build Coastguard Worker^^^^^^^^^
419*61c4878aSAndroid Build Coastguard WorkerA starlark helper for using a wildcard pattern to match a single directory
420*61c4878aSAndroid Build Coastguard Worker
421*61c4878aSAndroid Build Coastguard Worker.. py:function:: match_dir(include: List[str], exclude: List[str] = [], allow_empty: bool = True) -> Optional[str]
422*61c4878aSAndroid Build Coastguard Worker
423*61c4878aSAndroid Build Coastguard Worker   Identifies a single directory using a wildcard pattern.
424*61c4878aSAndroid Build Coastguard Worker
425*61c4878aSAndroid Build Coastguard Worker   This helper follows the same semantics as Bazel's native ``glob()`` function,
426*61c4878aSAndroid Build Coastguard Worker   but only matches a single directory. If more than one match is found, this
427*61c4878aSAndroid Build Coastguard Worker   will fail.
428*61c4878aSAndroid Build Coastguard Worker
429*61c4878aSAndroid Build Coastguard Worker   Args:
430*61c4878aSAndroid Build Coastguard Worker     include: A list of wildcard patterns to match against.
431*61c4878aSAndroid Build Coastguard Worker     exclude: A list of wildcard patterns to exclude.
432*61c4878aSAndroid Build Coastguard Worker     allow_empty: Whether or not to permit returning ``None``.
433*61c4878aSAndroid Build Coastguard Worker
434*61c4878aSAndroid Build Coastguard Worker   Returns:
435*61c4878aSAndroid Build Coastguard Worker     Path to a single directory that matches the specified constraints, or
436*61c4878aSAndroid Build Coastguard Worker     ``None`` if no match is found and ``allow_empty`` is ``True``.
437*61c4878aSAndroid Build Coastguard Worker
438*61c4878aSAndroid Build Coastguard WorkerToolchains and platforms
439*61c4878aSAndroid Build Coastguard Worker------------------------
440*61c4878aSAndroid Build Coastguard WorkerPigweed provides clang-based host toolchains for Linux and Mac Arm gcc
441*61c4878aSAndroid Build Coastguard Workertoolchain. The clang-based Linux and Arm gcc toolchains are entirely hermetic.
442*61c4878aSAndroid Build Coastguard WorkerWe don't currently provide a host toolchain for Windows.
443