หน้านี้จะอธิบายวิธีผสานรวมกับกฎ C++ ในระดับต่างๆ
การเข้าถึงเครื่องมือเชน C++
เนื่องจากมีการย้ายกฎ C++ อย่างต่อเนื่องไปยังแพลตฟอร์มและเครื่องมือเชน คุณควรใช้ฟังก์ชันผู้ช่วยที่มีอยู่ใน @bazel_tools//tools/cpp:toolchain_utils.bzl
ซึ่งจะทําทั้ง 2 วิธีเมื่อมีการปิดใช้และเปิดใช้เครื่องมือเชน หากต้องการใช้งานเครื่องมือเชน C++
ในกฎ ให้เพิ่มแอตทริบิวต์
Label
ชื่อ _cc_toolchain
และชี้ไปยัง @bazel_tools//tools/cpp:current_cc_toolchain
(อินสแตนซ์ของกฎ cc_toolchain_alias
ที่ชี้ไปยังเชนเครื่องมือ C++ ที่เลือกอยู่)
จากนั้นเมื่อนํากฎไปใช้ ให้ใช้ find_cpp_toolchain(ctx)
เพื่อรับ CcToolchainInfo
ดูตัวอย่างการทํางานที่สมบูรณ์ได้ในตัวอย่าง Rules_cc
การสร้างบรรทัดคําสั่งและตัวแปรสภาพแวดล้อมโดยใช้เชนเครื่องมือ C++
โดยปกติแล้ว คุณจะผสานรวมกับเครื่องมือเครื่องมือ C++ เพื่อให้มีแฟล็กบรรทัดคําสั่งเดียวกันกับกฎ C++ แต่ไม่ใช้การทํางาน C++ โดยตรง นั่นเป็นเพราะเมื่อเขียนการดําเนินการของเราเอง การดําเนินการดังกล่าวต้องสอดคล้องกับเชนเครื่องมือ C++ อย่างสอดคล้องกัน เช่น การส่งบรรทัดคําสั่ง C++ ไปยังเครื่องมือที่เรียกใช้คอมไพเลอร์ C++ เบื้องหลัง
กฎ C++ ใช้วิธีการพิเศษในการสร้างบรรทัดคําสั่งโดยอิงตามการกําหนดค่าฟีเจอร์ ในการสร้างบรรทัดคําสั่ง คุณต้องมีสิ่งต่อไปนี้
features
และaction_configs
- ภาพเหล่านี้มาจากCcToolchainConfigInfo
และห่อไว้ในCcToolchainInfo
FeatureConfiguration
- แสดงผลโดย cc_Common.configure_features- ตัวแปรการกําหนดค่าเครื่องมือเชน - แสดงผลโดย cc_Common.create_คอมไพล์ตัวแปร หรือ cc_Common.create_link_variables
แต่ก็ยังมี Getter เฉพาะเครื่องมือ เช่น คอมไพล์_executable
ต้องการใช้ get_tool_for_action
แทน เนื่องจากระบบจะนําเครื่องมือเฉพาะเครื่องมือออกในที่สุด
ดูตัวอย่างการทํางานที่สมบูรณ์ได้ในตัวอย่าง Rules_cc
การใช้กฎ Starlark ที่ขึ้นอยู่กับกฎ C++ และ/หรือกฎ C++ จะขึ้นอยู่กับ
กฎ C++ ส่วนใหญ่จะมี CcInfo
ซึ่งเป็นผู้ให้บริการที่มี CompilationContext
และ LinkingContext
วิธีนี้จะช่วยให้คุณเข้าถึงข้อมูลต่างๆ เช่น ส่วนหัวทางอ้อมหรือไลบรารีทั้งหมดที่จะลิงก์ได้ จาก CcInfo
และจากกฎที่กําหนดเอง CcToolchainInfo
รายการ Starlark ควรได้รับข้อมูลทั้งหมดที่ต้องการ
หากกฎที่กําหนดเองของ Starlark ให้ CcInfo
ไว้ ก็จะเป็นสัญญาณไปยังกฎ C++ ที่ขึ้นอยู่กับกฎนั้นด้วย อย่างไรก็ตาม โปรดระวัง หากคุณต้องการเผยแพร่CcInfo
ผ่านกราฟไปยังกฎไบนารีที่ต้องการใช้ ให้รวม CcInfo
ไว้ในผู้ให้บริการรายอื่น เช่น หากกฎ java_library
ต้องการเผยแพร่ทรัพยากร Dependency แบบเนทีฟจนถึง java_binary
คุณไม่ควรระบุ CcInfo
โดยตรง (cc_binary
โดยขึ้นอยู่กับ java_library
ไม่สมเหตุสมผล) และควรรวมกฎนั้นไว้ เช่น JavaCcInfo
ดูตัวอย่างการทํางานที่สมบูรณ์ได้ในตัวอย่าง Rules_cc
การใช้ตรรกะและการทํางานของกฎ C++ ซ้ํา
ยังไม่เสถียร ส่วนนี้จะได้รับการอัปเดตเมื่อ API เสถียรแล้ว ติดตาม #4570 เพื่อดูข้อมูลล่าสุด