Руководство по правилам сборки,Руководство по правилам сборки

Введение

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: цель cc_embed_data() , используемая для встраивания Sandboxee в двоичный файл. См. bazel/embed_data.bzl .
  • name .bin: двоичный файл Sandboxee, состоящий из небольшой коммуникационной заглушки и библиотеки, которая помещается в песочницу.

Аргументы

Атрибуты
имя

Имя ; необходимый

Уникальное имя для этой цели. Это позволит идентифицировать изолированную библиотеку C/C++, см. целевой выходной файл name-sapi.

глубины

Список ярлыков ; необязательный

Список других библиотек, которые будут связаны с изолированной библиотекой C/C++.

источники

Список ярлыков ; необязательный

Список файлов C и C++, которые обрабатываются для создания изолированной библиотеки C/C++. Это исходные файлы и файлы заголовков C/C++, либо не созданные (обычный исходный код), либо сгенерированные.

Для получения дополнительной информации см. объяснение атрибута srcs в документации cc_library .

HDRS

Список ярлыков ; необязательный

Список файлов заголовков, которые обрабатываются для создания изолированной библиотеки C/C++.

Здесь должно находиться определение песочницы (sandbox.h); оставьте пустым, если используется встроенная библиотека SAPI и достаточно политики песочницы по умолчанию.

вставлять

логическое значение; необязательный; по умолчанию — правда

Если принимает значение True, изолированная библиотека должна быть встроена в основной код. Это позволяет инициализировать песочницу SAPI с помощью конструктора ::sapi::Sandbox::Sandbox(FileToc*) .

функции

Список названий функций; необязательный

Список функций из библиотеки C/C++, для которых создается изолированная версия, которую затем можно использовать в хост-коде.

Пустой список попытается экспортировать и обернуть все функции, найденные в библиотеке.

библиотека

Нить; необходимый

Имя целевой библиотеки C/C++, которая будет изолированной библиотекой.

Предполагается, что у вас есть правило сборки cc_library для библиотеки C/C++ в проекте.

имя_библиотеки

Нить; необходимый

Имя объекта SAPI, который используется для проксирования библиотечных функций из атрибута функций. Любой вызов функции в изолированной библиотеке будет происходить через объект SAPI.

входные_файлы

Список ярлыков ; необязательный

Список файлов C и C++, которые обрабатываются во время внутреннего выполнения правила sapi_interface. Генератор сканирует эти файлы на наличие объявлений функций библиотеки C/C++.

В большинстве случаев в этом нет необходимости, поскольку экспортированные заголовки библиотеки C/C++ всегда сканируются.

пространство имен

Нить; необязательный; по умолчанию — Sapigen

Идентификатор пространства имен C++, в который помещается объект SAPI, определенный lib_name .

Пространство имен по умолчанию — sapigen .

заголовок

Нить; необязательный

Имя файла заголовка, который будет использоваться вместо сгенерированного файла заголовка.

Если вы хотите автоматически генерировать код, не используйте этот атрибут.

add_default_deps

логическое значение; необязательный; по умолчанию — правда

УСТАРЕЛО

лимит_сканирования_глубины

логическое значение; необязательный; по умолчанию — ложь

Для сложных библиотек количество файлов для 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 policy is sufficient.
    embed = True,  # This is the default
    functions = [
        "deflateInit_",
        "deflate",
        "deflateEnd",
    ],
    lib = "@zlib//:zlibonly",
    lib_name = "Zlib",
    namespace = "sapi::zlib",
)