C++ และ Bazel

รายงานปัญหา ดูแหล่งที่มา

หน้านี้มีแหล่งข้อมูลที่ช่วยให้คุณใช้ 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 หรือ 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 เป็นคอมไพเลอร์