Einführung
Die Sandboxed API (SAPI) kann mit dem Bazel-Build-System von Google oder mit dem beliebten CMake-Meta-Build-System verwendet werden. Auf dieser Seite geht es hauptsächlich um Bazel, aber dieselben Funktionen sind auch für CMake verfügbar. Bazel ist das empfohlene Build-System und lässt sich am einfachsten einbinden.
In Ihrer BUILD.bazel-Datei haben Sie eine Build-Regel zum Erstellen Ihres Host-Codes. Damit der Hostcode die Sandbox-Version einer Bibliothek verwendet, müssen Sie ein Build-Ziel vorbereiten, das vom Hostcode verwendet wird.
SAPI-Build-Regeln
- 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)
Ausgabeziele
Durch die sapi_library()-Build-Regel werden die folgenden Ziele generiert:
- name-sapi: Sandboxed-Bibliothek, die die normale cc_library als Ziel für den Hostcode ersetzt. Besteht aus 
zlib_sapi.binund Sandbox-Abhängigkeiten. - name.interface: Generierte Bibliotheksschnittstelle.
 - name.embed: 
cc_embed_data()-Ziel, das zum Einbetten des Sandboxee in die Binärdatei verwendet wird. Siehe bazel/embed_data.bzl.- name.bin: Sandboxee-Binärdatei, die aus einem kleinen Kommunikations-Stub und der Bibliothek besteht, die in der Sandbox ausgeführt wird.
 
 
Argumente
| Attribute | |
|---|---|
| name | 
         Name: erforderlich Ein eindeutiger Name für dieses Ziel. Dadurch wird die Sandbox-C/C++-Bibliothek identifiziert. Sehen Sie sich das Ausgabeziel „name-sapi“ an.  | 
    
| deps | 
         Liste mit Labels; optional Eine Liste anderer Bibliotheken, die in die C/C++-Bibliothek in der Sandbox eingebunden werden sollen.  | 
    
| srcs | 
         Liste mit Labels; optional Eine Liste der C- und C++-Dateien, die zum Erstellen der Sandbox-C/C++-Bibliothek verarbeitet werden. Dies sind C/C++-Quell- und Headerdateien, die entweder nicht generiert (normaler Quellcode) oder generiert sind. Weitere Informationen finden Sie in der Dokumentation zu cc_library.  | 
    
| hdrs | Liste mit Labels; optional Eine Liste der Headerdateien, die zum Erstellen der Sandbox-C/C++-Bibliothek verarbeitet werden. Hier sollte die Sandbox-Definition (sandbox.h) eingefügt werden. Lassen Sie das Feld leer, wenn die eingebettete SAPI-Bibliothek verwendet wird und die Standardsandbox-Richtlinie ausreicht.  | 
    
| Einbetten | Boolescher Wert; optional; Standardwert ist „True“ Wenn „True“, sollte die Sandbox-Bibliothek in den Hostcode eingebettet werden. Dadurch kann die SAPI-Sandbox mit dem Konstruktor   | 
    
| Funktionen | Liste der Funktionsnamen (optional) Eine Liste der Funktionen aus der C/C++-Bibliothek, für die eine Sandbox-Version generiert wird und die dann im Hostcode verwendet werden kann. Bei einer leeren Liste wird versucht, alle in der Bibliothek gefundenen Funktionen zu exportieren und zu umschließen.  | 
    
| lib | String; erforderlich Der Name des C/C++-Bibliotheksziels, das die Sandbox-Bibliothek sein wird. Dazu ist eine cc_library-Build-Regel für die C/C++-Bibliothek im Projekt erforderlich.  | 
    
| lib_name | String; erforderlich Der Name des SAPI-Objekts, das zum Proxying der Bibliotheksfunktionen aus dem Attribut „functions“ verwendet wird. Jeder Aufruf der Funktion in der Sandbox-Bibliothek erfolgt über das SAPI-Objekt.  | 
    
| input_files | Liste mit Labels; optional Eine Liste der C- und C++-Dateien, die während des internen Laufs der sapi_interface-Regel verarbeitet werden. Der Generator durchsucht diese Dateien nach Funktionsdeklarationen der C/C++-Bibliothek. Das ist meistens nicht erforderlich, da die exportierten Header der C/C++-Bibliothek immer gescannt werden.  | 
    
| Namespace | String; optional; Standardwert ist sapigen Eine C++-Namespace-Kennzeichnung, in die das von lib_name definierte SAPI-Objekt eingefügt werden soll. Der Standard-Namespace ist sapigen.  | 
    
| Header | String; optional Der Name der Headerdatei, die anstelle der generierten Headerdatei verwendet werden soll. Wenn Sie den Code automatisch generieren lassen möchten, verwenden Sie dieses Attribut nicht.  | 
    
| add_default_deps | Boolescher Wert; optional; Standardwert ist „True“ EINGESTELLT  | 
    
| limit_scan_depth | Boolescher Wert; optional; Standardwert ist „False“ Bei komplexen Bibliotheken kann die Dateianzahl für Bazel erreicht werden und der Build-Prozess schlägt fehl. Dieses Attribut ist ein Ausweg für diese komplexen Situationen. Nicht verwenden, es sei denn, es ist unbedingt erforderlich.  | 
    
| Tags | Weitere Informationen finden Sie in der Bazel-Dokumentation unter Tags.  | 
    
| Sichtbarkeit | Weitere Informationen finden Sie in der Bazel-Dokumentation unter Sichtbarkeit.  | 
    
Beispiel für die Verwendung
Das zlib-Beispiel ist ein gutes Referenzprojekt, das zeigt, wie die sapi_library-Build-Regel verwendet wird:
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",
)