Hướng dẫn tạo quy tắc

Giới thiệu

Bạn có thể sử dụng Sandboxed API (SAPI) với hệ thống xây dựng Bazel của Google hoặc với hệ thống xây dựng meta CMake phổ biến. Trang này tập trung vào Bazel, nhưng các tính năng tương tự cũng có trong CMake. Bazel là hệ thống bản dựng được đề xuất và dễ tích hợp nhất.

Trong tệp BUILD.bazel, bạn sẽ có một quy tắc xây dựng để tạo Mã máy chủ lưu trữ. Để Mã máy chủ sử dụng phiên bản hộp cát của một thư viện, bạn cần chuẩn bị một mục tiêu bản dựng mà Mã máy chủ sẽ sử dụng.

Quy tắc xây dựng 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)

Mục tiêu đầu ra

Quy tắc tạo bản dựng sapi_library() sẽ tạo ra các mục tiêu sau:

  • name-sapi: Thư viện được cách ly, thay thế cc_library thông thường làm mục tiêu Mã máy chủ. Bao gồm zlib_sapi.bin và các phần phụ thuộc của hộp cát.
  • name.interface: Giao diện thư viện được tạo.
  • name.embed: cc_embed_data() đích đến dùng để nhúng Sandboxee vào tệp nhị phân. Xem bazel/embed_data.bzl.
    • name.bin: Tệp nhị phân Sandboxee, bao gồm một đoạn giao tiếp nhỏ và thư viện đang được đưa vào hộp cát.

Đối số

Thuộc tính
tên

Tên; bắt buộc

Tên riêng cho mục tiêu này. Thao tác này sẽ xác định thư viện C/C++ được cách ly, hãy xem đích đầu ra name-sapi.

deps

Danh sách nhãn ; không bắt buộc

Danh sách các thư viện khác sẽ được liên kết vào thư viện C/C++ được cách ly.

srcs

Danh sách nhãn ; không bắt buộc

Danh sách các tệp C và C++ được xử lý để tạo thư viện C/C++ trong hộp cát. Đây là các tệp nguồn và tệp tiêu đề C/C++, không được tạo (mã nguồn thông thường) hoặc được tạo.

Để biết thêm thông tin, hãy xem phần giải thích về thuộc tính srcs trong tài liệu cc_library.

hdrs

Danh sách nhãn; không bắt buộc

Danh sách các tệp tiêu đề được xử lý để tạo thư viện C/C++ được cách ly.

Đây là nơi bạn nên đặt định nghĩa hộp cát (sandbox.h); hãy để trống nếu bạn dùng thư viện SAPI nhúng và chính sách hộp cát mặc định là đủ.

nhúng

Boolean; không bắt buộc; mặc định là True

Nếu là True, thư viện được cách ly phải được nhúng bên trong mã máy chủ. Điều này cho phép SAPI Sandbox được khởi chạy bằng hàm dựng ::sapi::Sandbox::Sandbox(FileToc*).

chức năng

Danh sách tên hàm; không bắt buộc

Danh sách các hàm trong thư viện C/C++ mà phiên bản hộp cát được tạo và sau đó có thể dùng trong Mã máy chủ.

Một danh sách trống sẽ cố gắng xuất và bao bọc tất cả các hàm có trong thư viện.

lib

Chuỗi; bắt buộc

Tên của đích thư viện C/C++ sẽ là thư viện được tạo hộp cát.

Điều này giả định rằng bạn có một quy tắc xây dựng cc_library cho thư viện C/C++ trong dự án.

lib_name

Chuỗi; bắt buộc

Tên của đối tượng SAPI được dùng để làm proxy cho các hàm thư viện từ thuộc tính functions. Mọi lệnh gọi đến hàm trong thư viện được cách ly sẽ diễn ra thông qua Đối tượng SAPI.

input_files

Danh sách nhãn; không bắt buộc

Danh sách các tệp C và C++ được xử lý trong quá trình chạy nội bộ của quy tắc sapi_interface. Trình tạo sẽ quét các tệp này để tìm khai báo hàm của thư viện C/C++.

Bạn thường không cần làm việc này vì các tiêu đề được xuất của thư viện C/C++ luôn được quét.

không gian tên

Chuỗi; không bắt buộc; mặc định là sapigen

Giá trị nhận dạng không gian tên C++ để đặt đối tượng SAPI do lib_name xác định vào.

Không gian tên mặc định là sapigen.

tiêu đề

Chuỗi; không bắt buộc

Tên của tệp tiêu đề sẽ dùng thay cho tệp tiêu đề được tạo.

Nếu bạn muốn tự động tạo mã, đừng sử dụng thuộc tính này

add_default_deps

Boolean; không bắt buộc; mặc định là True

KHÔNG CÒN DÙNG NỮA

limit_scan_depth

Boolean; không bắt buộc; giá trị mặc định là False

Đối với các thư viện phức tạp, số lượng tệp cho Bazel có thể đạt đến giới hạn và quy trình tạo sẽ không thành công. Thuộc tính này là một lối thoát cho những tình huống phức tạp này. Không sử dụng trừ phi cần thiết.

thẻ

Xem tài liệu về Bazel để biết thẻ.

mức hiển thị

Xem tài liệu về Bazel để biết khả năng hiển thị

Ví dụ về cách sử dụng

Ví dụ về zlib là một dự án tham chiếu hữu ích minh hoạ cách sử dụng quy tắc tạo 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",
)