Separating builds for different configs with Bazel
pikoTutorial

pikoTutorial @pikotutorial

About: Inspired by the SI unit prefix “pico” (10^-12), this place aims to deliver short and targeted tutorials which can speed up work of every software engineer.

Joined:
Dec 14, 2024

Separating builds for different configs with Bazel

Publish Date: Jun 10
0 1

Welcome to the next pikoTutorial !

Let's consider a simple project with the following structure:

project/
├── .bazelrc
├── BUILD
├── main.cpp
├── WORKSPACE
Enter fullscreen mode Exit fullscreen mode

The main function has 2 compile switches:

#include <iostream>

int main(int argc, char** argv)
{
#ifdef FEATURE_1_ENABLED
    std::cout << "Hello from feature 1 code!" << std::endl;
#endif
#ifdef FEATURE_2_ENABLED
    std::cout << "Hello from feature 2 code!" << std::endl;
#endif
}
Enter fullscreen mode Exit fullscreen mode

And we have 2 separate Bazel configurations including these switches:

build:feature_1 --compilation_mode=dbg
build:feature_1 --copt=-DFEATURE_1_ENABLED

build:feature_2 --compilation_mode=opt
build:feature_2 --copt=-DFEATURE_2_ENABLED
Enter fullscreen mode Exit fullscreen mode

When we build the application with the following command:

bazel build --config=feature_1 //:my_app
Enter fullscreen mode Exit fullscreen mode

I can run the application by invoking:

./bazel-bin/my_app
Enter fullscreen mode Exit fullscreen mode

But as soon as I build the second configuration of the application with command:

bazel build --config=feature_2 //:my_app
Enter fullscreen mode Exit fullscreen mode

I lost my previous binary because the build artifacts have been overwritten. A solution for that is separation of build directories with --symlink_prefix option added in the .bazelrc file:

build:feature_1 --compilation_mode=dbg
build:feature_1 --copt=-DFEATURE_1_ENABLED
build:feature_1 --symlink_prefix=./build/feature_1/

build:feature_2 --compilation_mode=opt
build:feature_2 --copt=-DFEATURE_2_ENABLED
build:feature_2 --symlink_prefix=./build/feature_2/
Enter fullscreen mode Exit fullscreen mode

From now on, at every point of time, you can run the first version of the application with command:

./build/feature_1/bin/my_app
Enter fullscreen mode Exit fullscreen mode

And the second version with command:

./build/feature_2/bin/my_app
Enter fullscreen mode Exit fullscreen mode

They will no longer be overwritten.

Comments 1 total

Add comment