Change compiler command line with Bazel

Viewed 740

I'd like to have complete control over the command line arguments Bazel passes to the compiler when compiling and linking C++ files. For example, I'd like to use a G++ from a custom path, I'd like to change -std=c++0x to -std=c++14 and remove -fno-omit-frame-pointer - with the following constraints:

  • Avoid setting the compiler via CC envvar, as it is fragile
  • Avoid using --crosstool_top et. al, as I understand Bazel is moving away from it
  • Be compatible with --all_incompatible_changes
  • Do not simply override those args via copts, as it is fragile and makes error prone commands

Preferably, I'd like to get the auto detected, generated toolchain, modify it, and commit it to my workspace, to be used by every C++ target in the workspace, including imported, from source compiled workspaces.

I looked at Toolchains, Configuring C++ toolchain, rules_cc - but I couldn't figure it out.

3 Answers

The default arguments (e.g: -fno-omit-frame-pointer or -std=c++0x) can be removed by disabling the default_compile_flags feature that provides them:

$ bazel build ... --features=-default_compile_flags

Add a .bazelrc to your project. Add the lines

build:your_config --cxxopt=-std=c++14

Build your code:

bazel build --config=your_config //...

You can also do this in your BUILD file for the entire package:

package(features = ["-default_compile_flags"])

or on a specific binary:

cc_binary(
    name = "cppversion",
    srcs = ["cppversion.cpp"],
    copts = ["--std=c++14"],
    features = ["-default_compile_flags"]
)
Related