簡介
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++ 程式庫,請參閱名稱 SAPI 輸出目標。 |
| deps |
標籤清單;選用 要連結至沙箱 C/C++ 程式庫的其他程式庫清單。 |
| srcs |
標籤清單 (選用) 經過處理後,用於建立沙箱 C/C++ 程式庫的 C 和 C++ 檔案清單。這些是 C/C++ 來源和標頭檔案,可以是未產生 (一般原始碼) 或已產生。 詳情請參閱 cc_library 說明文件中 srcs 屬性的說明。 |
| hdrs | 標籤清單;選用 系統會處理標頭檔案清單,以建立沙箱化的 C/C++ 程式庫。 這是沙箱定義 (sandbox.h) 的位置;如果使用嵌入式 SAPI 程式庫,且預設沙箱設定 (DefaultConfig,使用 |
| embed | 布林值;選用;預設值為 True 如果為 True,沙箱化程式庫應內嵌於主機代碼中。這樣一來,您就能使用 |
| 函式 | 函式名稱清單 (選填) C/C++ 程式庫中的函式清單,這些函式會產生沙箱版本,然後用於主機程式碼。 空白清單會嘗試匯出並包裝程式庫中找到的所有函式。 |
| lib | 字串;必填 要成為沙箱程式庫的 C/C++ 程式庫目標名稱。 這項操作的前提是,您已在專案中為 C/C++ 程式庫建立 cc_library 建構規則。 |
| lib_name | 字串;必要 SAPI 物件的名稱,用於從 functions 屬性代理程式庫函式。對沙箱化程式庫中函式的任何呼叫,都會透過 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 說明文件中的 標記。 |
| visibility | 請參閱 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 configuration (DefaultConfig) is sufficient.
embed = True, # This is the default
functions = [
"deflateInit_",
"deflate",
"deflateEnd",
],
lib = "@zlib//:zlibonly",
lib_name = "Zlib",
namespace = "sapi::zlib",
)