构建规则指南

简介

沙盒 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 文档中对属性 srcs 的说明。

hdrs

标签列表;可选

用于创建沙盒化的 C/C++ 库的头文件列表。

沙盒定义 (sandbox.h) 应在此处;如果使用嵌入式 SAPI 库,并且默认沙盒配置(DefaultConfig,使用 DefaultPolicyBuilder、DefaultFlags、DefaultEnvironmentVariables 和 DefaultLimits)足够,则留空。

embed

布尔值;可选;默认值为 True

如果为 True,则沙盒库应嵌入主机 代码中。这样,便可以使用 ::sapi::Sandbox::Sandbox(FileToc*) 构造函数初始化 SAPI 沙盒。

functions

函数名称列表;可选

C/C++ 库中的函数列表,这些函数会生成沙盒 版本,然后可以在主机代码中使用。

空列表将尝试导出和封装库中找到的所有函数。

lib

字符串;必需

将成为沙盒库的 C/C++ 库目标的名称。

这需要您在项目中为 C/C++ 库提供 cc_library 构建规则。

lib_name

字符串;必需

用于代理 functions 属性中的库函数 的 SAPI 对象的名称。对沙盒库中函数的任何调用都将通过 SAPI 对象进行。

input_files

标签列表;可选

在 sapi_interface 规则的内部 运行期间处理的 C 和 C++ 文件列表。生成器会扫描这些文件,以查找 C/C++ 库的函数声明。

这在大多数情况下是不需要的,因为系统始终会扫描 C/C++ 库的导出头 。

namespace

字符串;可选;默认值为 sapigen

用于放置由 lib_name 定义的 SAPI 对象的 C++ 命名空间标识符。

默认命名空间为 sapigen。

header

字符串;可选

要使用的头文件的名称,而不是生成的头文件 。

如果您想自动生成代码,不要使用 此属性

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 configuration (DefaultConfig) is sufficient.
    embed = True,  # This is the default
    functions = [
        "deflateInit_",
        "deflate",
        "deflateEnd",
    ],
    lib = "@zlib//:zlibonly",
    lib_name = "Zlib",
    namespace = "sapi::zlib",
)