aboutsummaryrefslogtreecommitdiffhomepage
path: root/FAQ.md
blob: 9a1e8eaf8983285dc240706bbe2459134501e370 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436

What is Bazel?
-------------

Bazel is a build system, i.e. a system that will run compilers and
tests to assemble your software, similar to Make, Ant, Gradle, Buck, Pants,
and Maven.


What is special about Bazel?
-----------------------

Bazel was designed to fit the way software is developed at Google. It
has the following features:

* Multi-language support: Bazel supports Java and C++ out of the box,
  and can be extended to support arbitrary programming languages.

* High-level build language: Projects are described in the BUILD
  language, a concise text format that describes a project as sets of
  small interconnected libraries. By contrast, in systems like Make
  you have to describe individual files and compiler invocations.

* Multi-platform support: The same tool and the same BUILD files can
  be used to build software for different architectures, and even
  different platforms.  At Google, we use Bazel to build both server
  applications (C++, Java, and Go binaries running on systems in our
  data centers) and client apps (Android and iOS apps running on ARM
  chips).

* Reproducibility: In BUILD files, each library, test, and binary must
  specify its dependencies completely.  Bazel uses this dependency
  information to know what must be rebuilt when you make changes to a
  source file, and which tasks can run in parallel.  This means that
  all builds are incremental and will always produce the same result.

* Scalable: Bazel can handle large builds; at Google, it is common for
  a server binary to have 100k source files, and builds where no files
  were changed take about ~200ms.


Why didn't you use ...?
-----------------------

* Make, Ninja: These systems give very exact control over what commands
  get invoked to build files, but it's up to the user to write rules
  that are correct.

  Users interact with Bazel on a higher level. For example, it has
  built-in rules for "Java test", "C++ binary", and notions such as
  "target platform" and "host platform". The rules have been battle
  tested to be foolproof.

* Ant and Maven: Ant and Maven are primarily geared toward Java, while
  Bazel handles multiple languages.  Bazel encourages subdividing
  codebases in smaller reusable units, and can rebuild only ones that
  need rebuilding. This speeds up development when working with larger
  codebases.

* Gradle: Bazel configuration files are much more structured than
  Gradle's, letting Bazel understand exactly what each action does.
  This allows for more parallelism and better reproducibility.

* Buck, Pants: Both systems were created ex-Googlers at Twitter and
  Facebook. They have been modeled on Bazel, but their feature set
  has not caught up to Bazel, so it's not an alternative for us.


What is Bazel's origin?
-----------------------

Bazel is a flavor of the tool that Google uses to build its server
software internally. It has expanded to also build the client apps
(iOS, Android) that connect to our servers.


Did you rewrite your internal tool as open-source? Is it a fork?
----------------------------------------------------------------

Bazel shares most of its code with the internal tool and its rules are
used for zillions of builds every day.


Why did Google build Bazel?
---------------------------

A long time ago, Google built its software using large, generated
Makefiles. These led to slow and unreliable builds, which began to
interfere with our developers' productivity and the company's
agility. Hence, we built Bazel.


Does Bazel require a build cluster?
-----------------------------------

Google's in-house flavor of Bazel does use [build
clusters](http://google-engtools.blogspot.com/2011/09/build-in-cloud-distributing-build-steps.html),
so Bazel does have hooks in the code base to plug-in a remote build
cache or a remote execution system.

The code base we are opening up runs tasks locally. We are confident
that this is fast enough for most of our users.


How does the Google development process work?
----------------------------------------------

For our server code, we use the following development workflow:

* All of our server code base is in a single, gigantic version control
  system.

* Everybody builds their software with Bazel.

* Different teams own different parts of the source tree, and make
  their components available as BUILD targets.

* Branching is primarily used for managing releases, so everybody
  develops their software at head.

Bazel is a cornerstones of this philosophy: since Bazel requires all
dependencies to be fully specified, we can predict which programs and
tests are affected by a change, and vet them before submission.

More background on the development process at Google can be found on
the [eng tools blog](http://google-engtools.blogspot.com/).


Why are you opening up Bazel?
-----------------------------

Building software should be fun and easy, and slow and unpredictable
builds take the fun out of programming.


Why would I want to use Bazel?
------------------------------

* Bazel may give you faster build times because it can recompile only
  the files that need to be recompiled. Similarly, it can skip
  re-running tests it knows haven't changed.

* Bazel produces deterministic results. This eliminates skews
  between incremental vs clean builds, laptop vs CI system, etc.

* Bazel can share code between different client and server apps. For
  example, you can change a client/server protocol in a single commit,
  and test that the updated mobile app works with the updated server,
  building both with the same tool, reaping all the aforementioned
  benefits of Bazel.


What is Bazel best at?
----------------------

Bazel shines at building and testing projects with the following properties:

* Projects with a large codebase
* Projects written in (multiple) compiled languages
* Projects that deploy on multiple platforms
* Projects that have extensive tests


On what platforms does Bazel run?
---------------------------------

Currently, Linux and MacOS. Porting to other Unix platforms should be
straightforward, provided a JDK is available for the platform.


What about Windows?
-------------------

We have experimented with a Windows port using MinGW/MSYS (see
README.windows), but have no plans to invest in this port right
now. Due to its Unix heritage, porting Bazel is significant work. For
example, Bazel uses symlinks extensively, which has varying levels of
support across Windows versions.


What should I not use Bazel for?
--------------------------------

* Bazel tries to be smart about caching. This means it is a bad match
  for build steps that may not be cached. For example, the following
  steps should not be controlled from Bazel:

  * A compilation step that fetches data from the internet.
  * A test step that connects to the QA instance of your site.
  * A deployment step that changes your site's cloud configuration.

* Bazel tries to minimize expensive compilation steps. If you are only
  using interpreted languages, such as JavaScript or Python, Bazel
  will likely not interest you.



How stable is Bazel's feature set?
--------------------

The core features (C++, Java, and shell rules) have extensive use
inside Google, so they are thoroughly tested and have very little
churn.  Similarly, we test new versions of Bazel across our millions
of targets every day to find regressions, and we release new versions
multiple times every month.

In short, except for features marked as experimental, at any point in
time, Bazel should Just Work.

You can recognize the different experimental features as follows:

* Options: Experimental features start with --experimental_.

* Rules: Experimental rules are undocumented in the
  build encyclopedia. TODO(bazel-team): add link.

* Attributes: Experimental rule attributes are undocumented in the
  build encyclopedia. TODO(bazel-team): add link.

* TODO(bazel-team): document skylark status more precisely.


How stable is Bazel as a binary?
--------------------

Inside Google, we make sure that Bazel crashes are very rare. This
should also hold for our open-source codebase.


How can I start using Bazel?
----------------------------

See our [getting started
doc](https://github.com/google/bazel/blob/master/docs/getting-started.md)

TODO(bazel-team): more doc links


Why do I need to have a tools/ directory in my tree?
----------------------------------------------------

Your project never works in isolation. Typically, it builds with a
certain version of the JDK/C++ compiler, with a certain test driver
framework, on a certain version of your operating system.

These aspects make builds less reproducible, and to counter this, we
at Google check most of these tools into version control, including
the toolchains and Bazel itself. By convention, we do this in a
directory called "tools".

Bazel allows tools such as the JDK to live outside your workspace, but
the configuration data for this (where is the JDK, where is the C++
compiler?) still needs to be somewhere, and that place is tools/.

Bazel comes with a base_workspace/ directory, containing a minimal set
of configuration files, suitable for running toolchains from
/usr/bin/.


Doesn't Docker solve the reproducibility problems?
--------------------------------------------------

With Docker you can easily create sandboxes with fixed OS releases,
eg. Ubuntu 12.04, Fedora 21. This solves the problem of
reproducibility for the system environment (i.e. "which version of
/usr/bin/c++ do I need?").

It does not address reproducibility with regard to changes in the
source code.  Running Make with a poorly written Makefile inside a
Docker container can still yield unpredictable results.

Inside Google, we check in tools for reproducibility.  In this way, we
can vet changes to tools ("upgrade GCC to 4.6.1") with the same
mechanism as changes to base libraries ("fix bounds check in OpenSSL").


Will Bazel make my builds reproducible automatically?
-----------------------------------------------------

For Java and C++ binaries, yes, assuming you do not change the
toolchain. If you have build steps that involve custom recipes
(eg. executing binaries through a shell rule), you will need to take
some extra care:

  * Do not use dependencies that were not declared. Sandboxed
    execution (--spawn_strategy=sandboxed-linux, only on Linux) can
    help find undeclared dependencies.

  * Avoid storing timestamps in artifacts. ZIP files and other
    archives are especially prone to this.

  * Avoid connecting to the network. Sandboxed execution can help here
    too.

  * Avoid processes that use random numbers, in particular, dictionary
    traversal is randomized in many programming languages.


Do you have binary releases?
----------------------------

No, but we should. Stay tuned.


I use Eclipse/IntelliJ. How does Bazel interoperate with IDEs?
--------------------------------------------------------------

For integrating with external tools, including IDEs, we have the
following hooks:

* "bazel query": lets you query the target dependency graph, see
  TODO(bazel-team): link to doc.

* Extra actions: Bazel can emit protobuf data detailing what
  commands are to be invoked for building certain targets.

Stay tuned for example IDE integration code.


I use Jenkins/CircleCI/TravisCI. How does Bazel interoperate with CI systems?
-----------------------------------------------------------------------------

Bazel returns an invalid exit code if the build or test invocation
fails, and this should be enough for basic CI integration.  Since
Bazel does not need clean builds for correctness, the CI system can
be configured to not clean before starting a build/test run.


What future features can we expect in Bazel?
--------------------------------------------

We work on supporting Google's internal use-cases. This includes
Google's principal languages (C++, Java, Go) and major platforms
(Linux, Android, iOS).  For practical reasons, not all of these are
open-sourced.

TODO(bazel-team): add link to public roadmap.


Where is the support for Go? Android?
-------------------------------------

We haven't made up our mind about these yet.


What about Python?
------------------

Even though Google uses Python internally, we have no plans to
open-source our Python support.


Can I use Bazel for my LISP/Python/Haskell/Scala/Rust project?
-----------------------------------------------

We have an extension mechanism that allows you to add new rules
without recompiling Bazel.

For documentation: see TODO(bazel-team).

At present, the extension mechanism is experimental though.


I need more functionality; can I add rules that are compiled into Bazel?
---------------------------------------------

If our extension mechanism is insufficient for your use case, email
the mailing list for advice: bazel-discuss@googlegroups.com.



Can I contribute to the Bazel code base?
----------------------------------------

Not yet, but we are working on a process.

Please consider the following:

* Before starting to code, discuss your plan to make sure we agree on
  it. We can be reached at bazel-discuss@googlegroups.com.

* All contributors must sign a Contributor License Agreement at

   https://cla.developers.google.com/

* All contributions will have to go through pre-commit code review.

* Contributions need a Google team member as sponsor.

TODO(bazel-team): set up a process


Why isn't all development done in the open?
-------------------------------------------

We still have to refactor the interfaces between the public code in
Bazel and our internal extensions frequently. This makes it hard to do
much development in the open.

TODO(bazel-team): link to roadmap.


How do I contact the team?
--------------------------

We are reachable at bazel-discuss@googlegroups.com.


Where do I report bugs?
-----------------------

Send us e-mail at bazel-discuss@googlegroups.com.



What's up with the word "Blaze" in the codebase?
------------------------------------------------

This is an internal name for the system. Please refer to Bazel as
Bazel.


Why do other Google projects (Android, Chrome) use other build tools?
---------------------------------------------------------------------

Until now, Bazel was not available externally, so open source projects
such as Chromium, Android, etc. could not use it. In addition, lack of
Windows support is a problem for building Windows applications, such
as Chrome.


How do you pronounce "Bazel"?
-----------------------------

The same way as "basil" (the herb) in US English: "BAY-zel". It rhymes with
"hazel". IPA: /ˈbeɪzˌəl/