Einführung
Die Sandboxed API (SAPI) kann mit dem Bazel Buildsystem von Google oder mit dem beliebten CMake Meta-Buildsystem 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 Buildsystem und lässt sich am einfachsten integrieren.
In Ihrer BUILD.bazel-Datei befindet sich eine Build-Regel zum Erstellen Ihres Host-Codes. Damit der Host-Code die Sandbox-Version einer Bibliothek verwenden kann, müssen Sie ein Build-Ziel vorbereiten, das von Ihrem Host-Code 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
Die Build-Regel sapi_library() generiert die folgenden Ziele:
- name-sapi: Sandbox-Bibliothek, ersetzt die normale cc_library als das
Host-Code-Ziel. Besteht aus
zlib_sapi.binund Sandbox-Abhängigkeiten. - name.interface: Generierte Bibliotheksschnittstelle.
- name.embed:
cc_embed_data()-Ziel, das verwendet wird, um den Sandboxee in die Binärdatei einzubetten. Siehe bazel/embed_data.bzl.- name.bin: Sandboxee-Binärdatei, besteht aus einem kleinen Kommunikations-Stub und der Bibliothek, 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. Weitere Informationen finden Sie unter dem Ausgabeziel name-sapi. |
| deps |
Liste der Labels; optional Eine Liste anderer Bibliotheken, die in die Sandbox-C/C++ Bibliothek verknüpft werden sollen. |
| srcs |
Liste der Labels; optional Eine Liste von C- und C++-Dateien, die verarbeitet werden, um die Sandbox- C/C++-Bibliothek zu erstellen. Dabei handelt es sich um C/C++-Quell- und Headerdateien, entweder nicht generiert (normaler Quellcode) oder generiert. Weitere Informationen finden Sie in der Erläuterung des Attributs „srcs“ in der cc_library-Dokumentation. |
| hdrs | Liste der Labels; optional Eine Liste von Headerdateien, die verarbeitet werden, um die Sandbox- C/C++-Bibliothek zu erstellen. Hier sollte die Sandbox-Definition (sandbox.h) stehen. Lassen Sie das Feld leer, wenn die eingebettete SAPI-Bibliothek verwendet wird und die Standard-Sandbox-Konfiguration (DefaultConfig, die |
| embed | Boolesch; optional; Standardwert ist „True“ Wenn „True“, sollte die Sandbox-Bibliothek in den Host
Code eingebettet werden. So kann die SAPI-Sandbox mit dem
|
| functions | Liste der Funktionsnamen; optional Eine Liste von Funktionen aus der C/C++-Bibliothek, für die eine Sandbox-Version generiert wird und die dann im Host-Code 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 soll. 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 verwendet wird, um die Bibliotheks funktionen aus dem Attribut „functions“ zu proxen. Alle Aufrufe der Funktion in der Sandbox-Bibliothek erfolgen über das SAPI-Objekt. |
| input_files | Liste der Labels; optional Eine Liste von C- und C++-Dateien, die während der internen Ausführung der sapi_interface-Regel verarbeitet werden. Der Generator durchsucht diese Dateien nach den Funktionsdeklarationen der C/C++-Bibliothek. Das ist meist nicht erforderlich, da die exportierten Header der C/C++-Bibliothek immer gescannt werden. |
| namespace | String; optional; Standardwert ist „sapigen“ Eine C++-Namespace-Kennung, in die das durch 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 Header Datei verwendet werden soll. Wenn Sie den Code automatisch generieren möchten, verwenden Sie dieses Attribut nicht |
| add_default_deps | Boolesch; optional; Standardwert ist „True“ VERWORFEN |
| limit_scan_depth | Boolesch; optional; Standardwert ist „False“ Bei komplexen Bibliotheken kann die Dateianzahl für Bazel erreicht werden und der Buildprozess schlägt fehl. Dieses Attribut ist eine Notlösung für diese komplexen Situationen. Verwenden Sie es nur, wenn es unbedingt erforderlich ist. |
| tags | Informationen zu Tags finden Sie in der Bazel-Dokumentation. |
| visibility | Informationen zur Sichtbarkeit finden Sie in der Bazel-Dokumentation. |
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 configuration (DefaultConfig) is sufficient.
embed = True, # This is the default
functions = [
"deflateInit_",
"deflate",
"deflateEnd",
],
lib = "@zlib//:zlibonly",
lib_name = "Zlib",
namespace = "sapi::zlib",
)