このページには、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 でこの機能をサポートしています。