简介
沙盒化 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:用于在二进制文件中嵌入 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 文档中关于属性 src 的说明。 |
HDR | 标签列表(可选) 为创建沙盒化 C/C++ 库而处理的头文件列表。 这是沙盒定义 (sandbox.h) 的位置;如果使用嵌入式 SAPI 库,并且默认沙盒政策就足够了,则留空。 |
嵌入 | 布尔值;可选;默认值为 True 如果为 True,则沙盒化库应嵌入到主机代码中。这样就可以使用 |
functions | 函数名称列表(可选) C/C++ 库中的函数列表,系统会针对该库生成沙盒化版本,然后可在主机代码中使用这些函数。 空列表会尝试导出并封装在库中找到的所有函数。 |
lib | 字符串;必填 将要成为沙盒化库的 C/C++ 库目标的名称。 这假设您对项目中的 C/C++ 库有一条 cc_library 构建规则。 |
lib_name | 字符串;必填 用于通过函数属性代理库函数的 SAPI 对象的名称。对沙盒化库中的函数的任何调用都将通过 SAPI 对象进行。 |
input_files | 标签列表(可选) 在 sapi_interface 规则内部运行期间处理的 C 和 C++ 文件列表。该生成器会扫描这些文件,以查找 C/C++ 库的函数声明。 大多数情况下不需要这样做,因为系统总是会扫描 C/C++ 库的导出头文件。 |
命名空间 | 字符串;可选;默认值为 sapigen 用于放置由 lib_name 定义的 SAPI 对象的 C++ 命名空间标识符。 默认命名空间为 sapigen。 |
标头 | 字符串;可选 要代替生成的头文件的名称。 如果您想自动生成代码,请不要使用此属性 |
add_default_deps | 布尔值;可选;默认值为 True 已弃用 |
limit_scan_depth | 布尔值;可选;默认值为 False 对于复杂的库,可能会达到 Bazel 的文件数,因而构建流程不会成功。此属性是这些复杂情况的应急方法。除非必要,请勿使用。 |
tags | 请参阅有关 标记的 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 policy is sufficient.
embed = True, # This is the default
functions = [
"deflateInit_",
"deflate",
"deflateEnd",
],
lib = "@zlib//:zlibonly",
lib_name = "Zlib",
namespace = "sapi::zlib",
)