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