หน้านี้มีแหล่งข้อมูลที่จะช่วยให้คุณใช้ Bazel กับโปรเจ็กต์ C++ ได้ ซึ่งลิงก์ไปยังบทแนะนำ กฎการสร้าง และข้อมูลอื่นๆ สำหรับการสร้างโปรเจ็กต์ C++ ด้วย Bazel โดยเฉพาะ
การทำงานกับ Bazel
แหล่งข้อมูลต่อไปนี้จะช่วยคุณใช้งาน Bazel ในโปรเจ็กต์ C++
- บทแนะนำ: การสร้างโปรเจ็กต์ C++
- Use Case ทั่วไปของ 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
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++ ได้ คุณเปิดใช้กฎได้โดยใช้ --features
Flag บรรทัดคำสั่งหรือแอตทริบิวต์ features
ของกฎ repo
, package
หรือ cc_*
ดังนี้
- ฟีเจอร์
parse_headers
ทำให้ใช้คอมไพเลอร์ C++ เพื่อแยกวิเคราะห์ (แต่ไม่ได้คอมไพล์) ไฟล์ส่วนหัวทั้งหมดในเป้าหมายที่สร้างขึ้นและไลบรารีที่เกี่ยวข้องเมื่อใช้แฟล็ก--process_headers_in_dependencies
ซึ่งจะช่วยตรวจหาปัญหาในไลบรารีที่มีเฉพาะส่วนหัว และตรวจสอบว่าส่วนหัวมีข้อมูลครบถ้วนในตัวและไม่ขึ้นอยู่กับลําดับที่รวมไว้ - ฟีเจอร์
layering_check
จะบังคับให้เป้าหมายมีเฉพาะส่วนหัวที่มาจาก Dependency โดยตรงเท่านั้น เครื่องมือชุดเริ่มต้นรองรับฟีเจอร์นี้ใน Linux ที่มีclang
เป็นคอมไพเลอร์