このページには、C++ プロジェクトで Bazel を使用する際に役立つリソースが記載されています。Bazel で C++ プロジェクトをビルドするためのチュートリアル、ビルドルール、その他の情報にリンクしています。
Bazel の使用
次のリソースは、C++ プロジェクトで Bazel を使用する際に役立ちます。
- チュートリアル: C++ プロジェクトをビルドする
- C++ の一般的なユースケース
- C/C++ のルール
- 必須ライブラリ
- C++ ツールチェーンの構成
- チュートリアル: C++ ツールチェーンを構成する
- C++ ルールとの統合
ベスト プラクティス
一般的な Bazel のベスト プラクティスに加えて、以下に C++ プロジェクトに固有のベスト プラクティスを示します。
BUILD ファイル
BUILD ファイルを作成する際は、次のガイドラインに従ってください。
- 各 - BUILDファイルには、ディレクトリ内のコンパイル単位ごとに 1 つの- cc_libraryルール ターゲットが含まれている必要があります。
- 増分性を最大化し、ビルドを並列化するために、C++ ライブラリをできるだけ細分化する必要があります。 
- srcsにソースファイルが 1 つしかない場合は、ライブラリにその C++ ファイルと同じ名前を付けます。このライブラリには、C++ ファイル、一致するヘッダー ファイル、ライブラリの直接的な依存関係が含まれている必要があります。次に例を示します。- cc_library( name = "mylib", srcs = ["mylib.cc"], hdrs = ["mylib.h"], deps = [":lower-level-lib"] )
- ファイル内の - cc_libraryターゲットごとに 1 つの- cc_testルール ターゲットを使用します。ターゲットに- [library-name]_test、ソースファイルに- [library-name]_test.ccという名前を付けます。たとえば、上記の- mylibライブラリ ターゲットのテスト ターゲットは次のようになります。- cc_test( name = "mylib_test", srcs = ["mylib_test.cc"], deps = [":mylib"] )
含めるパス
インクルード パスに関するガイドラインは次のとおりです。
- すべてのインクルード パスをワークスペース ディレクトリを基準とした相対パスにします。 
- システム以外のヘッダーには、山かっこ( - #include <foo/bar/baz.h>)ではなく、引用符付きのインクルード(- #include "foo/bar/baz.h")を使用します。
- .(現在のディレクトリ)や- ..(親ディレクトリ)などの UNIX ディレクトリ ショートカットは使用しないでください。
- プロジェクト リポジトリ外を指すインクルードを必要とするレガシー コードまたは - third_partyコード(接頭辞を必要とする外部リポジトリ インクルードなど)の場合は、- cc_libraryルール ターゲットで- include_prefix引数と- strip_include_prefix引数を使用します。
ツールチェーンの機能
次のオプションの機能を使用すると、C++ プロジェクトの衛生状態を改善できます。これらは、--features コマンドライン フラグ、または repo、package、cc_* ルールの features 属性を使用して有効にできます。
- parse_headers機能を使用すると、- --process_headers_in_dependenciesフラグを使用するときに、C++ コンパイラがビルド ターゲットとその依存関係にあるすべてのヘッダー ファイルを解析(コンパイルはしない)するようになります。これにより、ヘッダーのみのライブラリの問題を検出し、ヘッダーが自己完結型で、インクルードされる順序に依存しないことを確認できます。
- layering_check機能は、ターゲットに直接依存関係によって提供されるヘッダーのみが含まれるようにします。デフォルトのツールチェーンは、コンパイラとして- clangを使用して Linux でこの機能をサポートしています。