C++ 和 Bazel

回報問題 查看原始碼 Nightly · 8.0 . 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

本頁面提供的資源可協助您在 C++ 專案中使用 Bazel。這份文件會連結至教學課程、建構規則,以及其他與使用 Bazel 建構 C++ 專案相關的資訊。

使用 Bazel

下列資源可協助您在 C++ 專案中使用 Bazel:

最佳做法

除了一般 Bazel 最佳做法外,下方也提供 C++ 專案的最佳做法。

BUILD 檔案

建立 BUILD 檔案時,請遵循下列規範:

  • 每個 BUILD 檔案應包含目錄中每個編譯單元的 cc_library 規則目標。

  • 您應盡可能細分 C++ 程式庫,以便盡可能提高增量性並並行建構。

  • 如果 srcs 中只有一個來源檔案,請將程式庫命名為該 C++ 檔案的名稱。這個程式庫應包含 C++ 檔案、任何相符的標頭檔案,以及程式庫的直接依附元件。例如:

    cc_library(
        name = "mylib",
        srcs = ["mylib.cc"],
        hdrs = ["mylib.h"],
        deps = [":lower-level-lib"]
    )
    
  • 在檔案中,每個 cc_library 目標都應使用一個 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_prefixstrip_include_prefix 引數。

工具鍊功能

下列選用功能可改善 C++ 專案的衛生狀況。您可以使用 --features 指令列旗標或 repopackagecc_* 規則的 features 屬性啟用這些規則:

  • parse_headers 功能可讓 C++ 編譯器在使用 --process_headers_in_dependencies 標記時,剖析 (但不編譯) 已建構目標中的所有標頭檔案及其相依項目。這有助於找出只含標頭的程式庫中的問題,並確保標頭是獨立的,且不受加入標頭的順序影響。
  • layering_check 功能會強制目標只包含直接依附元件提供的標頭。預設工具鍊支援 Linux 上的這項功能,並以 clang 做為編譯器。