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