C++ และ Bazel

รายงานปัญหา ดูแหล่งที่มา รุ่น Nightly · 7.4 7.3 · 7.2 · 7.1 · 7.0 · 6.5

หน้านี้มีแหล่งข้อมูลที่จะช่วยให้คุณใช้ 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 1 รายการในไฟล์ ตั้งชื่อไฟล์เป้าหมาย [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++ คุณเปิดใช้กฎได้โดยใช้ --featuresFlag บรรทัดคำสั่งหรือแอตทริบิวต์ features ของกฎ repo, package หรือ cc_* ดังนี้

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