เกริ่นนำ
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 ปกติแทนเป้าหมายโค้ดโฮสต์ ประกอบด้วยทรัพยากร Dependency ของแซนด์บ็อกซ์
zlib_sapi.bin
และ - name.interface: อินเทอร์เฟซไลบรารีที่สร้างขึ้น
- name.embed: เป้าหมาย
cc_embed_data()
ที่ใช้เพื่อฝังแซนด์บ็อกซ์ในไบนารี โปรดดู bazel/embed_data.bzl - name.bin: ไบนารีแซนด์บ็อกซ์ ประกอบด้วยต้นขั้วการสื่อสารขนาดเล็กและไลบรารีที่แซนด์บ็อกซ์อยู่
อาร์กิวเมนต์
Attributes | |
---|---|
ชื่อ |
Name ต้องระบุ ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ การดำเนินการนี้จะระบุไลบรารี C/C++ ที่ทำแซนด์บ็อกซ์ โปรดดูเป้าหมายเอาต์พุต name-sapi |
Deps |
รายการ ป้ายกำกับ ไม่บังคับ รายการไลบรารีอื่นๆ ที่จะลิงก์กับไลบรารี C/C++ ที่ทำแซนด์บ็อกซ์ |
src |
รายการ ป้ายกำกับ ไม่บังคับ รายการไฟล์ C และ C++ ที่ได้รับการประมวลผลเพื่อสร้างไลบรารี C/C++ ที่ทำแซนด์บ็อกซ์ ไฟล์เหล่านี้เป็นไฟล์ต้นฉบับและส่วนหัว C/C++ ซึ่งอาจไม่ได้สร้างขึ้น (ซอร์สโค้ดปกติ) หรือสร้างขึ้น ดูคำอธิบายเพิ่มเติมของแอตทริบิวต์ src ใน เอกสาร cc_library |
HDR | รายการ ป้ายกำกับ ไม่บังคับ รายการไฟล์ส่วนหัวที่มีการประมวลผลเพื่อสร้างไลบรารี C/C++ ที่ทำแซนด์บ็อกซ์ ช่องนี้ควรใส่คำจำกัดความแซนด์บ็อกซ์ (sandbox.h) ให้เว้นว่างไว้หากใช้ไลบรารี SAPI ที่ฝังและนโยบายแซนด์บ็อกซ์เริ่มต้นก็เพียงพอแล้ว |
ฝัง | บูลีน ไม่บังคับ ค่าเริ่มต้นคือจริง หากเป็น "จริง" ควรฝังไลบรารีแซนด์บ็อกซ์ไว้ในโค้ดของโฮสต์ ซึ่งจะช่วยให้แซนด์บ็อกซ์ 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 | บูลีน ไม่บังคับ ค่าเริ่มต้นคือจริง เลิกใช้งานแล้ว |
limit_scan_depth | บูลีน ไม่บังคับ ค่าเริ่มต้นคือเท็จ สำหรับไลบรารีที่ซับซ้อน อาจมีการเข้าถึงจำนวนไฟล์ของ Bazel และกระบวนการบิลด์จะไม่ประสบความสำเร็จ แอตทริบิวต์นี้เป็นช่องทางลี้ภัยสำหรับสถานการณ์ที่ซับซ้อนเหล่านี้ อย่าใช้เว้นแต่จำเป็น |
แท็ก | ดูเอกสารประกอบของ Bazel สำหรับ แท็ก |
การเปิดเผย | ดูเอกสารประกอบของ Bazel สำหรับ ระดับการเข้าถึง |
ตัวอย่างการใช้งาน
ตัวอย่าง zlib เป็นโปรเจ็กต์อ้างอิงที่ดีซึ่งสาธิตวิธีใช้กฎการสร้าง 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",
)