Przewodnik po regułach tworzenia

Wprowadzenie

Interfejs SAPI można używać z systemem kompilacji Bazel od Google lub z popularnym systemem kompilacji meta CMake. Ta strona jest poświęcona Bazelowi, ale te same funkcje są dostępne w CMake. Bazel to zalecany system kompilacji, który najłatwiej zintegrować.

W pliku BUILD.bazel będziesz mieć regułę kompilacji do kompilowania kodu hosta. Aby kod hosta korzystał z wersji biblioteki w piaskownicy, musisz przygotować cel kompilacji, z którego będzie korzystać kod hosta.

Reguły kompilacji 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)

Cele wyjściowe

Reguła kompilacji sapi_library() generuje te środowiska docelowe:

  • name-sapi: biblioteka w piaskownicy, która zastępuje zwykłą bibliotekę cc_library jako miejsce docelowe kodu hosta. Składa się z zlib_sapi.bin i zależności piaskownicy.
  • name.interface: wygenerowany interfejs biblioteki.
  • name.embed: cc_embed_data() element docelowy używany do umieszczania Sandboxee w pliku binarnym. Zobacz bazel/embed_data.bzl.
    • name.bin: plik binarny Sandboxee, który zawiera mały fragment kodu do komunikacji i bibliotekę podlegającą piaskownicy.

Argumenty

Atrybuty
nazwa

Nazwa (wymagane)

Unikalna nazwa tego miejsca docelowego. Pozwoli to zidentyfikować bibliotekę C/C++ w piaskownicy. Zobacz nazwę docelową danych wyjściowych interfejsu SAPI.

deps

Lista etykiet (opcjonalnie).

Lista innych bibliotek, które mają być połączone z biblioteką C/C++ w piaskownicy.

srcs

Lista etykiet (opcjonalnie).

Lista plików C i C++, które są przetwarzane w celu utworzenia biblioteki C/C++ w piaskownicy. Są to pliki źródłowe i nagłówkowe C/C++, które mogą być wygenerowane lub nie.

Więcej informacji znajdziesz w wyjaśnieniu atrybutu srcs w dokumentacji cc_library.

hdrs

Lista etykiet (opcjonalnie).

Lista plików nagłówkowych, które są przetwarzane w celu utworzenia biblioteki C/C++ w piaskownicy.

W tym miejscu powinna się znajdować definicja piaskownicy (sandbox.h). Jeśli używana jest wbudowana biblioteka SAPI, a domyślna zasada piaskownicy jest wystarczająca, pozostaw to pole puste.

umieść

Wartość logiczna; opcjonalna; domyślnie True

Jeśli wartość to „True”, biblioteka w piaskownicy powinna być osadzona w kodzie hosta. Umożliwia to zainicjowanie piaskownicy SAPI za pomocą konstruktora ::sapi::Sandbox::Sandbox(FileToc*).

funkcje

Lista nazw funkcji (opcjonalnie)

Lista funkcji z biblioteki C/C++, dla których generowana jest wersja w piaskownicy, a które można następnie wykorzystać w kodzie hosta.

Pusta lista spowoduje wyeksportowanie i zawinięcie wszystkich funkcji znalezionych w bibliotece.

lib

Ciąg znaków, wymagany

Nazwa docelowej biblioteki C/C++, która będzie biblioteką w sandboxie.

Wymaga to reguły kompilacji cc_library dla biblioteki C/C++ w projekcie.

lib_name

Ciąg znaków, wymagany

Nazwa obiektu SAPI, który jest używany do przekazywania funkcji biblioteki z atrybutu funkcji. Każde wywołanie funkcji w bibliotece w piaskownicy będzie się odbywać za pomocą obiektu SAPI.

input_files

Lista etykiet (opcjonalnie).

Lista plików C i C++, które są przetwarzane podczas wewnętrznego uruchomienia reguły sapi_interface. Generator skanuje te pliki w poszukiwaniu deklaracji funkcji biblioteki C/C++.

Zwykle nie jest to potrzebne, ponieważ wyeksportowane nagłówki biblioteki C/C++ są zawsze skanowane.

przestrzeń nazw

Ciąg znaków; opcjonalny; domyślnie sapigen

Identyfikator przestrzeni nazw C++, w której ma się znajdować obiekt SAPI zdefiniowany przez lib_name.

Domyślna przestrzeń nazw to sapigen.

nagłówek

Ciąg znaków; opcjonalny

Nazwa pliku nagłówkowego, który ma być używany zamiast wygenerowanego pliku nagłówkowego.

Jeśli chcesz automatycznie wygenerować kod, nie używaj tego atrybutu.

add_default_deps

Wartość logiczna; opcjonalna; domyślnie True

WYCOFANO

limit_scan_depth

Wartość logiczna; opcjonalna; domyślnie False

W przypadku złożonych bibliotek może zostać osiągnięta maksymalna liczba plików w Bazelu, a proces kompilacji zakończy się niepowodzeniem. Ten atrybut jest wyjściem awaryjnym w takich złożonych sytuacjach. Nie używaj, chyba że jest to konieczne.

tagi,

Więcej informacji o  tagach znajdziesz w dokumentacji Bazela.

widoczność

Więcej informacji o  widoczności znajdziesz w dokumentacji Bazela.

Przykład użycia

Przykład zlib to dobry projekt referencyjny pokazujący, jak używana jest reguła kompilacji 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",
)