ภาพรวม
Bazel ต้องการความรู้เกี่ยวกับ ภายในของคอมไพเลอร์ เช่น ไดเรกทอรีและแฟล็กที่สำคัญ อีกนัยหนึ่งคือ Bazel ต้องการโมเดลแบบง่ายของคอมไพเลอร์เพื่อทำความเข้าใจ ที่มีประสิทธิภาพมากขึ้น
Bazel จำเป็นต้องทราบข้อมูลต่อไปนี้
- คอมไพเลอร์รองรับ ThinLTO, โมดูล, การลิงก์แบบไดนามิก หรือ PIC (โค้ดอิสระตามตำแหน่ง)
- เส้นทางไปยังเครื่องมือที่จำเป็น เช่น gcc, ld, ar, objcopy และอื่นๆ
- ระบบในตัวจะมีไดเรกทอรี Bazel ต้องการข้อมูลเหล่านี้เพื่อยืนยันว่า
ส่วนหัวทั้งหมดที่รวมอยู่ในไฟล์ต้นฉบับได้รับการประกาศอย่างถูกต้องใน
ไฟล์
BUILD
- sysroot เริ่มต้น
- แฟล็กใดที่จะใช้ในการคอมไพล์ การลิงก์ การเก็บ
- แฟล็กใดที่จะใช้สำหรับโหมดการคอมไพล์ที่รองรับ (opt, dbg, Fastbuild)
- ทำให้เป็นตัวแปรที่จำเป็นสำหรับคอมไพเลอร์โดยเฉพาะ
หากคอมไพเลอร์รองรับสถาปัตยกรรมหลายรายการ Bazel จะต้องกำหนดค่า แยกกัน
CcToolchainConfigInfo
เป็นผู้ให้บริการที่ระบุระดับ
สำหรับการกำหนดค่าลักษณะการทำงานของกฎ C++ ของ Bazel โดยค่าเริ่มต้น
Bazel กำหนดค่า CcToolchainConfigInfo
สำหรับบิลด์ของคุณโดยอัตโนมัติ แต่
จะมีตัวเลือกให้กำหนดค่าด้วยตนเอง คุณต้องมีกฎของ Starlark
ซึ่งระบุ CcToolchainConfigInfo
และคุณต้องชี้
toolchain_config
ของแอตทริบิวต์ cc_toolchain
ลงในกฎ
คุณสร้าง CcToolchainConfigInfo
ได้โดยโทร
cc_common.create_cc_toolchain_config_info()
คุณสามารถค้นหาตัวสร้าง Starlark สำหรับ Struct ทั้งหมดที่จำเป็นสำหรับกระบวนการนี้ใน
@rules_cc//cc:cc_toolchain_config_lib.bzl
เมื่อเป้าหมาย C++ เข้าสู่ช่วงการวิเคราะห์ Bazel จะเลือก
เป้าหมาย cc_toolchain
ตามไฟล์ BUILD
และรับ
CcToolchainConfigInfo
จากผู้ให้บริการเป้าหมายที่ระบุไว้ใน
cc_toolchain.toolchain_config
เป้าหมาย cc_toolchain
ส่งต่อข้อมูลนี้ไปยังเป้าหมาย C++ ผ่าน CcToolchainProvider
ตัวอย่างเช่น การดำเนินการคอมไพล์หรือลิงก์ซึ่งสร้างขึ้นโดยกฎ เช่น
cc_binary
หรือ cc_library
ต้องมีข้อมูลต่อไปนี้
- คอมไพเลอร์หรือ Linker ที่จะใช้
- แฟล็กบรรทัดคำสั่งสำหรับคอมไพเลอร์/Linker
- แฟล็กการกำหนดค่าที่ส่งผ่านตัวเลือก
--copt/--linkopt
- ตัวแปรสภาพแวดล้อม
- อาร์ติแฟกต์ที่จำเป็นในแซนด์บ็อกซ์ที่มีการดำเนินการ
ข้อมูลทั้งหมดข้างต้น ยกเว้นอาร์ติแฟกต์ที่จําเป็นในแซนด์บ็อกซ์คือ
ที่ระบุในเป้าหมาย Starlark ที่ cc_toolchain
ชี้ไป
มีการประกาศอาร์ติแฟกต์ที่จะจัดส่งไปยังแซนด์บ็อกซ์ใน cc_toolchain
เป้าหมาย เช่น คุณใช้แอตทริบิวต์ cc_toolchain.linker_files
เพื่อทำสิ่งต่อไปนี้ได้
ระบุไลบรารีไบนารีของ Linker และ Toolchain เพื่อจัดส่งไปยังแซนด์บ็อกซ์
การเลือกเครื่องมือเชน
ตรรกะการเลือก Toolchain มีหน้าที่ดังต่อไปนี้
ผู้ใช้ระบุเป้าหมาย
cc_toolchain_suite
ในไฟล์และคะแนนBUILD
Bazel ไปยังเป้าหมายโดยใช้--crosstool_top
ตัวเลือกเป้าหมาย
cc_toolchain_suite
อ้างอิง Toolchain หลายเชน ค่าของการแจ้ง--cpu
และ--compiler
จะเป็นตัวกำหนดว่าสิ่งใด เลือก Toolchains ตามค่าแฟล็ก--cpu
เท่านั้น หรือ ตามค่า--cpu | --compiler
ร่วม กระบวนการคัดเลือกเป็นไปตาม ดังต่อไปนี้:หากระบุตัวเลือก
--compiler
ไว้ Bazel จะเลือก รายการที่เกี่ยวข้องจากcc_toolchain_suite.toolchains
ด้วย--cpu | --compiler
ถ้า Bazel ไม่พบ รายการที่เกี่ยวข้องก็จะเกิดข้อผิดพลาดหากไม่ได้ระบุตัวเลือก
--compiler
ไว้ Bazel จะเลือก ข้อมูลที่เกี่ยวข้องจากcc_toolchain_suite.toolchains
ด้วยราคาเพียง--cpu
หากไม่ได้ระบุแฟล็ก Bazel จะตรวจสอบระบบโฮสต์และเลือก
--cpu
ตามผลการสืบค้น โปรดดู โค้ดกลไกการตรวจสอบ
เมื่อเลือกเครื่องมือเชนแล้ว feature
และ action_config
ที่เกี่ยวข้อง
ในกฎของ Starlark จะควบคุมการกำหนดค่าบิลด์ (ซึ่งก็คือ
รายการที่อธิบายภายหลัง) ข้อความเหล่านี้ช่วยให้สามารถติดตั้งใช้งาน
คุณลักษณะ C++ อย่างสมบูรณ์ใน Bazel โดยไม่ต้องแก้ไข
ไบนารี Bazel กฎ C++ รองรับการดำเนินการที่ไม่ซ้ำหลายรายการซึ่งจัดทำเป็นเอกสารโดยละเอียด
ในซอร์สโค้ด Bazel
ฟีเจอร์
ฟีเจอร์เป็นเอนทิตีที่ต้องแฟล็กบรรทัดคำสั่ง การดำเนินการ
ข้อจำกัดในสภาพแวดล้อมการดำเนินการหรือการเปลี่ยนแปลงทรัพยากร Dependency ฟีเจอร์
อาจเป็นการอนุญาตให้ไฟล์ BUILD
เลือกการกำหนดค่า
เช่น treat_warnings_as_errors
หรือโต้ตอบกับกฎ C++ และ
รวมการดำเนินการคอมไพล์ใหม่ๆ และอินพุตในการคอมไพล์ เช่น
header_modules
หรือ thin_lto
ตามหลักการแล้ว CcToolchainConfigInfo
จะมีรายการฟีเจอร์ โดยแต่ละรายการ
ประกอบด้วยกลุ่ม Flag อย่างน้อย 1 กลุ่ม โดยแต่ละกลุ่มกำหนดรายการ Flag
ที่ใช้กับการกระทำเฉพาะของ Bazel
มีการระบุจุดสนใจตามชื่อ ซึ่งทำให้สามารถแยกตัว Starlark ออกอย่างสมบูรณ์
การกำหนดค่ากฎจากรุ่น Bazel กล่าวอีกนัยหนึ่งคือ การปล่อย Bazel นั้น
ส่งผลต่อลักษณะการทำงานของการกำหนดค่า CcToolchainConfigInfo
รายการ
ไม่จำเป็นต้องใช้ฟีเจอร์ใหม่
ฟีเจอร์จะเปิดใช้ด้วยวิธีใดวิธีหนึ่งต่อไปนี้
- ตั้งค่าช่อง
enabled
ของฟีเจอร์เป็นtrue
- Bazel หรือเจ้าของกฎเปิดใช้อย่างชัดแจ้ง
- ผู้ใช้เปิดใช้ผ่านตัวเลือก
--feature
Bazel หรือกฎfeatures
ฟีเจอร์สามารถมีการพึ่งพากัน ขึ้นอยู่กับแฟล็กบรรทัดคำสั่ง ไฟล์ BUILD
การตั้งค่า และตัวแปรอื่นๆ
ความสัมพันธ์ของฟีเจอร์
การขึ้นต่อกันมักจะจัดการโดยตรงกับ Bazel โดยเพียงแค่บังคับใช้ ข้อกำหนดและจัดการข้อขัดแย้งตามลักษณะของฟีเจอร์ ที่กำหนดไว้ในบิลด์ ข้อกำหนดของเครื่องมือเชนช่วยให้ ข้อจำกัดสำหรับการใช้ภายในกฎของ Starlark ที่ควบคุมคุณลักษณะโดยตรง การสนับสนุนและการขยาย ได้แก่
ข้อจำกัด | คำอธิบาย |
requires = [ feature_set (features = [ 'feature-name-1', 'feature-name-2' ]), ] |
ระดับฟีเจอร์ ระบบจะรองรับฟีเจอร์นี้เมื่อจำเป็นเท่านั้น
เปิดใช้งานอยู่ ตัวอย่างเช่น เมื่อฟีเจอร์หนึ่งได้รับการสนับสนุนเฉพาะใน
โหมดบิลด์บางโหมด (opt , dbg หรือ
fastbuild ) หาก "requires" มี "feature_set" หลายรายการ
ระบบจะรองรับฟีเจอร์นี้หากมีคุณสมบัติตรงตาม "feature_set"
(เมื่อเปิดใช้ฟีเจอร์ที่ระบุทั้งหมด)
|
implies = ['feature'] |
ระดับฟีเจอร์ ฟีเจอร์นี้บอกเป็นนัยถึงฟีเจอร์ที่ระบุ การเปิดใช้ฟีเจอร์จะเป็นการเปิดใช้ฟีเจอร์ทั้งหมดโดยปริยายโดยปริยาย (กล่าวคือ ทำงานซ้ำๆ) นอกจากนี้ ยังช่วยให้สามารถแยกคำนวณการทำงานส่วนย่อยที่พบได้ทั่วไปจาก ชุดฟีเจอร์ เช่น ส่วนประกอบทั่วไปของน้ำยาฆ่าเชื้อ โดยนัย ไม่สามารถปิดใช้งานฟีเจอร์ได้ |
provides = ['feature'] |
ระดับฟีเจอร์ ระบุว่าฟีเจอร์นี้เป็นหนึ่งในหลายรายการ
คุณลักษณะสำรองพิเศษ เช่น สารฆ่าเชื้อทั้งหมดอาจ
ระบุ ซึ่งจะช่วยปรับปรุงการจัดการข้อผิดพลาดด้วยการแสดงทางเลือกต่างๆ หากผู้ใช้ถามว่า สำหรับฟีเจอร์ที่ใช้แยกกัน 2 อย่างขึ้นไปได้ในคราวเดียว |
with_features = [ with_feature_set( features = ['feature-1'], not_features = ['feature-2'], ), ] |
ระดับชุดการแจ้งว่าไม่เหมาะสม ฟีเจอร์สามารถระบุชุดการตั้งค่าสถานะหลายชุดที่มีหลายชุดได้
เมื่อระบุ with_features ชุดธงจะขยายเท่านั้น
ลงในคำสั่งบิลด์หากมี with_feature_set อย่างน้อย 1 รายการ
ฟีเจอร์ทั้งหมดใน features ที่ระบุ
เปิดใช้งานอยู่ และฟีเจอร์ทั้งหมดที่ระบุใน not_features
ตั้งค่าแล้ว
หากไม่ได้ระบุ with_features ชุดธงจะเป็น
ใช้โดยไม่มีเงื่อนไขสำหรับการดำเนินการทั้งหมดที่ระบุ
|
การทำงาน
การดำเนินการมีความยืดหยุ่นในการปรับเปลี่ยนสถานการณ์ภายใต้
การดำเนินการที่จะดำเนินการโดยไม่คาดเดาว่าการดำเนินการนั้นจะทำงานอย่างไร CANNOT TRANSLATE
action_config
จะระบุไบนารีของเครื่องมือที่การดำเนินการทำ ขณะที่
feature
ระบุการกำหนดค่า (แฟล็ก) ที่กำหนดวิธีการที่เครื่องมือดังกล่าว
จะทำงานเมื่อมีการเรียกใช้การดำเนินการ
ฟีเจอร์ของการดําเนินการอ้างอิงเพื่อส่งสัญญาณการดําเนินการของ Bazel
เนื่องจากการกระทำสามารถปรับเปลี่ยนกราฟการทำงานของ Bazel ได้
ผู้ให้บริการ CcToolchainConfigInfo
รายมีการดำเนินการที่มีแฟล็กและเครื่องมือ
ที่เกี่ยวข้อง เช่น c++-compile
มีการกำหนดธงให้กับการดำเนินการแต่ละรายการ
โดยการเชื่อมโยงพวกเขากับฟีเจอร์
ชื่อการกระทำแต่ละชื่อแสดงถึงการกระทำประเภทเดียวที่ดำเนินการโดย Bazel เช่น
การคอมไพล์หรือการลิงก์ อย่างไรก็ตาม มีความสัมพันธ์แบบหลายคนต่อหนึ่ง
การดำเนินการและประเภทการดำเนินการ Bazel โดยที่ประเภทการดำเนินการของ Bazel นั้นหมายถึงคลาส Java
ที่ใช้การดำเนินการ (เช่น CppCompileAction
) โดยเฉพาะอย่างยิ่ง ฟิลด์
"การดำเนินการของแอสเซมเมอร์" และ "การดำเนินการของคอมไพเลอร์" ในตารางด้านล่างคือ
CppCompileAction
ขณะที่การทำงานของลิงก์คือ CppLinkAction
การดำเนินการต่างๆ ของตัวประกอบ
การดำเนินการ | คำอธิบาย |
preprocess-assemble
|
ประกอบพร้อมการประมวลผลล่วงหน้า โดยปกติมีไว้สำหรับ .S ไฟล์
|
assemble
|
ประกอบเองโดยไม่ประมวลผลล่วงหน้า โดยปกติมีไว้สำหรับ .s ไฟล์
|
การทำงานของคอมไพเลอร์
การดำเนินการ | คำอธิบาย |
cc-flags-make-variable
|
เผยแพร่ CC_FLAGS ไปยัง Genrule
|
c-compile
|
คอมไพล์เป็น C |
c++-compile
|
คอมไพล์เป็น C++ |
c++-header-parsing
|
เรียกใช้โปรแกรมแยกวิเคราะห์ของคอมไพเลอร์ในไฟล์ส่วนหัวเพื่อให้แน่ใจว่าส่วนหัว จะเกิดขึ้นได้ด้วยตัวเอง เพราะจะทำให้เกิดข้อผิดพลาดในการคอมไพล์ได้ มีผล กับ Toolchain ที่รองรับโมดูลเท่านั้น |
การดำเนินของการลิงก์
การดำเนินการ | คำอธิบาย |
c++-link-dynamic-library
|
ลิงก์ไลบรารีที่แชร์ซึ่งมีทรัพยากร Dependency ทั้งหมด |
c++-link-nodeps-dynamic-library
|
ลิงก์ไลบรารีที่ใช้ร่วมกันซึ่งมีแหล่งที่มา cc_library รายการเท่านั้น
|
c++-link-executable
|
ลิงก์ไลบรารีที่พร้อมใช้งานขั้นสุดท้าย |
การดำเนินการ AR
การดำเนินการ AR รวมไฟล์ออบเจ็กต์ลงในไลบรารีที่เก็บถาวร (.a
ไฟล์) ผ่าน ar
และเข้ารหัสความหมายบางอย่างไว้ในชื่อ
การดำเนินการ | คำอธิบาย |
c++-link-static-library
|
สร้างไลบรารีแบบคงที่ (ที่เก็บถาวร) |
การดำเนินการ LTO
การดำเนินการ | คำอธิบาย |
lto-backend
|
การดำเนินการ ThinLTO คอมไพล์บิตโค้ดเป็นออบเจ็กต์ดั้งเดิม |
lto-index
|
การดำเนินการ ThinLTO ที่สร้างดัชนีทั่วโลก |
การใช้ action_config
action_config
เป็นโครงสร้าง Starlark ที่อธิบาย Bazel
การทำงานโดยระบุเครื่องมือ (ไบนารี) ที่จะเรียกใช้ระหว่างการดำเนินการและชุดของ
สถานะที่กำหนดโดยฟีเจอร์ แฟล็กเหล่านี้จะใช้ข้อจำกัดกับแท็ก
ตัวสร้าง action_config()
มีพารามิเตอร์ต่อไปนี้:
แอตทริบิวต์ | คำอธิบาย |
action_name
|
การกระทำของ Bazel ที่สอดคล้องกับการดำเนินการนี้ Bazel ใช้แอตทริบิวต์นี้เพื่อสำรวจเครื่องมือและการดำเนินการตามการดำเนินการ |
tools
|
ไฟล์ปฏิบัติการที่จะเรียกใช้ เครื่องมือที่ใช้กับการดำเนินการจะเป็น เครื่องมือแรกในรายการที่มีชุดฟีเจอร์ที่ตรงกับฟีเจอร์ การกำหนดค่า ต้องระบุค่าเริ่มต้น |
flag_sets
|
รายการแฟล็กที่ใช้กับกลุ่มการดำเนินการ เหมือนกับ |
env_sets
|
รายการข้อจำกัดของสภาพแวดล้อมที่ใช้กับกลุ่มการดำเนินการ เหมือนกับสำหรับฟีเจอร์ |
action_config
สามารถกำหนดให้ใช้และกล่าวเป็นนัยถึงฟีเจอร์อื่นๆ และ
action_config
ตามที่
ความสัมพันธ์เกี่ยวกับฟีเจอร์ที่อธิบายก่อนหน้านี้ ลักษณะการทำงานนี้
นั้นคล้ายกับคุณลักษณะ
แอตทริบิวต์ 2 รายการสุดท้ายซ้ำซ้อนกับแอตทริบิวต์ที่เกี่ยวข้องใน
และรวมไว้เนื่องจากการดำเนินการของ Bazel บางกรณีจำเป็นต้องมีการแจ้งว่าไม่เหมาะสม หรือ
โดยมีเป้าหมายเพื่อหลีกเลี่ยง action_config
+feature
ที่ไม่จำเป็น
คู่ โดยปกติแล้ว การแชร์ฟีเจอร์เดียวในหลายๆ action_config
แนะนำ
คุณไม่สามารถกำหนด action_config
มากกว่า 1 รายการด้วย action_name
เดียวกัน
ภายในเครื่องมือเดียวกัน วิธีนี้จะป้องกันความกำกวมในเส้นทางเครื่องมือ
และบังคับใช้เจตนารมณ์เบื้องหลัง action_config
ซึ่งก็คือคุณสมบัติของการดำเนินการ
อธิบายไว้อย่างชัดเจนในที่เดียวใน Toolchain
การใช้เครื่องมือสร้างเครื่องมือ
action_config
สามารถระบุชุดเครื่องมือผ่านพารามิเตอร์ tools
ตัวสร้าง tool()
จะรับพารามิเตอร์ต่อไปนี้
ฟิลด์ | คำอธิบาย |
tool_path
|
เส้นทางไปยังเครื่องมือที่เป็นปัญหา (สัมพันธ์กับตำแหน่งปัจจุบัน) |
with_features
|
รายการชุดฟีเจอร์ที่คุณต้องทำตามอย่างน้อย 1 รายการ ในการใช้เครื่องมือ |
สำหรับ action_config
หนึ่งๆ ระบบจะใช้ tool
เพียงรายการเดียว
เส้นทางเครื่องมือและข้อกำหนดการดำเนินการกับการดำเนินการของ Bazel เลือกเครื่องมือแล้ว
โดยทำซ้ำผ่านแอตทริบิวต์ tools
ใน action_config
จนกว่าจะใช้เครื่องมือ
ที่มีชุด with_feature
ตรงกับการกำหนดค่าฟีเจอร์
(ดูความสัมพันธ์เกี่ยวกับฟีเจอร์ก่อนหน้าในหน้านี้
) คุณควรสิ้นสุดรายการเครื่องมือด้วยค่าเริ่มต้น
ที่สอดคล้องกับการกำหนดค่าฟีเจอร์ที่ว่างเปล่า
ตัวอย่างการใช้
ฟีเจอร์และการทำงานสามารถใช้งานร่วมกับการดำเนินการของ Bazel ได้
โดยใช้ความหมายข้ามแพลตฟอร์มที่หลากหลาย ตัวอย่างเช่น เปิดใช้การแก้ไขข้อบกพร่องในการสร้างสัญลักษณ์
macOS กำหนดให้สร้างสัญลักษณ์ในการดำเนินการคอมไพล์ จากนั้นเรียกใช้
เครื่องมือพิเศษในระหว่างการดำเนินการลิงก์เพื่อสร้างที่เก็บถาวรของ DS ที่บีบอัด
จากนั้นคลายการบีบอัดไฟล์ที่เก็บถาวรนั้นเพื่อสร้าง Bundle แอปพลิเคชันและ .plist
ที่ใช้ได้ด้วย Xcode
Bazel ใช้วิธีการต่อไปนี้
unbundle-debuginfo
เป็นการกระทำของ Bazel:
load("@rules_cc//cc:defs.bzl", "ACTION_NAMES")
action_configs = [
action_config (
config_name = ACTION_NAMES.cpp_link_executable,
action_name = ACTION_NAMES.cpp_link_executable,
tools = [
tool(
with_features = [
with_feature(features=["generate-debug-symbols"]),
],
tool_path = "toolchain/mac/ld-with-dsym-packaging",
),
tool (tool_path = "toolchain/mac/ld"),
],
),
]
features = [
feature(
name = "generate-debug-symbols",
flag_sets = [
flag_set (
actions = [
ACTION_NAMES.c_compile,
ACTION_NAMES.cpp_compile
],
flag_groups = [
flag_group(
flags = ["-g"],
),
],
)
],
implies = ["unbundle-debuginfo"],
),
]
คุณลักษณะเดียวกันนี้สามารถใช้ได้แตกต่างกันโดยสิ้นเชิงสำหรับ Linux ซึ่งใช้
fission
หรือสำหรับ Windows ที่สร้าง .pdb
ไฟล์ ตัวอย่างเช่น พารามิเตอร์
การใช้งานสำหรับการสร้างสัญลักษณ์การแก้ไขข้อบกพร่องแบบ fission
อาจมีลักษณะดังนี้
ดังต่อไปนี้:
load("@rules_cc//cc:defs.bzl", "ACTION_NAMES")
action_configs = [
action_config (
name = ACTION_NAMES.cpp_compile,
tools = [
tool(
tool_path = "toolchain/bin/gcc",
),
],
),
]
features = [
feature (
name = "generate-debug-symbols",
requires = [with_feature_set(features = ["dbg"])],
flag_sets = [
flag_set(
actions = [ACTION_NAMES.cpp_compile],
flag_groups = [
flag_group(
flags = ["-gsplit-dwarf"],
),
],
),
flag_set(
actions = [ACTION_NAMES.cpp_link_executable],
flag_groups = [
flag_group(
flags = ["-Wl", "--gdb-index"],
),
],
),
],
),
]
รายงานกลุ่ม
CcToolchainConfigInfo
ให้คุณรวมกลุ่มแฟล็กไว้ในกลุ่มที่แสดง
วัตถุประสงค์ที่เฉพาะเจาะจง คุณสามารถระบุแฟล็กภายในโดยใช้ตัวแปรที่กำหนดไว้ล่วงหน้า
ภายในค่า Flag ซึ่งคอมไพเลอร์จะขยายเมื่อเพิ่ม Flag ลงใน
คำสั่งบิลด์ เช่น
flag_group (
flags = ["%{output_file_path}"],
)
ในกรณีนี้ เนื้อหาของแฟล็กจะแทนที่ด้วยเส้นทางไฟล์เอาต์พุต ของการดำเนินการ
ระบบจะขยายกลุ่มแฟล็กไปยังคำสั่งบิลด์ตามลำดับที่ปรากฏ ไว้ในรายการ ซึ่งได้แก่ จากบนลงล่าง ซ้ายไปขวา
สำหรับแฟล็กที่ต้องทำซ้ำด้วยค่าอื่นเมื่อเพิ่มลงในบิลด์
กลุ่มแฟล็กจะทำซ้ำตัวแปรประเภท list
ได้ ตัวอย่างเช่น พารามิเตอร์
ตัวแปร include_path
ของประเภท list
:
flag_group (
iterate_over = "include_paths",
flags = ["-I%{include_paths}"],
)
ขยายเป็น -I<path>
สำหรับองค์ประกอบเส้นทางแต่ละรายการในรายการ include_paths
ทั้งหมด
Flag (หรือ flag_group
) ในเนื้อหาของการประกาศกลุ่ม Flag จะขยายออกเป็น
หน่วย เช่น
flag_group (
iterate_over = "include_paths",
flags = ["-I", "%{include_paths}"],
)
ขยายเป็น -I <path>
สำหรับองค์ประกอบเส้นทางแต่ละรายการในรายการ include_paths
ตัวแปร 1 ตัวแสดงซ้ำได้หลายครั้ง เช่น
flag_group (
iterate_over = "include_paths",
flags = ["-iprefix=%{include_paths}", "-isystem=%{include_paths}"],
)
ขยายเป็น
-iprefix=<inc0> -isystem=<inc0> -iprefix=<inc1> -isystem=<inc1>
ตัวแปรสามารถสอดคล้องกับโครงสร้างที่เข้าถึงได้โดยใช้เครื่องหมายจุด สำหรับ ตัวอย่าง:
flag_group (
flags = ["-l%{libraries_to_link.name}"],
)
โครงสร้างสามารถซ้อนกันได้และอาจมีลำดับ เพื่อป้องกันไม่ให้ชื่อขัดแย้งกัน และเพื่อความชัดเจน คุณต้องระบุเส้นทางแบบเต็มผ่านช่องต่างๆ สำหรับ ตัวอย่าง:
flag_group (
iterate_over = "libraries_to_link",
flag_groups = [
flag_group (
iterate_over = "libraries_to_link.shared_libraries",
flags = ["-l%{libraries_to_link.shared_libraries.name}"],
),
],
)
การขยายแบบมีเงื่อนไข
กลุ่มแฟล็กจะรองรับการขยายแบบมีเงื่อนไขตามที่มีอยู่
หรือฟิลด์โดยใช้ expand_if_available
, expand_if_not_available
แอตทริบิวต์ expand_if_true
, expand_if_false
หรือ expand_if_equal
เช่น
flag_group (
iterate_over = "libraries_to_link",
flag_groups = [
flag_group (
iterate_over = "libraries_to_link.shared_libraries",
flag_groups = [
flag_group (
expand_if_available = "libraries_to_link.shared_libraries.is_whole_archive",
flags = ["--whole_archive"],
),
flag_group (
flags = ["-l%{libraries_to_link.shared_libraries.name}"],
),
flag_group (
expand_if_available = "libraries_to_link.shared_libraries.is_whole_archive",
flags = ["--no_whole_archive"],
),
],
),
],
)
ข้อมูลอ้างอิง CcToolchainConfigInfo
ส่วนนี้จะแสดงข้อมูลอ้างอิงของตัวแปรบิลด์ ฟีเจอร์ และอื่นๆ ข้อมูลที่จำเป็นต่อการกำหนดค่ากฎ C++ ได้สำเร็จ
ตัวแปรบิลด์ CcToolchainConfigInfo
ต่อไปนี้เป็นการอ้างอิงตัวแปรบิลด์ CcToolchainConfigInfo
ตัวแปร | การดำเนินการ | คำอธิบาย |
source_file
|
คอมไพล์ | ไฟล์ต้นฉบับที่จะคอมไพล์ |
input_file
|
แถบ | อาร์ติแฟกต์ที่จะตัด |
output_file
|
คอมไพล์ | ผลลัพธ์การคอมไพล์ |
output_assembly_file
|
คอมไพล์ | ไฟล์การประกอบที่ดำเนินการแล้ว มีผลเฉพาะเมื่อมีการ
การดำเนินการ compile จะแสดงข้อความประกอบ โดยปกติเมื่อใช้
การแจ้งว่าไม่เหมาะสม --save_temps เนื้อหาจะเหมือนกับของ
output_file
|
output_preprocess_file
|
คอมไพล์ | เอาต์พุตที่ประมวลผลล่วงหน้า ใช้กับคอมไพล์เท่านั้น
การดำเนินการที่ประมวลผลไฟล์ต้นฉบับล่วงหน้าเท่านั้น โดยทั่วไปเมื่อใช้
แฟล็ก --save_temps เนื้อหาจะเหมือนกับของ
output_file
|
includes
|
คอมไพล์ | ลำดับของไฟล์ที่คอมไพเลอร์จะต้อง ในซอร์สที่คอมไพล์แล้วโดยไม่มีเงื่อนไข |
include_paths
|
คอมไพล์ | ไดเรกทอรีลำดับที่คอมไพเลอร์
การค้นหาส่วนหัวที่รวมโดยใช้ #include<foo.h>
และ #include "foo.h"
|
quote_include_paths
|
คอมไพล์ | ลำดับของ -iquote ได้แก่
ไดเรกทอรีที่คอมไพเลอร์ค้นหาส่วนหัวโดยใช้
#include "foo.h"
|
system_include_paths
|
คอมไพล์ | ลำดับของ -isystem ได้แก่
ไดเรกทอรีที่คอมไพเลอร์ค้นหาส่วนหัวโดยใช้
#include <foo.h>
|
dependency_file
|
คอมไพล์ | ไฟล์ทรัพยากร Dependency ของ .d ที่คอมไพเลอร์สร้างขึ้น
|
preprocessor_defines
|
คอมไพล์ | ลําดับของ defines เช่น --DDEBUG
|
pic
|
คอมไพล์ | คอมไพล์เอาต์พุตเป็นโค้ดที่ไม่อิงตามตำแหน่ง |
gcov_gcno_file
|
คอมไพล์ | ไฟล์การครอบคลุมของ gcov
|
per_object_debug_info_file
|
คอมไพล์ | ไฟล์ข้อมูลการแก้ไขข้อบกพร่องต่อออบเจ็กต์ (.dwp )
|
stripotps
|
แถบ | ลำดับของ stripopts
|
legacy_compile_flags
|
คอมไพล์ | ลำดับการแจ้งจากแบบเดิม
CROSSTOOL ช่อง เช่น compiler_flag
optional_compiler_flag , cxx_flag และ
optional_cxx_flag
|
user_compile_flags
|
คอมไพล์ | ลำดับของการแจ้งจาก
แอตทริบิวต์กฎ copt หรือ --copt
แฟล็ก --cxxopt และ --conlyopt
|
unfiltered_compile_flags
|
คอมไพล์ | ลำดับการแจ้งจาก
unfiltered_cxx_flag ช่อง CROSSTOOL เดิมหรือฟิลด์
unfiltered_compile_flags รายการเหล่านี้ไม่ได้กรองตาม
แอตทริบิวต์กฎ nocopts
|
sysroot
|
sysroot
|
|
runtime_library_search_directories
|
ลิงก์ | รายการในเส้นทางการค้นหาแบบรันไทม์ของ Linker (โดยปกติ
ที่ตั้งไว้ด้วยธง -rpath )
|
library_search_directories
|
ลิงก์ | รายการในเส้นทางการค้นหา Linker (โดยปกติจะตั้งค่าด้วย
ธง-L )
|
libraries_to_link
|
ลิงก์ | แฟล็กที่ให้ไฟล์เพื่อลิงก์เป็นอินพุตในการเรียกใช้ Linker |
def_file_path
|
ลิงก์ | ตำแหน่งของไฟล์ def ที่ใช้ใน Windows ที่มี MSVC |
linker_param_file
|
ลิงก์ | ตำแหน่งของไฟล์พารามิเตอร์ Linker ที่สร้างโดย bazel ไปยัง เกินขีดจำกัดของความยาวของบรรทัดคำสั่ง |
output_execpath
|
ลิงก์ | ยกเว้นเอาต์พุตของ Linker |
generate_interface_library
|
ลิงก์ | "yes" หรือ "no" ขึ้นอยู่กับว่าไลบรารีอินเทอร์เฟซควร
ได้
|
interface_library_builder_path
|
ลิงก์ | เส้นทางไปยังเครื่องมือสร้างไลบรารีอินเทอร์เฟซ |
interface_library_input_path
|
ลิงก์ | อินพุตสำหรับเครื่องมือสร้างไลบรารีอินเทอร์เฟซ ifso
|
interface_library_output_path
|
ลิงก์ | เส้นทางที่ใช้สร้างไลบรารีอินเทอร์เฟซโดยใช้เครื่องมือสร้าง ifso
|
legacy_link_flags
|
ลิงก์ | แฟล็ก Linker มาจากช่อง CROSSTOOL เดิม
|
user_link_flags
|
ลิงก์ | แฟล็ก Linker มาจาก --linkopt
หรือ linkopts
|
symbol_counts_output
|
ลิงก์ | เส้นทางที่จะเขียนจำนวนสัญลักษณ์ |
linkstamp_paths
|
ลิงก์ | ตัวแปรบิลด์ที่มีเส้นทางลิงก์สแตมป์ |
force_pic
|
ลิงก์ | การมีอยู่ของตัวแปรนี้บ่งชี้ว่าโค้ด PIC/PIE ควร ขึ้น (มีการส่งตัวเลือก Bazel "--force_pic") |
strip_debug_symbols
|
ลิงก์ | การมีอยู่ของตัวแปรนี้บ่งชี้ว่าการแก้ไขข้อบกพร่อง สัญลักษณ์ควรถูกตัดออก |
is_cc_test
|
ลิงก์ | เป็นจริงเมื่อการดำเนินการปัจจุบันเป็น cc_test
การดำเนินการลิงก์ หรือเป็นเท็จ
|
is_using_fission
|
คอมไพล์, ลิงก์ | การมีอยู่ของตัวแปรนี้บ่งชี้ว่าฟิชชัน (ข้อมูลการแก้ไขข้อบกพร่องต่อออบเจ็กต์)
แล้ว ข้อมูลการแก้ไขข้อบกพร่องจะอยู่ในไฟล์ .dwo แทน
จาก .o ไฟล์ และคอมไพเลอร์และ Linker จำเป็นต้องทราบเรื่องนี้
|
fdo_instrument_path
|
คอมไพล์, ลิงก์ | เส้นทางไปยังไดเรกทอรีที่เก็บโปรไฟล์การใช้เครื่องมือ FDO |
fdo_profile_path
|
คอมไพล์ | เส้นทางไปยังโปรไฟล์ FDO |
fdo_prefetch_hints_path
|
คอมไพล์ | เส้นทางไปยังโปรไฟล์ที่ดึงข้อมูลแคชล่วงหน้า |
csfdo_instrument_path
|
คอมไพล์, ลิงก์ | เส้นทางไปยังไดเรกทอรีที่เก็บ FDO ที่ละเอียดอ่อนตามบริบท โปรไฟล์การวัดคุม |
สถานที่ที่รู้จักกันดี
ต่อไปนี้เป็นข้อมูลอ้างอิงเกี่ยวกับฟีเจอร์และการเปิดใช้งาน
ฟีเจอร์ | เอกสารประกอบ |
opt | dbg | fastbuild
|
เปิดใช้โดยค่าเริ่มต้นตามโหมดการคอมไพล์ |
static_linking_mode | dynamic_linking_mode
|
เปิดใช้โดยค่าเริ่มต้นตามโหมดการลิงก์ |
per_object_debug_info
|
เปิดใช้หากระบุฟีเจอร์ supports_fission และ
เปิดใช้งานอยู่ และมีการระบุโหมดการคอมไพล์ปัจจุบันใน
การแจ้งว่าไม่เหมาะสม --fission
|
supports_start_end_lib
|
หากเปิดใช้ (และตัวเลือก --start_end_lib ตั้งค่าไว้) Bazel
จะไม่เชื่อมโยงกับไลบรารีแบบคงที่ แต่จะใช้
--start-lib/--end-lib ตัวเลือก Linker เพื่อลิงก์กับวัตถุ
โดยตรง วิธีนี้จะช่วยให้สร้างได้เร็วขึ้นเนื่องจาก Bazel ไม่จำเป็นต้องสร้าง
และไลบรารีแบบคงที่
|
supports_interface_shared_libraries
|
หากเปิดใช้ (และตัวเลือก --interface_shared_objects คือ
) Bazel จะลิงก์เป้าหมายที่มีการตั้งค่า linkstatic เป็น
เท็จ (ค่าเริ่มต้นคือ cc_test ) เทียบกับอินเทอร์เฟซที่แชร์
ห้องสมุด ซึ่งจะทำให้เพิ่มการลิงก์ใหม่ได้เร็วขึ้น
|
supports_dynamic_linker
|
หากเปิดใช้ กฎ C++ จะทราบว่า Toolchain สร้างการแชร์ได้ ห้องสมุด |
static_link_cpp_runtimes
|
หากเปิดใช้ Bazel จะลิงก์รันไทม์ของ C++ แบบคงที่ในการลิงก์แบบคงที่
และแบบไดนามิกในโหมดการลิงก์แบบไดนามิก สิ่งประดิษฐ์
ที่ระบุไว้ใน cc_toolchain.static_runtime_lib หรือ
แอตทริบิวต์ cc_toolchain.dynamic_runtime_lib (ขึ้นอยู่กับ
โหมดการลิงก์) จะได้รับการเพิ่มลงในการดำเนินการลิงก์
|
supports_pic
|
หากเปิดใช้ Toolchain จะทราบว่าใช้ออบเจ็กต์ PIC สำหรับไลบรารีแบบไดนามิก ตัวแปร "pic" จะปรากฏเมื่อใดก็ตามที่จำเป็นต้องคอมไพล์ PIC หากไม่ได้เปิดใช้ โดยค่าเริ่มต้น และมีการส่ง "--force_pic" แล้ว Bazel จะส่งคำขอ "supports_pic" และ ตรวจสอบว่าได้เปิดใช้ฟีเจอร์แล้ว หากฟีเจอร์หายไปหรือไม่ได้ เปิดใช้ "--force_pic" ไม่ได้ |
static_linking_mode | dynamic_linking_mode
|
เปิดใช้โดยค่าเริ่มต้นตามโหมดการลิงก์ |
no_legacy_features
|
ป้องกันไม่ให้ Bazel เพิ่มฟีเจอร์เดิมลงใน C++ เมื่อปรากฏ ดูรายการทั้งหมดของ ด้านล่าง |
ตรรกะการแพตช์ฟีเจอร์เดิม
Bazel นำการเปลี่ยนแปลงต่อไปนี้ไปใช้กับฟีเจอร์เครื่องมือเชนสำหรับรายการย้อนหลัง ความเข้ากันได้:
- ย้ายฟีเจอร์
legacy_compile_flags
ไปที่ด้านบนสุดของ Toolchain - ย้ายฟีเจอร์
default_compile_flags
ไปที่ด้านบนสุดของ Toolchain - เพิ่มฟีเจอร์
dependency_file
(หากไม่มี) ที่ด้านบนของ Toolchain - เพิ่มฟีเจอร์
pic
(หากไม่มี) ที่ด้านบนของ Toolchain - เพิ่มฟีเจอร์
per_object_debug_info
(หากไม่มี) ที่ด้านบนของ Toolchain - เพิ่มฟีเจอร์
preprocessor_defines
(หากไม่มี) ที่ด้านบนของ Toolchain - เพิ่มฟีเจอร์
includes
(หากไม่มี) ที่ด้านบนของ Toolchain - เพิ่มฟีเจอร์
include_paths
(หากไม่มี) ที่ด้านบนของ Toolchain - เพิ่มฟีเจอร์
fdo_instrument
(หากไม่มี) ที่ด้านบนของ Toolchain - เพิ่มฟีเจอร์
fdo_optimize
(หากไม่มี) ที่ด้านบนของ Toolchain - เพิ่มฟีเจอร์
cs_fdo_instrument
(หากไม่มี) ที่ด้านบนของ Toolchain - เพิ่มฟีเจอร์
cs_fdo_optimize
(หากไม่มี) ที่ด้านบนของ Toolchain - เพิ่มฟีเจอร์
fdo_prefetch_hints
(หากไม่มี) ที่ด้านบนของ Toolchain - เพิ่มฟีเจอร์
autofdo
(หากไม่มี) ที่ด้านบนของ Toolchain - เพิ่มฟีเจอร์
build_interface_libraries
(หากไม่มี) ที่ด้านบนของ Toolchain - เพิ่มฟีเจอร์
dynamic_library_linker_tool
(หากไม่มี) ที่ด้านบนของ Toolchain - เพิ่มฟีเจอร์
symbol_counts
(หากไม่มี) ที่ด้านบนของ Toolchain - เพิ่มฟีเจอร์
shared_flag
(หากไม่มี) ที่ด้านบนของ Toolchain - เพิ่มฟีเจอร์
linkstamps
(หากไม่มี) ที่ด้านบนของ Toolchain - เพิ่มฟีเจอร์
output_execpath_flags
(หากไม่มี) ที่ด้านบนของ Toolchain - เพิ่มฟีเจอร์
runtime_library_search_directories
(หากไม่มี) ที่ด้านบนของ Toolchain - เพิ่มฟีเจอร์
library_search_directories
(หากไม่มี) ที่ด้านบนของ Toolchain - เพิ่มฟีเจอร์
archiver_flags
(หากไม่มี) ที่ด้านบนของ Toolchain - เพิ่มฟีเจอร์
libraries_to_link
(หากไม่มี) ที่ด้านบนของ Toolchain - เพิ่มฟีเจอร์
force_pic_flags
(หากไม่มี) ที่ด้านบนของ Toolchain - เพิ่มฟีเจอร์
user_link_flags
(หากไม่มี) ที่ด้านบนของ Toolchain - เพิ่มฟีเจอร์
legacy_link_flags
(หากไม่มี) ที่ด้านบนของ Toolchain - เพิ่มฟีเจอร์
static_libgcc
(หากไม่มี) ที่ด้านบนของ Toolchain - เพิ่มฟีเจอร์
fission_support
(หากไม่มี) ที่ด้านบนของ Toolchain - เพิ่มฟีเจอร์
strip_debug_symbols
(หากไม่มี) ที่ด้านบนของ Toolchain - เพิ่มฟีเจอร์
coverage
(หากไม่มี) ที่ด้านบนของ Toolchain - เพิ่มฟีเจอร์
llvm_coverage_map_format
(หากไม่มี) ที่ด้านบนของ Toolchain - เพิ่มฟีเจอร์
gcc_coverage_map_format
(หากไม่มี) ที่ด้านบนของ Toolchain - เพิ่มฟีเจอร์
fully_static_link
(หากไม่มี) ที่ด้านล่างของ Toolchain - เพิ่มฟีเจอร์
user_compile_flags
(หากไม่มี) ที่ด้านล่างของ Toolchain - เพิ่มฟีเจอร์
sysroot
(หากไม่มี) ที่ด้านล่างของ Toolchain - เพิ่มฟีเจอร์
unfiltered_compile_flags
(หากไม่มี) ที่ด้านล่างของ Toolchain - เพิ่มฟีเจอร์
linker_param_file
(หากไม่มี) ที่ด้านล่างของ Toolchain - เพิ่มฟีเจอร์
compiler_input_flags
(หากไม่มี) ที่ด้านล่างของ Toolchain - เพิ่มฟีเจอร์
compiler_output_flags
(หากไม่มี) ที่ด้านล่างของ Toolchain
เราจะพูดถึงฟีเจอร์ต่างๆ จำนวนมาก แผนการคือการกำจัดไฟล์ทิ้งเพียงครั้งเดียว
เครื่องมือข้ามใน Starlark คือ
เสร็จสิ้น สำหรับผู้ที่ต้องการอ่าน ดูการใช้งานได้ใน
CppActionConfigs,
และสำหรับ Toolchain เวอร์ชันที่ใช้งานจริง ให้พิจารณาเพิ่ม no_legacy_features
เพื่อให้
เชนเครื่องมือแบบสแตนด์อโลนมากขึ้น