Wstęp
Interfejs Sandboxed API (SAPI) może być używany z systemem kompilacji Bazel firmy Google lub z popularnym systemem metakompilacji CMake. Ta strona dotyczy usługi Bazel, ale te same funkcje są dostępne w CMake. Zalecanym systemem kompilacji jest Bazel, z którym najłatwiej można zintegrować.
W pliku BUILD.bazel znajdziesz regułę kompilacji, która pozwala utworzyć kod hosta. Aby kod hosta wykorzystywał wersję biblioteki w trybie piaskownicy, musisz przygotować miejsce docelowe 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 cele:
- name-sapi: biblioteka w trybie piaskownicy, zastępuje normalną bibliotekę cc_library jako miejsce docelowe kodu hosta. Składa się z zależności
zlib_sapi.bin
i piaskownicy. - name.interface: wygenerowany interfejs biblioteki.
- name.embed: element docelowy
cc_embed_data()
używany do umieszczenia piaskownicy w pliku binarnym. Więcej informacji: bazel/embed_data.bzl. - name.bin: plik binarny piaskownicy – składa się z niewielkiego wycinka komunikacyjnego i biblioteki dostępnej w piaskownicy.
Argumenty
Atrybuty | |
---|---|
nazwa |
Nazwa; wymagana Unikalna nazwa celu. Zidentyfikuje ona bibliotekę C/C++ w trybie piaskownicy. Zobacz docelowy adres wyjściowy name-sapi. |
deps |
Lista etykiet; opcjonalna Lista innych bibliotek, które mają zostać połączone z biblioteką C/C++ w trybie piaskownicy. |
źródła |
Lista etykiet; opcjonalna Lista plików C i C++, które są przetwarzane w celu utworzenia biblioteki C/C++ w trybie piaskownicy. Są to pliki źródłowe i nagłówki C/C++ w języku C/C++ – niegenerowane (normalny kod źródłowy) lub wygenerowane. Więcej informacji znajdziesz w objaśnieniu atrybutów srcs w dokumentacji biblioteki cc_library. |
HDR | Lista etykiet; opcjonalna Lista plików nagłówka, które są przetwarzane w celu utworzenia biblioteki C/C++ w trybie piaskownicy. Tutaj powinna znaleźć się definicja piaskownicy (sandbox.h). Jeśli używana jest osadzona biblioteka SAPI i wystarczą domyślne zasady piaskownicy. |
umieść | Wartość logiczna; opcjonalna; domyślna to True Jeśli zasada ma wartość Prawda, biblioteka piaskownicy powinna być umieszczona w kodzie hosta. Dzięki temu Piaskownica SAPI może być zainicjowana przy użyciu konstruktora |
funkcje | Lista nazw funkcji; opcjonalnie Lista funkcji z biblioteki C/C++, dla których generowana jest wersja piaskownicy i które mogą być używane w kodzie hosta. Jeśli lista będzie pusta, zostanie podjęta próba wyeksportowania i zapakowania wszystkich funkcji znajdujących się w bibliotece. |
lib | Ciąg znaków; wymagany Nazwa biblioteki docelowej biblioteki C/C++, która będzie biblioteką w trybie piaskownicy. Oczekuje się, że masz w projekcie regułę kompilacji cc_library dla biblioteki C/C++. |
lib_name | Ciąg znaków; wymagany Nazwa obiektu SAPI używanego do serwera proxy funkcji bibliotecznych z atrybutu funkcji. Wszelkie wywołania funkcji w bibliotece piaskownicy będą realizowane za pomocą obiektu SAPI. |
input_files | Lista etykiet; opcjonalna Lista plików C i C++, które są przetwarzane podczas wewnętrznego uruchomienia reguły sapi_interface. Generator skanuje te pliki pod kątem deklaracji funkcji biblioteki C/C++. Najczęściej nie jest to potrzebne, ponieważ wyeksportowane nagłówki z biblioteki C/C++ są zawsze skanowane. |
przestrzeń nazw | Ciąg znaków; opcjonalny; domyślnie jest to sapigen Identyfikator przestrzeni nazw C++, w którym należy umieścić obiekt SAPI zdefiniowany przez lib_name. Domyślną przestrzenią nazw to sapigen. |
nagłówek | Ciąg znaków; opcjonalnie Nazwa pliku nagłówka do użycia zamiast wygenerowanego pliku. Jeśli chcesz automatycznie generować kod, nie używaj tego atrybutu. |
add_default_deps | Wartość logiczna; opcjonalna; domyślna to True WYCOFANE |
limit_scan_depth | Wartość logiczna; opcjonalna; domyślna to False W przypadku złożonych bibliotek może zostać osiągnięta liczba plików dla bazy danych, a proces kompilacji się nie powiedzie. Ten atrybut służy do wyjścia awaryjnego na wypadek skomplikowanych sytuacji. Nie używaj tego narzędzia, jeśli nie jest to konieczne. |
tagi | Informacje o tagach znajdziesz w dokumentacji Bazel. |
widoczność | Informacje o widoczności znajdziesz w dokumentacji Bazel |
Przykład użycia
Przykład zlib jest dobrym projektem referencyjnym pokazującym, 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",
)