กฎ
- cc_binary
- cc_import
- cc_library
- cc_shared_library
- cc_static_library
- cc_test
- cc_toolchain
- cc_toolchain_suite
- fdo_prefetch_hints
- fdo_profile
- memprof_profile
- propeller_optimize
cc_binary
ดูแหล่งที่มาของกฎcc_binary(name, deps, srcs, data, additional_linker_inputs, args, compatible_with, conlyopts, copts, cxxopts, defines, deprecation, distribs, dynamic_deps, env, exec_compatible_with, exec_properties, features, hdrs_check, includes, licenses, link_extra_lib, linkopts, linkshared, linkstatic, local_defines, malloc, module_interfaces, nocopts, output_licenses, reexport_deps, restricted_to, stamp, tags, target_compatible_with, testonly, toolchains, visibility, win_def_file)
ซึ่งสร้างไบนารีที่เรียกใช้งานได้
name ของเป้าหมายควรเหมือนกับชื่อของ
ไฟล์ต้นฉบับซึ่งเป็นจุดแรกเข้าหลักของแอปพลิเคชัน (ไม่รวมนามสกุล)
เช่น หากจุดแรกเข้าอยู่ใน main.cc ชื่อของคุณควรเป็น main
เป้าหมายเอาต์พุตโดยนัย
- name.stripped(สร้างขึ้นเฉพาะในกรณีที่มีการขออย่างชัดเจน): ไบนารีเวอร์ชันที่ไม่มีข้อมูลการแก้ไขข้อบกพร่อง- strip -gจะทำงานในไบนารีเพื่อนำสัญลักษณ์การแก้ไขข้อบกพร่องออก คุณระบุตัวเลือกการลบเพิ่มเติมได้ในบรรทัดคำสั่งโดยใช้- --stripopt=-foo
- name.dwp(สร้างขึ้นเฉพาะในกรณีที่มีการขออย่างชัดเจน): หากเปิดใช้ Fission จะมีไฟล์แพ็กเกจข้อมูลการแก้ไขข้อบกพร่องที่เหมาะสำหรับการแก้ไขข้อบกพร่องของไบนารีที่ติดตั้งใช้งานจากระยะไกล หรือไฟล์ว่าง
อาร์กิวเมนต์
| Attributes | |
|---|---|
| name | ชื่อ (ต้องระบุ) ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ | 
| deps | รายการป้ายกำกับ ค่าเริ่มต้นคือ  ซึ่งอาจเป็นเป้าหมาย  | 
| srcs | รายการป้ายกำกับ ค่าเริ่มต้นคือ  ระบบจะคอมไพล์ไฟล์  ไฟล์แอสเซมบลีแบบเพียว (.s, .asm) จะไม่ได้รับการประมวลผลล่วงหน้า และโดยปกติจะสร้างขึ้นโดยใช้แอสเซมเบลอร์ ไฟล์แอสเซมบลีที่ประมวลผลล่วงหน้า (.S) จะได้รับการประมวลผลล่วงหน้าและโดยทั่วไปจะสร้างขึ้นโดยใช้คอมไพเลอร์ C/C++ ระบบจะไม่คอมไพล์ไฟล์  ต้องมีการกล่าวถึงไฟล์  ไฟล์  หากแอตทริบิวต์  
   
 
  ... และกฎใดๆ ที่สร้างไฟล์เหล่านั้น (เช่น  | 
| data | รายการป้ายกำกับ ค่าเริ่มต้นคือ  dataที่แอตทริบิวต์ทั่วไปที่กำหนดโดย
กฎการสร้างส่วนใหญ่หาก  หาก  โค้ด C++ สามารถเข้าถึงไฟล์ข้อมูลเหล่านี้ได้ดังนี้  | 
| additional_linker_inputs | รายการป้ายกำกับ ค่าเริ่มต้นคือ  เช่น คุณระบุไฟล์ .res ของ Windows ที่คอมไพล์แล้วได้ที่นี่เพื่อฝังใน เป้าหมายไบนารี | 
| conlyopts | รายการสตริง ค่าเริ่มต้นคือ  | 
| copts | รายการสตริง ค่าเริ่มต้นคือ  
  ระบบจะเพิ่มสตริงแต่ละรายการในแอตทริบิวต์นี้ตามลำดับที่ระบุไปยัง  
  หากแพ็กเกจประกาศฟีเจอร์
   | 
| cxxopts | รายการสตริง ค่าเริ่มต้นคือ  | 
| defines | รายการสตริง ค่าเริ่มต้นคือ  -Dและเพิ่มลงในบรรทัดคำสั่งคอมไพล์ไปยังเป้าหมายนี้
รวมถึงทุกกฎที่ขึ้นอยู่กับเป้าหมายนี้ โปรดใช้ความระมัดระวังอย่างยิ่ง เนื่องจากอาจส่งผลกระทบในวงกว้าง
  หากไม่แน่ใจ ให้เพิ่มค่าที่กำหนดไว้ในlocal_definesแทน | 
| dynamic_deps | รายการป้ายกำกับ ค่าเริ่มต้นคือ  cc_shared_libraryอื่นๆ ที่เป้าหมายปัจจุบันขึ้นอยู่กับ
การติดตั้งใช้งาน  | 
| hdrs_check | สตริง ค่าเริ่มต้นคือ  | 
| includes | รายการสตริง ค่าเริ่มต้นคือ  -isystem path_to_package/include_entryควรใช้เฉพาะกับไลบรารีของบุคคลที่สามที่
ไม่ได้เป็นไปตามรูปแบบการเขียนคำสั่ง #include ของ Google
ซึ่งต่างจาก COPTS โดยระบบจะเพิ่มแฟล็กเหล่านี้สำหรับกฎนี้
และทุกกฎที่ขึ้นอยู่กับกฎนี้ (หมายเหตุ: ไม่ใช่กฎที่ขึ้นอยู่กับกฎนั้น) โปรด
ระมัดระวังเป็นอย่างยิ่ง เนื่องจากอาจส่งผลกระทบในวงกว้าง  หากไม่แน่ใจ ให้เพิ่ม Flag "-I" ไปยัง COPTS แทน
เส้นทาง  | 
| link_extra_lib | ป้ายกำกับ ค่าเริ่มต้นคือ  
    โดยค่าเริ่มต้น ไบนารี C++ จะลิงก์กับ  | 
| linkopts | รายการสตริง ค่าเริ่มต้นคือ  LINKOPTSก่อน
ลิงก์เป้าหมายไบนารี
    องค์ประกอบแต่ละรายการในรายการนี้ที่ไม่ได้ขึ้นต้นด้วย  | 
| linkshared | บูลีน ค่าเริ่มต้นคือ  linkshared=Trueในกฎ โดยค่าเริ่มต้น
ตัวเลือกนี้จะปิดอยู่
  การมีแฟล็กนี้หมายความว่าการลิงก์เกิดขึ้นพร้อมกับแฟล็ก  
  หากคุณระบุทั้ง  | 
| linkstatic | บูลีน ค่าเริ่มต้นคือ  cc_binaryและcc_test: ลิงก์ไบนารีในโหมดคงที่ สำหรับcc_library.link_staticโปรดดูด้านล่างโดยค่าเริ่มต้น ตัวเลือกนี้จะเปิดอยู่สำหรับ  
  หากเปิดใช้และเป็นไบนารีหรือการทดสอบ ตัวเลือกนี้จะบอกเครื่องมือบิลด์ให้ลิงก์ใน
   การลิงก์ไฟล์ที่เรียกใช้งานได้มี 3 วิธีหลักๆ ดังนี้ 
 
หากใช้แอตทริบิวต์  
แอตทริบิวต์  
ไม่ควรมีโค้ดที่สร้างด้วย  | 
| local_defines | รายการสตริง ค่าเริ่มต้นคือ  -Dและเพิ่มลงในบรรทัดคำสั่งคอมไพล์สำหรับเป้าหมายนี้
แต่จะไม่เพิ่มลงในเป้าหมายที่ขึ้นอยู่กับเป้าหมายนี้ | 
| malloc | ป้ายกำกับ ค่าเริ่มต้นคือ  
  โดยค่าเริ่มต้น ไบนารี C++ จะลิงก์กับ  | 
| module_interfaces | รายการป้ายกำกับ ค่าเริ่มต้นคือ  มาตรฐาน C++ ไม่ได้จำกัดนามสกุลไฟล์อินเทอร์เฟซของโมดูล 
 การใช้งานได้รับการป้องกันโดยแฟล็ก
 | 
| nocopts | สตริง ค่าเริ่มต้นคือ  COPTSที่มีอยู่ก่อนแล้วซึ่งตรงกับนิพจน์ทั่วไปนี้
(รวมถึงค่าที่ระบุอย่างชัดเจนในแอตทริบิวต์ copts ของกฎ)
จะถูกนำออกจากCOPTSเพื่อวัตถุประสงค์ในการรวบรวมกฎนี้
ไม่ควรต้องใช้แอตทริบิวต์นี้ภายนอกthird_partyระบบจะไม่ประมวลผลค่าล่วงหน้า
ในลักษณะใดๆ นอกเหนือจากการแทนที่ตัวแปร "Make" | 
| reexport_deps | รายการป้ายกำกับ ค่าเริ่มต้นคือ  | 
| stamp | จำนวนเต็ม ค่าเริ่มต้นคือ  
 ระบบจะไม่สร้างไบนารีที่ประทับเวลาใหม่ เว้นแต่ว่ามีการเปลี่ยนแปลงในทรัพยากร Dependency | 
| win_def_file | ป้ายกำกับ ค่าเริ่มต้นคือ  ควรใช้แอตทริบิวต์นี้เมื่อ Windows เป็นแพลตฟอร์มเป้าหมายเท่านั้น ใช้เพื่อ ส่งออกสัญลักษณ์ระหว่างลิงก์ไลบรารีที่แชร์ได้ | 
cc_import
ดูแหล่งที่มาของกฎcc_import(name, deps, data, hdrs, alwayslink, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, includes, interface_library, linkopts, objects, pic_objects, pic_static_library, restricted_to, shared_library, static_library, system_provided, tags, target_compatible_with, testonly, toolchains, visibility)
cc_import ช่วยให้ผู้ใช้นำเข้าไลบรารี C/C++ ที่คอมไพล์ไว้ล่วงหน้าได้
กรณีการใช้งานทั่วไปมีดังนี้ 
1. การลิงก์ไลบรารีแบบคงที่
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  static_library = "libmylib.a",
  # If alwayslink is turned on,
  # libmylib.a will be forcely linked into any binary that depends on it.
  # alwayslink = 1,
)
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  shared_library = "libmylib.so",
)
ใน Unix ให้ทำดังนี้
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  # libmylib.ifso is an interface library for libmylib.so which will be passed to linker
  interface_library = "libmylib.ifso",
  # libmylib.so will be available for runtime
  shared_library = "libmylib.so",
)
บน Windows:
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  # mylib.lib is an import library for mylib.dll which will be passed to linker
  interface_library = "mylib.lib",
  # mylib.dll will be available for runtime
  shared_library = "mylib.dll",
)
system_provided=True
ใน Unix ให้ทำดังนี้
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  interface_library = "libmylib.ifso", # Or we can also use libmylib.so as its own interface library
  # libmylib.so is provided by system environment, for example it can be found in LD_LIBRARY_PATH.
  # This indicates that Bazel is not responsible for making libmylib.so available.
  system_provided = 1,
)
บน Windows:
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  # mylib.lib is an import library for mylib.dll which will be passed to linker
  interface_library = "mylib.lib",
  # mylib.dll is provided by system environment, for example it can be found in PATH.
  # This indicates that Bazel is not responsible for making mylib.dll available.
  system_provided = 1,
)
ใน Unix ให้ทำดังนี้
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  static_library = "libmylib.a",
  shared_library = "libmylib.so",
)
บน Windows:
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  static_library = "libmylib.lib", # A normal static library
  interface_library = "mylib.lib", # An import library for mylib.dll
  shared_library = "mylib.dll",
)
ส่วนที่เหลือจะเหมือนกันใน Unix และ Windows ดังนี้
# first will link to libmylib.a (or libmylib.lib)
cc_binary(
  name = "first",
  srcs = ["first.cc"],
  deps = [":mylib"],
  linkstatic = 1, # default value
)
# second will link to libmylib.so (or libmylib.lib)
cc_binary(
  name = "second",
  srcs = ["second.cc"],
  deps = [":mylib"],
  linkstatic = 0,
)
cc_import รองรับแอตทริบิวต์ include เช่น
cc_import(
  name = "curl_lib",
  hdrs = glob(["vendor/curl/include/curl/*.h"]),
  includes = ["vendor/curl/include"],
  shared_library = "vendor/curl/lib/.libs/libcurl.dylib",
)
อาร์กิวเมนต์
| Attributes | |
|---|---|
| name | ชื่อ (ต้องระบุ) ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ | 
| deps | รายการป้ายกำกับ ค่าเริ่มต้นคือ  depsที่แอตทริบิวต์ทั่วไปที่กำหนดโดย
กฎการสร้างส่วนใหญ่ | 
| hdrs | รายการป้ายกำกับ ค่าเริ่มต้นคือ  | 
| alwayslink | บูลีน ค่าเริ่มต้นคือ  หาก alwayslink ใช้กับ VS 2017 ใน Windows ไม่ได้ นั่นเป็นเพราะปัญหาที่ทราบ โปรดอัปเกรด VS 2017 เป็นเวอร์ชันล่าสุด | 
| includes | รายการสตริง ค่าเริ่มต้นคือ  -isystem path_to_package/include_entryควรใช้เฉพาะกับไลบรารีของบุคคลที่สามที่
ไม่ได้เป็นไปตามรูปแบบการเขียนคำสั่ง #include ของ Google
ซึ่งต่างจาก COPTS โดยระบบจะเพิ่มแฟล็กเหล่านี้สำหรับกฎนี้
และทุกกฎที่ขึ้นอยู่กับกฎนี้ (หมายเหตุ: ไม่ใช่กฎที่ขึ้นอยู่กับกฎนั้น) โปรด
ระมัดระวังเป็นอย่างยิ่ง เนื่องจากอาจส่งผลกระทบในวงกว้าง  หากไม่แน่ใจ ให้เพิ่ม Flag "-I" ไปยัง COPTS แทน
เส้นทาง  | 
| interface_library | ป้ายกำกับ ค่าเริ่มต้นคือ   ประเภทไฟล์ที่อนุญาต
   | 
| linkopts | รายการสตริง ค่าเริ่มต้นคือ  LINKOPTSก่อน
ลิงก์เป้าหมายไบนารี
  องค์ประกอบแต่ละรายการในรายการนี้ที่ไม่ได้ขึ้นต้นด้วย  | 
| objects | รายการป้ายกำกับ ค่าเริ่มต้นคือ  | 
| pic_objects | รายการป้ายกำกับ ค่าเริ่มต้นคือ  | 
| pic_static_library | ป้ายกำกับ ค่าเริ่มต้นคือ  | 
| shared_library | ป้ายกำกับ ค่าเริ่มต้นคือ   ประเภทไฟล์ที่อนุญาต
   | 
| static_library | ป้ายกำกับ ค่าเริ่มต้นคือ   ประเภทไฟล์ที่อนุญาต
   | 
| system_provided | บูลีน ค่าเริ่มต้นคือ  interface_libraryและเว้นว่างshared_libraryไว้ | 
cc_library
ดูแหล่งที่มาของกฎcc_library(name, deps, srcs, data, hdrs, additional_compiler_inputs, additional_linker_inputs, alwayslink, compatible_with, conlyopts, copts, cxxopts, defines, deprecation, distribs, exec_compatible_with, exec_properties, features, hdrs_check, implementation_deps, include_prefix, includes, licenses, linkopts, linkstamp, linkstatic, local_defines, module_interfaces, restricted_to, strip_include_prefix, tags, target_compatible_with, testonly, textual_hdrs, toolchains, visibility, win_def_file)
ใช้ cc_library() สำหรับไลบรารีที่คอมไพล์ด้วย C++
  ผลลัพธ์จะเป็น .so, .lo หรือ .a ขึ้นอยู่กับสิ่งที่ต้องการ
  หากคุณสร้างสิ่งใดก็ตามด้วยการลิงก์แบบคงที่ซึ่งขึ้นอยู่กับ
  cc_library เอาต์พุตของกฎไลบรารีที่ขึ้นต่อกัน
  คือไฟล์ .a หากคุณระบุ
   alwayslink=True คุณจะได้รับไฟล์ .lo
  ชื่อไฟล์เอาต์พุตจริงคือ libfoo.so สำหรับ
  คลังที่ใช้ร่วมกัน โดย foo คือชื่อของกฎ  
  ไลบรารีประเภทอื่นๆ จะลงท้ายด้วย .lo และ .a
  ตามลำดับ  หากต้องการชื่อไลบรารีที่ใช้ร่วมกันที่เฉพาะเจาะจง เช่น เพื่อกำหนดโมดูล Python ให้ใช้ genrule เพื่อคัดลอกไลบรารีไปยังชื่อที่ต้องการ
การตรวจสอบการรวมส่วนหัว
  ต้องประกาศไฟล์ส่วนหัวทั้งหมดที่ใช้ในการสร้างใน hdrs หรือ srcs ของกฎ cc_*
  มีการบังคับใช้กฎข้อนี้แล้ว
  สำหรับกฎ cc_library ส่วนหัวใน hdrs จะประกอบด้วย
  อินเทอร์เฟซสาธารณะของไลบรารี และสามารถรวมได้โดยตรงจากทั้ง
  ไฟล์ใน hdrs และ srcs ของไลบรารี
  เอง รวมถึงจากไฟล์ใน hdrs และ srcs
  ของกฎ cc_* ที่แสดงไลบรารีใน deps
  ส่วนหัวใน srcs ต้องรวมจากไฟล์ใน hdrs และ srcs ของไลบรารีโดยตรงเท่านั้น เมื่อ
  ตัดสินใจว่าจะใส่ส่วนหัวใน hdrs หรือ srcs
  คุณควรพิจารณาว่าต้องการให้ผู้ใช้ไลบรารีนี้สามารถ
  รวมไลบรารีนี้โดยตรงหรือไม่ ซึ่งเป็นการตัดสินใจที่คล้ายกันโดยประมาณกับ
  ระหว่างระดับการมองเห็น public กับ private ในภาษาโปรแกรม
  กฎ cc_binary และ cc_test ไม่มีอินเทอร์เฟซที่ส่งออก
  จึงไม่มีแอตทริบิวต์ hdrs ด้วย ส่วนหัวทั้งหมด
  ที่เป็นของไบนารีหรือการทดสอบโดยตรงควรแสดงอยู่ใน
  srcs
โปรดดูตัวอย่างต่อไปนี้เพื่ออธิบายกฎเหล่านี้
cc_binary(
    name = "foo",
    srcs = [
        "foo.cc",
        "foo.h",
    ],
    deps = [":bar"],
)
cc_library(
    name = "bar",
    srcs = [
        "bar.cc",
        "bar-impl.h",
    ],
    hdrs = ["bar.h"],
    deps = [":baz"],
)
cc_library(
    name = "baz",
    srcs = [
        "baz.cc",
        "baz-impl.h",
    ],
    hdrs = ["baz.h"],
)
  การรวมโดยตรงที่อนุญาตในตัวอย่างนี้แสดงอยู่ในตารางด้านล่าง
  เช่น foo.cc ได้รับอนุญาตให้รวม foo.h และ bar.h โดยตรง แต่ไม่ได้รับอนุญาตให้รวม baz.h
| รวมไฟล์ | การรวมที่อนุญาต | 
|---|---|
| foo.h | bar.h | 
| foo.cc | foo.h bar.h | 
| bar.h | bar-impl.h baz.h | 
| bar-impl.h | bar.h baz.h | 
| bar.cc | bar.h bar-impl.h baz.h | 
| baz.h | baz-impl.h | 
| baz-impl.h | baz.h | 
| baz.cc | baz.h baz-impl.h | 
  กฎการตรวจสอบการรวมจะมีผลกับการรวมโดยตรงเท่านั้น
 ในตัวอย่างด้านบน foo.cc ได้รับอนุญาตให้
  รวม bar.h ซึ่งอาจรวม baz.h ซึ่งใน
  ทางกลับกันก็ได้รับอนุญาตให้รวม baz-impl.h ในทางเทคนิค การ
  คอมไพล์ไฟล์ .cc อาจรวมไฟล์ส่วนหัวใดก็ได้ใน hdrs หรือ srcs ใน
  cc_library ใดก็ได้ในทรานซิทีฟ deps ปิด ในกรณีนี้ คอมไพเลอร์อาจอ่าน baz.h และ baz-impl.h เมื่อคอมไพล์ foo.cc แต่ foo.cc ต้องไม่มี #include "baz.h" หากต้องการอนุญาต
  ให้ทำเช่นนั้นได้ คุณต้องเพิ่ม baz ลงใน deps
  ของ foo
  Bazel ต้องอาศัยการรองรับ Toolchain เพื่อบังคับใช้กฎการตรวจสอบการรวม
  เครื่องมือต้องรองรับlayering_checkและต้องขออย่างชัดเจน เช่น ผ่านแฟล็กบรรทัดคำสั่ง --features=layering_check หรือพารามิเตอร์ features ของฟังก์ชัน package Toolchain
  ที่ Bazel จัดเตรียมให้รองรับฟีเจอร์นี้กับ clang ใน Unix และ macOS เท่านั้น
ตัวอย่าง
   เราใช้แฟล็ก alwayslink เพื่อบังคับให้ Linker ลิงก์ใน
   โค้ดนี้แม้ว่าโค้ดไบนารีหลักจะไม่ได้อ้างอิงก็ตาม
cc_library(
    name = "ast_inspector_lib",
    srcs = ["ast_inspector_lib.cc"],
    hdrs = ["ast_inspector_lib.h"],
    visibility = ["//visibility:public"],
    deps = ["//third_party/llvm/llvm/tools/clang:frontend"],
    # alwayslink as we want to be able to call things in this library at
    # debug time, even if they aren't used anywhere in the code.
    alwayslink = 1,
)
ตัวอย่างต่อไปนี้มาจาก
   third_party/python2_4_3/BUILD
   โค้ดบางส่วนใช้ไลบรารี dl (เพื่อโหลดไลบรารีแบบไดนามิกอื่น) ดังนั้นกฎนี้จึงระบุตัวเลือกการลิงก์ -ldl เพื่อลิงก์ไลบรารี dl
cc_library(
    name = "python2_4_3",
    linkopts = [
        "-ldl",
        "-lutil",
    ],
    deps = ["//third_party/expat"],
)
ตัวอย่างต่อไปนี้มาจาก third_party/kde/BUILD
   เราเก็บไฟล์ .so ที่สร้างไว้ล่วงหน้าไว้ในที่เก็บ
   ไฟล์ส่วนหัวจะอยู่ในไดเรกทอรีย่อยชื่อ include
cc_library(
    name = "kde",
    srcs = [
        "lib/libDCOP.so",
        "lib/libkdesu.so",
        "lib/libkhtml.so",
        "lib/libkparts.so",
        ...more .so files...,
    ],
    includes = ["include"],
    deps = ["//third_party/X11"],
)
ตัวอย่างต่อไปนี้มาจาก third_party/gles/BUILD
   โค้ดของบุคคลที่สามมักต้องมี defines และ
   linkopts
cc_library(
    name = "gles",
    srcs = [
        "GLES/egl.h",
        "GLES/gl.h",
        "ddx.c",
        "egl.c",
    ],
    defines = [
        "USE_FLOAT",
        "__GL_FLOAT",
        "__GL_COMMON",
    ],
    linkopts = ["-ldl"],  # uses dlopen(), dl library
    deps = [
        "es",
        "//third_party/X11",
    ],
)
อาร์กิวเมนต์
| Attributes | |
|---|---|
| name | ชื่อ (ต้องระบุ) ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ | 
| deps | รายการป้ายกำกับ ค่าเริ่มต้นคือ  ซึ่งอาจเป็นเป้าหมาย  ดูความคิดเห็นทั่วไปเกี่ยวกับ  ซึ่งควรเป็นชื่อของกฎไลบรารี C++
   เมื่อสร้างไบนารีที่ลิงก์ไลบรารีของกฎนี้
   คุณจะลิงก์ไลบรารีใน  แม้ว่าจะมีชื่อว่า "deps" แต่ไคลเอ็นต์ของไลบรารีนี้บางส่วน
   ไม่ได้อยู่ในที่นี้  การขึ้นต่อกันของข้อมูลรันไทม์จะอยู่ใน  หากต้องการลิงก์ในไลบรารีของบุคคลที่สามที่คอมไพล์ไว้ล่วงหน้า ให้เพิ่มชื่อไลบรารีลงใน
    หากต้องการใช้ไลบรารีอื่นโดยไม่ลิงก์กับไลบรารีนี้ ให้เพิ่มชื่อไลบรารีนั้นลงใน  | 
| srcs | รายการป้ายกำกับ ค่าเริ่มต้นคือ  ระบบจะคอมไพล์ไฟล์  ไฟล์แอสเซมบลีแบบเพียว (.s, .asm) จะไม่ได้รับการประมวลผลล่วงหน้า และโดยปกติจะสร้างขึ้นโดยใช้แอสเซมเบลอร์ ไฟล์แอสเซมบลีที่ประมวลผลล่วงหน้า (.S) จะได้รับการประมวลผลล่วงหน้าและโดยทั่วไปจะสร้างขึ้นโดยใช้คอมไพเลอร์ C/C++ ระบบจะไม่คอมไพล์ไฟล์  ต้องมีการกล่าวถึงไฟล์  ไฟล์  หากแอตทริบิวต์  
   
 
  ... และกฎใดๆ ที่สร้างไฟล์เหล่านั้น (เช่น  | 
| data | รายการป้ายกำกับ ค่าเริ่มต้นคือ  dataที่แอตทริบิวต์ทั่วไปที่กำหนดโดย
กฎการสร้างส่วนใหญ่หาก  หาก  โค้ด C++ สามารถเข้าถึงไฟล์ข้อมูลเหล่านี้ได้ดังนี้  | 
| hdrs | รายการป้ายกำกับ ค่าเริ่มต้นคือ  นี่คือตำแหน่งที่แนะนำอย่างยิ่งสำหรับการประกาศไฟล์ส่วนหัวที่
อธิบายอินเทอร์เฟซของไลบรารี ระบบจะทำให้ส่วนหัวเหล่านี้พร้อมใช้งาน
เพื่อให้แหล่งที่มาในกฎนี้หรือในกฎที่ขึ้นอยู่กับกฎนี้รวมไว้
 ส่วนหัวที่ไม่ได้มีไว้ให้ไคลเอ็นต์ของไลบรารีนี้รวมไว้ควรแสดงอยู่ในแอตทริบิวต์  ประเภทไฟล์  | 
| additional_compiler_inputs | รายการป้ายกำกับ ค่าเริ่มต้นคือ  | 
| additional_linker_inputs | รายการป้ายกำกับ ค่าเริ่มต้นคือ  เช่น คุณระบุไฟล์ .res ของ Windows ที่คอมไพล์แล้วได้ที่นี่เพื่อฝังใน เป้าหมายไบนารี | 
| alwayslink | บูลีน ค่าเริ่มต้นคือ  srcsแม้ว่าบางไฟล์จะไม่มีสัญลักษณ์ที่ไบนารีอ้างอิงก็ตาม
ซึ่งจะมีประโยชน์ในกรณีที่โค้ดไม่ได้เรียกอย่างชัดเจนโดยโค้ดใน
ไบนารี เช่น หากโค้ดลงทะเบียนเพื่อรับการเรียกกลับบางอย่าง
ที่ได้รับจากบริการบางอย่างหาก alwayslink ใช้กับ VS 2017 ใน Windows ไม่ได้ นั่นเป็นเพราะปัญหาที่ทราบ โปรดอัปเกรด VS 2017 เป็นเวอร์ชันล่าสุด | 
| conlyopts | รายการสตริง ค่าเริ่มต้นคือ  | 
| copts | รายการสตริง ค่าเริ่มต้นคือ  
  ระบบจะเพิ่มสตริงแต่ละรายการในแอตทริบิวต์นี้ตามลำดับที่ระบุไปยัง  
  หากแพ็กเกจประกาศฟีเจอร์
   | 
| cxxopts | รายการสตริง ค่าเริ่มต้นคือ  | 
| defines | รายการสตริง ค่าเริ่มต้นคือ  -Dและเพิ่มลงในบรรทัดคำสั่งคอมไพล์ไปยังเป้าหมายนี้
รวมถึงทุกกฎที่ขึ้นอยู่กับเป้าหมายนี้ โปรดใช้ความระมัดระวังอย่างยิ่ง เนื่องจากอาจส่งผลกระทบในวงกว้าง
  หากไม่แน่ใจ ให้เพิ่มค่าที่กำหนดไว้ในlocal_definesแทน | 
| hdrs_check | สตริง ค่าเริ่มต้นคือ  | 
| implementation_deps | รายการป้ายกำกับ ค่าเริ่มต้นคือ  depsโดยส่วนหัวและเส้นทางรวมของไลบรารีเหล่านี้ (และ
การขึ้นต่อกันแบบทรานซิทีฟทั้งหมด) จะใช้สำหรับการคอมไพล์ไลบรารีนี้เท่านั้น และไม่ใช่ไลบรารีที่
ขึ้นอยู่กับไลบรารีนี้ ไลบรารีที่ระบุด้วยimplementation_depsจะยังคงลิงก์อยู่ใน
เป้าหมายไบนารีที่ขึ้นอยู่กับไลบรารีนี้ | 
| include_prefix | สตริง ค่าเริ่มต้นคือ  เมื่อตั้งค่าแล้ว ระบบจะเข้าถึงส่วนหัวในแอตทริบิวต์  ระบบจะนำคำนำหน้าในแอตทริบิวต์  แอตทริบิวต์นี้ถูกต้องตามกฎหมายภายใต้  | 
| includes | รายการสตริง ค่าเริ่มต้นคือ  -isystem path_to_package/include_entryควรใช้เฉพาะกับไลบรารีของบุคคลที่สามที่
ไม่ได้เป็นไปตามรูปแบบการเขียนคำสั่ง #include ของ Google
ซึ่งต่างจาก COPTS โดยระบบจะเพิ่มแฟล็กเหล่านี้สำหรับกฎนี้
และทุกกฎที่ขึ้นอยู่กับกฎนี้ (หมายเหตุ: ไม่ใช่กฎที่ขึ้นอยู่กับกฎนั้น) โปรด
ระมัดระวังเป็นอย่างยิ่ง เนื่องจากอาจส่งผลกระทบในวงกว้าง  หากไม่แน่ใจ ให้เพิ่ม Flag "-I" ไปยัง COPTS แทน
เส้นทาง  | 
| linkopts | รายการสตริง ค่าเริ่มต้นคือ  cc_binary.linkoptsแอตทริบิวต์linkoptsจะใช้กับเป้าหมายใดๆ ที่ขึ้นอยู่กับไลบรารีนี้โดยตรงหรือโดยอ้อมผ่านแอตทริบิวต์deps(หรือผ่านแอตทริบิวต์อื่นๆ ที่ได้รับการปฏิบัติในลักษณะเดียวกัน เช่น
แอตทริบิวต์mallocของcc_binary) ตัวเลือกการลิงก์การขึ้นต่อกัน
จะมีลำดับความสำคัญเหนือกว่าตัวเลือกการลิงก์ที่ขึ้นต่อกัน (เช่น ตัวเลือกการลิงก์การขึ้นต่อกัน
จะปรากฏในบรรทัดคำสั่งในภายหลัง) Linkopts ที่ระบุใน--linkoptจะมีผลเหนือกว่า Linkopts ของกฎ
โปรดทราบว่าแอตทริบิวต์  นอกจากนี้ โปรดทราบว่าระบบไม่รองรับตัวเลือก "-Wl,-soname" หรือ "-Xlinker -soname" และไม่ควรระบุในแอตทริบิวต์นี้  ไฟล์  | 
| linkstamp | ป้ายกำกับ ค่าเริ่มต้นคือ  baseแพ็กเกจ | 
| linkstatic | บูลีน ค่าเริ่มต้นคือ  cc_binaryและcc_test: ลิงก์ไบนารีในโหมดคงที่ สำหรับcc_library.link_staticโปรดดูด้านล่างโดยค่าเริ่มต้น ตัวเลือกนี้จะเปิดอยู่สำหรับ  
  หากเปิดใช้และเป็นไบนารีหรือการทดสอบ ตัวเลือกนี้จะบอกเครื่องมือบิลด์ให้ลิงก์ใน
   การลิงก์ไฟล์ที่เรียกใช้งานได้มี 3 วิธีหลักๆ ดังนี้ 
 
หากใช้แอตทริบิวต์  
แอตทริบิวต์  
ไม่ควรมีโค้ดที่สร้างด้วย  | 
| local_defines | รายการสตริง ค่าเริ่มต้นคือ  -Dและเพิ่มลงในบรรทัดคำสั่งคอมไพล์สำหรับเป้าหมายนี้
แต่จะไม่เพิ่มลงในเป้าหมายที่ขึ้นอยู่กับเป้าหมายนี้ | 
| module_interfaces | รายการป้ายกำกับ ค่าเริ่มต้นคือ  มาตรฐาน C++ ไม่ได้จำกัดนามสกุลไฟล์อินเทอร์เฟซของโมดูล 
 การใช้งานได้รับการป้องกันโดยแฟล็ก
 | 
| strip_include_prefix | สตริง ค่าเริ่มต้นคือ  เมื่อตั้งค่าแล้ว ส่วนหัวใน หากเป็นเส้นทางแบบสัมพัทธ์ ระบบจะถือว่าเป็นเส้นทางแบบสัมพัทธ์ของแพ็กเกจ หากเป็นเส้นทางสัมบูรณ์ ระบบจะถือว่าเป็นเส้นทางสัมพัทธ์ของที่เก็บ ระบบจะเพิ่มคำนำหน้าในแอตทริบิวต์  แอตทริบิวต์นี้ถูกต้องตามกฎหมายภายใต้  | 
| textual_hdrs | รายการป้ายกำกับ ค่าเริ่มต้นคือ  นี่คือตำแหน่งสำหรับการประกาศไฟล์ส่วนหัวที่คอมไพล์ด้วยตัวเองไม่ได้ กล่าวคือ ไฟล์เหล่านี้ต้องรวมอยู่ในไฟล์ต้นฉบับอื่นๆ เสมอเพื่อสร้างโค้ดที่ถูกต้อง | 
| win_def_file | ป้ายกำกับ ค่าเริ่มต้นคือ  ควรใช้แอตทริบิวต์นี้เมื่อ Windows เป็นแพลตฟอร์มเป้าหมายเท่านั้น ใช้เพื่อ ส่งออกสัญลักษณ์ระหว่างลิงก์ไลบรารีที่แชร์ได้ | 
cc_shared_library
ดูแหล่งที่มาของกฎcc_shared_library(name, deps, additional_linker_inputs, compatible_with, deprecation, distribs, dynamic_deps, exec_compatible_with, exec_properties, experimental_disable_topo_sort_do_not_use_remove_before_7_0, exports_filter, features, restricted_to, roots, shared_lib_name, static_deps, tags, target_compatible_with, testonly, toolchains, user_link_flags, visibility, win_def_file)
ซึ่งจะสร้างไลบรารีที่ใช้ร่วมกัน
ตัวอย่าง
cc_shared_library(
    name = "foo_shared",
    deps = [
        ":foo",
    ],
    dynamic_deps = [
        ":bar_shared",
    ],
    additional_linker_inputs = [
        ":foo.lds",
    ],
    user_link_flags = [
        "-Wl,--version-script=$(location :foo.lds)",
    ],
)
cc_library(
    name = "foo",
    srcs = ["foo.cc"],
    hdrs = ["foo.h"],
    deps = [
        ":bar",
        ":baz",
    ],
)
cc_shared_library(
    name = "bar_shared",
    shared_lib_name = "bar.so",
    deps = [":bar"],
)
cc_library(
    name = "bar",
    srcs = ["bar.cc"],
    hdrs = ["bar.h"],
)
cc_library(
    name = "baz",
    srcs = ["baz.cc"],
    hdrs = ["baz.h"],
)
ในตัวอย่าง foo_shared จะลิงก์แบบคงที่กับ foo
และ baz โดย baz เป็นการขึ้นต่อกันแบบทรานซิทีฟ ไม่ลิงก์ bar เนื่องจาก dynamic_dep bar_shared มีการระบุแบบไดนามิกอยู่แล้ว
foo_shared ใช้ไฟล์สคริปต์ของโปรแกรมลิงก์ *.lds เพื่อควบคุมว่าควรส่งออกสัญลักษณ์ใด ตรรกะของกฎ cc_shared_library ไม่ได้ควบคุมว่าจะส่งออกสัญลักษณ์ใด แต่จะใช้เฉพาะสิ่งที่คาดว่าจะส่งออกเพื่อแสดงข้อผิดพลาดในระยะการวิเคราะห์ หากไลบรารีที่แชร์ 2 รายการส่งออกเป้าหมายเดียวกัน
ระบบจะถือว่าการขึ้นต่อกันโดยตรงทั้งหมดของ cc_shared_library มีการส่งออก ดังนั้น Bazel จึงถือว่า foo ได้รับการส่งออกโดย foo_shared ในระหว่างการวิเคราะห์ foo_shared ไม่ได้ส่งออก baz
 ระบบจะถือว่าเป้าหมายทุกรายการที่ exports_filter
 ตรงกันจะได้รับการส่งออกด้วย
cc_library ทุกรายการในตัวอย่างควรปรากฏใน cc_shared_library ไม่เกิน 1 รายการ หากต้องการลิงก์ baz เข้ากับ
bar_shared ด้วย เราจะต้องเพิ่ม
tags = ["LINKABLE_MORE_THAN_ONCE"] ไปยัง baz
เนื่องจากแอตทริบิวต์ shared_lib_name ไฟล์ที่สร้างโดย
bar_shared จะมีชื่อเป็น bar.so ซึ่งแตกต่างจากชื่อ libbar.so ที่จะเป็นชื่อเริ่มต้นใน Linux
ข้อผิดพลาด
Two shared libraries in dependencies export the same symbols.
เหตุการณ์นี้จะเกิดขึ้นเมื่อใดก็ตามที่คุณสร้างเป้าหมายที่มีการอ้างอิง 2 รายการที่แตกต่างกันcc_shared_libraryซึ่งส่งออกเป้าหมายเดียวกัน หากต้องการแก้ไขปัญหานี้ คุณต้องหยุดการส่งออกไลบรารีในcc_shared_libraryการอ้างอิงรายการใดรายการหนึ่ง
Two shared libraries in dependencies link the same library statically
กรณีนี้จะเกิดขึ้นเมื่อใดก็ตามที่คุณสร้าง cc_shared_library ใหม่ที่มีการอ้างอิง cc_shared_library 2 รายการที่แตกต่างกันซึ่งลิงก์เป้าหมายเดียวกันแบบคงที่
คล้ายกับข้อผิดพลาดในการส่งออก
วิธีแก้ไขปัญหานี้วิธีหนึ่งคือการหยุดลิงก์ไลบรารีไปยังหนึ่งใน
cc_shared_library Dependency ในขณะเดียวกัน ผู้ที่ยังคงลิงก์อยู่
ต้องส่งออกไลบรารีเพื่อให้ผู้ที่ไม่ได้ลิงก์ยังคงมองเห็น
สัญลักษณ์ อีกวิธีหนึ่งคือการดึงไลบรารีที่สามซึ่งส่งออกเป้าหมาย
วิธีที่ 3 คือการแท็กผู้กระทำผิดcc_libraryด้วยLINKABLE_MORE_THAN_ONCE
แต่การแก้ไขนี้ไม่ควรเกิดขึ้นบ่อยนัก และคุณควรตรวจสอบให้แน่ใจว่าcc_libraryปลอดภัยที่จะลิงก์มากกว่า 1 ครั้ง
'//foo:foo' is already linked statically in '//bar:bar' but not exported`
ซึ่งหมายความว่าไลบรารีใน Transitive Closure ของ deps สามารถเข้าถึงได้
โดยไม่ต้องผ่านการอ้างอิง cc_shared_library รายการใดรายการหนึ่ง แต่มีการลิงก์
ไปยัง cc_shared_library อื่นใน dynamic_deps อยู่แล้วและไม่ได้
ส่งออก
วิธีแก้คือส่งออกจากcc_shared_libraryการอ้างอิงหรือดึงcc_shared_libraryบุคคลที่สามที่ส่งออก
Do not place libraries which only contain a precompiled dynamic library in deps.
หากคุณมีไลบรารีแบบไดนามิกที่คอมไพล์ไว้ล่วงหน้า คุณไม่จำเป็นต้องและไม่สามารถ
ลิงก์แบบคงที่กับcc_shared_libraryเป้าหมายปัจจุบันที่คุณ
กำลังสร้างได้ ดังนั้นจึงไม่ควรอยู่ในdepsของ
cc_shared_library หากไลบรารีแบบไดนามิกที่คอมไพล์ล่วงหน้านี้เป็นทรัพยากร Dependency ของcc_librariesรายการใดรายการหนึ่ง cc_libraryนั้นจะต้องขึ้นต่อกันกับไลบรารีดังกล่าวโดยตรง
Trying to export a library already exported by a different shared library
คุณจะเห็นข้อผิดพลาดนี้หากในกฎปัจจุบัน คุณอ้างว่าต้องการส่งออกเป้าหมายที่การอ้างอิงแบบไดนามิกรายการใดรายการหนึ่งของคุณส่งออกอยู่แล้ว
หากต้องการแก้ไขปัญหานี้ ให้นำเป้าหมายออกจาก deps และใช้เฉพาะเป้าหมายจาก
การอ้างอิงแบบไดนามิก หรือตรวจสอบว่า exports_filter ไม่ได้จับเป้าหมายนี้
อาร์กิวเมนต์
| Attributes | |
|---|---|
| name | ชื่อ (ต้องระบุ) ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ | 
| deps | รายการป้ายกำกับ ค่าเริ่มต้นคือ  
การขึ้นต่อกันของไลบรารีแบบทรานซิทีฟของการขึ้นต่อกันโดยตรงเหล่านี้จะลิงก์ไปยังไลบรารีที่ใช้ร่วมกันนี้
ตราบใดที่ยังไม่ได้ลิงก์โดย  
ในระหว่างการวิเคราะห์ การติดตั้งใช้งานกฎจะพิจารณาเป้าหมายที่ระบุใน
 
การใช้งานจะทําให้เกิดข้อผิดพลาดทุกครั้งที่มีการลิงก์ไลบรารีเดียวกันแบบคงที่
ใน  | 
| additional_linker_inputs | รายการป้ายกำกับ ค่าเริ่มต้นคือ  user_link_flags | 
| dynamic_deps | รายการป้ายกำกับ ค่าเริ่มต้นคือ  cc_shared_libraryอื่นๆ ที่เป้าหมายปัจจุบันขึ้นอยู่กับ
การติดตั้งใช้งาน  | 
| experimental_disable_topo_sort_do_not_use_remove_before_7_0 | บูลีน ค่าเริ่มต้นคือ  | 
| exports_filter | รายการสตริง ค่าเริ่มต้นคือ  
ระบบจะถือว่าไลบรารีที่ใช้ร่วมกันจะส่งออกเป้าหมาย  
โปรดทราบว่าแอตทริบิวต์นี้ไม่ได้เพิ่มขอบการอ้างอิงไปยังเป้าหมายเหล่านั้นจริงๆ แต่ เราอนุญาตให้ใช้ไวยากรณ์ต่อไปนี้ 
 
 | 
| roots | รายการป้ายกำกับ ค่าเริ่มต้นคือ  | 
| shared_lib_name | สตริง ค่าเริ่มต้นคือ  | 
| static_deps | รายการสตริง ค่าเริ่มต้นคือ  | 
| user_link_flags | รายการสตริง ค่าเริ่มต้นคือ   | 
| win_def_file | ป้ายกำกับ ค่าเริ่มต้นคือ  ควรใช้แอตทริบิวต์นี้เมื่อ Windows เป็นแพลตฟอร์มเป้าหมายเท่านั้น ใช้เพื่อ ส่งออกสัญลักษณ์ระหว่างลิงก์ไลบรารีที่แชร์ได้ | 
cc_static_library
ดูแหล่งที่มาของกฎcc_static_library(name, deps, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
--experimental_cc_static_library เท่านั้น
สร้างไลบรารีแบบคงที่จากรายการเป้าหมายและการขึ้นต่อกันแบบทรานซิทีฟ
ไลบรารีแบบคงที่ที่ได้จะมีไฟล์ออบเจ็กต์ของเป้าหมายที่ระบุไว้ใน
deps รวมถึงการขึ้นต่อกันแบบทรานซิทีฟ โดยจะให้ความสำคัญกับออบเจ็กต์ PIC
กลุ่มเอาต์พุต
linkdeps
ไฟล์ข้อความที่มีป้ายกำกับของทรัพยากร Dependency แบบทรานซิทีฟของเป้าหมายที่แสดงใน
deps ซึ่งไม่ได้มีส่วนร่วมในไฟล์ออบเจ็กต์ใดๆ กับไลบรารีแบบคงที่ แต่มี
ไลบรารีแบบคงที่ แบบไดนามิก หรืออินเทอร์เฟซอย่างน้อย 1 รายการ ไลบรารีแบบคงที่ที่ได้
อาจกำหนดให้ไลบรารีเหล่านี้พร้อมใช้งานในเวลาลิงก์
linkopts
ไฟล์ข้อความที่มี linkopts ที่ผู้ใช้ระบุของ
การอ้างอิงแบบทรานซิทีฟทั้งหมดของเป้าหมายที่ระบุไว้ใน deps
สัญลักษณ์ซ้ำ
โดยค่าเริ่มต้น cc_static_library กฎจะตรวจสอบว่าไลบรารีแบบคงที่ที่ได้ไม่มีสัญลักษณ์ที่ซ้ำกัน หากมี บิลด์จะล้มเหลวพร้อมข้อความแสดงข้อผิดพลาด
ที่แสดงรายการสัญลักษณ์ที่ซ้ำกันและไฟล์ออบเจ็กต์ที่มีสัญลักษณ์เหล่านั้น
คุณปิดใช้การตรวจสอบนี้ต่อเป้าหมายหรือต่อแพ็กเกจได้โดยตั้งค่า
features = ["-symbol_check"] หรือปิดใช้ทั่วโลกผ่าน
--features=-symbol_check
การรองรับ Toolchain สำหรับ symbol_check
ชุดเครื่องมือ C++ ที่กำหนดค่าอัตโนมัติซึ่งมาพร้อมกับ Bazel รองรับฟีเจอร์
symbol_checkในทุกแพลตฟอร์ม Toolchain ที่กำหนดเองสามารถเพิ่มการรองรับ
ได้ 2 วิธีดังนี้
- การใช้การดำเนินการ ACTION_NAMES.validate_static_libraryและ การเปิดใช้ด้วยฟีเจอร์symbol_checkชุดเครื่องมือที่ตั้งค่าไว้ในการดำเนินการจะ เรียกใช้ด้วยอาร์กิวเมนต์ 2 รายการ ได้แก่ ไลบรารีแบบคงที่ที่จะตรวจสอบสัญลักษณ์ที่ซ้ำกัน และ เส้นทางของไฟล์ที่ต้องสร้างหากการตรวจสอบผ่าน
- มีsymbol_checkฟีเจอร์ที่เพิ่มแฟล็กของโปรแกรมเก็บถาวรซึ่งทำให้การดำเนินการสร้างไลบรารีแบบคงที่ล้มเหลวเนื่องจากมีสัญลักษณ์ที่ซ้ำกัน
อาร์กิวเมนต์
| Attributes | |
|---|---|
| name | ชื่อ (ต้องระบุ) ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ | 
| deps | รายการป้ายกำกับ ค่าเริ่มต้นคือ  Dependency ที่ไม่ได้ระบุไฟล์ออบเจ็กต์จะไม่รวมอยู่ในไลบรารีแบบคงที่ แต่ระบบจะรวบรวมป้ายกำกับของ Dependency เหล่านั้นไว้ในไฟล์ที่จัดทำโดยกลุ่มเอาต์พุต  | 
cc_test
ดูแหล่งที่มาของกฎcc_test(name, deps, srcs, data, additional_linker_inputs, args, compatible_with, conlyopts, copts, cxxopts, defines, deprecation, distribs, dynamic_deps, env, env_inherit, exec_compatible_with, exec_properties, features, flaky, hdrs_check, includes, licenses, link_extra_lib, linkopts, linkshared, linkstatic, local, local_defines, malloc, module_interfaces, nocopts, reexport_deps, restricted_to, shard_count, size, stamp, tags, target_compatible_with, testonly, timeout, toolchains, visibility, win_def_file)
cc_test() กฎจะคอมไพล์การทดสอบ  ในที่นี้ เทสต์
คือ Wrapper แบบไบนารีที่ครอบโค้ดการทดสอบบางส่วน
โดยค่าเริ่มต้น การทดสอบ C++ จะลิงก์แบบไดนามิก
    หากต้องการลิงก์แบบคงที่กับ Unit Test ให้ระบุ
    linkstatic=True
    คุณควรแสดงความคิดเห็นว่าทำไมการทดสอบจึงต้องมีlinkstatic เนื่องจากอาจไม่ชัดเจน
เป้าหมายเอาต์พุตโดยนัย
- name.stripped(สร้างขึ้นเฉพาะในกรณีที่มีการขออย่างชัดเจน): ไบนารีเวอร์ชันที่ไม่มีข้อมูลการแก้ไขข้อบกพร่อง- strip -gจะทำงานในไบนารีเพื่อนำสัญลักษณ์การแก้ไขข้อบกพร่องออก คุณระบุตัวเลือกการลบเพิ่มเติมได้ในบรรทัดคำสั่งโดยใช้- --stripopt=-foo
- name.dwp(สร้างขึ้นเฉพาะในกรณีที่มีการขออย่างชัดเจน): หากเปิดใช้ Fission จะมีไฟล์แพ็กเกจข้อมูลการแก้ไขข้อบกพร่องที่เหมาะสำหรับการแก้ไขข้อบกพร่องของไบนารีที่ติดตั้งใช้งานจากระยะไกล หรือไฟล์ว่าง
ดูอาร์กิวเมนต์ cc_binary() ยกเว้นว่า
อาร์กิวเมนต์ stamp จะตั้งค่าเป็น 0 โดยค่าเริ่มต้นสำหรับการทดสอบ และ
cc_test มี
แอตทริบิวต์เพิ่มเติมที่ใช้ร่วมกันในกฎการทดสอบทั้งหมด (*_test)
อาร์กิวเมนต์
| Attributes | |
|---|---|
| name | ชื่อ (ต้องระบุ) ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ | 
| deps | รายการป้ายกำกับ ค่าเริ่มต้นคือ  ซึ่งอาจเป็นเป้าหมาย  | 
| srcs | รายการป้ายกำกับ ค่าเริ่มต้นคือ  ระบบจะคอมไพล์ไฟล์  ไฟล์แอสเซมบลีแบบเพียว (.s, .asm) จะไม่ได้รับการประมวลผลล่วงหน้า และโดยปกติจะสร้างขึ้นโดยใช้แอสเซมเบลอร์ ไฟล์แอสเซมบลีที่ประมวลผลล่วงหน้า (.S) จะได้รับการประมวลผลล่วงหน้าและโดยทั่วไปจะสร้างขึ้นโดยใช้คอมไพเลอร์ C/C++ ระบบจะไม่คอมไพล์ไฟล์  ต้องมีการกล่าวถึงไฟล์  ไฟล์  หากแอตทริบิวต์  
   
 
  ... และกฎใดๆ ที่สร้างไฟล์เหล่านั้น (เช่น  | 
| data | รายการป้ายกำกับ ค่าเริ่มต้นคือ  dataที่แอตทริบิวต์ทั่วไปที่กำหนดโดย
กฎการสร้างส่วนใหญ่หาก  หาก  โค้ด C++ สามารถเข้าถึงไฟล์ข้อมูลเหล่านี้ได้ดังนี้  | 
| additional_linker_inputs | รายการป้ายกำกับ ค่าเริ่มต้นคือ  เช่น คุณระบุไฟล์ .res ของ Windows ที่คอมไพล์แล้วได้ที่นี่เพื่อฝังใน เป้าหมายไบนารี | 
| conlyopts | รายการสตริง ค่าเริ่มต้นคือ  | 
| copts | รายการสตริง ค่าเริ่มต้นคือ  
  ระบบจะเพิ่มสตริงแต่ละรายการในแอตทริบิวต์นี้ตามลำดับที่ระบุไปยัง  
  หากแพ็กเกจประกาศฟีเจอร์
   | 
| cxxopts | รายการสตริง ค่าเริ่มต้นคือ  | 
| defines | รายการสตริง ค่าเริ่มต้นคือ  -Dและเพิ่มลงในบรรทัดคำสั่งคอมไพล์ไปยังเป้าหมายนี้
รวมถึงทุกกฎที่ขึ้นอยู่กับเป้าหมายนี้ โปรดใช้ความระมัดระวังอย่างยิ่ง เนื่องจากอาจส่งผลกระทบในวงกว้าง
  หากไม่แน่ใจ ให้เพิ่มค่าที่กำหนดไว้ในlocal_definesแทน | 
| dynamic_deps | รายการป้ายกำกับ ค่าเริ่มต้นคือ  cc_shared_libraryอื่นๆ ที่เป้าหมายปัจจุบันขึ้นอยู่กับ
การติดตั้งใช้งาน  | 
| hdrs_check | สตริง ค่าเริ่มต้นคือ  | 
| includes | รายการสตริง ค่าเริ่มต้นคือ  -isystem path_to_package/include_entryควรใช้เฉพาะกับไลบรารีของบุคคลที่สามที่
ไม่ได้เป็นไปตามรูปแบบการเขียนคำสั่ง #include ของ Google
ซึ่งต่างจาก COPTS โดยระบบจะเพิ่มแฟล็กเหล่านี้สำหรับกฎนี้
และทุกกฎที่ขึ้นอยู่กับกฎนี้ (หมายเหตุ: ไม่ใช่กฎที่ขึ้นอยู่กับกฎนั้น) โปรด
ระมัดระวังเป็นอย่างยิ่ง เนื่องจากอาจส่งผลกระทบในวงกว้าง  หากไม่แน่ใจ ให้เพิ่ม Flag "-I" ไปยัง COPTS แทน
เส้นทาง  | 
| link_extra_lib | ป้ายกำกับ ค่าเริ่มต้นคือ  
    โดยค่าเริ่มต้น ไบนารี C++ จะลิงก์กับ  | 
| linkopts | รายการสตริง ค่าเริ่มต้นคือ  LINKOPTSก่อน
ลิงก์เป้าหมายไบนารี
    องค์ประกอบแต่ละรายการในรายการนี้ที่ไม่ได้ขึ้นต้นด้วย  | 
| linkshared | บูลีน ค่าเริ่มต้นคือ  linkshared=Trueในกฎ โดยค่าเริ่มต้น
ตัวเลือกนี้จะปิดอยู่
  การมีแฟล็กนี้หมายความว่าการลิงก์เกิดขึ้นพร้อมกับแฟล็ก  
  หากคุณระบุทั้ง  | 
| linkstatic | บูลีน ค่าเริ่มต้นคือ  cc_binaryและcc_test: ลิงก์ไบนารีในโหมดคงที่ สำหรับcc_library.link_staticโปรดดูด้านล่างโดยค่าเริ่มต้น ตัวเลือกนี้จะเปิดอยู่สำหรับ  
  หากเปิดใช้และเป็นไบนารีหรือการทดสอบ ตัวเลือกนี้จะบอกเครื่องมือบิลด์ให้ลิงก์ใน
   การลิงก์ไฟล์ที่เรียกใช้งานได้มี 3 วิธีหลักๆ ดังนี้ 
 
หากใช้แอตทริบิวต์  
แอตทริบิวต์  
ไม่ควรมีโค้ดที่สร้างด้วย  | 
| local_defines | รายการสตริง ค่าเริ่มต้นคือ  -Dและเพิ่มลงในบรรทัดคำสั่งคอมไพล์สำหรับเป้าหมายนี้
แต่จะไม่เพิ่มลงในเป้าหมายที่ขึ้นอยู่กับเป้าหมายนี้ | 
| malloc | ป้ายกำกับ ค่าเริ่มต้นคือ  
  โดยค่าเริ่มต้น ไบนารี C++ จะลิงก์กับ  | 
| module_interfaces | รายการป้ายกำกับ ค่าเริ่มต้นคือ  มาตรฐาน C++ ไม่ได้จำกัดนามสกุลไฟล์อินเทอร์เฟซของโมดูล 
 การใช้งานได้รับการป้องกันโดยแฟล็ก
 | 
| nocopts | สตริง ค่าเริ่มต้นคือ  COPTSที่มีอยู่ก่อนแล้วซึ่งตรงกับนิพจน์ทั่วไปนี้
(รวมถึงค่าที่ระบุอย่างชัดเจนในแอตทริบิวต์ copts ของกฎ)
จะถูกนำออกจากCOPTSเพื่อวัตถุประสงค์ในการรวบรวมกฎนี้
ไม่ควรต้องใช้แอตทริบิวต์นี้ภายนอกthird_partyระบบจะไม่ประมวลผลค่าล่วงหน้า
ในลักษณะใดๆ นอกเหนือจากการแทนที่ตัวแปร "Make" | 
| reexport_deps | รายการป้ายกำกับ ค่าเริ่มต้นคือ  | 
| stamp | จำนวนเต็ม ค่าเริ่มต้นคือ  
 ระบบจะไม่สร้างไบนารีที่ประทับเวลาใหม่ เว้นแต่ว่ามีการเปลี่ยนแปลงในทรัพยากร Dependency | 
| win_def_file | ป้ายกำกับ ค่าเริ่มต้นคือ  ควรใช้แอตทริบิวต์นี้เมื่อ Windows เป็นแพลตฟอร์มเป้าหมายเท่านั้น ใช้เพื่อ ส่งออกสัญลักษณ์ระหว่างลิงก์ไลบรารีที่แชร์ได้ | 
cc_toolchain
ดูแหล่งที่มาของกฎcc_toolchain(name, all_files, ar_files, as_files, compatible_with, compiler_files, compiler_files_without_includes, coverage_files, deprecation, distribs, dwp_files, dynamic_runtime_lib, exec_compatible_with, exec_properties, exec_transition_for_inputs, features, libc_top, licenses, linker_files, module_map, objcopy_files, output_licenses, restricted_to, static_runtime_lib, strip_files, supports_header_parsing, supports_param_files, tags, target_compatible_with, testonly, toolchain_config, toolchain_identifier, toolchains, visibility)
แสดงถึงเครื่องมือ C++
กฎนี้มีหน้าที่รับผิดชอบในเรื่องต่อไปนี้
- 
      รวบรวมอาร์ติแฟกต์ทั้งหมดที่จำเป็นสำหรับการดำเนินการ C++ เพื่อเรียกใช้ ซึ่งทำได้โดยใช้แอตทริบิวต์ เช่น all_files,compiler_files,linker_filesหรือแอตทริบิวต์อื่นๆ ที่ลงท้ายด้วย_files) โดยส่วนใหญ่แล้วจะเป็นรูปแบบ glob ของกลุ่มไฟล์ที่รวมไฟล์ที่จำเป็นทั้งหมด
- 
      สร้างบรรทัดคำสั่งที่ถูกต้องสำหรับการดำเนินการ C++ ซึ่งทำได้โดยใช้
      CcToolchainConfigInfo(ดูรายละเอียดด้านล่าง)
  ใช้แอตทริบิวต์ toolchain_config เพื่อกำหนดค่าเครื่องมือ C++
  ดูเอกสารประกอบการกำหนดค่าเชนเครื่องมือ C++ และการเลือกเชนเครื่องมือโดยละเอียดได้ที่
  
    หน้า
  นี้
  ใช้ tags = ["manual"] เพื่อป้องกันไม่ให้สร้างและกำหนดค่า Toolchain
  โดยไม่จำเป็นเมื่อเรียกใช้ bazel build //...
อาร์กิวเมนต์
| Attributes | |
|---|---|
| name | ชื่อ (ต้องระบุ) ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ | 
| all_files | ป้ายกำกับ (ต้องระบุ)คอลเล็กชันของอาร์ติแฟกต์ cc_toolchain ทั้งหมด ระบบจะเพิ่มอาร์ติแฟกต์เหล่านี้เป็นอินพุตในการดำเนินการทั้งหมดที่เกี่ยวข้องกับ rules_cc (ยกเว้นการดำเนินการที่ใช้ชุดอาร์ติแฟกต์ที่แม่นยำกว่าจากแอตทริบิวต์ด้านล่าง) Bazel ถือว่า all_filesเป็นซูเปอร์เซ็ต
ของแอตทริบิวต์อื่นๆ ทั้งหมดที่ให้ผลลัพธ์ (เช่น การคอมไพล์ linkstamp ต้องใช้ทั้งไฟล์คอมไพล์
และไฟล์ลิงก์ จึงใช้all_files)
ซึ่งเป็นสิ่งที่  | 
| ar_files | ป้ายกำกับ ค่าเริ่มต้นคือ  | 
| as_files | ป้ายกำกับ ค่าเริ่มต้นคือ  | 
| compiler_files | ป้ายกำกับ (ต้องระบุ)รวบรวมอาร์ติแฟกต์ cc_toolchain ทั้งหมดที่จำเป็นสำหรับการดำเนินการคอมไพล์ | 
| compiler_files_without_includes | ป้ายกำกับ ค่าเริ่มต้นคือ  | 
| coverage_files | ป้ายกำกับ ค่าเริ่มต้นคือ  | 
| dwp_files | ป้ายกำกับ (ต้องระบุ)รวบรวมอาร์ติแฟกต์ cc_toolchain ทั้งหมดที่จำเป็นสำหรับการดำเนินการ dwp | 
| dynamic_runtime_lib | ป้ายกำกับ ค่าเริ่มต้นคือ  ระบบจะใช้ตัวเลือกนี้เมื่อเปิดใช้ฟีเจอร์ "static_link_cpp_runtimes" และเราลิงก์ การอ้างอิงแบบไดนามิก | 
| exec_transition_for_inputs | บูลีน ค่าเริ่มต้นคือ  | 
| libc_top | ป้ายกำกับ ค่าเริ่มต้นคือ  | 
| linker_files | ป้ายกำกับ (ต้องระบุ)รวบรวมอาร์ติแฟกต์ cc_toolchain ทั้งหมดที่จำเป็นสำหรับการดำเนินการลิงก์ | 
| module_map | ป้ายกำกับ ค่าเริ่มต้นคือ  | 
| objcopy_files | ป้ายกำกับ (ต้องระบุ)รวบรวมอาร์ติแฟกต์ cc_toolchain ทั้งหมดที่จำเป็นสำหรับการดำเนินการ objcopy | 
| output_licenses | รายการสตริง ค่าเริ่มต้นคือ  | 
| static_runtime_lib | ป้ายกำกับ ค่าเริ่มต้นคือ  โดยจะใช้เมื่อเปิดใช้ฟีเจอร์ "static_link_cpp_runtimes" และเราลิงก์ การอ้างอิงแบบคงที่ | 
| strip_files | ป้ายกำกับ (ต้องระบุ)รวบรวมอาร์ติแฟกต์ cc_toolchain ทั้งหมดที่จำเป็นสำหรับการดำเนินการ strip | 
| supports_header_parsing | บูลีน ค่าเริ่มต้นคือ  | 
| supports_param_files | บูลีน ค่าเริ่มต้นคือ  | 
| toolchain_config | ป้ายกำกับ (ต้องระบุ)ป้ายกำกับของกฎที่ระบุ cc_toolchain_config_info | 
| toolchain_identifier | สตริง ค่าเริ่มต้นคือ  
  จนกว่าปัญหา #5380 จะได้รับการแก้ไข
  วิธีนี้เป็นวิธีที่แนะนำในการเชื่อมโยง  | 
cc_toolchain_suite
ดูแหล่งที่มาของกฎcc_toolchain_suite(name, compatible_with, deprecation, distribs, features, licenses, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
เลิกใช้งานแล้ว: กฎนี้ไม่มีผลและจะถูกนำออก
อาร์กิวเมนต์
| Attributes | |
|---|---|
| name | ชื่อ (ต้องระบุ) ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ | 
fdo_prefetch_hints
ดูแหล่งที่มาของกฎfdo_prefetch_hints(name, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, profile, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
แสดงถึงโปรไฟล์คำแนะนำการดึงข้อมูลล่วงหน้าของ FDO ที่อยู่ในพื้นที่ทำงาน ตัวอย่าง
fdo_prefetch_hints(
    name = "hints",
    profile = "//path/to/hints:profile.afdo",
)
อาร์กิวเมนต์
| Attributes | |
|---|---|
| name | ชื่อ (ต้องระบุ) ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ | 
| profile | ป้ายกำกับ (ต้องระบุ)ป้ายกำกับของโปรไฟล์คำใบ้ ไฟล์คำแนะนำมีนามสกุล .afdo ป้ายกำกับยังชี้ไปยังกฎ fdo_absolute_path_profile ได้ด้วย | 
fdo_profile
ดูแหล่งที่มาของกฎfdo_profile(name, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, memprof_profile, profile, proto_profile, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
แสดงโปรไฟล์ FDO ที่อยู่ในพื้นที่ทำงาน ตัวอย่าง
fdo_profile(
    name = "fdo",
    profile = "//path/to/fdo:profile.zip",
)
อาร์กิวเมนต์
| Attributes | |
|---|---|
| name | ชื่อ (ต้องระบุ) ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ | 
| memprof_profile | ป้ายกำกับ ค่าเริ่มต้นคือ  | 
| profile | ป้ายกำกับ (ต้องระบุ)ป้ายกำกับของโปรไฟล์ FDO หรือกฎที่สร้างโปรไฟล์ ไฟล์ FDO อาจมีนามสกุลต่อไปนี้ .profraw สำหรับโปรไฟล์ LLVM ที่ไม่ได้จัดทำดัชนี, .profdata สำหรับโปรไฟล์ LLVM ที่จัดทำดัชนี, .zip ที่มีโปรไฟล์ LLVM profraw, .afdo สำหรับโปรไฟล์ AutoFDO, .xfdo สำหรับ โปรไฟล์ XBinary ป้ายกำกับยังชี้ไปยังกฎ fdo_absolute_path_profile ได้ด้วย | 
| proto_profile | ป้ายกำกับ ค่าเริ่มต้นคือ  | 
memprof_profile
ดูแหล่งที่มาของกฎmemprof_profile(name, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, profile, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
แสดงโปรไฟล์ MEMPROF ที่อยู่ในพื้นที่ทำงาน ตัวอย่าง
memprof_profile(
    name = "memprof",
    profile = "//path/to/memprof:profile.afdo",
)
อาร์กิวเมนต์
| Attributes | |
|---|---|
| name | ชื่อ (ต้องระบุ) ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ | 
| profile | ป้ายกำกับ (ต้องระบุ)ป้ายกำกับของโปรไฟล์ MEMPROF โปรไฟล์ควรมีนามสกุล .profdata (สำหรับโปรไฟล์ memprof ที่จัดทำดัชนี/มีสัญลักษณ์) หรือนามสกุล .zip สำหรับไฟล์ ZIP ที่มีไฟล์ memprof.profdata ป้ายกำกับยังชี้ไปยังกฎ fdo_absolute_path_profile ได้ด้วย | 
propeller_optimize
ดูแหล่งที่มาของกฎpropeller_optimize(name, cc_profile, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, ld_profile, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)
แสดงโปรไฟล์การเพิ่มประสิทธิภาพของ Propeller ในพื้นที่ทำงาน ตัวอย่าง
propeller_optimize(
    name = "layout",
    cc_profile = "//path:cc_profile.txt",
    ld_profile = "//path:ld_profile.txt"
)
อาร์กิวเมนต์
| Attributes | |
|---|---|
| name | ชื่อ (ต้องระบุ) ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ | 
| cc_profile | ป้ายกำกับ (ต้องระบุ)ป้ายกำกับของโปรไฟล์ที่ส่งไปยังการดำเนินการคอมไพล์ต่างๆ ไฟล์นี้มีนามสกุล .txt | 
| ld_profile | ป้ายกำกับ (ต้องระบุ)ป้ายกำกับของโปรไฟล์ที่ส่งไปยังการดำเนินการลิงก์ ไฟล์นี้มีนามสกุล .txt |