簡介
Sandboxed 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++ 程式庫,請參閱 name-sapi 輸出目標。 |
依附元件 |
標籤清單;選用 要連結至沙箱 C/C++ 程式庫的其他程式庫清單。 |
srcs |
標籤清單;選用 為建立採用沙箱機制 C/C++ 程式庫而處理的 C 和 C++ 檔案清單。這些是 C/C++ 來源和標頭檔案,不是產生 (一般原始碼) 或已產生的標頭檔案。 詳情請參閱 cc_library 說明文件中的屬性 srcs 說明。 |
HDR | 標籤清單;選用 系統在建立沙箱 C/C++ 程式庫時處理的標頭檔案清單。 這就是沙箱定義 (sandbox.h) 的地方;如果使用內嵌 SAPI 程式庫,請將空白欄位留空,且預設的沙箱政策就足夠。 |
嵌入 | 布林值;選用;預設值為 True 如果設為 True,沙箱程式庫應嵌入主機程式碼。這可讓系統使用 |
函式 | 函式名稱清單;選用項目 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 已淘汰 |
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",
)