このページでは、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コードの場合は、include_prefixとstrip_include_prefix引数をcc_libraryルール ターゲットで使用します。
ツールチェーンの機能
次のオプション機能
を使用すると、C++ プロジェクトの衛生状態を改善できます。これらの機能は、
--features コマンドライン フラグまたは features 属性を使用して有効にできます。repopackagecc_*
parse_headers機能を使用すると、C++ コンパイラを使用して、ビルドされたターゲットとその依存関係にあるすべてのヘッダー ファイルを解析 (コンパイルしない)--process_headers_in_dependenciesフラグを使用した場合に、コンパイルできます。これにより、ヘッダーのみのライブラリの問題を検出し、ヘッダーが自己完結型で、インクルードされる順序に依存しないようにすることができます。layering_check機能を使用すると、ターゲットが直接的な依存関係によって提供されるヘッダーのみを含むように強制できます。デフォルトのツールチェーンは、コンパイラとしてclangを使用する Linux でこの機能をサポートしています。