Введение
Изолированный API (SAPI) можно использовать с системой сборки Bazel от Google или с популярной системой метасборки CMake. This page focuses on Bazel, but the same features are available for 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(), используемая для встраивания изолированной среды в двоичный файл. См. bazel/embed_data.bzl.- name.bin – исполняемый файл Sandboxee, состоящий из небольшого коммуникационного модуля и библиотеки, которая помещается в изолированную среду.
Аргументы
| Атрибуты | |
|---|---|
| name |
Name; обязательное свойство. Уникальное название для этой цели. Это позволит идентифицировать изолированную библиотеку C/C++. См. целевой объект name-sapi. |
| deps |
Список ярлыков (необязательно). Список других библиотек, которые будут связаны с изолированной библиотекой C/C++. |
| srcs |
Список ярлыков (необязательно). Список файлов C и C++, которые обрабатываются для создания библиотеки C/C++ в изолированной среде. Это исходные и заголовочные файлы C/C++, которые могут быть как сгенерированными, так и нет (обычный исходный код). Дополнительную информацию можно найти в описании атрибута srcs в документации по cc_library. |
| hdrs | Список ярлыков (необязательно). Список заголовочных файлов, которые обрабатываются для создания изолированной библиотеки C/C++. Здесь должен быть указан файл sandbox.h. Если используется встроенная библиотека SAPI и достаточно конфигурации изолированной среды по умолчанию (DefaultConfig, в которой используются |
| embed | Логическое значение; необязательное; по умолчанию – True. Если True, изолированная библиотека должна быть встроена в код хоста. Это позволяет инициализировать безопасную тестовую среду SAPI с помощью конструктора |
| функции | Список названий функций (необязательно). Список функций из библиотеки C/C++, для которых создается изолированная версия и которые затем можно использовать в коде хоста. Если список пуст, будут экспортированы и упакованы все функции, найденные в библиотеке. |
| lib | Строка; обязательно Название целевой библиотеки C/C++, которая будет библиотекой в изолированной среде. Для этого в проекте должно быть правило сборки cc_library для библиотеки C/C++. |
| lib_name | Строка; обязательный параметр. Название объекта SAPI, который используется для проксирования функций библиотеки из атрибута functions. Любой вызов функции в изолированной библиотеке будет выполняться через объект SAPI. |
| input_files | Список ярлыков (необязательно). Список файлов C и C++, которые обрабатываются во время внутреннего выполнения правила sapi_interface. Генератор сканирует эти файлы на наличие объявлений функций библиотеки C/C++. В большинстве случаев это не требуется, поскольку экспортированные заголовки библиотеки C/C++ всегда сканируются. |
| пространство имен | Строка; необязательный; по умолчанию – sapigen Идентификатор пространства имен C++, в которое будет помещен объект SAPI, определенный параметром lib_name. Пространство имен по умолчанию – sapigen. |
| заголовок | Строка; необязательный параметр. Название заголовочного файла, который будет использоваться вместо сгенерированного. Если вы хотите, чтобы код генерировался автоматически, не используйте этот атрибут. |
| add_default_deps | Логическое значение; необязательное; по умолчанию – True. УСТАРЕВШИЙ |
| limit_scan_depth | Логическое значение; необязательный параметр; по умолчанию – False. Для сложных библиотек может быть достигнуто ограничение на количество файлов для Bazel, и процесс сборки не будет выполнен. Этот атрибут позволяет обойти такие сложные ситуации. Не используйте без необходимости. |
| теги | Подробнее о тегах рассказывается в документации по Bazel. |
| доступность | Ознакомьтесь с документацией 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",
)