xref: /aosp_15_r20/external/pigweed/seed/0111.rst (revision 61c4878ac05f98d0ceed94b57d316916de578985)
1*61c4878aSAndroid Build Coastguard Worker.. _seed-0111:
2*61c4878aSAndroid Build Coastguard Worker
3*61c4878aSAndroid Build Coastguard Worker===============================================
4*61c4878aSAndroid Build Coastguard Worker0111: Make Bazel Pigweed's Primary Build System
5*61c4878aSAndroid Build Coastguard Worker===============================================
6*61c4878aSAndroid Build Coastguard Worker.. seed::
7*61c4878aSAndroid Build Coastguard Worker   :number: 111
8*61c4878aSAndroid Build Coastguard Worker   :name: Make Bazel Pigweed's Primary Build System
9*61c4878aSAndroid Build Coastguard Worker   :status: Accepted
10*61c4878aSAndroid Build Coastguard Worker   :proposal_date: 2023-09-26
11*61c4878aSAndroid Build Coastguard Worker   :cl: 171695
12*61c4878aSAndroid Build Coastguard Worker   :authors: Ted Pudlik
13*61c4878aSAndroid Build Coastguard Worker   :facilitator: Armando Montanez
14*61c4878aSAndroid Build Coastguard Worker
15*61c4878aSAndroid Build Coastguard Worker-------
16*61c4878aSAndroid Build Coastguard WorkerSummary
17*61c4878aSAndroid Build Coastguard Worker-------
18*61c4878aSAndroid Build Coastguard WorkerThis SEED proposes that Pigweed transition to using `Bazel
19*61c4878aSAndroid Build Coastguard Worker<https://bazel.build/>`_ as its primary build system, replacing `GN
20*61c4878aSAndroid Build Coastguard Worker<https://gn.googlesource.com/gn/>`_ in that role.
21*61c4878aSAndroid Build Coastguard Worker
22*61c4878aSAndroid Build Coastguard WorkerPigweed is and will continue to be a multi-build-system project. As modular
23*61c4878aSAndroid Build Coastguard Workermiddleware, Pigweed aspires to be easy to integrate with existing embedded
24*61c4878aSAndroid Build Coastguard Workerprojects whatever their build system. To facilitate this, we provide BUILD
25*61c4878aSAndroid Build Coastguard Workerfiles for multiple systems (Bazel, CMake, GN, Soong), as well as other
26*61c4878aSAndroid Build Coastguard Workerdistributables where applicable (npm packages, Python wheels, etc).
27*61c4878aSAndroid Build Coastguard Worker
28*61c4878aSAndroid Build Coastguard WorkerBut Pigweed is more than just a collection of modules. Pigweed offers a quick,
29*61c4878aSAndroid Build Coastguard Workerergonomic way to start a new embedded project, as well as developer tooling
30*61c4878aSAndroid Build Coastguard Workerthat lets it scale from a prototype to production deployment. And if you're
31*61c4878aSAndroid Build Coastguard Workerstarting a new project using Pigweed from day one, you will ask: which build
32*61c4878aSAndroid Build Coastguard Workersystem *should* I use? This is what we mean by Pigweed's *primary* build
33*61c4878aSAndroid Build Coastguard Workersystem.
34*61c4878aSAndroid Build Coastguard Worker
35*61c4878aSAndroid Build Coastguard WorkerPigweed's primary build system has been GN, but soon will be Bazel.
36*61c4878aSAndroid Build Coastguard Worker
37*61c4878aSAndroid Build Coastguard Worker----------
38*61c4878aSAndroid Build Coastguard WorkerMotivation
39*61c4878aSAndroid Build Coastguard Worker----------
40*61c4878aSAndroid Build Coastguard WorkerGN has been Pigweed's primary build system since inception, and we've developed
41*61c4878aSAndroid Build Coastguard Workeran extensive GN build that was used to successfully ship products at scale. GN
42*61c4878aSAndroid Build Coastguard Workeris fast and extensible, and its flexible toolchain abstraction is well-suited
43*61c4878aSAndroid Build Coastguard Workerto the multi-target builds that arise in most embedded projects.
44*61c4878aSAndroid Build Coastguard Worker
45*61c4878aSAndroid Build Coastguard WorkerBut GN has limitations:
46*61c4878aSAndroid Build Coastguard Worker
47*61c4878aSAndroid Build Coastguard Worker#.  **Small community.** GN is a niche build system: the only major open-source
48*61c4878aSAndroid Build Coastguard Worker    projects that use it are Chromium and Fuchsia. It is not championed by any
49*61c4878aSAndroid Build Coastguard Worker    major nonprofit or corporation. Few users or open-source contributors come
50*61c4878aSAndroid Build Coastguard Worker    to Pigweed with any past experience with GN.
51*61c4878aSAndroid Build Coastguard Worker#.  **No reusable rulesets.** Pigweed has written and maintains all its GN
52*61c4878aSAndroid Build Coastguard Worker    rules: for C/C++, for Python, for Go (though those are deprecated). With
53*61c4878aSAndroid Build Coastguard Worker    Rust entering Pigweed, we are now developing GN rules for Rust. There are
54*61c4878aSAndroid Build Coastguard Worker    no built-in or community-provided rules we could adopt instead. Developing
55*61c4878aSAndroid Build Coastguard Worker    all rules in-house gives us flexibility, but requires large up-front and
56*61c4878aSAndroid Build Coastguard Worker    ongoing investments.
57*61c4878aSAndroid Build Coastguard Worker#.  **No hermetic builds.** GN offers no sandboxing and relies on timestamps to
58*61c4878aSAndroid Build Coastguard Worker    decide if outputs need to be rebuilt. This has undesirable consequences:
59*61c4878aSAndroid Build Coastguard Worker
60*61c4878aSAndroid Build Coastguard Worker    *  The boundary between the environment produced by
61*61c4878aSAndroid Build Coastguard Worker       :ref:`module-pw_env_setup` and GN is blurred, making GN-built Pigweed as
62*61c4878aSAndroid Build Coastguard Worker       a whole hostile to systems like Docker or remote execution services.
63*61c4878aSAndroid Build Coastguard Worker    *  Incremental builds can become corrupted. Deleting the output directory
64*61c4878aSAndroid Build Coastguard Worker       and environment is an undesirable but necessary piece of every Pigweed
65*61c4878aSAndroid Build Coastguard Worker       developer's toolkit.
66*61c4878aSAndroid Build Coastguard Worker    *  Reliably running only affected tests in CQ is not possible.
67*61c4878aSAndroid Build Coastguard Worker
68*61c4878aSAndroid Build Coastguard WorkerWe would like Pigweed to recommend a build system that does not suffer from these
69*61c4878aSAndroid Build Coastguard Workerlimitations.
70*61c4878aSAndroid Build Coastguard Worker
71*61c4878aSAndroid Build Coastguard WorkerThese limitations are not new. What's changed is the build system landscape.
72*61c4878aSAndroid Build Coastguard WorkerWhen Pigweed was started years ago, GN was the best choice for a project
73*61c4878aSAndroid Build Coastguard Workeremphasizing multi-target builds. But the alternatives have now matured.
74*61c4878aSAndroid Build Coastguard Worker
75*61c4878aSAndroid Build Coastguard Worker--------
76*61c4878aSAndroid Build Coastguard WorkerProposal
77*61c4878aSAndroid Build Coastguard Worker--------
78*61c4878aSAndroid Build Coastguard WorkerThe proposal is to make Bazel the recommended build system to use with Pigweed,
79*61c4878aSAndroid Build Coastguard Workerand the best overall build system for embedded developers. This will involve a
80*61c4878aSAndroid Build Coastguard Workercombination of contributions to Pigweed itself, to existing open-source Bazel
81*61c4878aSAndroid Build Coastguard Workerrules we wish to reuse, and when necessary to core Bazel.
82*61c4878aSAndroid Build Coastguard Worker
83*61c4878aSAndroid Build Coastguard WorkerThe vision is not merely to achieve feature parity with Pigweed's GN offering
84*61c4878aSAndroid Build Coastguard Workerwhile addressing the limitations identified above, but to fully utilize the
85*61c4878aSAndroid Build Coastguard Workercapabilities provided by Bazel to produce the best possible developer
86*61c4878aSAndroid Build Coastguard Workerexperience. For example, Bazel offers native support for external dependency
87*61c4878aSAndroid Build Coastguard Workermanagement and remote build execution. We will make it easy for Pigweed
88*61c4878aSAndroid Build Coastguard Workerprojects to leverage features like these.
89*61c4878aSAndroid Build Coastguard Worker
90*61c4878aSAndroid Build Coastguard Worker*  **What about GN?** Pigweed's GN support will continue, focusing on
91*61c4878aSAndroid Build Coastguard Worker   maintenance rather than new build features. No earlier than 2026, if no
92*61c4878aSAndroid Build Coastguard Worker   Pigweed projects are using GN, we may remove GN support. *The approval of
93*61c4878aSAndroid Build Coastguard Worker   this SEED does not imply approval of removing GN support.* This decision is
94*61c4878aSAndroid Build Coastguard Worker   explicitly deferred until a future date.
95*61c4878aSAndroid Build Coastguard Worker
96*61c4878aSAndroid Build Coastguard Worker*  **What about CMake?** Because of its wide adoption in the C++ community,
97*61c4878aSAndroid Build Coastguard Worker   CMake will be supported indefinitely at the current level.
98*61c4878aSAndroid Build Coastguard Worker
99*61c4878aSAndroid Build Coastguard Worker-------
100*61c4878aSAndroid Build Coastguard WorkerRoadmap
101*61c4878aSAndroid Build Coastguard Worker-------
102*61c4878aSAndroid Build Coastguard WorkerThis section lists the high-level milestones for Pigweed's Bazel support, and
103*61c4878aSAndroid Build Coastguard Workerthen dives into the specific work needed to reach them.
104*61c4878aSAndroid Build Coastguard Worker
105*61c4878aSAndroid Build Coastguard WorkerThis roadmap is our plan of record as of the time of writing, but like all SEED
106*61c4878aSAndroid Build Coastguard Workercontent it represents a snapshot in time. We are not as committed to the
107*61c4878aSAndroid Build Coastguard Workerspecific dates as we are to the general direction.
108*61c4878aSAndroid Build Coastguard Worker
109*61c4878aSAndroid Build Coastguard WorkerThere's no specific action that users must take by any date. But our
110*61c4878aSAndroid Build Coastguard Workerrecommendations about build system choice (embodied in docs and in what we tell
111*61c4878aSAndroid Build Coastguard Workerpeople when they ask us) will change at some point.
112*61c4878aSAndroid Build Coastguard Worker
113*61c4878aSAndroid Build Coastguard WorkerMilestones
114*61c4878aSAndroid Build Coastguard Worker==========
115*61c4878aSAndroid Build Coastguard Worker*  **M0: Good for Most.** We can recommend Bazel as the build system for most
116*61c4878aSAndroid Build Coastguard Worker   new projects. We may not have full parity with GN yet, but we're close enough
117*61c4878aSAndroid Build Coastguard Worker   that the benefits of adopting Bazel exceed the costs, even in the short run.
118*61c4878aSAndroid Build Coastguard Worker   The target date for this milestone is the end of 2023.
119*61c4878aSAndroid Build Coastguard Worker
120*61c4878aSAndroid Build Coastguard Worker   * Out of scope for M0: Windows support. We have to start somewhere, and we're
121*61c4878aSAndroid Build Coastguard Worker     starting with Linux and MacOS.
122*61c4878aSAndroid Build Coastguard Worker
123*61c4878aSAndroid Build Coastguard Worker*  **M1: Good for All.** We can recommend Bazel for all new Pigweed projects,
124*61c4878aSAndroid Build Coastguard Worker   including ones that need Windows support.  The target date is end of Q1
125*61c4878aSAndroid Build Coastguard Worker   2024. After this date, we don't expect any new projects to use GN.
126*61c4878aSAndroid Build Coastguard Worker
127*61c4878aSAndroid Build Coastguard Worker*  **M2: Best.** We develop compelling features for embedded within the
128*61c4878aSAndroid Build Coastguard Worker   Bazel ecosystem. This will happen throughout 2024.
129*61c4878aSAndroid Build Coastguard Worker
130*61c4878aSAndroid Build Coastguard WorkerTechnical tracks
131*61c4878aSAndroid Build Coastguard Worker================
132*61c4878aSAndroid Build Coastguard WorkerThere are three main technical tracks:
133*61c4878aSAndroid Build Coastguard Worker
134*61c4878aSAndroid Build Coastguard Worker*  **Configurable toolchains** exist for host and embedded, for C++ and Rust.
135*61c4878aSAndroid Build Coastguard Worker   A separate upcoming SEED will cover this area in detail, but the high-level
136*61c4878aSAndroid Build Coastguard Worker   goal is to make it straightforward to create families of related toolchains
137*61c4878aSAndroid Build Coastguard Worker   for embedded targets. This is required for milestone M0, except for Windows
138*61c4878aSAndroid Build Coastguard Worker   support, which is part of M1. The overall tracking issue is `b/300458513
139*61c4878aSAndroid Build Coastguard Worker   <https://issues.pigweed.dev/issues/300458513>`_.
140*61c4878aSAndroid Build Coastguard Worker
141*61c4878aSAndroid Build Coastguard Worker*  **Core build patterns** (facades, multi-platform build, third-party crate
142*61c4878aSAndroid Build Coastguard Worker   deps for Rust) are established, documented, and usable.
143*61c4878aSAndroid Build Coastguard Worker
144*61c4878aSAndroid Build Coastguard Worker   * M0:
145*61c4878aSAndroid Build Coastguard Worker
146*61c4878aSAndroid Build Coastguard Worker     * Module configuration is supported in Bazel, `b/234872811
147*61c4878aSAndroid Build Coastguard Worker       <https://issues.pigweed.dev/issues/234872811>`_.
148*61c4878aSAndroid Build Coastguard Worker     * Bazel proto codegen is feature-complete, `b/301328390
149*61c4878aSAndroid Build Coastguard Worker       <https://issues.pigweed.dev/issues/301328390>`_.
150*61c4878aSAndroid Build Coastguard Worker     * Multiplatform build is ergonomic thanks to the adoption of
151*61c4878aSAndroid Build Coastguard Worker       `platform_data
152*61c4878aSAndroid Build Coastguard Worker       <https://github.com/bazelbuild/proposals/blob/main/designs/2023-06-08-standard-platform-transitions.md#depend-on-a-target-built-for-a-different-platform>`_
153*61c4878aSAndroid Build Coastguard Worker       and `platform-based flags
154*61c4878aSAndroid Build Coastguard Worker       <https://github.com/bazelbuild/proposals/blob/main/designs/2023-06-08-platform-based-flags.md>`_, `b/301334234
155*61c4878aSAndroid Build Coastguard Worker       <https://issues.pigweed.dev/issues/301334234>`_.
156*61c4878aSAndroid Build Coastguard Worker     * Clang sanitizers (asan, msan, tsan) are easy to enable in the Bazel build, `b/301487567
157*61c4878aSAndroid Build Coastguard Worker       <https://issues.pigweed.dev/issues/301487567>`_.
158*61c4878aSAndroid Build Coastguard Worker
159*61c4878aSAndroid Build Coastguard Worker   * M1:
160*61c4878aSAndroid Build Coastguard Worker
161*61c4878aSAndroid Build Coastguard Worker     * On-device testing pattern for Bazel projects developed and documented, `b/301332139
162*61c4878aSAndroid Build Coastguard Worker       <https://issues.pigweed.dev/issues/301332139>`_.
163*61c4878aSAndroid Build Coastguard Worker     * Sphinx documentation can be built with Bazel.
164*61c4878aSAndroid Build Coastguard Worker     * OSS Fuzz integration through Bazel.
165*61c4878aSAndroid Build Coastguard Worker
166*61c4878aSAndroid Build Coastguard Worker*  **Bootstrap** for Bazel projects is excellent. This includes offering
167*61c4878aSAndroid Build Coastguard Worker   interfaces to Pigweed developer tooling like :ref:`module-pw_console`,
168*61c4878aSAndroid Build Coastguard Worker   :ref:`module-pw_cli`, etc.
169*61c4878aSAndroid Build Coastguard Worker
170*61c4878aSAndroid Build Coastguard Worker   * M0: GN-free bootstrap for Bazel-based projects is designed and prototyped, `b/274658181
171*61c4878aSAndroid Build Coastguard Worker     <https://issues.pigweed.dev/issues/274658181>`_.
172*61c4878aSAndroid Build Coastguard Worker
173*61c4878aSAndroid Build Coastguard Worker   * M1: Pigweed is straightforward to manage as a Bazel dependency, `b/301336229
174*61c4878aSAndroid Build Coastguard Worker     <https://issues.pigweed.dev/issues/301336229>`_.
175*61c4878aSAndroid Build Coastguard Worker
176*61c4878aSAndroid Build Coastguard Worker*  **Onboarding** for users new to Pigweed-on-Bazel is easy thanks to
177*61c4878aSAndroid Build Coastguard Worker   excellent documentation, including examples.
178*61c4878aSAndroid Build Coastguard Worker
179*61c4878aSAndroid Build Coastguard Worker   * M0:
180*61c4878aSAndroid Build Coastguard Worker
181*61c4878aSAndroid Build Coastguard Worker     * There is a Bazel example project for Pigweed, `b/299994234
182*61c4878aSAndroid Build Coastguard Worker       <https://issues.pigweed.dev/issues/299994234>`_.
183*61c4878aSAndroid Build Coastguard Worker     * We have a "build system support matrix" that compares the features
184*61c4878aSAndroid Build Coastguard Worker       available in the three main build systems (Bazel, CMake, GN),
185*61c4878aSAndroid Build Coastguard Worker       `b/301481759 <https://issues.pigweed.dev/issues/301481759>`_.
186*61c4878aSAndroid Build Coastguard Worker
187*61c4878aSAndroid Build Coastguard Worker   * M1:
188*61c4878aSAndroid Build Coastguard Worker
189*61c4878aSAndroid Build Coastguard Worker     * The sample project has Bazel support, `b/302150820
190*61c4878aSAndroid Build Coastguard Worker       <https://issues.pigweed.dev/issues/302150820>`_.
191*61c4878aSAndroid Build Coastguard Worker
192*61c4878aSAndroid Build Coastguard Worker------------
193*61c4878aSAndroid Build Coastguard WorkerAlternatives
194*61c4878aSAndroid Build Coastguard Worker------------
195*61c4878aSAndroid Build Coastguard WorkerThe main alternatives to investing in Bazel are championing GN or switching to
196*61c4878aSAndroid Build Coastguard Workera different build system.
197*61c4878aSAndroid Build Coastguard Worker
198*61c4878aSAndroid Build Coastguard WorkerChampion GN
199*61c4878aSAndroid Build Coastguard Worker===========
200*61c4878aSAndroid Build Coastguard WorkerPigweed does not have the resources to bring GN to parity with modern build
201*61c4878aSAndroid Build Coastguard Workersystems like Bazel, Buck2, or Meson. This is an area where we should partner
202*61c4878aSAndroid Build Coastguard Workerwith another large project rather than build capabilities ourselves.
203*61c4878aSAndroid Build Coastguard Worker
204*61c4878aSAndroid Build Coastguard WorkerCMake
205*61c4878aSAndroid Build Coastguard Worker=====
206*61c4878aSAndroid Build Coastguard WorkerCMake is `the most popular build system for C++ projects
207*61c4878aSAndroid Build Coastguard Worker<https://www.jetbrains.com/lp/devecosystem-2021/cpp/#Which-project-models-or-build-systems-do-you-regularly-use>`_,
208*61c4878aSAndroid Build Coastguard Workerby a significant margin. We already offer some CMake support in Pigweed. But
209*61c4878aSAndroid Build Coastguard Workerit's not a viable candidate for Pigweed's primary build system:
210*61c4878aSAndroid Build Coastguard Worker
211*61c4878aSAndroid Build Coastguard Worker* **No multi-toolchain builds** Unlike Bazel and GN, CMake does not support
212*61c4878aSAndroid Build Coastguard Worker  multi-toolchain builds.
213*61c4878aSAndroid Build Coastguard Worker* **No Python or Rust support** Again unlike Bazel and GN, CMake is primarily
214*61c4878aSAndroid Build Coastguard Worker  focused on building C++ code. But Pigweed is a multilingual project, and
215*61c4878aSAndroid Build Coastguard Worker  Python and Rust need first-class treatment.
216*61c4878aSAndroid Build Coastguard Worker* **No hermetic builds** Unlike Bazel, CMake does not support sandboxing.
217*61c4878aSAndroid Build Coastguard Worker
218*61c4878aSAndroid Build Coastguard WorkerMany developers are attracted to CMake by its IDE support. Fortunately, `IDE
219*61c4878aSAndroid Build Coastguard Workersupport for Bazel is also well-developed <https://bazel.build/install/ide>`_.
220*61c4878aSAndroid Build Coastguard Worker
221*61c4878aSAndroid Build Coastguard WorkerOther build systems
222*61c4878aSAndroid Build Coastguard Worker===================
223*61c4878aSAndroid Build Coastguard WorkerThere are other multi-lingual, correctness-emphasizing build systems out there,
224*61c4878aSAndroid Build Coastguard Workermost prominently `Meson <https://mesonbuild.com/>`_ and `Buck2
225*61c4878aSAndroid Build Coastguard Worker<https://buck2.build/>`_. We did not consider them realistic targets for
226*61c4878aSAndroid Build Coastguard Workermigration at this time. They offer similar features to Bazel, and we have an
227*61c4878aSAndroid Build Coastguard Workerexisting Bazel build that's in use by some projects, as well as a closer
228*61c4878aSAndroid Build Coastguard Workerrelationship with the Bazel community.
229*61c4878aSAndroid Build Coastguard Worker
230*61c4878aSAndroid Build Coastguard Worker--------------
231*61c4878aSAndroid Build Coastguard WorkerOpen questions
232*61c4878aSAndroid Build Coastguard Worker--------------
233*61c4878aSAndroid Build Coastguard WorkerAdditional SEEDs related to Bazel support are anticipated but have not yet been
234*61c4878aSAndroid Build Coastguard Workerwritten. They will be linked from here once they exist.
235*61c4878aSAndroid Build Coastguard Worker
236*61c4878aSAndroid Build Coastguard Worker* `SEED-0113
237*61c4878aSAndroid Build Coastguard Worker  <https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/173453>`_:
238*61c4878aSAndroid Build Coastguard Worker  Modular Bazel C/C++ toolchain API
239*61c4878aSAndroid Build Coastguard Worker* SEED-????: Pigweed CI/CQ for Bazel
240*61c4878aSAndroid Build Coastguard Worker
241*61c4878aSAndroid Build Coastguard Worker----------------------------
242*61c4878aSAndroid Build Coastguard WorkerAppendix: Why Bazel is great
243*61c4878aSAndroid Build Coastguard Worker----------------------------
244*61c4878aSAndroid Build Coastguard WorkerThis SEED has not focused on why Bazel is a great build system. This is because
245*61c4878aSAndroid Build Coastguard Workerwe are not choosing Bazel over other major build systems, like Meson or Buck2,
246*61c4878aSAndroid Build Coastguard Workerfor its specific features. We are motivated to recommend a new build system
247*61c4878aSAndroid Build Coastguard Workerbecause of GN's limitations, and we choose Bazel because we have a pre-existing
248*61c4878aSAndroid Build Coastguard Workercommunity of Bazel users, developers with Bazel experience, and a close
249*61c4878aSAndroid Build Coastguard Workerrelationship with the Bazel core team.
250*61c4878aSAndroid Build Coastguard Worker
251*61c4878aSAndroid Build Coastguard WorkerBut actually, Bazel *is* great! Here are some things we like best about it:
252*61c4878aSAndroid Build Coastguard Worker
253*61c4878aSAndroid Build Coastguard Worker*  **Correct incremental builds.** It's great to be able to trust the build
254*61c4878aSAndroid Build Coastguard Worker   system to just do the right thing, including on a rebuild.
255*61c4878aSAndroid Build Coastguard Worker*  **External dependency management.** Bazel can manage external dependencies
256*61c4878aSAndroid Build Coastguard Worker   for you, including lazily downloading them only when needed. By leveraging
257*61c4878aSAndroid Build Coastguard Worker   this, we expect to speed up Pigweed bootstrap from several minutes to
258*61c4878aSAndroid Build Coastguard Worker   several seconds.
259*61c4878aSAndroid Build Coastguard Worker*  **Remote build execution** Bazel has excellent native support for `executing
260*61c4878aSAndroid Build Coastguard Worker   build actions in a distributed manner on workers in the cloud
261*61c4878aSAndroid Build Coastguard Worker   <https://bazel.build/remote/rbe>`_. Although embedded builds are typically
262*61c4878aSAndroid Build Coastguard Worker   small, build latency and infra test latency is a recurring concern among
263*61c4878aSAndroid Build Coastguard Worker   Pigweed users, and leveraging remote builds should allow us to dramatically
264*61c4878aSAndroid Build Coastguard Worker   improve performance in this area.
265*61c4878aSAndroid Build Coastguard Worker*  **Python environment management.** The Python rules for Bazel take care of
266*61c4878aSAndroid Build Coastguard Worker   standing up a Python interpreter with a project-specific virtual
267*61c4878aSAndroid Build Coastguard Worker   environment, a functionality we had to develop in-house for our GN build.
268*61c4878aSAndroid Build Coastguard Worker*  **Multilingual support.** Bazel comes with official or widely adopted
269*61c4878aSAndroid Build Coastguard Worker   third-party rules for C++, Python, Java, Go, Rust, and other langauges.
270*61c4878aSAndroid Build Coastguard Worker*  **Active community.** The Bazel Slack is always helpful, and GitHub issues
271*61c4878aSAndroid Build Coastguard Worker   tend to receive swift attention.
272