Bazel lets you set up various “modes” of compilation. There are several built-in (fast, optimized, debug) and you can define your own. The built in ones are:
- Fast: build your program as quickly as possible. This is generally best for development (when you want a tight compile/edit loop) and is the default, when you don’t specify anything. Your build’s output is generated in
- Optimized: code is compiled to run fast, but may take longer to build. You can get this by running
bazel build -c opt //your:targetand it’s output will be generated in
bazel-out/local-opt. This mode is the best for code that will be deployed.
- Debug: this leaves in symbols and generally optimizes code for running through a debugger. You can get this by running
bazel build -c dbg //your:targetand it’s output will be generated in
You don’t have to actually know where the build’s output is stored, bazel will update the bazel-bin/bazel-genfiles symlinks for you automatically at the end of your build, so they’ll always point to the right bazel-out subdirectory.
Because each flavor’s output is stored in a different directory, each mode effectively has an entirely separate set of build artifacts, so you can get incremental builds when switching between modes. On the downside: when you build in a new mode for the first time, it’s essentially a clean build.
-c is short for
--compilation_mode, but everyone just says
Defining a new mode
Okay, you can’t really define your own mode without tons of work, but you can create named sets of options (which is probably what you wanted anyway unless you’re writing your own toolchain).
For example, let’s say I generally have several flags I want to run with when I’m trying to debug a failing test. I can create a “gahhh” config in my ~/.bazelrc as follows:
test:gahhh --test_output=all test:gahhh --nocache_test_results test:gahhh --verbose_failures test:gahhh -c dbg
The “test” part indicates what command this applies to (“build”, “query” or “startup” are other useful ones). The “:gahhh” names the config, and then I give the option. Now, when I get frustrated, I can run:
$ bazel test --config gahhh //my:target
and I don’t have to remember the four options that I want to use.