建構規則指南

簡介

沙箱化 API (SAPI) 可搭配 Google 的 Bazel 建構系統,或搭配熱門的 CMake 中繼建構系統使用。本頁面著重於 Bazel,但 CMake 也提供相同功能。建議使用 Bazel 建構系統,因為最容易整合。

在 BUILD.bazel 檔案中,您會有建構主機程式碼的建構規則。如要讓主機程式碼使用程式庫的沙箱版本,您需要準備主機程式碼會使用的建構目標。

SAPI 建構規則

  • sapi_library

sapi_library

sapi_library(name, deps, srcs, hdrs, embed, functions, lib, lib_name, input_files, namespace, header, add_default_deps, limit_scan_depth, visibility)

輸出目標

sapi_library() 建構規則會產生下列目標:

  • name-sapi:沙箱程式庫,可取代一般 cc_library 做為主機程式碼目標。由 zlib_sapi.bin 和沙箱依附元件組成。
  • name.interface:產生的程式庫介面。
  • name.embed:cc_embed_data() 用於在二進位檔中嵌入 Sandboxee 的目標。請參閱 bazel/embed_data.bzl
    • name.bin:Sandboxee 二進位檔,由小型通訊存根和受沙箱保護的程式庫組成。

引數

屬性
名稱

名稱 (必填)

這個目標的專屬名稱。這會識別沙箱化的 C/C++ 程式庫,請參閱名稱 SAPI 輸出目標。

deps

標籤清單;選用

要連結至沙箱 C/C++ 程式庫的其他程式庫清單。

srcs

標籤清單 (選用)

系統會處理 C 和 C++ 檔案清單,建立沙箱化的 C/C++ 程式庫。這些是 C/C++ 來源和標頭檔案,可以是未產生 (一般原始碼) 或已產生。

詳情請參閱 cc_library 說明文件中 srcs 屬性的說明。

hdrs

標籤清單 (選用)

系統會處理標頭檔案清單,以建立沙箱 C/C++ 程式庫。

沙箱定義 (sandbox.h) 應位於此處;如果使用內嵌的 SAPI 程式庫,且預設沙箱政策足夠,請留空。

嵌入

布林值;選用;預設值為 True

如果為 True,沙箱化程式庫應內嵌於主機程式碼中。這樣一來,SAPI Sandbox 就能使用 ::sapi::Sandbox::Sandbox(FileToc*) 建構函式初始化。

函式

函式名稱清單 (選用)

C/C++ 程式庫中的函式清單,其中會產生沙箱版本,然後可在主機程式碼中使用。

空白清單會嘗試匯出並包裝程式庫中找到的所有函式。

lib

字串;必填

C/C++ 程式庫目標的名稱,該目標將成為沙箱程式庫。

這項操作的前提是,您已在專案中為 C/C++ 程式庫建立 cc_library 建構規則。

lib_name

字串;必填

SAPI 物件的名稱,用於從函式屬性代理程式庫函式。對沙箱程式庫中函式的任何呼叫,都會透過 SAPI 物件進行。

input_files

標籤清單 (選用)

在 sapi_interface 規則的內部執行期間處理的 C 和 C++ 檔案清單。產生器會掃描這些檔案,找出 C/C++ 程式庫的函式宣告。

C/C++ 程式庫匯出的標頭一律會掃描,因此通常不需要這麼做。

命名空間

字串;選用;預設為 sapigen

C++ 命名空間 ID,用於放置 lib_name 定義的 SAPI 物件。

預設命名空間為 sapigen

標頭

字串;選用

要使用的標頭檔案名稱,而非產生的標頭檔案。

如要自動產生程式碼,請勿使用這項屬性

add_default_deps

布林值;選用;預設值為 True

DEPRECATED

limit_scan_depth

布林值;選用;預設值為 False

如果是複雜的程式庫,可能會達到 Bazel 的檔案數上限,導致建構程序失敗。這項屬性是這些複雜情況的應變措施。除非必要,否則請勿使用

標記

請參閱 Bazel 說明文件中的 標記

顯示設定

請參閱 Bazel 說明文件,瞭解 可見性

使用範例

zlib 範例是很好的參考專案,可說明如何使用 sapi_library 建構規則:

load(
    "//sandboxed_api/tools/generator:sapi_generator.bzl",
    "sapi_library",
)

sapi_library(
    name = "zlib-sapi",
    srcs = [],     # Extra code compiled with the SAPI library
    hdrs = [],     # Leave empty if embedded SAPI libraries are used, and the
                   # default sandbox policy is sufficient.
    embed = True,  # This is the default
    functions = [
        "deflateInit_",
        "deflate",
        "deflateEnd",
    ],
    lib = "@zlib//:zlibonly",
    lib_name = "Zlib",
    namespace = "sapi::zlib",
)