C++ และ Bazel

วันที่ รายงานปัญหา ดูแหล่งที่มา ตอนกลางคืน · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

หน้านี้มีแหล่งข้อมูลที่จะช่วยให้คุณใช้ Bazel กับโปรเจ็กต์ C++ ได้ ลิงก์ ไปยังบทแนะนำ สร้างกฎ และข้อมูลอื่นๆ เฉพาะสำหรับการสร้าง C++ กับ Bazel

การทำงานกับ Bazel

แหล่งข้อมูลต่อไปนี้จะช่วยคุณในการทำงานกับ Bazel ในโปรเจ็กต์ C++

แนวทางปฏิบัติแนะนำ

นอกเหนือจากแนวทางปฏิบัติแนะนำทั่วไปของ Bazel แล้ว ยังมีข้อมูลต่อไปนี้ ให้กับโครงการ C++ โดยเฉพาะ

สร้างไฟล์

ทำตามหลักเกณฑ์ด้านล่างเมื่อสร้างไฟล์ BUILD

  • ไฟล์ BUILD แต่ละไฟล์ควรมี cc_library 1 รายการ เป้าหมายกฎต่อหน่วยคอมไพล์ในไดเรกทอรี

  • คุณควรอธิบายไลบรารี C++ อย่างละเอียด เป็นไปได้ที่จะเพิ่มส่วนเพิ่มสูงสุดและขนานกับบิลด์

  • หากมีไฟล์แหล่งที่มาไฟล์เดียวใน srcs ให้ตั้งชื่อไลบรารีเหมือนกับ ในชื่อไฟล์ C++ ไลบรารีนี้ควรมีไฟล์ C++ ถ้ามี ไฟล์ส่วนหัว และการอ้างอิงโดยตรงของไลบรารี เช่น

    cc_library(
        name = "mylib",
        srcs = ["mylib.cc"],
        hdrs = ["mylib.h"],
        deps = [":lower-level-lib"]
    )
    
  • ใช้เป้าหมายกฎ cc_test 1 รายการต่อเป้าหมาย cc_library ในไฟล์ ตั้งชื่อ กำหนดเป้าหมาย [library-name]_test และไฟล์ต้นฉบับ [library-name]_test.cc ตัวอย่างเช่น เป้าหมายทดสอบสำหรับเป้าหมายไลบรารี mylib ที่แสดงด้านบนจะ ซึ่งจะมีลักษณะดังนี้

    cc_test(
        name = "mylib_test",
        srcs = ["mylib_test.cc"],
        deps = [":mylib"]
    )
    

รวมเส้นทาง

การใช้เส้นทาง "รวม" จะต้องเป็นไปตามหลักเกณฑ์ต่อไปนี้

  • กำหนดให้เส้นทางรวมทั้งหมดสัมพันธ์กับไดเรกทอรีพื้นที่ทำงาน

  • ใช้การรวมเครื่องหมายอัญประกาศ (#include "foo/bar/baz.h") สำหรับส่วนหัวที่ไม่ใช่ระบบ ไม่ใช่ วงเล็บมุม (#include <foo/bar/baz.h>)

  • หลีกเลี่ยงการใช้ทางลัดไดเรกทอรี UNIX เช่น . (ไดเรกทอรีปัจจุบัน) หรือ .. (ไดเรกทอรีหลัก)

  • สำหรับโค้ดเดิมหรือรหัส third_party ที่ต้องมีการชี้นอก ที่เก็บโปรเจ็กต์ เช่น ที่เก็บภายนอก ต้องมีคำนำหน้า ใช้ include_prefix และ strip_include_prefix อาร์กิวเมนต์ในเป้าหมายของกฎ cc_library

ฟีเจอร์ Toolchain

ฟีเจอร์ที่ไม่บังคับต่อไปนี้ ทำให้โปรเจ็กต์ C++ มีความสมบูรณ์ได้ โดยจะเปิดใช้ได้โดยใช้ แฟล็กบรรทัดคำสั่ง --features หรือแอตทริบิวต์ features ของ repo กฎ package หรือ cc_*:

  • ฟีเจอร์ parse_headers ทำให้สามารถใช้คอมไพเลอร์ C++ เพื่อแยกวิเคราะห์ (แต่ไม่คอมไพล์) ไฟล์ส่วนหัวทั้งหมดในเป้าหมายที่สร้างขึ้นและทรัพยากร Dependency เมื่อใช้ --process_headers_in_dependencies แจ้ง ซึ่งจะช่วยตรวจจับปัญหาในไลบรารีที่มีเฉพาะส่วนหัวเท่านั้นและช่วยให้มั่นใจว่า ส่วนหัวอยู่ในตัวเอง และเป็นอิสระจากลำดับ รวมไว้ด้วย
  • ฟีเจอร์ layering_check จะบังคับใช้การกำหนดเป้าหมายที่มีเฉพาะส่วนหัวเท่านั้น ที่ได้รับจากทรัพยากร Dependency โดยตรง Toolchain เริ่มต้นรองรับ ใน Linux โดยมี clang เป็นคอมไพเลอร์