Introduzione
L'API in sandbox (SAPI) può essere utilizzata con il sistema di compilazione Bazel di Google o con il popolare sistema di meta-compilazione CMake. Questa pagina si concentra su Bazel, ma le stesse funzionalità sono disponibili per CMake. Bazel è il sistema di compilazione consigliato e il più semplice da integrare.
Nel file BUILD.bazel avrai una regola di compilazione per compilare il codice host. Affinché il codice host utilizzi la versione in sandbox di una libreria, devi preparare un target di build che il codice host utilizzerà.
Regole di compilazione 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)
Output target
La regola di build sapi_library()
genera i seguenti target:
- name-sapi: libreria in sandbox, sostituisce la normale libreria cc_library come
target del codice host. È costituito da
zlib_sapi.bin
e dalle dipendenze della sandbox. - name.interface: interfaccia della libreria generata.
- name.embed:
cc_embed_data()
target utilizzato per incorporare Sandboxee nel file binario. Vedi bazel/embed_data.bzl.- name.bin: binario Sandboxee, costituito da un piccolo stub di comunicazione e dalla libreria in fase di sandboxing.
Argomenti
Attributi | |
---|---|
nome |
Name (nome); obbligatorio Un nome univoco per questo target. In questo modo verrà identificata la libreria C/C++ in sandbox. Vedi la destinazione dell'output name-sapi. |
dipendenze |
Elenco di etichette; facoltativo Un elenco di altre librerie da collegare alla libreria C/C++ in sandbox. |
srcs |
Elenco di etichette; facoltativo Un elenco di file C e C++ elaborati per creare la libreria C/C++ in sandbox. Si tratta di file di origine e di intestazione C/C++, non generati (codice sorgente normale) o generati. Per saperne di più, consulta la spiegazione dell'attributo srcs nella documentazione di cc_library. |
hdrs | Elenco di etichette; facoltativo Un elenco di file di intestazione elaborati per creare la libreria C/C++ in sandbox. È qui che deve essere inserita la definizione della sandbox (sandbox.h). Lascia vuoto se viene utilizzata la libreria SAPI incorporata e la policy sandbox predefinita è sufficiente. |
codice da incorporare | Booleano; facoltativo; il valore predefinito è True Se è True, la libreria in sandbox deve essere incorporata nel codice host. In questo modo, la sandbox SAPI può essere inizializzata con il
costruttore |
funzioni | Elenco dei nomi delle funzioni; facoltativo Un elenco di funzioni della libreria C/C++ per le quali viene generata una versione in sandbox e che possono essere utilizzate nel codice host. Un elenco vuoto tenterà di esportare e includere tutte le funzioni trovate nella raccolta. |
lib | Stringa; obbligatorio Il nome della destinazione della libreria C/C++ che sarà la libreria in sandbox. Ciò presuppone che tu disponga di una regola di build cc_library per la libreria C/C++ nel progetto. |
lib_name | Stringa; obbligatorio Il nome dell'oggetto SAPI utilizzato per eseguire il proxy delle funzioni della libreria dall'attributo functions. Qualsiasi chiamata alla funzione nella libreria in sandbox avverrà tramite l'oggetto SAPI. |
input_files | Elenco di etichette; facoltativo Un elenco di file C e C++ elaborati durante l'esecuzione interna della regola sapi_interface. Il generatore analizza questi file per le dichiarazioni di funzione della libreria C/C++. Per lo più non è necessario, poiché le intestazioni esportate della libreria C/C++ vengono sempre analizzate. |
spazio dei nomi | Stringa; facoltativa; il valore predefinito è sapigen Un identificatore dello spazio dei nomi C++ in cui inserire l'oggetto SAPI definito da lib_name. Lo spazio dei nomi predefinito è sapigen. |
intestazione | Stringa; facoltativo Il nome del file di intestazione da utilizzare al posto del file di intestazione generato. Se vuoi generare automaticamente il codice, non utilizzare questo attributo |
add_default_deps | Booleano; facoltativo; il valore predefinito è True DEPRECATED |
limit_scan_depth | Booleano; facoltativo; il valore predefinito è False Per le librerie complesse, il conteggio dei file per Bazel potrebbe essere raggiunto e la procedura di build non andrà a buon fine. Questo attributo è una scappatoia per queste situazioni complesse. Non utilizzare a meno che non sia necessario. |
tag | Consulta la documentazione di Bazel per i tag. |
visibilità | Consulta la documentazione di Bazel per la visibilità |
Esempio di utilizzo
L'esempio zlib è un buon progetto di riferimento che mostra come viene utilizzata la regola di build 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",
)