บทนำ
คุณสามารถใช้ Sandboxed API (SAPI) กับระบบบิลด์ Bazel ของ Google หรือกับระบบบิลด์เมตา CMake ที่ได้รับความนิยม หน้านี้เน้นที่ Bazel แต่ฟีเจอร์เดียวกันนี้ก็มีให้ใช้งานสำหรับ CMake ด้วย Bazel เป็นระบบบิลด์ที่แนะนำและผสานรวมได้ง่ายที่สุด
ในไฟล์ BUILD.bazel คุณจะมีกฎการสร้างเพื่อสร้างโค้ดโฮสต์ หากต้องการให้โค้ดโฮสต์ใช้ไลบรารีเวอร์ชันแซนด์บ็อกซ์ คุณต้องเตรียม เป้าหมายการสร้างที่โค้ดโฮสต์จะใช้
กฎการสร้าง 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)
เป้าหมายเอาต์พุต
sapi_library()
กฎการสร้างจะสร้างเป้าหมายต่อไปนี้
- name-sapi: ไลบรารีแซนด์บ็อกซ์ ซึ่งแทนที่ cc_library ปกติเป็นเป้าหมายของ Host Code ประกอบด้วย
zlib_sapi.bin
และการขึ้นต่อกันของแซนด์บ็อกซ์ - name.interface: อินเทอร์เฟซของไลบรารีที่สร้างขึ้น
- name.embed:
cc_embed_data()
เป้าหมายที่ใช้ฝัง Sandboxee ในไบนารี ดู bazel/embed_data.bzl- name.bin: ไบนารี Sandboxee ประกอบด้วย Stub การสื่อสารขนาดเล็กและ ไลบรารีที่กำลังแซนด์บ็อกซ์
อาร์กิวเมนต์
Attributes | |
---|---|
ชื่อ |
ชื่อ; ต้องระบุ ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ ซึ่งจะระบุไลบรารี C/C++ ที่อยู่ในแซนด์บ็อกซ์ ดูเป้าหมายเอาต์พุต name-sapi |
deps |
รายการ ป้ายกำกับ (ไม่บังคับ) รายการไลบรารีอื่นๆ ที่จะลิงก์ไปยังไลบรารี C/C++ ในแซนด์บ็อกซ์ |
srcs |
รายการ ป้ายกำกับ (ไม่บังคับ) รายการไฟล์ C และ C++ ที่ประมวลผลเพื่อสร้างไลบรารี C/C++ แบบแซนด์บ็อกซ์ ซึ่งเป็นไฟล์ต้นฉบับและไฟล์ส่วนหัวของ C/C++ ไม่ว่าจะเป็น ไฟล์ที่ไม่ได้สร้าง (ซอร์สโค้ดปกติ) หรือไฟล์ที่สร้างขึ้น ดูข้อมูลเพิ่มเติมได้ที่คำอธิบายแอตทริบิวต์ srcs ใน เอกสารประกอบ cc_library |
hdrs | รายการ ป้ายกำกับ (ไม่บังคับ) รายการไฟล์ส่วนหัวที่ประมวลผลเพื่อสร้างไลบรารี C/C++ ที่อยู่ในแซนด์บ็อกซ์ นี่คือตำแหน่งที่ควรวางคำจำกัดความแซนด์บ็อกซ์ (sandbox.h) เว้นว่างไว้ หากใช้ไลบรารี SAPI แบบฝัง และนโยบายแซนด์บ็อกซ์เริ่มต้น เพียงพอ |
ฝัง | บูลีน ไม่บังคับ ค่าเริ่มต้นคือ True หากเป็นจริง ควรฝังไลบรารีที่อยู่ในแซนด์บ็อกซ์ไว้ภายในโค้ดโฮสต์ ซึ่งจะช่วยให้เริ่มต้นแซนด์บ็อกซ์ SAPI ด้วย
ตัวสร้าง |
ฟังก์ชัน | รายการชื่อฟังก์ชัน (ไม่บังคับ) รายการฟังก์ชันจากไลบรารี C/C++ ที่มีการสร้างเวอร์ชันแซนด์บ็อกซ์ และสามารถใช้ในโค้ดโฮสต์ได้ รายการที่ว่างเปล่าจะพยายามส่งออกและรวมฟังก์ชันทั้งหมดที่พบใน ไลบรารี |
lib | สตริง; ต้องระบุ ชื่อของเป้าหมายไลบรารี C/C++ ซึ่งจะเป็นไลบรารีแซนด์บ็อกซ์ ซึ่งคาดว่าคุณจะมีกฎการสร้าง cc_library สำหรับไลบรารี C/C++ ในโปรเจ็กต์ |
lib_name | สตริง; ต้องระบุ ชื่อของออบเจ็กต์ SAPI ซึ่งใช้เพื่อพร็อกซีฟังก์ชันไลบรารี จากแอตทริบิวต์ฟังก์ชัน การเรียกฟังก์ชันใน ไลบรารีแซนด์บ็อกซ์จะเกิดขึ้นผ่านออบเจ็กต์ SAPI |
input_files | รายการ ป้ายกำกับ (ไม่บังคับ) รายการไฟล์ C และ C++ ที่ประมวลผลระหว่างการเรียกใช้ภายใน ของกฎ sapi_interface เครื่องมือสร้างจะสแกนไฟล์เหล่านี้เพื่อหา การประกาศฟังก์ชันของไลบรารี C/C++ โดยส่วนใหญ่ไม่จำเป็นต้องทำเช่นนี้ เนื่องจากระบบจะสแกนส่วนหัวที่ส่งออกจากไลบรารี C/C++ เสมอ |
เนมสเปซ | สตริง ไม่บังคับ ค่าเริ่มต้นคือ sapigen ตัวระบุเนมสเปซ C++ เพื่อวางออบเจ็กต์ SAPI ที่กำหนดโดย lib_name เนมสเปซเริ่มต้นคือ sapigen |
ส่วนหัว | สตริง ไม่บังคับ ชื่อของไฟล์ส่วนหัวที่จะใช้แทนไฟล์ส่วนหัวที่สร้างขึ้น หากต้องการสร้างโค้ดโดยอัตโนมัติ อย่าใช้ แอตทริบิวต์นี้ |
add_default_deps | บูลีน ไม่บังคับ ค่าเริ่มต้นคือ True เลิกใช้งานแล้ว |
limit_scan_depth | บูลีน ไม่บังคับ ค่าเริ่มต้นคือ False สำหรับไลบรารีที่ซับซ้อน จำนวนไฟล์สำหรับ Bazel อาจถึงขีดจำกัด และกระบวนการบิลด์จะไม่สำเร็จ แอตทริบิวต์นี้เป็นทางออก สำหรับสถานการณ์ที่ซับซ้อนเหล่านี้ อย่าใช้เว้นแต่ จำเป็น |
แท็ก | ดูเอกสารประกอบของ Bazel สำหรับ แท็ก |
การเปิดเผย | ดูเอกสารประกอบของ Bazel สำหรับ ระดับการมองเห็น |
ตัวอย่างการใช้งาน
ตัวอย่าง zlib เป็นโปรเจ็กต์อ้างอิงที่ดีที่แสดงให้เห็นวิธีใช้กฎ sapi_library build
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",
)