C++ と Bazel

このページでは、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 コードの場合は、接頭辞を必要とする外部リポジトリ インクルードなど、 include_prefix 引数と strip_include_prefix 引数を cc_library ルールターゲットで使用します。

ツールチェーンの機能

次のオプション機能 を使用すると、C++ プロジェクトの健全性を向上させることができます。これらの機能は、 --features コマンドライン フラグまたは features 属性を使用して有効にできます。repopackagecc_*

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