หน้านี้มีแหล่งข้อมูลที่ช่วยให้คุณใช้ Bazel กับโปรเจ็กต์ C++ ซึ่งจะลิงก์ไปยังบทแนะนำ สร้างกฎ และข้อมูลอื่นๆ ที่ใช้ในการสร้างโปรเจ็กต์ C++ ด้วย Bazel โดยเฉพาะ
การทำงานร่วมกับ Bazel
แหล่งข้อมูลต่อไปนี้จะช่วยคุณในการใช้งาน Bazel ในโปรเจ็กต์ C++
- บทแนะนำ: การสร้างโปรเจ็กต์ C++
- กรณีการใช้งานทั่วไปของ C++
- กฎ C/C++
- ห้องสมุดที่สำคัญ
- การกำหนดค่าเชนเครื่องมือ C++
- บทแนะนํา: การกําหนดค่าเชนเครื่องมือ C++
- การผสานรวมกับกฎ 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
เป็นคอมไพเลอร์