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 |
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",
)