C++ 和 Bazel

回報問題 查看原始碼

這個頁面所含的資源可協助您將 Bazel 與 C++ 專案搭配使用。該頁面會連結至使用 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 相對於工作區目錄的路徑。

  • 使用引號括住 (#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 做為編譯器時,預設工具鍊支援這項功能。