Wprowadzenie
Interfejs API w piaskownicy (SAPI) można używać z systemem kompilacji Bazel firmy Google lub z popularnym systemem kompilacji CMake. Ta strona koncentruje się na Bazelu, 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 mógł 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 cele:
- name-sapi: biblioteka w piaskownicy, zastępuje zwykłą bibliotekę cc_library jako cel kodu hosta. Składa się z
zlib_sapi.bini zależności piaskownicy. - name.interface: wygenerowany interfejs biblioteki.
- name.embed: cel
cc_embed_data()używany do umieszczania piaskownicy w pliku binarnym. Zobacz bazel/embed_data.bzl.- name.bin: plik binarny piaskownicy, składa się z małego elementu komunikacyjnego i biblioteki, która jest umieszczana w piaskownicy.
Argumenty
| Atrybuty | |
|---|---|
| nazwa |
Nazwa; wymagana Unikalna nazwa tego celu. Będzie ona identyfikować bibliotekę C/C++ w piaskownicy. Zobacz cel wyjściowy name-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 nie są generowane (zwykły kod źródłowy) lub są generowane. 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. Tutaj powinna się znajdować definicja piaskownicy (sandbox.h). Pozostaw
to pole puste, jeśli używana jest biblioteka SAPI umieszczona w kodzie, a domyślna konfiguracja piaskownicy (DefaultConfig,
która używa |
| embed | Wartość logiczna; opcjonalnie; domyślnie True Jeśli wartość to True, biblioteka w piaskownicy powinna być umieszczona w kodzie hosta. Umożliwia to zainicjowanie piaskownicy SAPI za pomocą
|
| functions | Lista nazw funkcji; opcjonalnie Lista funkcji z biblioteki C/C++, dla których generowana jest wersja w piaskownicy , która może być używana w kodzie hosta. Pusta lista spowoduje wyeksportowanie i opakowanie wszystkich funkcji znalezionych w bibliotece. |
| lib | Ciąg znaków; wymagany Nazwa celu biblioteki C/C++, która będzie biblioteką w piaskownicy. Wymaga to, aby w projekcie była reguła 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 funkcji z atrybutu functions. Każde wywołanie funkcji w bibliotece w piaskownicy będzie odbywać się za pomocą obiektu SAPI. |
| input_files | Lista etykiet; opcjonalnie Lista plików C i C++, które są przetwarzane podczas wewnętrznego uruchamiania reguły sapi_interface. Generator skanuje te pliki pod kątem deklaracji funkcji biblioteki C/C++. Zwykle nie jest to konieczne, ponieważ zawsze skanowane są wyeksportowane nagłówki biblioteki C/C++. |
| namespace | Ciąg znaków; opcjonalnie; 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. |
| header | Ciąg znaków; opcjonalnie 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; opcjonalnie; domyślnie True WYCOFANE |
| limit_scan_depth | Wartość logiczna; opcjonalnie; domyślnie False W przypadku złożonych bibliotek może zostać osiągnięta liczba plików w Bazelu a proces kompilacji nie powiedzie się. Ten atrybut jest rozwiązaniem w takich złożonych sytuacjach. Nie używaj, chyba że jest to konieczne. |
| tags | Informacje o tagach znajdziesz w dokumentacji Bazela . |
| visibility | |
Przykład użycia
Dobrym projektem referencyjnym, który pokazuje, jak używać reguły kompilacji sapi_library, jest przykład zlib:
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",
)