C++ และ Bazel

รายงานปัญหา ดูแหล่งที่มา Nightly · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

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

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

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

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

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

ไฟล์ BUILD

ปฏิบัติตามหลักเกณฑ์ด้านล่างเมื่อสร้างไฟล์ BUILD

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

  • คุณควรแยกย่อยไลบรารี C++ ให้มากที่สุด เพื่อเพิ่มการวัดผลที่เพิ่มขึ้นและสร้างแบบคู่ขนาน

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

    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 Flag บรรทัดคำสั่งหรือแอตทริบิวต์ features ของ repo package หรือกฎ cc_*

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