mcpField
B
bazel

bazel

github.com/mohitmishra786開発269448 回インストール18 週間前に更新
リポジトリ

bazel について

C/C++プロジェクトでBazelを使うためのスキルです。BUILDファイル、Bzlmod依存関係、ツールチェーン、リモート実行、依存関係のクエリ、サンドボックスの問題調査を扱います。

主な機能

  1. 01cc_libraryとcc_binaryルールの記述
  2. 02Bzlmodによる依存関係管理
  3. 03ターゲット依存グラフのクエリ
  4. 04C++ツールチェーンの登録
  5. 05リモート実行の設定
  6. 06サンドボックス失敗のデバッグ

活用シーン

  1. 01BazelでC/C++ターゲットをビルドする
  2. 02Bzlmodで外部依存関係を追加する
  3. 03直接依存と逆依存を探す
  4. 04サンドボックスのビルドエラーを調査する

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/mohitmishra786/low-level-dev-skills --skill bazel

インストール後、Claude Code で/bazelを入力して読み込まれたか確認します。

同梱ファイルreferences/bazel-cpp-toolchain.md

詳細

Bazel

目的

C/C++ プロジェクト向けに Bazel の使い方をエージェントに案内します。BUILD ファイルの作成、cc_library/cc_binary ルール、ツールチェーンの登録、リモート実行、依存関係グラフのクエリ、Bzlmod による依存関係管理、サンドボックスのデバッグを扱います。

トリガー

  • 「C++ ライブラリ用の Bazel BUILD ファイルはどう書けばよいですか?」
  • 「Bzlmod で外部依存関係を追加するにはどうすればよいですか?」
  • 「Bazel のサンドボックスエラーをデバッグするにはどうすればよいですか?」
  • 「Bazel の依存関係グラフをクエリするにはどうすればよいですか?」
  • 「Bazel でリモート実行を設定するにはどうすればよいですか?」
  • 「カスタム C++ ツールチェーンを登録するにはどうすればよいですか?」

ワークフロー

1. ワークスペースの構成
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.h
2. 基本的な BUILD ファイル — 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 — 最新の依存関係管理
# 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. 依存関係グラフのクエリ
# 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. ツールチェーンの登録
# 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. リモート実行
# 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. サンドボックスのデバッグ
# 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

Bazel の C++ ツールチェーン設定については、references/bazel-cpp-toolchain.md を参照してください。

関連スキル

  • 代替のビルドシステムとして CMake を使うには、skills/build-systems/cmake を使用します
  • Bazel のリモートキャッシュと sccache の連携には、skills/build-systems/build-acceleration を使用します
  • Bazel の copts で使用するコンパイラーフラグについては、skills/compilers/gcc または skills/compilers/clang を使用します

コメント