ส่วนนี้จะกำหนดคำศัพท์และแนวคิดต่างๆ ที่ใช้กันทั่วไปใน ฟังก์ชันหรือกฎการสร้างหลายอย่าง
เนื้อหา
- การแยกโทเค็นของ Bourne Shell
- การขยายป้ายกำกับ
- แอตทริบิวต์ทั่วไปที่กำหนดโดยกฎการสร้างส่วนใหญ่
- แอตทริบิวต์ที่ใช้ร่วมกันในกฎการสร้างทั้งหมด
- แอตทริบิวต์ที่ใช้ร่วมกันในกฎการทดสอบทั้งหมด (*_test)
- แอตทริบิวต์ที่ใช้ร่วมกันในกฎแบบไบนารีทั้งหมด (*_binary)
- แอตทริบิวต์ที่กำหนดค่าได้
- เป้าหมายเอาต์พุตโดยนัย
การแปลงข้อมูลเป็นโทเค็นของ Bourne Shell
แอตทริบิวต์สตริงบางอย่างของกฎบางข้อจะแยกออกเป็นหลายคำ ตามกฎการแยกโทเค็นของ Bourne Shell โดยมีรายละเอียดดังนี้ ช่องว่างที่ไม่ได้อยู่ในเครื่องหมายคำพูดจะคั่นคำต่างๆ และใช้อักขระเครื่องหมายคำพูดเดี่ยวและ เครื่องหมายคำพูดคู่ รวมถึงแบ็กสแลชเพื่อป้องกัน การแยกโทเค็น
แอตทริบิวต์ที่ต้องใช้การแปลงโทเค็นนี้จะระบุไว้อย่างชัดเจนในคำจำกัดความในเอกสารนี้
  โดยปกติแล้ว แอตทริบิวต์ที่ขึ้นอยู่กับการขยายตัวแปร "Make" และการแยกโทเค็น Bourne Shell จะใช้เพื่อส่งตัวเลือกที่กำหนดเองไปยังคอมไพเลอร์และเครื่องมืออื่นๆ ตัวอย่างแอตทริบิวต์ดังกล่าว ได้แก่
  cc_library.copts และ java_library.javacopts
  การแทนที่เหล่านี้ช่วยให้ตัวแปรสตริงเดียวขยายเป็นรายการคำตัวเลือกเฉพาะการกำหนดค่าได้
การขยายป้ายกำกับ
  แอตทริบิวต์สตริงบางรายการของกฎบางข้ออาจมีการขยายป้ายกำกับ
  หากสตริงเหล่านั้นมีป้ายกำกับที่ถูกต้องเป็นสตริงย่อย เช่น //mypkg:target และป้ายกำกับนั้นเป็นข้อกำหนดเบื้องต้นที่ประกาศไว้ของกฎปัจจุบัน ระบบจะขยายป้ายกำกับเป็นเส้นทางแบบเต็มของไฟล์ที่แสดงโดยเป้าหมาย
  //mypkg:target
  ตัวอย่างแอตทริบิวต์ ได้แก่ genrule.cmd และ
  cc_binary.linkopts  รายละเอียดอาจแตกต่างกันอย่างมากในแต่ละกรณีเกี่ยวกับปัญหาต่างๆ เช่น มีการขยายป้ายกำกับที่เกี่ยวข้องหรือไม่ วิธีจัดการป้ายกำกับที่ขยายไปยังหลายไฟล์ เป็นต้น โปรดดูรายละเอียดในเอกสารประกอบแอตทริบิวต์กฎ
แอตทริบิวต์ทั่วไปที่กำหนดโดยกฎการสร้างส่วนใหญ่
ส่วนนี้อธิบายแอตทริบิวต์ที่กำหนดโดยกฎการสร้างหลายรายการ แต่ไม่ใช่ทั้งหมด
| แอตทริบิวต์ | คำอธิบาย | 
|---|---|
| data | รายการป้ายกำกับ ค่าเริ่มต้นคือ  ไฟล์ที่กฎนี้ต้องการในรันไทม์ อาจแสดงเป้าหมายของไฟล์หรือกฎ โดยทั่วไป อนุญาตเป้าหมายใดก็ได้ 
เอาต์พุตและ runfiles เริ่มต้นของเป้าหมายในแอตทริบิวต์  
กฎใหม่ควรกำหนดแอตทริบิวต์  | 
| deps | รายการป้ายกำกับ ค่าเริ่มต้นคือ  
การอ้างอิงสำหรับเป้าหมายนี้ โดยทั่วไปควรแสดงเฉพาะเป้าหมายของกฎ (แม้ว่ากฎบางข้อจะอนุญาตให้แสดงไฟล์ใน  โดยทั่วไปแล้ว กฎเฉพาะภาษาจะจำกัดเป้าหมายที่แสดงไว้ให้เฉพาะผู้ที่มีผู้ให้บริการที่เฉพาะเจาะจง 
ความหมายที่แน่นอนของสิ่งที่หมายถึงการที่เป้าหมายขึ้นอยู่กับเป้าหมายอื่นโดยใช้  
โดยส่วนใหญ่แล้วจะใช้ | 
| licenses | รายการสตริง กำหนดค่าไม่ได้
  ค่าเริ่มต้นคือ  รายการสตริงประเภทใบอนุญาตที่จะใช้กับเป้าหมายนี้ ซึ่งเป็นส่วนหนึ่งของ API การอนุญาตให้ใช้สิทธิที่เลิกใช้งานแล้วซึ่ง Bazel ไม่ได้ใช้แล้ว อย่า ใช้สิ่งนี้ | 
| srcs | รายการป้ายกำกับ ค่าเริ่มต้นคือ  
ไฟล์ที่กฎนี้ประมวลผลหรือรวมไว้ โดยทั่วไปจะแสดงรายการไฟล์โดยตรง แต่
อาจแสดงเป้าหมายของกฎ (เช่น  กฎเฉพาะภาษาอาจกำหนดให้ไฟล์ที่แสดงต้องมีส่วนขยายไฟล์ที่เฉพาะเจาะจง | 
แอตทริบิวต์ที่ใช้ร่วมกันในกฎการบิลด์ทั้งหมด
ส่วนนี้อธิบายแอตทริบิวต์ที่เพิ่มลงในกฎการสร้างทั้งหมดโดยนัย
| แอตทริบิวต์ | คำอธิบาย | 
|---|---|
| compatible_with | รายการป้ายกำกับ
  กำหนดค่าไม่ได้ ค่าเริ่มต้นคือ  รายการสภาพแวดล้อมที่สามารถสร้างเป้าหมายนี้ได้ นอกเหนือจาก สภาพแวดล้อมที่รองรับโดยค่าเริ่มต้น ซึ่งเป็นส่วนหนึ่งของระบบข้อจำกัดของ Bazel ที่ช่วยให้ผู้ใช้ประกาศได้ว่า เป้าหมายใดที่ขึ้นต่อกันได้และไม่ได้ เช่น ไบนารีที่สามารถติดตั้งใช้งานภายนอก ไม่ควรขึ้นอยู่กับไลบรารีที่มีโค้ดที่เป็นความลับของบริษัท ดูรายละเอียดได้ที่ ConstraintSemantics | 
| deprecation | สตริง กำหนดค่าไม่ได้ ค่าเริ่มต้นคือ  ข้อความแจ้งเตือนที่อธิบายซึ่งเชื่อมโยงกับเป้าหมายนี้ โดยปกติแล้วจะใช้เพื่อแจ้งให้ผู้ใช้ทราบว่าเป้าหมายล้าสมัยแล้ว หรือถูกแทนที่ด้วยกฎอื่น เป็นกฎส่วนตัวของแพ็กเกจ หรือ อาจถือว่าเป็นอันตรายด้วยเหตุผลบางประการ เราขอแนะนำให้ใส่ข้อมูลอ้างอิง (เช่น หน้าเว็บ หมายเลขข้อบกพร่อง หรือ CL การย้ายข้อมูลตัวอย่าง) เพื่อให้ทราบได้ง่ายว่าต้องทำการเปลี่ยนแปลงใดบ้างเพื่อหลีกเลี่ยงข้อความ หากมีเป้าหมายใหม่ที่ใช้แทนได้ คุณควรย้ายข้อมูลผู้ใช้ทั้งหมดของเป้าหมายเก่า 
แอตทริบิวต์นี้ไม่มีผลต่อวิธีสร้างสิ่งต่างๆ แต่
อาจส่งผลต่อเอาต์พุตการวินิจฉัยของเครื่องมือบิลด์  เครื่องมือบิลด์จะออก
คำเตือนเมื่อเป้าหมายในแพ็กเกจอื่น
ขึ้นอยู่กับกฎที่มีแอตทริบิวต์  การขึ้นต่อกันภายในแพ็กเกจจะได้รับการยกเว้นจากคำเตือนนี้ ดังนั้น เช่น การสร้างการทดสอบของกฎที่เลิกใช้งานแล้วจะไม่ พบคำเตือน หากเป้าหมายที่เลิกใช้งานแล้วขึ้นอยู่กับเป้าหมายอื่นที่เลิกใช้งานแล้ว ระบบจะไม่แสดงข้อความเตือน เมื่อผู้ใช้หยุดใช้แล้ว คุณจะนำเป้าหมายออกได้ | 
| distribs | รายการสตริง กำหนดค่าไม่ได้
  ค่าเริ่มต้นคือ  รายการสตริงของวิธีการเผยแพร่ที่จะใช้สำหรับเป้าหมายนี้ ซึ่งเป็นส่วนหนึ่งของ API การอนุญาตให้ใช้สิทธิที่เลิกใช้งานแล้วซึ่ง Bazel ไม่ได้ใช้แล้ว อย่า ใช้สิ่งนี้ | 
| exec_compatible_with | รายการป้ายกำกับ
  กำหนดค่าไม่ได้ ค่าเริ่มต้นคือ  
รายการ
 | 
| exec_properties | พจนานุกรมของสตริง ค่าเริ่มต้นคือ   พจนานุกรมของสตริงที่จะเพิ่มลงใน  หากมีคีย์ทั้งในพร็อพเพอร์ตี้ระดับแพลตฟอร์มและระดับเป้าหมาย ระบบจะนำค่ามาจากเป้าหมาย | 
| features | รายการสตริงฟีเจอร์ ค่าเริ่มต้นคือ  ฟีเจอร์คือแท็กสตริงที่เปิดหรือปิดใช้ในเป้าหมายได้ ความหมายของฟีเจอร์จะขึ้นอยู่กับกฎนั้นๆ แอตทริบิวต์  | 
| restricted_to | รายการป้ายกำกับ
  กำหนดค่าไม่ได้ ค่าเริ่มต้นคือ  รายการสภาพแวดล้อมที่สามารถสร้างเป้าหมายนี้ได้แทน สภาพแวดล้อมที่รองรับเริ่มต้น 
ซึ่งเป็นส่วนหนึ่งของระบบข้อจำกัดของ Bazel ดูรายละเอียดได้ที่
 | 
| tags | 
  รายการสตริง กำหนดค่าไม่ได้
  ค่าเริ่มต้นคือ  
  คุณใช้แท็กกับกฎใดก็ได้ แท็กในกฎการทดสอบและ
   
  Bazel จะแก้ไขลักษณะการทำงานของโค้ดแซนด์บ็อกซ์หากพบคีย์เวิร์ดต่อไปนี้
  ในแอตทริบิวต์  
 โดยทั่วไปแล้ว Tag ในการทดสอบจะใช้เพื่ออธิบายบทบาทของการทดสอบในกระบวนการ แก้ไขข้อบกพร่องและเผยแพร่ โดยปกติแล้ว แท็กจะมีประโยชน์มากที่สุดสําหรับการทดสอบ C++ และ Python ซึ่งไม่มีความสามารถในการใส่คำอธิบายประกอบรันไทม์ การใช้แท็กและองค์ประกอบขนาด ช่วยให้มีความยืดหยุ่นในการรวบรวมชุดการทดสอบตามนโยบายการเช็คอิน ของโค้ดเบส 
  Bazel จะแก้ไขลักษณะการทำงานของการทดสอบหากพบคีย์เวิร์ดต่อไปนี้ในแอตทริบิวต์  
 | 
| target_compatible_with | 
รายการป้ายกำกับ ค่าเริ่มต้นคือ  
รายการ
 เป้าหมายที่ขึ้นอยู่กับเป้าหมายที่ไม่เข้ากันโดยอ้อมจะถือว่าไม่เข้ากัน ระบบจะข้ามการสร้างและการทดสอบด้วย รายการที่ว่างเปล่า (ซึ่งเป็นค่าเริ่มต้น) หมายความว่าเป้าหมายเข้ากันได้ กับทุกแพลตฟอร์ม 
 
กฎทั้งหมดนอกเหนือจากกฎของ Workspace รองรับแอตทริบิวต์นี้
แอตทริบิวต์นี้จะไม่มีผลกับกฎบางอย่าง เช่น การระบุ  
 ดูข้อมูลเพิ่มเติมเกี่ยวกับการข้ามเป้าหมายที่ไม่รองรับได้ที่หน้าแพลตฟอร์ม | 
| testonly | บูลีน กำหนดค่าไม่ได้ ค่าเริ่มต้นคือ  
หาก  
ในทำนองเดียวกัน กฎที่ไม่ได้เป็น  
การทดสอบ ( แอตทริบิวต์นี้มีไว้เพื่อระบุว่าไม่ควรมีเป้าหมายในไบนารีที่เผยแพร่ไปยังเวอร์ชันที่ใช้งานจริง เนื่องจากมีการบังคับใช้ testonly ในเวลาบิลด์ ไม่ใช่เวลาเรียกใช้ และมีการแพร่กระจาย แบบไวรัลผ่านแผนผังการอ้างอิง จึงควรใช้ด้วยความรอบคอบ ตัวอย่างเช่น สตับและออบเจ็กต์จำลองที่มีประโยชน์สำหรับการทดสอบหน่วยอาจมีประโยชน์สำหรับการทดสอบการผสานรวมที่เกี่ยวข้องกับไบนารีเดียวกันซึ่งจะเผยแพร่ไปยังเวอร์ชันที่ใช้งานจริงด้วย ดังนั้นจึงไม่ควรทำเครื่องหมายว่า testonly ในทางกลับกัน กฎที่ เป็นอันตรายแม้เพียงแค่ลิงก์เข้าไป อาจเป็นเพราะกฎนั้น ลบล้างลักษณะการทำงานปกติโดยไม่มีเงื่อนไข ควรทำเครื่องหมายเป็น testonly อย่างแน่นอน | 
| toolchains | รายการป้ายกำกับ
  กำหนดค่าไม่ได้ ค่าเริ่มต้นคือ  
  ชุดเป้าหมายที่เป้าหมายนี้ได้รับอนุญาตให้เข้าถึงตัวแปรที่สร้าง เป้าหมายเหล่านี้เป็นอินสแตนซ์ของกฎที่ให้  
 
  โปรดทราบว่าแนวคิดนี้แตกต่างจากแนวคิดของ
    การแก้ปัญหา Toolchain
    ที่ใช้โดยการใช้งานกฎสำหรับการกำหนดค่าที่ขึ้นอยู่กับแพลตฟอร์ม คุณไม่สามารถใช้แอตทริบิวต์นี้เพื่อระบุว่า | 
| visibility | รายการป้ายกำกับ กำหนดค่าไม่ได้ ค่าเริ่มต้นแตกต่างกัน 
  แอตทริบิวต์  
  สำหรับเป้าหมายที่ประกาศโดยตรงในไฟล์ BUILD หรือในมาโครเดิมที่เรียกจากไฟล์ BUILD ค่าเริ่มต้นคือ  | 
แอตทริบิวต์ที่ใช้ร่วมกันในกฎการทดสอบทั้งหมด (*_test)
ส่วนนี้อธิบายแอตทริบิวต์ที่ใช้ร่วมกันในกฎการทดสอบทั้งหมด
| แอตทริบิวต์ | คำอธิบาย | ||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| args | รายการสตริง ซึ่งขึ้นอยู่กับ
$(location) และ
การแทนที่"สร้างตัวแปร" และ
การแยกโทเค็นของ Bourne Shell ค่าเริ่มต้นคือ  อาร์กิวเมนต์บรรทัดคำสั่งที่ Bazel ส่งไปยังเป้าหมายเมื่อมีการ
เรียกใช้ด้วย  
อาร์กิวเมนต์เหล่านี้จะส่งผ่านก่อน | ||||||||||||||||||||
| env | 
  พจนานุกรมของสตริง ค่าอาจมีการแทนที่ $(location) และ "Make variable" ค่าเริ่มต้นคือ  
  ระบุตัวแปรสภาพแวดล้อมเพิ่มเติมที่จะตั้งค่าเมื่อ 
  แอตทริบิวต์นี้ใช้กับกฎเนทีฟเท่านั้น เช่น  | ||||||||||||||||||||
| env_inherit | รายการสตริง ค่าเริ่มต้นคือ  ระบุตัวแปรสภาพแวดล้อมเพิ่มเติมที่จะรับค่าจาก
  สภาพแวดล้อมภายนอกเมื่อ  
  แอตทริบิวต์นี้ใช้กับกฎเนทีฟเท่านั้น เช่น  | ||||||||||||||||||||
| size | สตริง  ระบุ "ความหนัก" ของเป้าหมายการทดสอบ ซึ่งหมายถึงเวลา/ทรัพยากรที่ต้องใช้ในการเรียกใช้ การทดสอบหน่วยถือเป็น "เล็ก" การทดสอบการผสานรวมถือเป็น "ปานกลาง" และการทดสอบแบบครบวงจรถือเป็น "ใหญ่" หรือ
"ใหญ่มาก" Bazel ใช้ขนาดเพื่อกำหนดการหมดเวลาเริ่มต้น ซึ่งสามารถลบล้างได้โดยใช้แอตทริบิวต์
 ขนาดการทดสอบสอดคล้องกับระยะหมดเวลาเริ่มต้นต่อไปนี้และการใช้งานทรัพยากรในเครื่องสูงสุดโดยประมาณ 
 
  ระบบจะตั้งค่าตัวแปรสภาพแวดล้อม
   | ||||||||||||||||||||
| timeout | สตริง  ระยะเวลาที่คาดว่าจะใช้ในการทดสอบก่อนที่จะกลับมา 
แม้ว่าแอตทริบิวต์ขนาดของการทดสอบจะควบคุมการประมาณทรัพยากร แต่คุณก็ตั้งค่า
การหมดเวลาของการทดสอบแยกกันได้  หากไม่ได้ระบุอย่างชัดเจน ค่า
หมดเวลาจะขึ้นอยู่กับขนาดของการทดสอบ คุณสามารถลบล้างการหมดเวลาของ
การทดสอบได้ด้วยแฟล็ก  
 
สำหรับเวลาอื่นๆ นอกเหนือจากข้างต้น คุณสามารถลบล้างการหมดเวลาทดสอบได้ด้วย
 
  ระบบจะตั้งค่าตัวแปรสภาพแวดล้อม
   | ||||||||||||||||||||
| flaky | บูลีน กำหนดค่าไม่ได้
  ค่าเริ่มต้นคือ  ทำเครื่องหมายการทดสอบว่าไม่น่าเชื่อถือ หากตั้งค่าไว้ จะเรียกใช้การทดสอบสูงสุด 3 ครั้ง และทำเครื่องหมายว่าไม่สำเร็จก็ต่อเมื่อการทดสอบไม่สำเร็จทุกครั้ง โดยค่าเริ่มต้น แอตทริบิวต์นี้จะตั้งค่าเป็น False และการทดสอบจะ ดำเนินการเพียงครั้งเดียว โปรดทราบว่าโดยทั่วไปไม่แนะนำให้ใช้แอตทริบิวต์นี้ เนื่องจากควรมีการทดสอบที่ผ่านอย่างน่าเชื่อถือเมื่อมีการยืนยัน | ||||||||||||||||||||
| shard_count | จำนวนเต็มที่ไม่เป็นลบซึ่งน้อยกว่าหรือเท่ากับ 50 ค่าเริ่มต้นคือ  ระบุจำนวนชาร์ดแบบขนาน ที่จะใช้เรียกใช้การทดสอบ หากตั้งค่าไว้ ค่านี้จะลบล้างฮิวริสติกที่ใช้ในการกำหนดจำนวน
ชาร์ดแบบขนานที่จะใช้ในการทดสอบ โปรดทราบว่ากฎการทดสอบบางอย่างอาจต้องใช้พารามิเตอร์นี้เพื่อเปิดใช้การแยกส่วนตั้งแต่แรก ดู หากเปิดใช้การแบ่งการทดสอบ ระบบจะตั้งค่าตัวแปรสภาพแวดล้อม  การแบ่งพาร์ติชันต้องใช้โปรแกรมเรียกใช้การทดสอบที่รองรับโปรโตคอลการแบ่งพาร์ติชันการทดสอบ หากไม่เป็นเช่นนั้น ก็มีแนวโน้มสูงที่จะเรียกใช้การทดสอบทุกรายการในทุก Shard ซึ่ง ไม่ใช่สิ่งที่คุณต้องการ ดูรายละเอียดเกี่ยวกับการแบ่งกลุ่มได้ที่ การแบ่งกลุ่มการทดสอบ ในสารานุกรมการทดสอบ | ||||||||||||||||||||
| local | บูลีน กำหนดค่าไม่ได้
  ค่าเริ่มต้นคือ  บังคับให้เรียกใช้การทดสอบในเครื่องโดยไม่ต้องใช้แซนด์บ็อกซ์ การตั้งค่านี้เป็น True จะเทียบเท่ากับการระบุ "local" เป็นแท็ก
( | 
แอตทริบิวต์ที่ใช้ร่วมกันในกฎไบนารีทั้งหมด (*_binary)
ส่วนนี้อธิบายแอตทริบิวต์ที่ใช้ร่วมกันในกฎไบนารีทั้งหมด
| แอตทริบิวต์ | คำอธิบาย | 
|---|---|
| args | 
  รายการสตริง โดยขึ้นอยู่กับ
  $(location) และ
  การแทนที่"สร้างตัวแปร" และ
  การแยกโทเค็น Bourne Shell
  กำหนดค่าไม่ได้
  ค่าเริ่มต้นคือ  
อาร์กิวเมนต์บรรทัดคำสั่งที่ Bazel จะส่งไปยังเป้าหมายเมื่อมีการเรียกใช้
ไม่ว่าจะโดยคำสั่ง  
หมายเหตุ: ระบบจะไม่ส่งอาร์กิวเมนต์เมื่อคุณเรียกใช้เป้าหมาย
ภายนอก Bazel (เช่น โดยการเรียกใช้ไบนารีใน
 | 
| env | พจนานุกรมของสตริง ค่าต้องเป็นไปตาม
$(location) และ
"สร้างตัวแปร" การแทนที่ ค่าเริ่มต้นคือ  ระบุตัวแปรสภาพแวดล้อมเพิ่มเติมที่จะตั้งค่าเมื่อ  
  แอตทริบิวต์นี้ใช้กับกฎเนทีฟเท่านั้น เช่น  
หมายเหตุ: ระบบจะไม่ตั้งค่าตัวแปรสภาพแวดล้อมเมื่อคุณเรียกใช้เป้าหมายนอก Bazel (เช่น โดยการเรียกใช้ไบนารีใน  | 
| output_licenses | รายการสตริง ค่าเริ่มต้นคือ  ใบอนุญาตของไฟล์เอาต์พุตที่ไบนารีนี้สร้างขึ้น ซึ่งเป็นส่วนหนึ่งของ API การอนุญาตให้ใช้สิทธิที่เลิกใช้งานแล้วซึ่ง Bazel ไม่ได้ใช้แล้ว อย่า ใช้สิ่งนี้ | 
แอตทริบิวต์ที่กำหนดค่าได้
แอตทริบิวต์ส่วนใหญ่เป็น "กำหนดค่าได้" ซึ่งหมายความว่าค่าของแอตทริบิวต์อาจเปลี่ยนแปลงเมื่อ สร้างเป้าหมายด้วยวิธีต่างๆ โดยเฉพาะอย่างยิ่ง แอตทริบิวต์ที่กำหนดค่าได้ อาจแตกต่างกันไปตาม Flag ที่ส่งไปยังบรรทัดคำสั่ง Bazel หรือสิ่งที่ การอ้างอิงดาวน์สตรีมขอเป้าหมาย ซึ่งสามารถใช้เพื่อปรับแต่งเป้าหมายสำหรับหลายแพลตฟอร์มหรือโหมดการคอมไพล์ได้ เป็นต้น
  ตัวอย่างต่อไปนี้ประกาศแหล่งที่มาต่างๆ สำหรับสถาปัตยกรรมเป้าหมายที่แตกต่างกัน
 การเรียกใช้ bazel build :multiplatform_lib --cpu x86
  จะสร้างเป้าหมายโดยใช้ x86_impl.cc ขณะที่การแทนที่
  --cpu arm จะทำให้ใช้ arm_impl.cc แทน
cc_library(
    name = "multiplatform_lib",
    srcs = select({
        ":x86_mode": ["x86_impl.cc"],
        ":arm_mode": ["arm_impl.cc"]
    })
)
config_setting(
    name = "x86_mode",
    values = { "cpu": "x86" }
)
config_setting(
    name = "arm_mode",
    values = { "cpu": "arm" }
)
  ฟังก์ชัน select()
  จะเลือกค่าอื่นแทนค่าต่างๆ สำหรับแอตทริบิวต์ที่กำหนดค่าได้โดยอิงตาม
  เกณฑ์ config_setting
  หรือ constraint_value
  ที่การกำหนดค่าของเป้าหมายเป็นไปตาม
  Bazel จะประเมินแอตทริบิวต์ที่กำหนดค่าได้หลังจากประมวลผลมาโครและก่อน
  ประมวลผลกฎ (ในทางเทคนิคคือระหว่าง
  ระยะการโหลดและการวิเคราะห์)
  การประมวลผลใดๆ ก่อนการประเมิน select() จะไม่ทราบว่า select() เลือกสาขาใด เช่น แมโครไม่สามารถเปลี่ยนลักษณะการทำงานตามสาขาที่เลือก และbazel queryทำได้เพียงคาดเดาอย่างระมัดระวังเกี่ยวกับทรัพยากร Dependency ที่กำหนดค่าได้ของเป้าหมาย ดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้ select() กับกฎและมาโครได้ที่
  
  คำถามที่พบบ่อยนี้
  แอตทริบิวต์ที่ทำเครื่องหมาย nonconfigurable ในเอกสารประกอบจะใช้ฟีเจอร์นี้ไม่ได้
 โดยปกติแล้ว แอตทริบิวต์จะกำหนดค่าไม่ได้เนื่องจาก Bazel
  ต้องทราบค่าของแอตทริบิวต์ภายในก่อนจึงจะกำหนดวิธีแก้ไขselect()ได้
ดูภาพรวมโดยละเอียดได้ที่ แอตทริบิวต์การสร้างที่กำหนดค่าได้
เป้าหมายเอาต์พุตโดยนัย
เราเลิกใช้งานเอาต์พุตโดยนัยใน C++ แล้ว โปรดหลีกเลี่ยงการใช้คำนี้ ในภาษาอื่นๆ หากเป็นไปได้ เรายังไม่มีเส้นทางการเลิกใช้งาน แต่ในที่สุดก็จะเลิกใช้งานเช่นกัน
เมื่อกำหนดกฎการสร้างในไฟล์ BUILD คุณจะประกาศเป้าหมายกฎใหม่ที่มีชื่อในแพ็กเกจอย่างชัดเจน
  ฟังก์ชันกฎการสร้างหลายฟังก์ชันยังโดยนัยเกี่ยวข้องกับเป้าหมายไฟล์เอาต์พุตอย่างน้อย 1 รายการ ซึ่งเนื้อหาและความหมายจะขึ้นอยู่กับกฎ
  เช่น เมื่อคุณประกาศjava_binary(name='foo', ...) rule อย่างชัดเจน คุณก็ยังประกาศเป้าหมายไฟล์เอาต์พุต foo_deploy.jar เป็นสมาชิกของแพ็กเกจเดียวกันโดยนัยด้วย
  (เป้าหมายนี้เป็นไฟล์เก็บถาวร Java แบบสแตนด์อโลนที่เหมาะ
  สำหรับการติดตั้งใช้งาน)
  เป้าหมายเอาต์พุตโดยนัยเป็นสมาชิกชั้นหนึ่งของกราฟเป้าหมายส่วนกลาง
  เช่นเดียวกับเป้าหมายอื่นๆ ระบบจะสร้างเป้าหมายเหล่านี้ตามคำขอ
  ไม่ว่าจะเมื่อระบุในคำสั่งบิลด์ระดับบนสุด หรือเมื่อเป้าหมายเหล่านั้น
  เป็นข้อกำหนดเบื้องต้นที่จำเป็นสำหรับเป้าหมายบิลด์อื่นๆ  โดยสามารถ
  อ้างอิงเป็นทรัพยากร Dependency ในไฟล์ BUILD และสังเกตได้ใน
  เอาต์พุตของเครื่องมือวิเคราะห์ เช่น bazel query
สำหรับกฎการสร้างแต่ละประเภท เอกสารประกอบของกฎจะมี ส่วนพิเศษที่อธิบายรายละเอียดชื่อและเนื้อหาของเอาต์พุตโดยนัย ที่เกิดจากการประกาศกฎประเภทนั้น
  ความแตกต่างที่สำคัญแต่ค่อนข้างละเอียดระหว่างเนมสเปซ 2 รายการที่ใช้โดยระบบบิลด์
  ป้ายกำกับระบุเป้าหมาย
  ซึ่งอาจเป็นกฎหรือไฟล์ และเป้าหมายไฟล์อาจแบ่งออกเป็น
  เป้าหมายไฟล์ต้นฉบับ (หรืออินพุต) และเป้าหมายไฟล์ที่ได้มา (หรือเอาต์พุต)
  สิ่งที่คุณระบุได้ในไฟล์ BUILD
  สร้างจากบรรทัดคำสั่ง หรือตรวจสอบโดยใช้ bazel query
  นี่คือเนมสเปซเป้าหมาย  เป้าหมายของแต่ละไฟล์จะสอดคล้อง
  กับไฟล์จริง 1 ไฟล์ในดิสก์ ("เนมสเปซของระบบไฟล์") ส่วนเป้าหมายของแต่ละกฎ
  อาจสอดคล้องกับไฟล์จริง 0, 1 หรือหลายไฟล์ในดิสก์
  อาจมีไฟล์ในดิสก์ที่ไม่มีเป้าหมายที่สอดคล้องกัน เช่น ไฟล์ออบเจ็กต์ .o ที่สร้างขึ้นระหว่างการคอมไพล์ C++ จะอ้างอิงจากภายในไฟล์ BUILD หรือจากบรรทัดคำสั่งไม่ได้
  ด้วยวิธีนี้ เครื่องมือบิลด์อาจซ่อนรายละเอียดการใช้งานบางอย่างของ
  วิธีที่เครื่องมือทำงาน ซึ่งอธิบายไว้อย่างละเอียดในการอ้างอิงแนวคิด BUILD