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