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.bin
und 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",
)