xref: /aosp_15_r20/external/pigweed/pw_build_android/docs.rst (revision 61c4878ac05f98d0ceed94b57d316916de578985)
1*61c4878aSAndroid Build Coastguard Worker.. _module-pw_build_android:
2*61c4878aSAndroid Build Coastguard Worker
3*61c4878aSAndroid Build Coastguard Worker================
4*61c4878aSAndroid Build Coastguard Workerpw_build_android
5*61c4878aSAndroid Build Coastguard Worker================
6*61c4878aSAndroid Build Coastguard Worker.. pigweed-module::
7*61c4878aSAndroid Build Coastguard Worker   :name: pw_build_android
8*61c4878aSAndroid Build Coastguard Worker
9*61c4878aSAndroid Build Coastguard Worker``pw_build_android`` provides simple utilities and guidelines for building with
10*61c4878aSAndroid Build Coastguard WorkerSoong.
11*61c4878aSAndroid Build Coastguard Worker
12*61c4878aSAndroid Build Coastguard Worker----------
13*61c4878aSAndroid Build Coastguard WorkerQuickstart
14*61c4878aSAndroid Build Coastguard Worker----------
15*61c4878aSAndroid Build Coastguard WorkerUse the ``pw_android_common_backends`` ``cc_defaults`` in the Pigweed module
16*61c4878aSAndroid Build Coastguard Workerlibrary or binary rule to use a preselected set of backends common to most
17*61c4878aSAndroid Build Coastguard WorkerAndroid platform projects.
18*61c4878aSAndroid Build Coastguard Worker
19*61c4878aSAndroid Build Coastguard Worker.. code-block:: androidbp
20*61c4878aSAndroid Build Coastguard Worker
21*61c4878aSAndroid Build Coastguard Worker   cc_binary {
22*61c4878aSAndroid Build Coastguard Worker       name: "my_app",
23*61c4878aSAndroid Build Coastguard Worker       host_supported: true,
24*61c4878aSAndroid Build Coastguard Worker       vendor: true,
25*61c4878aSAndroid Build Coastguard Worker       defaults: [
26*61c4878aSAndroid Build Coastguard Worker           "pw_android_common_backends",
27*61c4878aSAndroid Build Coastguard Worker       ],
28*61c4878aSAndroid Build Coastguard Worker       srcs: [
29*61c4878aSAndroid Build Coastguard Worker           "main.cc",
30*61c4878aSAndroid Build Coastguard Worker       ],
31*61c4878aSAndroid Build Coastguard Worker   }
32*61c4878aSAndroid Build Coastguard Worker
33*61c4878aSAndroid Build Coastguard Worker
34*61c4878aSAndroid Build Coastguard Worker----------------------------
35*61c4878aSAndroid Build Coastguard WorkerBasic blueprint files format
36*61c4878aSAndroid Build Coastguard Worker----------------------------
37*61c4878aSAndroid Build Coastguard WorkerAll Pigweed Soong blueprint files must be named ``Android.bp``, and include the
38*61c4878aSAndroid Build Coastguard Workerfolowing copyright header with the year adjusted and package.
39*61c4878aSAndroid Build Coastguard Worker
40*61c4878aSAndroid Build Coastguard Worker.. code-block:: androidbp
41*61c4878aSAndroid Build Coastguard Worker
42*61c4878aSAndroid Build Coastguard Worker   // Copyright 2024 The Pigweed Authors
43*61c4878aSAndroid Build Coastguard Worker   //
44*61c4878aSAndroid Build Coastguard Worker   // Licensed under the Apache License, Version 2.0 (the "License"); you may not
45*61c4878aSAndroid Build Coastguard Worker   // use this file except in compliance with the License. You may obtain a copy of
46*61c4878aSAndroid Build Coastguard Worker   // the License at
47*61c4878aSAndroid Build Coastguard Worker   //
48*61c4878aSAndroid Build Coastguard Worker   //     https://www.apache.org/licenses/LICENSE-2.0
49*61c4878aSAndroid Build Coastguard Worker   //
50*61c4878aSAndroid Build Coastguard Worker   // Unless required by applicable law or agreed to in writing, software
51*61c4878aSAndroid Build Coastguard Worker   // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
52*61c4878aSAndroid Build Coastguard Worker   // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
53*61c4878aSAndroid Build Coastguard Worker   // License for the specific language governing permissions and limitations under
54*61c4878aSAndroid Build Coastguard Worker   // the License.
55*61c4878aSAndroid Build Coastguard Worker
56*61c4878aSAndroid Build Coastguard Worker   package {
57*61c4878aSAndroid Build Coastguard Worker       default_applicable_licenses: ["external_pigweed_license"],
58*61c4878aSAndroid Build Coastguard Worker   }
59*61c4878aSAndroid Build Coastguard Worker
60*61c4878aSAndroid Build Coastguard WorkerThe ``bpfmt`` tool in Android can be used to format a blueprint file, e.g.
61*61c4878aSAndroid Build Coastguard Worker``bpfmt -w Android.bp``.
62*61c4878aSAndroid Build Coastguard Worker
63*61c4878aSAndroid Build Coastguard Worker.. _module-pw_build_android-common-backends:
64*61c4878aSAndroid Build Coastguard Worker
65*61c4878aSAndroid Build Coastguard Worker-----------------------
66*61c4878aSAndroid Build Coastguard WorkerCommon Android backends
67*61c4878aSAndroid Build Coastguard Worker-----------------------
68*61c4878aSAndroid Build Coastguard WorkerSoong doesn't provide a simple way to select custom Pigweed backends, as is
69*61c4878aSAndroid Build Coastguard Workerfound in other build systems. Fortunately, most Android platform binaries will
70*61c4878aSAndroid Build Coastguard Workerlikely use the same common set of backends. Thus, Pigweed provides a
71*61c4878aSAndroid Build Coastguard Worker``cc_defaults`` rule named ``pw_android_common_backends`` with a selected set of
72*61c4878aSAndroid Build Coastguard Workercommon backends for Android platform binaries. This
73*61c4878aSAndroid Build Coastguard Worker``pw_android_common_backends`` rule will be used in all Pigweed modules and
74*61c4878aSAndroid Build Coastguard Workerbackends defined using Soong.
75*61c4878aSAndroid Build Coastguard Worker
76*61c4878aSAndroid Build Coastguard WorkerThis table lists the backends selected by this rule:
77*61c4878aSAndroid Build Coastguard Worker
78*61c4878aSAndroid Build Coastguard Worker.. list-table:: ``pw_android_common_backends``
79*61c4878aSAndroid Build Coastguard Worker   :align: left
80*61c4878aSAndroid Build Coastguard Worker   :header-rows: 1
81*61c4878aSAndroid Build Coastguard Worker
82*61c4878aSAndroid Build Coastguard Worker   * - Facade
83*61c4878aSAndroid Build Coastguard Worker     - Selected Backend
84*61c4878aSAndroid Build Coastguard Worker   * - :ref:`module-pw_assert`
85*61c4878aSAndroid Build Coastguard Worker     - :ref:`module-pw_assert_log`
86*61c4878aSAndroid Build Coastguard Worker   * - :ref:`module-pw_log`
87*61c4878aSAndroid Build Coastguard Worker     - :ref:`module-pw_log_android`
88*61c4878aSAndroid Build Coastguard Worker   * - :ref:`module-pw_chrono`
89*61c4878aSAndroid Build Coastguard Worker     - :ref:`module-pw_chrono_stl`
90*61c4878aSAndroid Build Coastguard Worker   * - :ref:`module-pw_sync`
91*61c4878aSAndroid Build Coastguard Worker     - :ref:`module-pw_sync_stl`
92*61c4878aSAndroid Build Coastguard Worker   * - :ref:`module-pw_thread`
93*61c4878aSAndroid Build Coastguard Worker     - :ref:`module-pw_thread_stl`
94*61c4878aSAndroid Build Coastguard Worker
95*61c4878aSAndroid Build Coastguard Worker.. _module-pw_build_android-module-libraries:
96*61c4878aSAndroid Build Coastguard Worker
97*61c4878aSAndroid Build Coastguard Worker----------------
98*61c4878aSAndroid Build Coastguard WorkerModule libraries
99*61c4878aSAndroid Build Coastguard Worker----------------
100*61c4878aSAndroid Build Coastguard WorkerModule libraries are defined as ``cc_library_static`` rules and include the
101*61c4878aSAndroid Build Coastguard Workercommon Android backends via the ``pw_android_common_backends`` defaults.
102*61c4878aSAndroid Build Coastguard Worker
103*61c4878aSAndroid Build Coastguard Worker.. note::
104*61c4878aSAndroid Build Coastguard Worker
105*61c4878aSAndroid Build Coastguard Worker   Every dependency has to be added as ``whole_static_libs`` to avoid dropping
106*61c4878aSAndroid Build Coastguard Worker   symbols on transitive dependencies.
107*61c4878aSAndroid Build Coastguard Worker
108*61c4878aSAndroid Build Coastguard Worker.. code-block:: androidbp
109*61c4878aSAndroid Build Coastguard Worker
110*61c4878aSAndroid Build Coastguard Worker   cc_library_static {
111*61c4878aSAndroid Build Coastguard Worker       name: "pw_<MODULE_NAME>",
112*61c4878aSAndroid Build Coastguard Worker       cpp_std: "c++20",
113*61c4878aSAndroid Build Coastguard Worker       export_include_dirs: ["public"],
114*61c4878aSAndroid Build Coastguard Worker       vendor_available: true,
115*61c4878aSAndroid Build Coastguard Worker       host_supported: true,
116*61c4878aSAndroid Build Coastguard Worker       defaults: [
117*61c4878aSAndroid Build Coastguard Worker           "pw_android_common_backends",
118*61c4878aSAndroid Build Coastguard Worker       ],
119*61c4878aSAndroid Build Coastguard Worker       header_libs: [
120*61c4878aSAndroid Build Coastguard Worker           // Header library list for all the libraries in #include directives.
121*61c4878aSAndroid Build Coastguard Worker       ],
122*61c4878aSAndroid Build Coastguard Worker       export_header_lib_headers: [
123*61c4878aSAndroid Build Coastguard Worker           // Header library list for all the libraries in #include directives
124*61c4878aSAndroid Build Coastguard Worker           // in public header files only.
125*61c4878aSAndroid Build Coastguard Worker           // These entries must also be present in header_libs.
126*61c4878aSAndroid Build Coastguard Worker       ],
127*61c4878aSAndroid Build Coastguard Worker       whole_static_libs: [
128*61c4878aSAndroid Build Coastguard Worker           // Static library list for all static library dependencies, listed as
129*61c4878aSAndroid Build Coastguard Worker           // whole libraries to avoid dropping symbols in transitive
130*61c4878aSAndroid Build Coastguard Worker           // dependencies.
131*61c4878aSAndroid Build Coastguard Worker       ],
132*61c4878aSAndroid Build Coastguard Worker       export_static_lib_headers: [
133*61c4878aSAndroid Build Coastguard Worker           // Static library list for static libraries in #include directives in
134*61c4878aSAndroid Build Coastguard Worker           // public header files only.
135*61c4878aSAndroid Build Coastguard Worker           // These entries must also be present in whole_static_libs.
136*61c4878aSAndroid Build Coastguard Worker       ],
137*61c4878aSAndroid Build Coastguard Worker       srcs: [
138*61c4878aSAndroid Build Coastguard Worker           // List of source (.cc) files.
139*61c4878aSAndroid Build Coastguard Worker       ],
140*61c4878aSAndroid Build Coastguard Worker   }
141*61c4878aSAndroid Build Coastguard Worker
142*61c4878aSAndroid Build Coastguard WorkerModule libraries with custom backends
143*61c4878aSAndroid Build Coastguard Worker-------------------------------------
144*61c4878aSAndroid Build Coastguard WorkerIf a Pigweed module needs to be used with a backend different than the common
145*61c4878aSAndroid Build Coastguard WorkerAndroid backend, it should be defined as a ``cc_defaults`` rule following the
146*61c4878aSAndroid Build Coastguard Worker``pw_<MODULE_NAME>_no_backends`` name format, with the source files listed in a
147*61c4878aSAndroid Build Coastguard Worker``filegroup`` following the ``pw_<MODULE_NAME>_src_files`` name format and the
148*61c4878aSAndroid Build Coastguard Workerinclude directories defined as a ``cc_library_headers`` following the
149*61c4878aSAndroid Build Coastguard Worker``pw_<MODULE_NAME>_include_dirs`` name format. A ``cc_static_library`` with the
150*61c4878aSAndroid Build Coastguard Workercommon Android backend should still be provided, which uses the mentioned
151*61c4878aSAndroid Build Coastguard Worker``cc_defaults``.
152*61c4878aSAndroid Build Coastguard Worker
153*61c4878aSAndroid Build Coastguard Worker.. note::
154*61c4878aSAndroid Build Coastguard Worker
155*61c4878aSAndroid Build Coastguard Worker   ``filegroup`` captures the absolute paths of the listed source files, so they
156*61c4878aSAndroid Build Coastguard Worker   can be addressed properly when the ``cc_defaults`` rule is used.
157*61c4878aSAndroid Build Coastguard Worker
158*61c4878aSAndroid Build Coastguard Worker.. code-block:: androidbp
159*61c4878aSAndroid Build Coastguard Worker
160*61c4878aSAndroid Build Coastguard Worker   filegroup {
161*61c4878aSAndroid Build Coastguard Worker       name: "pw_<MODULE_NAME>_src_files",
162*61c4878aSAndroid Build Coastguard Worker       srcs: [
163*61c4878aSAndroid Build Coastguard Worker           // List of source (.cc) files.
164*61c4878aSAndroid Build Coastguard Worker       ],
165*61c4878aSAndroid Build Coastguard Worker   }
166*61c4878aSAndroid Build Coastguard Worker
167*61c4878aSAndroid Build Coastguard Worker    cc_library_headers {
168*61c4878aSAndroid Build Coastguard Worker        name: "pw_<MODULE_NAME>_include_dirs",
169*61c4878aSAndroid Build Coastguard Worker        export_include_dirs: [
170*61c4878aSAndroid Build Coastguard Worker            "public",
171*61c4878aSAndroid Build Coastguard Worker        ],
172*61c4878aSAndroid Build Coastguard Worker        vendor_available: true,
173*61c4878aSAndroid Build Coastguard Worker        host_supported: true,
174*61c4878aSAndroid Build Coastguard Worker    }
175*61c4878aSAndroid Build Coastguard Worker
176*61c4878aSAndroid Build Coastguard Worker   cc_defaults {
177*61c4878aSAndroid Build Coastguard Worker       name: "pw_<MODULE_NAME>_no_backends",
178*61c4878aSAndroid Build Coastguard Worker       cpp_std: "c++20",
179*61c4878aSAndroid Build Coastguard Worker
180*61c4878aSAndroid Build Coastguard Worker       header_libs: [
181*61c4878aSAndroid Build Coastguard Worker           // Header library list for all the libraries in #include directives.
182*61c4878aSAndroid Build Coastguard Worker           "pw_<MODULE_NAME>_include_dirs"
183*61c4878aSAndroid Build Coastguard Worker       ],
184*61c4878aSAndroid Build Coastguard Worker       export_header_lib_headers: [
185*61c4878aSAndroid Build Coastguard Worker           // Header library list for all the libraries in #include directives
186*61c4878aSAndroid Build Coastguard Worker           // in public header files only.
187*61c4878aSAndroid Build Coastguard Worker           // These entries must also be present in header_libs.
188*61c4878aSAndroid Build Coastguard Worker       ],
189*61c4878aSAndroid Build Coastguard Worker       whole_static_libs: [
190*61c4878aSAndroid Build Coastguard Worker           // Static library list for all static library dependencies, listed as
191*61c4878aSAndroid Build Coastguard Worker           // whole libraries to avoid dropping symbols in transitive
192*61c4878aSAndroid Build Coastguard Worker           // dependencies.
193*61c4878aSAndroid Build Coastguard Worker       ],
194*61c4878aSAndroid Build Coastguard Worker       export_static_lib_headers: [
195*61c4878aSAndroid Build Coastguard Worker           // Static library list for static libraries in #include directives in
196*61c4878aSAndroid Build Coastguard Worker           // public header files only.
197*61c4878aSAndroid Build Coastguard Worker           // These entries must also be present in whole_static_libs.
198*61c4878aSAndroid Build Coastguard Worker       ],
199*61c4878aSAndroid Build Coastguard Worker       srcs: [
200*61c4878aSAndroid Build Coastguard Worker           "pw_<MODULE_NAME>_src_files",
201*61c4878aSAndroid Build Coastguard Worker       ],
202*61c4878aSAndroid Build Coastguard Worker   }
203*61c4878aSAndroid Build Coastguard Worker
204*61c4878aSAndroid Build Coastguard Worker   cc_library_static {
205*61c4878aSAndroid Build Coastguard Worker       name: "pw_<MODULE_NAME>",
206*61c4878aSAndroid Build Coastguard Worker       cpp_std: "c++20",
207*61c4878aSAndroid Build Coastguard Worker       export_include_dirs: ["public"],
208*61c4878aSAndroid Build Coastguard Worker       defaults: [
209*61c4878aSAndroid Build Coastguard Worker           "pw_android_common_backends",
210*61c4878aSAndroid Build Coastguard Worker           "pw_<MODULE_NAME>_no_backends",
211*61c4878aSAndroid Build Coastguard Worker       ],
212*61c4878aSAndroid Build Coastguard Worker       vendor_available: true,
213*61c4878aSAndroid Build Coastguard Worker       host_supported: true,
214*61c4878aSAndroid Build Coastguard Worker   }
215*61c4878aSAndroid Build Coastguard Worker
216*61c4878aSAndroid Build Coastguard WorkerModule libraries with configurable build flags
217*61c4878aSAndroid Build Coastguard Worker----------------------------------------------
218*61c4878aSAndroid Build Coastguard WorkerIf a Pigweed module provides user-configurable build flags it should be defined
219*61c4878aSAndroid Build Coastguard Workeras a ``cc_defaults`` rule following the ``pw_<MODULE_NAME>_defaults`` name
220*61c4878aSAndroid Build Coastguard Workerformat. This hints the user that the rule must be initialized with the desired
221*61c4878aSAndroid Build Coastguard Workerbuild flag values. Source files must be listed in a ``filegroup`` following the
222*61c4878aSAndroid Build Coastguard Worker``pw_<MODULE_NAME>_src_files`` name format and the include directories defined
223*61c4878aSAndroid Build Coastguard Workeras a ``cc_library_headers`` following the ``pw_<MODULE_NAME>_include_dirs`` name
224*61c4878aSAndroid Build Coastguard Workerformat.
225*61c4878aSAndroid Build Coastguard Worker
226*61c4878aSAndroid Build Coastguard Worker.. code-block:: androidbp
227*61c4878aSAndroid Build Coastguard Worker
228*61c4878aSAndroid Build Coastguard Worker   filegroup {
229*61c4878aSAndroid Build Coastguard Worker       name: "pw_<MODULE_NAME>_src_files",
230*61c4878aSAndroid Build Coastguard Worker       srcs: [
231*61c4878aSAndroid Build Coastguard Worker           // List of source (.cc) files.
232*61c4878aSAndroid Build Coastguard Worker       ],
233*61c4878aSAndroid Build Coastguard Worker   }
234*61c4878aSAndroid Build Coastguard Worker
235*61c4878aSAndroid Build Coastguard Worker    cc_library_headers {
236*61c4878aSAndroid Build Coastguard Worker        name: "pw_<MODULE_NAME>_include_dirs",
237*61c4878aSAndroid Build Coastguard Worker        export_include_dirs: [
238*61c4878aSAndroid Build Coastguard Worker            "public",
239*61c4878aSAndroid Build Coastguard Worker        ],
240*61c4878aSAndroid Build Coastguard Worker        vendor_available: true,
241*61c4878aSAndroid Build Coastguard Worker        host_supported: true,
242*61c4878aSAndroid Build Coastguard Worker    }
243*61c4878aSAndroid Build Coastguard Worker
244*61c4878aSAndroid Build Coastguard Worker   cc_defaults {
245*61c4878aSAndroid Build Coastguard Worker       name: "pw_<MODULE_NAME>_defaults",
246*61c4878aSAndroid Build Coastguard Worker       cpp_std: "c++20",
247*61c4878aSAndroid Build Coastguard Worker
248*61c4878aSAndroid Build Coastguard Worker       header_libs: [
249*61c4878aSAndroid Build Coastguard Worker           // Header library list for all the libraries in #include directives.
250*61c4878aSAndroid Build Coastguard Worker           "pw_<MODULE_NAME>_include_dirs"
251*61c4878aSAndroid Build Coastguard Worker       ],
252*61c4878aSAndroid Build Coastguard Worker       export_header_lib_headers: [
253*61c4878aSAndroid Build Coastguard Worker           // Header library list for all the libraries in #include directives
254*61c4878aSAndroid Build Coastguard Worker           // in public header files only.
255*61c4878aSAndroid Build Coastguard Worker           // These entries must also be present in header_libs.
256*61c4878aSAndroid Build Coastguard Worker       ],
257*61c4878aSAndroid Build Coastguard Worker       whole_static_libs: [
258*61c4878aSAndroid Build Coastguard Worker           // Static library list for all static library dependencies, listed as
259*61c4878aSAndroid Build Coastguard Worker           // whole libraries to avoid dropping symbols in transitive
260*61c4878aSAndroid Build Coastguard Worker           // dependencies.
261*61c4878aSAndroid Build Coastguard Worker       ],
262*61c4878aSAndroid Build Coastguard Worker       export_static_lib_headers: [
263*61c4878aSAndroid Build Coastguard Worker           // Static library list for static libraries in #include directives in
264*61c4878aSAndroid Build Coastguard Worker           // public header files only.
265*61c4878aSAndroid Build Coastguard Worker           // These entries must also be present in whole_static_libs.
266*61c4878aSAndroid Build Coastguard Worker       ],
267*61c4878aSAndroid Build Coastguard Worker       srcs: [
268*61c4878aSAndroid Build Coastguard Worker           "pw_<MODULE_NAME>_src_files",
269*61c4878aSAndroid Build Coastguard Worker       ],
270*61c4878aSAndroid Build Coastguard Worker   }
271*61c4878aSAndroid Build Coastguard Worker
272*61c4878aSAndroid Build Coastguard WorkerA downstream user can instantiate the ``pw_<MODULE_NAME>_defaults`` rule as
273*61c4878aSAndroid Build Coastguard Workerfollows.
274*61c4878aSAndroid Build Coastguard Worker
275*61c4878aSAndroid Build Coastguard Worker.. note::
276*61c4878aSAndroid Build Coastguard Worker
277*61c4878aSAndroid Build Coastguard Worker   To avoid collisions the rule using the ``cc_defaults`` must have a unique
278*61c4878aSAndroid Build Coastguard Worker   name that distinguishes it from other rule names in Pigweed and other
279*61c4878aSAndroid Build Coastguard Worker   projects. It is recommended to suffix the project name.
280*61c4878aSAndroid Build Coastguard Worker
281*61c4878aSAndroid Build Coastguard Worker.. code-block:: androidbp
282*61c4878aSAndroid Build Coastguard Worker
283*61c4878aSAndroid Build Coastguard Worker   cc_library_static {
284*61c4878aSAndroid Build Coastguard Worker       name: "pw_<MODULE_NAME>_<PROJECT_NAME>",
285*61c4878aSAndroid Build Coastguard Worker       cflags: [
286*61c4878aSAndroid Build Coastguard Worker           "-DPW_<MODULE_NAME>_<FLAG_NAME>=<FLAG_VALUE>",
287*61c4878aSAndroid Build Coastguard Worker       ],
288*61c4878aSAndroid Build Coastguard Worker       defaults: [
289*61c4878aSAndroid Build Coastguard Worker           "pw_<MODULE_NAME>_defaults",
290*61c4878aSAndroid Build Coastguard Worker       ],
291*61c4878aSAndroid Build Coastguard Worker   }
292*61c4878aSAndroid Build Coastguard Worker
293*61c4878aSAndroid Build Coastguard Worker-------
294*61c4878aSAndroid Build Coastguard WorkerFacades
295*61c4878aSAndroid Build Coastguard Worker-------
296*61c4878aSAndroid Build Coastguard WorkerAll facades must be defined as ``cc_library_headers`` if they don’t have
297*61c4878aSAndroid Build Coastguard Worker``srcs`` list. The facade names follow the ``pw_<MODULE_NAME>.<FACADE_NAME>``.
298*61c4878aSAndroid Build Coastguard WorkerIn the case there is only one facade in the module or ``<MODULE_NAME>`` is
299*61c4878aSAndroid Build Coastguard Workerthe same as ``<FACADE_NAME>`` follow ``pw_<MODULE_NAME>``, e.g. ``pw_log``.
300*61c4878aSAndroid Build Coastguard Worker
301*61c4878aSAndroid Build Coastguard Worker.. note::
302*61c4878aSAndroid Build Coastguard Worker   Facade names should not be suffixed with ``_headers``.
303*61c4878aSAndroid Build Coastguard Worker
304*61c4878aSAndroid Build Coastguard Worker.. code-block:: androidbp
305*61c4878aSAndroid Build Coastguard Worker
306*61c4878aSAndroid Build Coastguard Worker   cc_library_headers {
307*61c4878aSAndroid Build Coastguard Worker       name: "pw_<MODULE_NAME>.<FACADE_NAME>",
308*61c4878aSAndroid Build Coastguard Worker       cpp_std: "c++20",
309*61c4878aSAndroid Build Coastguard Worker       vendor_available: true,
310*61c4878aSAndroid Build Coastguard Worker       host_supported: true,
311*61c4878aSAndroid Build Coastguard Worker       export_include_dirs: ["public"],
312*61c4878aSAndroid Build Coastguard Worker   }
313*61c4878aSAndroid Build Coastguard Worker
314*61c4878aSAndroid Build Coastguard WorkerIf a facade requires a ``srcs`` list, it must be defined as a ``cc_defaults``
315*61c4878aSAndroid Build Coastguard Workerrule instead, with the source files listed in a ``filegroup`` following the
316*61c4878aSAndroid Build Coastguard Worker``pw_<MODULE_NAME>.<FACADE_NAME>_files`` name format or
317*61c4878aSAndroid Build Coastguard Worker``pw_<MODULE_NAME>_files`` if applicable.
318*61c4878aSAndroid Build Coastguard Worker
319*61c4878aSAndroid Build Coastguard Worker.. note::
320*61c4878aSAndroid Build Coastguard Worker
321*61c4878aSAndroid Build Coastguard Worker   ``filegroup`` captures the absolute paths of the listed source files, so they
322*61c4878aSAndroid Build Coastguard Worker   can be addressed properly when the ``cc_defaults`` rule is used.
323*61c4878aSAndroid Build Coastguard Worker
324*61c4878aSAndroid Build Coastguard Worker.. note::
325*61c4878aSAndroid Build Coastguard Worker
326*61c4878aSAndroid Build Coastguard Worker   Facades cannot be defined as ``cc_static_library`` because it wouldn’t be
327*61c4878aSAndroid Build Coastguard Worker   possible to build the facade without a backend.
328*61c4878aSAndroid Build Coastguard Worker
329*61c4878aSAndroid Build Coastguard Worker.. code-block:: androidbp
330*61c4878aSAndroid Build Coastguard Worker
331*61c4878aSAndroid Build Coastguard Worker   filegroup {
332*61c4878aSAndroid Build Coastguard Worker       name: "pw_<MODULE_NAME>.<FACADE_NAME>_files",
333*61c4878aSAndroid Build Coastguard Worker       srcs: [
334*61c4878aSAndroid Build Coastguard Worker           // List of source (.cc) files.
335*61c4878aSAndroid Build Coastguard Worker       ],
336*61c4878aSAndroid Build Coastguard Worker   }
337*61c4878aSAndroid Build Coastguard Worker
338*61c4878aSAndroid Build Coastguard Worker   cc_defaults {
339*61c4878aSAndroid Build Coastguard Worker       name: "pw_<MODULE_NAME>.<FACADE_NAME>",
340*61c4878aSAndroid Build Coastguard Worker       cpp_std: "c++20",
341*61c4878aSAndroid Build Coastguard Worker       export_include_dirs: ["public"],
342*61c4878aSAndroid Build Coastguard Worker       srcs: [
343*61c4878aSAndroid Build Coastguard Worker           "pw_<MODULE_NAME>.<FACADE_NAME>_files",
344*61c4878aSAndroid Build Coastguard Worker       ],
345*61c4878aSAndroid Build Coastguard Worker   }
346*61c4878aSAndroid Build Coastguard Worker
347*61c4878aSAndroid Build Coastguard WorkerTo assign a backend to a facade defined as ``cc_defaults`` the ``cc_defaults``
348*61c4878aSAndroid Build Coastguard Workerrule can be placed in the ``defaults`` list of a ``cc_static_library`` rule or
349*61c4878aSAndroid Build Coastguard Workerbinary rule that lists the facade's backend as a dependency.
350*61c4878aSAndroid Build Coastguard Worker
351*61c4878aSAndroid Build Coastguard Worker.. code-block:: androidbp
352*61c4878aSAndroid Build Coastguard Worker
353*61c4878aSAndroid Build Coastguard Worker   cc_static_library {
354*61c4878aSAndroid Build Coastguard Worker       name: "user_of_pw_<MODULE_NAME>.<FACADE_NAME>",
355*61c4878aSAndroid Build Coastguard Worker       cpp_std: "c++20",
356*61c4878aSAndroid Build Coastguard Worker       vendor_available: true,
357*61c4878aSAndroid Build Coastguard Worker       host_supported: true,
358*61c4878aSAndroid Build Coastguard Worker       defaults: [
359*61c4878aSAndroid Build Coastguard Worker           "pw_<MODULE_NAME>.<FACADE_NAME>",
360*61c4878aSAndroid Build Coastguard Worker       ],
361*61c4878aSAndroid Build Coastguard Worker       static_libs: [
362*61c4878aSAndroid Build Coastguard Worker           "backend_of_pw_<MODULE_NAME>.<FACADE_NAME>",
363*61c4878aSAndroid Build Coastguard Worker       ],
364*61c4878aSAndroid Build Coastguard Worker   }
365*61c4878aSAndroid Build Coastguard Worker
366*61c4878aSAndroid Build Coastguard WorkerAlternatively, the ``cc_defaults`` rule can be placed in the ``defaults`` list
367*61c4878aSAndroid Build Coastguard Workerof another ``cc_defaults`` rule where the latter rule may or may not list the
368*61c4878aSAndroid Build Coastguard Workerfacade's backend. ``cc_defaults`` rules can be inherited many times. Facades
369*61c4878aSAndroid Build Coastguard Workercan be used as long as the backends are assigned in ``cc_static_library`` or
370*61c4878aSAndroid Build Coastguard Workerbinary rules using the final ``cc_defaults`` as explained above.
371*61c4878aSAndroid Build Coastguard Worker
372*61c4878aSAndroid Build Coastguard Worker--------
373*61c4878aSAndroid Build Coastguard WorkerBackends
374*61c4878aSAndroid Build Coastguard Worker--------
375*61c4878aSAndroid Build Coastguard WorkerBackends are defined the same way as
376*61c4878aSAndroid Build Coastguard Worker:ref:`module-pw_build_android-module-libraries`. They must follow the
377*61c4878aSAndroid Build Coastguard Worker``pw_<MODULE_NAME>.<FACADE_NAME>_<BACKEND_NAME>`` name format or
378*61c4878aSAndroid Build Coastguard Worker``pw_<MODULE_NAME>_<BACKEND_NAME>`` if applicable.
379*61c4878aSAndroid Build Coastguard Worker
380*61c4878aSAndroid Build Coastguard Worker-----------
381*61c4878aSAndroid Build Coastguard WorkerBuild flags
382*61c4878aSAndroid Build Coastguard Worker-----------
383*61c4878aSAndroid Build Coastguard WorkerSome build flags should be set for all Android targets; these flags are
384*61c4878aSAndroid Build Coastguard Workerspecified in ``pw_android_common_backends``. These flags are as follows:
385*61c4878aSAndroid Build Coastguard Worker
386*61c4878aSAndroid Build Coastguard Worker``PW_FUNCTION_ENABLE_DYNAMIC_ALLOCATION``
387*61c4878aSAndroid Build Coastguard Worker-----------------------------------------
388*61c4878aSAndroid Build Coastguard WorkerAs discussed in :ref:`module-pw_function-dynamic-allocation`, this flag enables
389*61c4878aSAndroid Build Coastguard Workerdynamic allocation of :cpp:type:`pw::Function`, allowing it to exceed the
390*61c4878aSAndroid Build Coastguard Workerinline size limit.
391*61c4878aSAndroid Build Coastguard Worker
392*61c4878aSAndroid Build Coastguard WorkerAndroid targets support dynamic allocation since the Android environment is not
393*61c4878aSAndroid Build Coastguard Workermemory constrained. Thus, ``PW_FUNCTION_ENABLE_DYNAMIC_ALLOCATION`` is enabled
394*61c4878aSAndroid Build Coastguard Workerin ``pw_android_common_backends``. Components built with dynamic allocation
395*61c4878aSAndroid Build Coastguard Workerdisabled cannot be linked against components with dynamic allocation enabled.
396