Skip to content

Configuring a cc_binary differently than a cc_test

Greg edited this page May 7, 2019 · 3 revisions
# This is an example of using a Starlark (user-defined) transition to make
# two native rules build with different settings in the same build.

cat tt/BUILD
load("//tt:defs.bzl", "transitioning_rule")
 
cc_test(
    name = "test",
    srcs = ["test.cc"],
    data = [":transitioner"],
    deps = ["//testing:gunit"],
)
 
transitioning_rule(
    name = "transitioner",
    actual_binary = ":bin",
)
 
cc_binary(
    name = "bin",
    srcs = ["bin.cc"],
    copts = ["-DCOMPILATION_MODE=\\\"$(COMPILATION_MODE)\\\""],
)
 
#### #### #### #### #### #### #### #### #### #### #### #### #### #### 
$  cat tt/defs.bzl
def _impl(ctx):
    return [
        DefaultInfo(
            data_runfiles =
                ctx.attr.actual_binary[0][DefaultInfo].data_runfiles,
        ),
    ]
 
def _transition_impl(settings):
    return {"//command_line_option:compilation_mode": "opt"}
 
_comp_mode_transition = transition(
    implementation = _transition_impl,
    inputs = [],
    outputs = ["//command_line_option:compilation_mode"],
)
 
transitioning_rule = rule(
    implementation = _impl,
    attrs = {
        "actual_binary": attr.label(cfg = _comp_mode_transition),
    },
)
 
#### #### #### #### #### #### #### #### #### #### #### #### #### 
$  cat tt/bin.cc 
#include <iostream>
 
int main(int argc, char** argv) {
  std::cout << "Binary on compilation mode=" << COMPILATION_MODE << "\n";
}
 
#### #### #### #### #### #### #### #### #### #### #### #### ####
$  bazel build  //tt:test --compilation_mode=fastbuild
INFO: Analysed target //tt:test (0 packages loaded, 0 targets configured).
INFO: Found 1 target...
Target //tt:test up-to-date:
  bazel-bin/tt/test
INFO: Build completed successfully, 2 total actions
 
#### #### #### #### #### #### #### #### #### #### #### #### ####
$  bazel-bin/tt/test.runfiles/tt/bin
Binary on compilation mode=opt
Clone this wiki locally