/bazel
Bazel build system skill for C/C++ projects. Use when writing BUILD files with cc_library and cc_binary rules, registering toolchains, configuring remote execution, debugging sandbox issues, using query and cquery for dependency graphs, or migrating from CMake to Bazel.
$ npx -y skills add mohitmishra786/low-level-dev-skills --skill bazel --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/bazel
Context preview
The summary Claude sees to decide when to auto-load this skill.
Bazel build system skill for C/C++ projects. Use when writing BUILD files with cc_library and cc_binary rules, registering toolchains, configuring remote execution, debugging sandbox issues, using query and cquery for dependency graphs, or migrating from CMake to Bazel.
SKILL.md
bazel.SKILL.mdname: bazel
description: Bazel build system skill for C/C++ projects. Use when writing BUILD files with cc_library and cc_binary rules, registering toolchains, configuring remote execution, debugging sandbox issues, using query and cquery for dependency graphs, or migrating from CMake to Bazel. Activates on queries about Bazel, BUILD files, cc_library, cc_binary, Bzlmod, bazel query, remote execution, or Bazel toolchain registration.
Bazel
Purpose
Guide agents through Bazel for C/C++ projects: writing BUILD files, cc_library/cc_binary rules, toolchain registration, remote execution, dependency graph queries, Bzlmod dependency management, and sandbox debugging.
Triggers
- "How do I write a Bazel BUILD file for a C++ library?"
- "How do I add external dependencies with Bzlmod?"
- "How do I debug Bazel sandbox errors?"
- "How do I query the Bazel dependency graph?"
- "How do I set up remote execution with Bazel?"
- "How do I register a custom C++ toolchain?"
Workflow
1. Workspace structure
my-project/
├── MODULE.bazel # Bzlmod dependency file (Bazel ≥6)
├── WORKSPACE # legacy (still needed for some features)
├── BUILD # root build file
├── src/
│ ├── BUILD
│ └── main.cc
└── lib/
├── BUILD
├── mylib.cc
└── mylib.h2. Basic BUILD file — cc_library / cc_binary
# lib/BUILD
cc_library(
name = "mylib",
srcs = ["mylib.cc"],
hdrs = ["mylib.h"],
copts = ["-Wall", "-Wextra", "-std=c++17"],
visibility = ["//visibility:public"],
deps = [
"@com_google_absl//absl/strings", # external dep
"//util:helpers", # internal dep
],
)
cc_test(
name = "mylib_test",
srcs = ["mylib_test.cc"],
deps = [
":mylib",
"@com_google_googletest//:gtest_main",
],
)# src/BUILD
cc_binary(
name = "main",
srcs = ["main.cc"],
deps = ["//lib:mylib"],
linkopts = ["-lpthread"],
)# Build
bazel build //src:main
bazel build //... # build everything
# Test
bazel test //lib:mylib_test
bazel test //... # run all tests
# Run
bazel run //src:main -- arg1 arg2
# Output path
bazel-bin/src/main
3. Bzlmod — modern dependency management
# MODULE.bazel
module(
name = "my_project",
version = "1.0",
)
bazel_dep(name = "abseil-cpp", version = "20240116.2")
bazel_dep(name = "googletest", version = "1.14.0")
bazel_dep(name = "rules_cc", version = "0.0.9")
bazel_dep(name = "platforms", version = "0.0.8")
# For http_archive deps not yet in BCR (Bazel Central Registry)
# Use module extensions# Check available versions
bazel mod graph | head -30
# Show dependency tree
bazel mod deps --depth=2
4. Dependency graph queries
# Show all dependencies of a target
bazel query "deps(//src:main)"
# Find reverse dependencies (who depends on this?)
bazel query "rdeps(//..., //lib:mylib)"
# Find what changed between builds
bazel query "filter('//lib', deps(//src:main))"
# cquery — configuration-aware query
bazel cquery "deps(//src:main)" --output=files
# Show include paths for a target
bazel cquery "//lib:mylib" --output=build
# Find cycles in the build graph
bazel query --nohost_deps --noimplicit_deps \
"somepath(//src:main, //lib:mylib)"
# aquery — action graph (shows compiler flags, inputs, outputs)
bazel aquery "//src:main"
bazel aquery "//src:main" --output=jsonproto | jq '.actions[0].arguments'5. Toolchain registration
# platforms/BUILD
platform(
name = "linux_x86_64",
constraint_values = [
"@platforms//os:linux",
"@platforms//cpu:x86_64",
],
)
# toolchains/BUILD
cc_toolchain_suite(
name = "my_toolchain",
toolchains = {
"k8": ":my_k8_toolchain",
},
)
cc_toolchain(
name = "my_k8_toolchain",
all_files = ":empty",
compiler_files = ":compiler_wrapper",
# ... other file groups
)
toolchain(
name = "my_cc_toolchain",
toolchain = ":my_k8_toolchain",
toolchain_type = "@bazel_tools//tools/cpp:toolchain_type",
target_compatible_with = ["@platforms//os:linux"],
)# MODULE.bazel — register toolchain
register_toolchains("//toolchains:my_cc_toolchain")6. Remote execution
# Use --remote_executor flag
bazel build //... \
--remote_executor=grpc://buildgrid.example.com:50051 \
--remote_instance_name=main
# Google Cloud Build Remote Execution
bazel build //... \
--remote_executor=remotebuildexecution.googleapis.com \
--remote_instance_name=projects/my-project/instances/default \
--google_default_credentials
# Caching (without remote execution)
bazel build //... \
--remote_cache=grpc://cache.example.com:9092
# Show what's cached
bazel build //... --remote_upload_local_results=true
7. Sandbox debugging
# Show sandbox inputs and outputs
bazel build //src:main --sandbox_debug
# Run build with verbose sandboxing
bazel build //src:main --verbose_failures --sandbox_debug
# Disable sandbox entirely (for debugging)
bazel build //src:main --spawn_strategy=local
# Common sandbox errors
# "No such file or directory" → missing data dependency
# Fix: add file to `data = [...]` attribute
# "Permission denied" → trying to write outside sandbox
# Fix: use genrule output paths instead of hardcoded paths
# "FAILED: Build did NOT complete successfully" → check verbose output
# See the exact command Bazel ran
bazel build //src:main --subcommands
For Bazel C++ toolchain configuration, see [references/bazel-cpp-toolchain.md](references/bazel-cpp-toolchain.md).
Related skills
- Use `skills/build-systems/cmake` for CMake as an alternative build system
- Use `skills/build-systems/build-acceleration` for sccache integration with Bazel remote cache
- Use `skills/compilers/gcc` or `skills/compilers/clang` for compiler flags used in Bazel `copts`
Read more
name: bazel description: Bazel build system skill for C/C++ projects. Use when writing BUILD files with cc_library and cc_binary rules, registering toolchains, configuring remote execution, debugging sandbox issues, using query and cquery for dependency graphs, or migrating from CMake to Bazel. Activates on queries about Bazel, BUILD files, cc_library, cc_binary, Bzlmod, bazel query, remote execution, or Bazel toolchain registration.
Bazel
Purpose
Guide agents through Bazel for C/C++ projects: writing BUILD files, cc_library/cc_binary rules, toolchain registration, remote execution, dependency graph queries, Bzlmod dependency management, and sandbox debugging.
Triggers
- "How do I write a Bazel BUILD file for a C++ library?"
- "How do I add external dependencies with Bzlmod?"
- "How do I debug Bazel sandbox errors?"
- "How do I query the Bazel dependency graph?"
- "How do I set up remote execution with Bazel?"
- "How do I register a custom C++ toolchain?"
Workflow
1. Workspace structure
my-project/
├── MODULE.bazel # Bzlmod dependency file (Bazel ≥6)
├── WORKSPACE # legacy (still needed for some features)
├── BUILD # root build file
├── src/
│ ├── BUILD
│ └── main.cc
└── lib/
├── BUILD
├── mylib.cc
└── mylib.h2. Basic BUILD file — cc_library / cc_binary
# lib/BUILD
cc_library(
name = "mylib",
srcs = ["mylib.cc"],
hdrs = ["mylib.h"],
copts = ["-Wall", "-Wextra", "-std=c++17"],
visibility = ["//visibility:public"],
deps = [
"@com_google_absl//absl/strings", # external dep
"//util:helpers", # internal dep
],
)
cc_test(
name = "mylib_test",
srcs = ["mylib_test.cc"],
deps = [
":mylib",
"@com_google_googletest//:gtest_main",
],
)# src/BUILD
cc_binary(
name = "main",
srcs = ["main.cc"],
deps = ["//lib:mylib"],
linkopts = ["-lpthread"],
)# Build bazel build //src:main bazel build //... # build everything # Test bazel test //lib:mylib_test bazel test //... # run all tests # Run bazel run //src:main -- arg1 arg2 # Output path bazel-bin/src/main
3. Bzlmod — modern dependency management
# MODULE.bazel
module(
name = "my_project",
version = "1.0",
)
bazel_dep(name = "abseil-cpp", version = "20240116.2")
bazel_dep(name = "googletest", version = "1.14.0")
bazel_dep(name = "rules_cc", version = "0.0.9")
bazel_dep(name = "platforms", version = "0.0.8")
# For http_archive deps not yet in BCR (Bazel Central Registry)
# Use module extensions# Check available versions bazel mod graph | head -30 # Show dependency tree bazel mod deps --depth=2
4. Dependency graph queries
# Show all dependencies of a target
bazel query "deps(//src:main)"
# Find reverse dependencies (who depends on this?)
bazel query "rdeps(//..., //lib:mylib)"
# Find what changed between builds
bazel query "filter('//lib', deps(//src:main))"
# cquery — configuration-aware query
bazel cquery "deps(//src:main)" --output=files
# Show include paths for a target
bazel cquery "//lib:mylib" --output=build
# Find cycles in the build graph
bazel query --nohost_deps --noimplicit_deps \
"somepath(//src:main, //lib:mylib)"
# aquery — action graph (shows compiler flags, inputs, outputs)
bazel aquery "//src:main"
bazel aquery "//src:main" --output=jsonproto | jq '.actions[0].arguments'5. Toolchain registration
# platforms/BUILD
platform(
name = "linux_x86_64",
constraint_values = [
"@platforms//os:linux",
"@platforms//cpu:x86_64",
],
)
# toolchains/BUILD
cc_toolchain_suite(
name = "my_toolchain",
toolchains = {
"k8": ":my_k8_toolchain",
},
)
cc_toolchain(
name = "my_k8_toolchain",
all_files = ":empty",
compiler_files = ":compiler_wrapper",
# ... other file groups
)
toolchain(
name = "my_cc_toolchain",
toolchain = ":my_k8_toolchain",
toolchain_type = "@bazel_tools//tools/cpp:toolchain_type",
target_compatible_with = ["@platforms//os:linux"],
)# MODULE.bazel — register toolchain
register_toolchains("//toolchains:my_cc_toolchain")6. Remote execution
# Use --remote_executor flag bazel build //... \ --remote_executor=grpc://buildgrid.example.com:50051 \ --remote_instance_name=main # Google Cloud Build Remote Execution bazel build //... \ --remote_executor=remotebuildexecution.googleapis.com \ --remote_instance_name=projects/my-project/instances/default \ --google_default_credentials # Caching (without remote execution) bazel build //... \ --remote_cache=grpc://cache.example.com:9092 # Show what's cached bazel build //... --remote_upload_local_results=true
7. Sandbox debugging
# Show sandbox inputs and outputs bazel build //src:main --sandbox_debug # Run build with verbose sandboxing bazel build //src:main --verbose_failures --sandbox_debug # Disable sandbox entirely (for debugging) bazel build //src:main --spawn_strategy=local # Common sandbox errors # "No such file or directory" → missing data dependency # Fix: add file to `data = [...]` attribute # "Permission denied" → trying to write outside sandbox # Fix: use genrule output paths instead of hardcoded paths # "FAILED: Build did NOT complete successfully" → check verbose output # See the exact command Bazel ran bazel build //src:main --subcommands
For Bazel C++ toolchain configuration, see [references/bazel-cpp-toolchain.md](references/bazel-cpp-toolchain.md).
Related skills
- Use `skills/build-systems/cmake` for CMake as an alternative build system
- Use `skills/build-systems/build-acceleration` for sccache integration with Bazel remote cache
- Use `skills/compilers/gcc` or `skills/compilers/clang` for compiler flags used in Bazel `copts`
A curated suite of AI agent skills for systems and low-level programming — C/C++, Rust, Zig, GPU, bare-metal firmware, Linux kernel/driver development, computer architecture, compiler internals, HPC, and more.
Repo: mohitmishra786/low-level-dev-skills
Other skills on low-level-dev-skills.
- /custom-allocators
Custom allocator skill for memory allocation strategies. Use when implementing pool/slab/arena allocators, tuning jemalloc/mimalloc, writing Rust GlobalAlloc, or benchmarking allocator performance. Activates on queries about jemalloc, mimalloc, tcmalloc, arena allocator,
Open skill - /numa-programming
NUMA programming skill for multi-socket memory locality. Use when detecting NUMA topology, binding processes with numactl, using libnuma API, building NUMA-aware data structures, or measuring remote access penalties. Activates on queries about numactl, libnuma, NUMA topology,
Open skill - /af-xdp
AF_XDP skill for high-performance XDP sockets. Use when creating AF_XDP sockets, configuring UMEM and XSK rings, XDP_REDIRECT programs, copy vs zero-copy mode, or comparing with DPDK. Activates on queries about AF_XDP, xsk_umem, XDP_REDIRECT, libbpf xsk, or zero-copy XDP.
Open skill - /dpdk
DPDK skill for userspace packet I/O. Use when initializing EAL, configuring PMD drivers, using mbuf pools and rte_ring, setting up huge pages, RSS, or testpmd validation. Activates on queries about DPDK, EAL, rte_eth_rx_burst, hugepages, PMD, or testpmd.
Open skill - /io-uring
io_uring skill for Linux async I/O. Use when building high-performance servers with liburing, multi-shot operations, provided buffers, fixed files, zero-copy send, or tokio-uring. Activates on queries about io_uring, SQE/CQE, liburing, IORING_OP_PROVIDE_BUFFERS, or io_uring vs
Open skill - /adc-dac-baremetal
Bare-metal ADC and DAC skill. Use when configuring analog sampling, DMA-driven ADC, calibration, or DAC output on MCUs. Activates on queries about ADC bare-metal, sampling time, DMA ADC, or DAC channel setup.
Open skill

