C++ と Bazel

問題を報告 ソースを表示 Nightly · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

このページには、C++ プロジェクトで Bazel を使用する際に役立つリソースが記載されています。チュートリアル、ビルドルール、Bazel を使用した C++ プロジェクトのビルドに固有の情報にリンクします。

Bazel の使用

C++ プロジェクトで Bazel を使用する際には、次のリソースを参照してください。

ベスト プラクティス

一般的な 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 コマンドライン フラグ、または repopackagecc_* ルールの features 属性を使用して有効にできます。

  • parse_headers 機能を使用すると、--process_headers_in_dependencies フラグを使用するときに、ビルドされたターゲット内のすべてのヘッダー ファイルとその依存関係を C++ コンパイラが解析(コンパイルしない)ようになります。これにより、ヘッダーのみのライブラリの問題を検出し、ヘッダーが自己完結型で、含まれる順序から独立していることを確認できます。
  • layering_check 機能により、ターゲットには直接依存関係によって提供されるヘッダーのみが含まれるように強制されます。デフォルトのツールチェーンは、コンパイラとして clang を使用して Linux でこの機能をサポートしています。