简介
沙盒 API (SAPI) 可与 Google 的 Bazel 构建系统或热门的 CMake 元构建系统搭配使用。本页重点介绍 Bazel,但 CMake 也提供相同的功能。Bazel 是推荐的构建系统,也是最容易集成的。
在 BUILD.bazel 文件中,您将拥有一个用于构建主机代码的 build 规则。为了让宿主代码使用库的沙盒版本,您需要准备一个宿主代码将要使用的 build 目标。
SAPI build 规则
- 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() build 规则会生成以下目标:
- name-sapi:沙盒库,替代了正常的 cc_library 作为宿主代码目标。由 
zlib_sapi.bin和沙盒依赖项组成。 - 名称.interface:生成的库接口。
 - name.embed:用于在二进制文件中嵌入 Sandboxee 的 
cc_embed_data()目标。请参阅 bazel/embed_data.bzl。- name.bin:Sandboxee 二进制文件,包含一个小型通信桩和正在沙盒化的库。
 
 
参数
| 属性 | |
|---|---|
| name | 
         名称;必需 相应目标的唯一名称。这将标识沙盒化的 C/C++ 库,请参阅 name-sapi 输出目标。  | 
    
| deps | 
        
         要链接到沙盒 C/C++ 库中的其他库的列表。  | 
    
| srcs | 
         标签列表;可选 处理后可创建沙盒 C/C++ 库的 C 和 C++ 文件列表。这些是 C/C++ 源文件和头文件,可以是未生成的(常规源代码),也可以是生成的。 如需了解详情,请参阅 cc_library 文档中对属性 srcs 的说明。  | 
    
| hdrs | 标签列表;可选 处理后用于创建沙盒 C/C++ 库的头文件列表。 这是放置沙盒定义 (sandbox.h) 的位置;如果使用嵌入式 SAPI 库,并且默认沙盒政策足够,则留空。  | 
    
| 嵌入 | 布尔值;可选;默认值为 True 如果为 True,则沙盒库应嵌入到宿主代码中。这样一来,便可以使用   | 
    
| 函数 | 函数名称列表;可选 C/C++ 库中已生成沙盒版本且可在宿主代码中使用的函数列表。 空列表将尝试导出并封装库中找到的所有函数。  | 
    
| lib | 字符串;必需 将成为沙盒库的 C/C++ 库目标的名称。 这要求您在项目中为 C/C++ 库提供 cc_library build 规则。  | 
    
| lib_name | 字符串;必需 用于代理来自 functions 属性的库函数的 SAPI 对象的名称。对沙盒库中函数的任何调用都将通过 SAPI 对象进行。  | 
    
| input_files | 标签列表;可选 在 sapi_interface 规则的内部运行期间处理的 C 和 C++ 文件列表。生成器会扫描这些文件,以查找 C/C++ 库的函数声明。 这在大多数情况下是不需要的,因为 C/C++ 库的导出头文件始终会进行扫描。  | 
    
| 命名空间 | 字符串;可选;默认值为 sapigen 一个 C++ 命名空间标识符,用于放置由 lib_name 定义的 SAPI 对象。 默认命名空间为 sapigen。  | 
    
| header | 字符串;可选 要使用的头文件的名称,而不是生成的头文件。 如果您想自动生成代码,请勿使用此属性  | 
    
| add_default_deps | 布尔值;可选;默认值为 True 已弃用  | 
    
| limit_scan_depth | 布尔值;可选;默认值为 False 对于复杂的库,可能会达到 Bazel 的文件数上限,导致构建过程失败。此属性是应对这些复杂情况的应急方案。除非必要,否则请勿使用。  | 
    
| 标记 | 请参阅 Bazel 文档,了解 标记。  | 
    
| visibility | 请参阅 Bazel 文档,了解 可见性  | 
    
用法示例
zlib 示例是一个很好的参考项目,展示了如何使用 sapi_library build 规则:
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",
)