Welcome to the next pikoTutorial !
Let’s consider a simple project with the following structure:
project/
├── .bazelrc
├── BUILD
├── main.cpp
├── WORKSPACEThe 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
}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_ENABLEDWhen we build the application with the following command:
bazel build --config=feature_1 //:my_appI can run the application by invoking:
./bazel-bin/my_appBut as soon as I build the second configuration of the application with command:
bazel build --config=feature_2 //:my_appI 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/From now on, at every point of time, you can run the first version of the application with command:
./build/feature_1/bin/my_appAnd the second version with command:
./build/feature_2/bin/my_appThey will no longer be overwritten.
Read also:
- Bug of the week #13
- git log tricks you really should know
- Surprisingly necessary explanation of Python venv
- When AI gets C++ bitmask enums almost right
- 10 VS Code snippets essential for every C++ engineer
- Storing your ATTiny program in…EEPROM?
- Bug of the week #12
- Sharing variable between bash scripts
- A 40-line LLM-based bash command executor in Python
- GTest and short-circuit evaluation in C++
- AI is powerful. Snippets are instant.
- From AUTOSAR to S-Core: the first C++ pub/sub implementation
- How to write Arduino Uno code with Python?
- Combining Bazel with Docker
- Running commands with timeout on Linux
- Running Python unit tests with CMake
- Thirdparty dependencies with FetchContent
- Bug of the week #11
- Combining CMake with Docker
- How to search the internet from Linux terminal?
- Folding expressions in C++
- How to derive from an enum in Python?
- Bug of the week #10
- Trying ROS2: client/server within a single container
- Make C++ a better place #4: Go as an alternative
- How to convert hex to dec in Linux terminal?
- Setting up a Python project with CMake
- Separating builds for different configs with Bazel
- Trying ROS2: pub/sub within a single container
- Bug of the week #9
- UDP multicasting with Python
- Destruction order vs thread safety in C++
- Let’s review some code: C++ #2
- Make C++ a better place #3: D as an alternative
- Registering callback using std::function in C++
- Bug of the week #8
- TCP client/server with Python
- Simple menus in Bash scripts with select
- Calling member function on a nullptr in C++
- Bug of the week #7
- Python lru_cache explained
- How to dockerize a Python application?
- Make C++ a better place #2: CppFront as an alternative
- Parameters combinations in GoogleTest
- Data transfer with curl
- Python reduce explained
- Bug of the week #6
- Custom literals in C++
- Linux and hash command
- 5 Python good practices which make life easier
- Let’s review some code: Python #1
- Make C++ a better place #1: What does better mean
- Enums vs enum class in C++
- Bug of the week #5
- UDP client/server with Python
- Hard links in Linux
- Functions calling order in unit tests in C++
- Bug of the week #4
- Yield in Python – state machines, coroutines and more
- Copy files from another branch with Git









