กฎ C / C++

กฎ

cc_binary

cc_binary(name, deps, srcs, data, additional_linker_inputs, args, compatible_with, copts, defines, deprecation, distribs, env, exec_compatible_with, exec_properties, features, includes, licenses, linkopts, linkshared, linkstatic, local_defines, malloc, nocopts, output_licenses, restricted_to, stamp, tags, target_compatible_with, testonly, toolchains, visibility, win_def_file)

เป้าหมายเอาต์พุตโดยนัย

  • name.stripped (สร้างเฉพาะเมื่อขออย่างชัดแจ้ง): ไบนารีเวอร์ชันที่ถูกตัดออก จะมีการเรียกใช้ strip -g ในไบนารีเพื่อนำสัญลักษณ์การแก้ไขข้อบกพร่องออก คุณระบุตัวเลือกแถบเพิ่มเติมในบรรทัดคำสั่งได้โดยใช้ --stripopt=-foo ระบบจะสร้างเอาต์พุตนี้ก็ต่อเมื่อมีการขออย่างชัดแจ้งเท่านั้น
  • name.dwp (สร้างเมื่อมีการขออย่างชัดแจ้งเท่านั้น): หากเปิดใช้ Fission อยู่: ไฟล์แพ็กเกจข้อมูลการแก้ไขข้อบกพร่องที่เหมาะสำหรับการแก้ไขข้อบกพร่องไบนารีที่ใช้งานจากระยะไกล อื่นๆ: ไฟล์เปล่า

อาร์กิวเมนต์

Attributes
name

Name; required

ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้

deps

List of labels; optional

รายการไลบรารีอื่นๆ ที่จะลิงก์กับเป้าหมายไบนารี

ซึ่งอาจเป็นเป้าหมาย cc_library หรือ objc_library ก็ได้

srcs

List of labels; optional

รายการไฟล์ C และ C++ ที่ประมวลผลเพื่อสร้างเป้าหมาย ไฟล์เหล่านี้เป็นไฟล์ต้นฉบับและส่วนหัว C/C++ ซึ่งอาจไม่ได้สร้างขึ้น (ซอร์สโค้ดปกติ) หรือสร้างขึ้น

ระบบจะคอมไพล์ไฟล์ .cc, .c และ .cpp ทั้งหมด ไฟล์เหล่านี้อาจสร้างขึ้น หากไฟล์ที่ตั้งชื่ออยู่ใน outs ของกฎอื่น กฎนี้จะขึ้นอยู่กับกฎอื่นนั้นโดยอัตโนมัติ

ระบบจะไม่คอมไพล์ไฟล์ .h แต่จะรวมตามแหล่งที่มาในกฎนี้ได้ ทั้งไฟล์ .cc และ .h จะมีส่วนหัวที่ระบุไว้ใน srcs เหล่านี้หรือใน hdrs ของกฎใดก็ได้ที่แสดงอยู่ในอาร์กิวเมนต์ deps

ต้องพูดถึงไฟล์ทั้งหมด #included ไฟล์ในแอตทริบิวต์ srcs ของกฎนี้ หรือในแอตทริบิวต์ hdrs ของ cc_library() ที่อ้างอิง รูปแบบที่แนะนำคือสำหรับส่วนหัวที่เชื่อมโยงกับไลบรารีที่จะแสดงในแอตทริบิวต์ hdrs ของไลบรารีนั้น และส่วนหัวที่เหลือทั้งหมดที่เชื่อมโยงกับแหล่งที่มาของกฎนี้จะแสดงใน srcs ดูรายละเอียดเพิ่มเติมได้ใน "การตรวจสอบการรวมส่วนหัว"

หากชื่อของกฎอยู่ใน srcs กฎนี้จะอิงตามกฎดังกล่าวโดยอัตโนมัติ หาก outs ของกฎที่มีชื่อเป็นไฟล์ต้นฉบับ C หรือ C++ ระบบจะรวบรวมไฟล์เหล่านั้นไว้ในกฎนี้ หากเป็นไฟล์ไลบรารี ไฟล์ก็จะลิงก์กันเข้ามา

ไฟล์ที่อนุญาต srcs ประเภท:

  • ไฟล์ต้นฉบับ C และ C++: .c, .cc, .cpp, .cxx, .c++, .C
  • ไฟล์ส่วนหัว C และ C++: .h, .hh, .hpp, .hxx, .inc, .inl, .H
  • Assembler with C Preprocessor: .S
  • ที่เก็บถาวร: .a, .pic.a
  • ไลบรารี "ลิงก์เสมอ": .lo, .pic.lo
  • ไลบรารีที่ใช้ร่วมกัน มีเวอร์ชันหรือไม่กำหนดเวอร์ชัน: .so, .so.version
  • ไฟล์ออบเจ็กต์: .o, .pic.o

...และกฎต่างๆ ที่สร้างไฟล์เหล่านี้ ส่วนขยายที่ต่างกันจะบ่งชี้ภาษาโปรแกรมที่ต่างกันตามธรรมเนียมของ GCC

additional_linker_inputs

List of labels; optional

ส่งผ่านไฟล์เหล่านี้ไปยังคำสั่ง Linker C++

เช่น ไฟล์ .res ของ Windows ที่คอมไพล์อาจจะมีให้ที่นี่เพื่อฝังลงในเป้าหมายไบนารี

copts

List of strings; optional

เพิ่มตัวเลือกเหล่านี้ในคำสั่งการคอมไพล์ C++ ขึ้นอยู่กับการแทนที่ "สร้างตัวแปร" และการแปลงข้อมูลเป็นโทเค็นของ Bourne shell

ระบบจะเพิ่มสตริงแต่ละรายการในแอตทริบิวต์นี้ตามลำดับที่กำหนดไปยัง COPTS ก่อนคอมไพล์เป้าหมายไบนารี แฟล็กจะมีผลกับการคอมไพล์เป้าหมายนี้เท่านั้น ไม่ใช่ทรัพยากร Dependency ของ URL นั้นๆ ดังนั้นโปรดระมัดระวังเกี่ยวกับไฟล์ส่วนหัวที่รวมอยู่ที่อื่นด้วย เส้นทางทั้งหมดควรสัมพัทธ์กับพื้นที่ทำงาน ไม่ใช่แพ็กเกจปัจจุบัน

หากแพ็กเกจประกาศฟีเจอร์ no_copts_tokenization การแปลงเป็นโทเค็นของ Bourne shell จะมีผลกับสตริงที่มีตัวแปร "Make" เพียงรายการเดียวเท่านั้น

defines

List of strings; optional

รายการกำหนดที่จะเพิ่มในบรรทัดคอมไพล์ ขึ้นอยู่กับการแทนที่ ตัวแปร"Make" และการแปลงข้อมูลเป็นโทเค็นของ Bourne shell แต่ละสตริงต้องประกอบด้วยโทเค็น Bourne Shell รายการเดียว ระบบจะใส่ -D ไว้หน้าและเพิ่มลงในบรรทัดคำสั่งคอมไพล์ให้กับเป้าหมายนี้ รวมถึงกฎทั้งหมดที่ต้องใช้โทเค็นดังกล่าว โปรดใช้ความระมัดระวังให้มาก เนื่องจากอาจส่งผลกระทบในวงกว้าง หากไม่แน่ใจ ให้เพิ่มการกําหนดค่าลงใน local_defines แทน
includes

List of strings; optional

รายการรวมไดเรกทอรีที่จะเพิ่มลงในบรรทัดคอมไพล์

ขึ้นอยู่กับการแทนที่ "สร้างตัวแปร" แต่ละสตริงจะใส่ -isystem ไว้หน้าและเพิ่มลงใน COPTS ระบบจะเพิ่มแฟล็กเหล่านี้สำหรับกฎนี้และทุกกฎที่ขึ้นอยู่กับ COPTS (หมายเหตุ: ไม่ใช่กฎเกณฑ์จะขึ้นอยู่กับ) โปรดใช้ความระมัดระวังให้มาก เนื่องจากอาจส่งผลกระทบในวงกว้าง หากไม่แน่ใจ ให้เพิ่มแฟล็ก "-I" ใน COPTS แทน

ต้องเพิ่มส่วนหัวลงใน srcs หรือ hdrs ไม่เช่นนั้นจะใช้ไม่ได้กับกฎที่เกี่ยวข้องเมื่อการคอมไพล์เป็นแซนด์บ็อกซ์ (ค่าเริ่มต้น)

linkopts

List of strings; optional

เพิ่มแฟล็กเหล่านี้ไปยังคำสั่ง Linker C++ ขึ้นอยู่กับการแทนที่ ตัวแปร"Make" การแปลงข้อมูลเป็นโทเค็นของ Bourne shell และ การขยายป้ายกำกับ ระบบจะเพิ่มสตริงแต่ละรายการในแอตทริบิวต์นี้ลงใน LINKOPTS ก่อนลิงก์เป้าหมายไบนารี

ระบบจะถือว่าแต่ละองค์ประกอบในรายการนี้ที่ไม่ได้ขึ้นต้นด้วย $ หรือ - เป็นป้ายกำกับของเป้าหมายใน deps รายการไฟล์ที่เป้าหมายนั้นสร้างขึ้นจะต่อท้ายตัวเลือก Linker ระบบจะรายงานข้อผิดพลาดหากป้ายกำกับไม่ถูกต้องหรือไม่ได้ประกาศไว้ใน deps

linkshared

Boolean; optional; nonconfigurable; default is False

สร้างไลบรารีที่ใช้ร่วมกัน หากต้องการเปิดใช้แอตทริบิวต์นี้ ให้ใส่ linkshared=True ไว้ในกฎ ตัวเลือกนี้จะปิดอยู่โดยค่าเริ่มต้น

การมี Flag นี้หมายความว่าการลิงก์เกิดขึ้นพร้อมกับแฟล็ก -shared ไปยัง gcc และไลบรารีที่ใช้ร่วมกันที่ได้จะเหมาะสำหรับการโหลดลงในโปรแกรม Java เช่น อย่างไรก็ตาม สำหรับวัตถุประสงค์ของบิลด์ จะไม่มีการลิงก์เข้ากับไบนารีที่เกี่ยวข้อง เนื่องจากจะมีสมมติฐานว่าไลบรารีที่ใช้ร่วมกันที่สร้างด้วยกฎ cc_binary จะโหลดด้วยตนเองโดยโปรแกรมอื่นๆ เท่านั้น จึงไม่ถือว่าไลบรารีดังกล่าวใช้แทนกฎ cc_library เราขอแนะนำให้หลีกเลี่ยงวิธีการนี้ทั้งหมดเพื่อความสามารถในการปรับขนาด และอนุญาตให้ java_library อิงตามกฎ cc_library แทน

หากระบุทั้ง linkopts=['-static'] และ linkshared=True คุณจะได้รับหน่วยในตัวเดียวอย่างสมบูรณ์ หากระบุทั้ง linkstatic=True และ linkshared=True คุณจะได้รับหน่วยเดียวซึ่งส่วนใหญ่มีตัวแปรในตัว

linkstatic

Boolean; optional; default is True

สำหรับ cc_binary และ cc_test: ลิงก์ไบนารีในโหมดคงที่ สำหรับ cc_library.linkstatic: โปรดดูด้านล่าง

ตามค่าเริ่มต้น ตัวเลือกนี้จะเปิดอยู่สำหรับ cc_binary และปิดสำหรับเวอร์ชันที่เหลือ

หากเปิดใช้และนี่เป็นไบนารีหรือการทดสอบ ตัวเลือกนี้จะบอกให้เครื่องมือสร้างลิงก์ใน .a แทน .so สำหรับไลบรารีผู้ใช้ทุกครั้งที่ทำได้ ไลบรารีระบบบางรายการอาจยังคงลิงก์แบบไดนามิกอยู่ เช่น ไลบรารีที่ไม่มีไลบรารีแบบคงที่ ดังนั้นไฟล์สั่งการที่ได้จะยังคงลิงก์แบบไดนามิก จึงมีแต่ไฟล์ส่วนใหญ่แบบคงที่

การลิงก์ไฟล์ปฏิบัติการทำได้ 3 วิธีดังนี้

  • สถิติที่มีฟีเจอร์full_static_link ซึ่งทุกอย่างลิงก์แบบคงที่ เช่น "gcc -static foo.o libbar.a libbaz.a -lm"
    โหมดนี้เปิดใช้ได้โดยระบุ fully_static_link ในแอตทริบิวต์ features
  • สถิติ ซึ่งไลบรารีผู้ใช้ทั้งหมดจะลิงก์แบบคงที่ (หากมีเวอร์ชันคงที่) แต่มีการลิงก์ไลบรารีระบบ (ยกเว้นไลบรารีรันไทม์ C/C++) แบบไดนามิก เช่น "gcc foo.o libfoo.a libbaz.a -lm"
    โหมดนี้จะเปิดใช้โดยระบุ linkstatic=True
  • ไดนามิก ซึ่งไลบรารีทั้งหมดลิงก์แบบไดนามิก (หากมีเวอร์ชันแบบไดนามิก) เช่น "gcc foo.o libfoo.so libbaz.so -lm"
    โหมดนี้เปิดใช้งานได้โดยการระบุ linkstatic=False

แอตทริบิวต์ linkstatic มีความหมายต่างกันหากใช้กับกฎ cc_library() สำหรับไลบรารี C++ แล้ว linkstatic=True จะระบุว่าอนุญาต การลิงก์แบบคงที่เท่านั้น ดังนั้นจึงจะไม่มีการสร้าง .so linkstatic=False ไม่ได้ป้องกันการสร้างไลบรารีแบบคงที่ แอตทริบิวต์นี้มีไว้เพื่อควบคุมการสร้างไลบรารีแบบไดนามิก

หากตั้งค่าเป็น linkstatic=False เครื่องมือสร้างจะสร้างลิงก์สัญลักษณ์ไปยังไลบรารีที่ใช้ร่วมกันซึ่งอ้างอิงในพื้นที่ *.runfiles

local_defines

List of strings; optional

รายการกำหนดที่จะเพิ่มในบรรทัดคอมไพล์ ขึ้นอยู่กับการแทนที่ ตัวแปร"Make" และการแปลงข้อมูลเป็นโทเค็นของ Bourne shell แต่ละสตริงซึ่งต้องประกอบด้วยโทเค็น Bourne Shell เดี่ยว จะถูกเพิ่มต่อท้ายด้วย -D และเพิ่มในบรรทัดคำสั่งของคอมไพล์สำหรับเป้าหมายนี้ แต่ไม่เพิ่มลงในทรัพยากร Dependency
malloc

Label; optional; default is @bazel_tools//tools/cpp:malloc

ลบล้างทรัพยากร Dependency เริ่มต้นบน Malloc

โดยค่าเริ่มต้น ไบนารี C++ จะลิงก์กับ //tools/cpp:malloc ซึ่งเป็นไลบรารีว่าง ไบนารีจึงใช้ libc Malloc แทน ป้ายกำกับนี้ต้องอ้างอิงถึง cc_library หากการคอมไพล์เป็นกฎที่ไม่ใช่ C++ ตัวเลือกนี้จะไม่มีผล ระบบจะละเว้นค่าของแอตทริบิวต์นี้หากระบุ linkshared=True

nocopts

String; optional

นำรูปแบบการทำงานออกจากคำสั่งการคอมไพล์ C++ ขึ้นอยู่กับการแทนที่ตัวแปร"ผู้ผลิต" ระบบจะตีความค่าของแอตทริบิวต์นี้เป็นนิพจน์ทั่วไป ระบบจะนำ COPTS ที่มีอยู่แล้วก่อนหน้าที่ตรงกับนิพจน์ทั่วไปนี้ (รวมถึงค่าที่ระบุอย่างชัดแจ้งในแอตทริบิวต์ copts ของกฎ) ออกจาก COPTS เพื่อจุดประสงค์ในการคอมไพล์กฎนี้ แอตทริบิวต์นี้ไม่จำเป็นต้องใช้บ่อยนัก
stamp

Integer; optional; default is -1

จะเข้ารหัสข้อมูลของบิลด์ลงในไบนารีหรือไม่ ค่าที่เป็นไปได้มีดังนี้
  • stamp = 1: ประทับข้อมูลบิลด์ลงในไบนารีเสมอ แม้กระทั่งในบิลด์ --nostamp ควรหลีกเลี่ยงการตั้งค่านี้ เนื่องจากอาจกำจัดการแคชระยะไกลสำหรับไบนารีและการดำเนินการดาวน์สตรีมที่ต้องใช้การตั้งค่าดังกล่าว
  • stamp = 0: แทนที่ข้อมูลของบิลด์ด้วยค่าคงที่เสมอ ซึ่งทำให้มีการแคชผลลัพธ์ของบิลด์ที่ดี
  • stamp = -1: การฝังข้อมูลของบิลด์จะควบคุมโดยแฟล็ก --[no]stamp

ระบบจะไม่สร้างไบนารีที่ประทับตราขึ้นมาใหม่เว้นแต่มีการเปลี่ยนแปลงทรัพยากร Dependency

win_def_file

Label; optional

ไฟล์ Windows DEF ที่จะส่งไปยัง Linker

ควรใช้แอตทริบิวต์นี้เมื่อ Windows เป็นแพลตฟอร์มเป้าหมายเท่านั้น คุณใช้เพื่อ ส่งออกสัญลักษณ์ระหว่างการลิงก์ไลบรารีที่ใช้ร่วมกันได้

cc_import

cc_import(name, data, hdrs, alwayslink, compatible_with, deprecation, distribs, features, interface_library, licenses, restricted_to, shared_library, static_library, system_provided, tags, target_compatible_with, testonly, 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,
)
2. การลิงก์ไลบรารีที่ใช้ร่วมกัน (Unix)
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  shared_library = "libmylib.so",
)
3. การลิงก์ไลบรารีที่ใช้ร่วมกันกับไลบรารีอินเทอร์เฟซ (Windows)
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  # mylib.lib is a 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",
)
4. การลิงก์ไลบรารีที่ใช้ร่วมกันกับ system_provided=True (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,
)
5. การลิงก์ไปยังไลบรารีแบบคงที่หรือที่ใช้ร่วมกัน
ใน Unix:
cc_import(
  name = "mylib",
  hdrs = ["mylib.h"],
  static_library = "libmylib.a",
  shared_library = "libmylib.so",
)

# first will link to libmylib.a
cc_binary(
  name = "first",
  srcs = ["first.cc"],
  deps = [":mylib"],
  linkstatic = 1, # default value
)

# second will link to libmylib.so
cc_binary(
  name = "second",
  srcs = ["second.cc"],
  deps = [":mylib"],
  linkstatic = 0,
)
ใน 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",
)

# first will link to libmylib.lib
cc_binary(
  name = "first",
  srcs = ["first.cc"],
  deps = [":mylib"],
  linkstatic = 1, # default value
)

# second will link to mylib.dll through mylib.lib
cc_binary(
  name = "second",
  srcs = ["second.cc"],
  deps = [":mylib"],
  linkstatic = 0,
)

อาร์กิวเมนต์

Attributes
name

Name; required

ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้

hdrs

List of labels; optional

รายการไฟล์ส่วนหัวที่เผยแพร่โดยไลบรารีที่คอมไพล์ล่วงหน้านี้ที่จะรวมโดยตรงโดยแหล่งที่มาในกฎที่เกี่ยวข้อง

Boolean; optional; default is False

หากเป็น 1 ไบนารีใดก็ตามที่อ้างอิงไลบรารีที่คอมไพล์ C++ ไว้ล่วงหน้า (ทั้งโดยตรงหรือโดยอ้อม) นี้จะลิงก์ในไฟล์ออบเจ็กต์ทั้งหมดที่เก็บไว้ในไลบรารีแบบคงที่ แม้ว่าบางไฟล์จะไม่มีสัญลักษณ์ที่ไบนารีอ้างอิงก็ตาม ซึ่งจะเป็นประโยชน์หากไม่มีการเรียกใช้โค้ดอย่างชัดแจ้งในไบนารี เช่น หากโค้ดของคุณบันทึกเพื่อรับโค้ดเรียกกลับจากบางบริการ

หาก Alwayslink ใช้ไม่ได้กับ VS 2017 บน Windows นั่นเป็นเพราะปัญหาที่ทราบแล้ว โปรดอัปเกรด VS 2017 เป็นเวอร์ชันล่าสุด

interface_library

Label; optional

ไลบรารีอินเทอร์เฟซเดี่ยวสำหรับการลิงก์ไลบรารีที่ใช้ร่วมกัน

ประเภทไฟล์ที่อนุญาต: .ifso, .tbd, .lib, .so หรือ .dylib

shared_library

Label; optional

ไลบรารีที่ใช้ร่วมกันรายการเดียวที่คอมไพล์ล่วงหน้า Bazel ช่วยให้มั่นใจว่าจะใช้งานได้กับไบนารีที่ขึ้นอยู่กับทรัพยากรดังกล่าวระหว่างรันไทม์

ประเภทไฟล์ที่อนุญาต: .so, .dll หรือ .dylib

static_library

Label; optional

ไลบรารีแบบคงที่ที่คอมไพล์ไว้ล่วงหน้ารายการเดียว

ประเภทไฟล์ที่อนุญาต: .a, .pic.a หรือ .lib

system_provided

Boolean; optional; default is False

หากเป็น 1 แสดงว่าระบบได้ให้ไลบรารีที่ใช้ร่วมกันซึ่งจำเป็นในขณะรันไทม์ ในกรณีนี้ คุณควรระบุ interface_library และควรปล่อย shared_library ว่างไว้

cc_library

cc_library(name, deps, srcs, data, hdrs, alwayslink, compatible_with, copts, defines, deprecation, distribs, exec_compatible_with, exec_properties, features, implementation_deps, include_prefix, includes, licenses, linkopts, linkstamp, linkstatic, local_defines, nocopts, restricted_to, strip_include_prefix, tags, target_compatible_with, testonly, textual_hdrs, toolchains, visibility, win_def_file)

การตรวจสอบการรวมส่วนหัว

ไฟล์ส่วนหัวทั้งหมดที่ใช้ในบิลด์ต้องได้รับการประกาศในกฎ 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.hbar.h
foo.ccfoo.h bar.h
bar.hbar-impl.h baz.h
bar-impl.hbar.h baz.h
bar.ccbar.h bar-impl.h baz.h
baz.hbaz-impl.h
baz-impl.hbaz.h
baz.ccbaz.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 ไม่สามารถแยกแยะความแตกต่างระหว่างการรวมโดยตรงและการรวมแบบสกรรมได้ ดังนั้นจึงไม่สามารถตรวจจับกรณีข้อผิดพลาดที่ไฟล์มีส่วนหัวโดยตรงแต่อนุญาตให้รวมไว้แบบชั่วคราวเท่านั้นอย่างผิดกฎหมาย เช่น Bazel จะไม่บ่นหากในตัวอย่างข้างต้น foo.cc มี baz.h โดยตรง การกระทำนี้อาจผิดกฎหมาย เนื่องจาก foo ไม่ได้อาศัย baz โดยตรง ขณะนี้จะไม่เกิดข้อผิดพลาดในกรณีนั้น แต่อาจเพิ่มการตรวจสอบข้อผิดพลาดดังกล่าวในอนาคต

อาร์กิวเมนต์

Attributes
name

Name; required

ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้

deps

List of labels; optional

รายการไลบรารีอื่นๆ ที่จะลิงก์กับเป้าหมายไบนารี

ซึ่งอาจเป็นเป้าหมาย cc_library หรือ objc_library ก็ได้

srcs

List of labels; optional

รายการไฟล์ C และ C++ ที่ประมวลผลเพื่อสร้างเป้าหมาย ไฟล์เหล่านี้เป็นไฟล์ต้นฉบับและส่วนหัว C/C++ ซึ่งอาจไม่ได้สร้างขึ้น (ซอร์สโค้ดปกติ) หรือสร้างขึ้น

ระบบจะคอมไพล์ไฟล์ .cc, .c และ .cpp ทั้งหมด ไฟล์เหล่านี้อาจสร้างขึ้น หากไฟล์ที่ตั้งชื่ออยู่ใน outs ของกฎอื่น กฎนี้จะขึ้นอยู่กับกฎอื่นนั้นโดยอัตโนมัติ

ระบบจะไม่คอมไพล์ไฟล์ .h แต่จะรวมตามแหล่งที่มาในกฎนี้ได้ ทั้งไฟล์ .cc และ .h จะมีส่วนหัวที่ระบุไว้ใน srcs เหล่านี้หรือใน hdrs ของกฎใดก็ได้ที่แสดงอยู่ในอาร์กิวเมนต์ deps

ต้องพูดถึงไฟล์ทั้งหมด #included ไฟล์ในแอตทริบิวต์ srcs ของกฎนี้ หรือในแอตทริบิวต์ hdrs ของ cc_library() ที่อ้างอิง รูปแบบที่แนะนำคือสำหรับส่วนหัวที่เชื่อมโยงกับไลบรารีที่จะแสดงในแอตทริบิวต์ hdrs ของไลบรารีนั้น และส่วนหัวที่เหลือทั้งหมดที่เชื่อมโยงกับแหล่งที่มาของกฎนี้จะแสดงใน srcs ดูรายละเอียดเพิ่มเติมได้ใน "การตรวจสอบการรวมส่วนหัว"

หากชื่อของกฎอยู่ใน srcs กฎนี้จะอิงตามกฎดังกล่าวโดยอัตโนมัติ หาก outs ของกฎที่มีชื่อเป็นไฟล์ต้นฉบับ C หรือ C++ ระบบจะรวบรวมไฟล์เหล่านั้นไว้ในกฎนี้ หากเป็นไฟล์ไลบรารี ไฟล์ก็จะลิงก์กันเข้ามา

ไฟล์ที่อนุญาต srcs ประเภท:

  • ไฟล์ต้นฉบับ C และ C++: .c, .cc, .cpp, .cxx, .c++, .C
  • ไฟล์ส่วนหัว C และ C++: .h, .hh, .hpp, .hxx, .inc, .inl, .H
  • Assembler with C Preprocessor: .S
  • ที่เก็บถาวร: .a, .pic.a
  • ไลบรารี "ลิงก์เสมอ": .lo, .pic.lo
  • ไลบรารีที่ใช้ร่วมกัน มีเวอร์ชันหรือไม่กำหนดเวอร์ชัน: .so, .so.version
  • ไฟล์ออบเจ็กต์: .o, .pic.o

...และกฎต่างๆ ที่สร้างไฟล์เหล่านี้ ส่วนขยายที่ต่างกันจะบ่งชี้ภาษาโปรแกรมที่ต่างกันตามธรรมเนียมของ GCC

hdrs

List of labels; optional

รายการไฟล์ส่วนหัวที่เผยแพร่โดยไลบรารีนี้ที่จะรวมโดยตรงโดยแหล่งที่มาในกฎที่เกี่ยวข้อง

ตำแหน่งนี้เป็นตำแหน่งที่แนะนำอย่างยิ่งสำหรับการประกาศไฟล์ส่วนหัวที่อธิบายอินเทอร์เฟซของไลบรารี ส่วนหัวเหล่านี้จะสามารถรวมตามแหล่งที่มาในกฎนี้หรือในกฎที่เกี่ยวข้องได้ ส่วนหัวที่ไม่ได้มีไว้สำหรับให้ไคลเอ็นต์ของไลบรารีนี้รวมอยู่ควรแสดงในแอตทริบิวต์ srcs แทน แม้ว่าส่วนหัวนั้นจะรวมอยู่ในส่วนหัวที่เผยแพร่ก็ตาม ดูรายละเอียดเพิ่มเติมได้ที่ "การตรวจสอบการรวมส่วนหัว"

Boolean; optional; default is False

หากเป็น 1 ไบนารีใดก็ตามที่อ้างอิง (ทั้งทางตรงและทางอ้อม) ในไลบรารี C++ นี้จะลิงก์ในไฟล์ออบเจ็กต์ทั้งหมดของไฟล์ที่ระบุใน srcs แม้ว่าบางไฟล์จะไม่มีสัญลักษณ์ที่ไบนารีอ้างอิงก็ตาม ซึ่งจะเป็นประโยชน์หากไม่มีการเรียกใช้โค้ดอย่างชัดแจ้งในไบนารี เช่น หากโค้ดของคุณบันทึกเพื่อรับโค้ดเรียกกลับจากบางบริการ

หาก Alwayslink ใช้ไม่ได้กับ VS 2017 บน Windows นั่นเป็นเพราะปัญหาที่ทราบแล้ว โปรดอัปเกรด VS 2017 เป็นเวอร์ชันล่าสุด

copts

List of strings; optional

เพิ่มตัวเลือกเหล่านี้ในคำสั่งการคอมไพล์ C++ ขึ้นอยู่กับการแทนที่ "สร้างตัวแปร" และการแปลงข้อมูลเป็นโทเค็นของ Bourne shell

ระบบจะเพิ่มสตริงแต่ละรายการในแอตทริบิวต์นี้ตามลำดับที่กำหนดไปยัง COPTS ก่อนคอมไพล์เป้าหมายไบนารี แฟล็กจะมีผลกับการคอมไพล์เป้าหมายนี้เท่านั้น ไม่ใช่ทรัพยากร Dependency ของ URL นั้นๆ ดังนั้นโปรดระมัดระวังเกี่ยวกับไฟล์ส่วนหัวที่รวมอยู่ที่อื่นด้วย เส้นทางทั้งหมดควรสัมพัทธ์กับพื้นที่ทำงาน ไม่ใช่แพ็กเกจปัจจุบัน

หากแพ็กเกจประกาศฟีเจอร์ no_copts_tokenization การแปลงเป็นโทเค็นของ Bourne shell จะมีผลกับสตริงที่มีตัวแปร "Make" เพียงรายการเดียวเท่านั้น

defines

List of strings; optional

รายการกำหนดที่จะเพิ่มในบรรทัดคอมไพล์ ขึ้นอยู่กับการแทนที่ ตัวแปร"Make" และการแปลงข้อมูลเป็นโทเค็นของ Bourne shell แต่ละสตริงต้องประกอบด้วยโทเค็น Bourne Shell รายการเดียว ระบบจะใส่ -D ไว้หน้าและเพิ่มลงในบรรทัดคำสั่งคอมไพล์ให้กับเป้าหมายนี้ รวมถึงกฎทั้งหมดที่ต้องใช้โทเค็นดังกล่าว โปรดใช้ความระมัดระวังให้มาก เนื่องจากอาจส่งผลกระทบในวงกว้าง หากไม่แน่ใจ ให้เพิ่มการกําหนดค่าลงใน local_defines แทน
implementation_deps

List of labels; optional

รายชื่อไลบรารีอื่นๆ ที่ไลบรารีกำหนดเป้าหมายไว้ ส่วนหัวและรวมเส้นทางของไลบรารีเหล่านี้ (และ Dependency แบบทรานซิทีฟทั้งหมด) จะใช้สำหรับการคอมไพล์ไลบรารีนี้เท่านั้น ซึ่งต่างจาก deps ตรงที่ไม่ต้องใช้ไลบรารีที่อาศัยไลบรารีนี้ ไลบรารีที่ระบุด้วย implementation_deps ยังคงลิงก์อยู่ในเป้าหมายไบนารีที่ขึ้นอยู่กับไลบรารีนี้

สำหรับตอนนี้การใช้งานจะจำกัดอยู่ที่ cc_libraries และได้รับการปกป้องโดยแฟล็ก --experimental_cc_implementation_deps

include_prefix

String; optional

คำนำหน้าที่จะเพิ่มไปยังเส้นทางของส่วนหัวของกฎนี้

เมื่อตั้งค่าแล้ว ส่วนหัวในแอตทริบิวต์ hdrs ของกฎนี้จะเข้าถึงได้คือค่าของแอตทริบิวต์นี้ที่เพิ่มข้างหน้าเส้นทางที่สัมพันธ์กับที่เก็บ

นำคำนำหน้าในแอตทริบิวต์ strip_include_prefix ออกก่อนเพิ่มคำนำหน้านี้

includes

List of strings; optional

รายการรวมไดเรกทอรีที่จะเพิ่มลงในบรรทัดคอมไพล์

ขึ้นอยู่กับการแทนที่ "สร้างตัวแปร" แต่ละสตริงจะใส่ -isystem ไว้หน้าและเพิ่มลงใน COPTS ระบบจะเพิ่มแฟล็กเหล่านี้สำหรับกฎนี้และทุกกฎที่ขึ้นอยู่กับ COPTS (หมายเหตุ: ไม่ใช่กฎเกณฑ์จะขึ้นอยู่กับ) โปรดใช้ความระมัดระวังให้มาก เนื่องจากอาจส่งผลกระทบในวงกว้าง หากไม่แน่ใจ ให้เพิ่มแฟล็ก "-I" ใน COPTS แทน

ต้องเพิ่มส่วนหัวลงใน srcs หรือ hdrs ไม่เช่นนั้นจะใช้ไม่ได้กับกฎที่เกี่ยวข้องเมื่อการคอมไพล์เป็นแซนด์บ็อกซ์ (ค่าเริ่มต้น)

linkopts

List of strings; optional

เพิ่มแฟล็กเหล่านี้ไปยังคำสั่ง Linker C++ ขึ้นอยู่กับการแทนที่ ตัวแปร"Make" การแปลงข้อมูลเป็นโทเค็นของ Bourne shell และ การขยายป้ายกำกับ ระบบจะเพิ่มสตริงแต่ละรายการในแอตทริบิวต์นี้ลงใน LINKOPTS ก่อนลิงก์เป้าหมายไบนารี

ระบบจะถือว่าแต่ละองค์ประกอบในรายการนี้ที่ไม่ได้ขึ้นต้นด้วย $ หรือ - เป็นป้ายกำกับของเป้าหมายใน deps รายการไฟล์ที่เป้าหมายนั้นสร้างขึ้นจะต่อท้ายตัวเลือก Linker ระบบจะรายงานข้อผิดพลาดหากป้ายกำกับไม่ถูกต้องหรือไม่ได้ประกาศไว้ใน deps

linkstamp

Label; optional

คอมไพล์และลิงก์ไฟล์ต้นฉบับ C++ ที่ระบุไปยังไบนารีสุดท้ายพร้อมกัน เคล็ดลับนี้จำเป็นต่อการแนะนำข้อมูลการประทับเวลาในรูปแบบไบนารี หากเราคอมไพล์ไฟล์ต้นฉบับไปยังไฟล์ออบเจ็กต์ด้วยวิธีปกติ การประทับเวลาอาจไม่ถูกต้อง การคอมไพล์ Linktamp อาจไม่มีชุดแฟล็กคอมไพเลอร์ชุดใดโดยเฉพาะ จึงไม่ควรขึ้นอยู่กับส่วนหัว ตัวเลือกคอมไพเลอร์ หรือตัวแปรบิลด์อื่นๆ ที่เฉพาะเจาะจง ตัวเลือกนี้ควรใช้ในแพ็กเกจ base เท่านั้น
linkstatic

Boolean; optional; default is False

สำหรับ cc_binary และ cc_test: ลิงก์ไบนารีในโหมดคงที่ สำหรับ cc_library.linkstatic: โปรดดูด้านล่าง

ตามค่าเริ่มต้น ตัวเลือกนี้จะเปิดอยู่สำหรับ cc_binary และปิดสำหรับเวอร์ชันที่เหลือ

หากเปิดใช้และนี่เป็นไบนารีหรือการทดสอบ ตัวเลือกนี้จะบอกให้เครื่องมือสร้างลิงก์ใน .a แทน .so สำหรับไลบรารีผู้ใช้ทุกครั้งที่ทำได้ ไลบรารีระบบบางรายการอาจยังคงลิงก์แบบไดนามิกอยู่ เช่น ไลบรารีที่ไม่มีไลบรารีแบบคงที่ ดังนั้นไฟล์สั่งการที่ได้จะยังคงลิงก์แบบไดนามิก จึงมีแต่ไฟล์ส่วนใหญ่แบบคงที่

การลิงก์ไฟล์ปฏิบัติการทำได้ 3 วิธีดังนี้

  • สถิติที่มีฟีเจอร์full_static_link ซึ่งทุกอย่างลิงก์แบบคงที่ เช่น "gcc -static foo.o libbar.a libbaz.a -lm"
    โหมดนี้เปิดใช้ได้โดยระบุ fully_static_link ในแอตทริบิวต์ features
  • สถิติ ซึ่งไลบรารีผู้ใช้ทั้งหมดจะลิงก์แบบคงที่ (หากมีเวอร์ชันคงที่) แต่มีการลิงก์ไลบรารีระบบ (ยกเว้นไลบรารีรันไทม์ C/C++) แบบไดนามิก เช่น "gcc foo.o libfoo.a libbaz.a -lm"
    โหมดนี้จะเปิดใช้โดยระบุ linkstatic=True
  • ไดนามิก ซึ่งไลบรารีทั้งหมดลิงก์แบบไดนามิก (หากมีเวอร์ชันแบบไดนามิก) เช่น "gcc foo.o libfoo.so libbaz.so -lm"
    โหมดนี้เปิดใช้งานได้โดยการระบุ linkstatic=False

แอตทริบิวต์ linkstatic มีความหมายต่างกันหากใช้กับกฎ cc_library() สำหรับไลบรารี C++ แล้ว linkstatic=True จะระบุว่าอนุญาต การลิงก์แบบคงที่เท่านั้น ดังนั้นจึงจะไม่มีการสร้าง .so linkstatic=False ไม่ได้ป้องกันการสร้างไลบรารีแบบคงที่ แอตทริบิวต์นี้มีไว้เพื่อควบคุมการสร้างไลบรารีแบบไดนามิก

หากตั้งค่าเป็น linkstatic=False เครื่องมือสร้างจะสร้างลิงก์สัญลักษณ์ไปยังไลบรารีที่ใช้ร่วมกันซึ่งอ้างอิงในพื้นที่ *.runfiles

local_defines

List of strings; optional

รายการกำหนดที่จะเพิ่มในบรรทัดคอมไพล์ ขึ้นอยู่กับการแทนที่ ตัวแปร"Make" และการแปลงข้อมูลเป็นโทเค็นของ Bourne shell แต่ละสตริงซึ่งต้องประกอบด้วยโทเค็น Bourne Shell เดี่ยว จะถูกเพิ่มต่อท้ายด้วย -D และเพิ่มในบรรทัดคำสั่งของคอมไพล์สำหรับเป้าหมายนี้ แต่ไม่เพิ่มลงในทรัพยากร Dependency
nocopts

String; optional

นำรูปแบบการทำงานออกจากคำสั่งการคอมไพล์ C++ ขึ้นอยู่กับการแทนที่ตัวแปร"ผู้ผลิต" ระบบจะตีความค่าของแอตทริบิวต์นี้เป็นนิพจน์ทั่วไป ระบบจะนำ COPTS ที่มีอยู่แล้วก่อนหน้าที่ตรงกับนิพจน์ทั่วไปนี้ (รวมถึงค่าที่ระบุอย่างชัดแจ้งในแอตทริบิวต์ copts ของกฎ) ออกจาก COPTS เพื่อจุดประสงค์ในการคอมไพล์กฎนี้ แอตทริบิวต์นี้ไม่จำเป็นต้องใช้บ่อยนัก
strip_include_prefix

String; optional

คำนำหน้าที่ตัดออกจากเส้นทางของส่วนหัวของกฎนี้

เมื่อตั้งค่าแล้ว ส่วนหัวในแอตทริบิวต์ hdrs ของกฎนี้จะเข้าถึงได้ที่เส้นทางของส่วนหัวที่ตัดคำนำหน้านี้

หากเป็นเส้นทางแบบสัมพัทธ์ ระบบจะถือว่าเป็นเส้นทางที่ขึ้นอยู่กับแพ็กเกจ หากเป็นเส้นทางสัมบูรณ์ ระบบจะเข้าใจว่าเป็นเส้นทางแบบสัมพัทธ์ของที่เก็บ

ระบบจะเพิ่มคำนำหน้าในแอตทริบิวต์ include_prefix หลังจากนำคำนำหน้านี้ออก

textual_hdrs

List of labels; optional

รายการไฟล์ส่วนหัวที่เผยแพร่โดยไลบรารีนี้เพื่อรวมข้อความโดยแหล่งที่มาในกฎที่เกี่ยวข้อง

นี่คือตำแหน่งสำหรับการประกาศไฟล์ส่วนหัวที่คอมไพล์ด้วยตนเองไม่ได้ กล่าวคือ ไฟล์ต้นฉบับอื่นๆ ต้องใส่เป็นข้อความเสมอเพื่อสร้างโค้ดที่ถูกต้อง

win_def_file

Label; optional

ไฟล์ Windows DEF ที่จะส่งไปยัง Linker

ควรใช้แอตทริบิวต์นี้เมื่อ Windows เป็นแพลตฟอร์มเป้าหมายเท่านั้น คุณใช้เพื่อ ส่งออกสัญลักษณ์ระหว่างการลิงก์ไลบรารีที่ใช้ร่วมกันได้

cc_proto_library

cc_proto_library(name, deps, data, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, licenses, restricted_to, tags, target_compatible_with, testonly, visibility)

cc_proto_library สร้างโค้ด C++ จาก .proto ไฟล์

deps ต้องชี้ไปที่กฎ proto_library

ตัวอย่าง

cc_library(
    name = "lib",
    deps = [":foo_cc_proto"],
)

cc_proto_library(
    name = "foo_cc_proto",
    deps = [":foo_proto"],
)

proto_library(
    name = "foo_proto",
)

อาร์กิวเมนต์

Attributes
name

Name; required

ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้

deps

List of labels; optional

รายการกฎ proto_library สำหรับสร้างโค้ด C++

fdo_prefetch_hints

fdo_prefetch_hints(name, compatible_with, deprecation, distribs, features, licenses, profile, restricted_to, tags, target_compatible_with, testonly, visibility)

แสดงโปรไฟล์คำแนะนำที่ดึงข้อมูลล่วงหน้าของ FDO ซึ่งอยู่ในพื้นที่ทำงานหรือในเส้นทางสัมบูรณ์ที่ระบุ ตัวอย่าง

fdo_prefetch_hints(
    name = "hints",
    profile = "//path/to/hints:profile.afdo",
)

fdo_profile(
  name = "hints_abs",
  absolute_path_profile = "/absolute/path/profile.afdo",
)

อาร์กิวเมนต์

Attributes
name

Name; required

ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้

profile

Label; optional

ป้ายกำกับของโปรไฟล์คำแนะนำ ไฟล์คำแนะนำมีนามสกุล .afdo ป้ายกำกับยังชี้ไปยังกฎ fdo_absolute_path_profile ได้ด้วย

fdo_profile

fdo_profile(name, absolute_path_profile, compatible_with, deprecation, distribs, features, licenses, profile, proto_profile, restricted_to, tags, target_compatible_with, testonly, visibility)

แสดงโปรไฟล์ FDO ที่อยู่ในพื้นที่ทำงานหรือในเส้นทางสัมบูรณ์ที่ระบุ ตัวอย่าง

fdo_profile(
    name = "fdo",
    profile = "//path/to/fdo:profile.zip",
)

fdo_profile(
  name = "fdo_abs",
  absolute_path_profile = "/absolute/path/profile.zip",
)

อาร์กิวเมนต์

Attributes
name

Name; required

ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้

absolute_path_profile

String; optional

เส้นทางสัมบูรณ์ไปยังโปรไฟล์ FDO ไฟล์ FDO อาจมีนามสกุลอย่างใดอย่างหนึ่งต่อไปนี้ .profraw สำหรับโปรไฟล์ LLVM ที่ไม่ได้จัดทำดัชนี, .profdata สำหรับโปรไฟล์ LLVM ที่จัดทำดัชนี, .zip ที่มีโปรไฟล์ LLVM Profraw หรือ .afdo สำหรับโปรไฟล์ AutoFDO
profile

Label; optional

ป้ายกำกับของโปรไฟล์ FDO หรือกฎที่สร้างโปรไฟล์ ไฟล์ FDO อาจมีนามสกุลอย่างใดอย่างหนึ่งต่อไปนี้: .profraw สำหรับโปรไฟล์ LLVM ที่ไม่ได้จัดทำดัชนี, .profdata สำหรับโปรไฟล์ LLVM ที่จัดทำดัชนี, .zip ที่มีโปรไฟล์ LLVM Profraw, .afdo สำหรับโปรไฟล์ AutoFDO, .xfdo สำหรับโปรไฟล์ XBinary ป้ายกำกับยังสามารถชี้ไปยังกฎ fdo_absolute_path_profile
proto_profile

Label; optional

ป้ายกำกับของโปรไฟล์ protobuf

propeller_optimize

propeller_optimize(name, compatible_with, deprecation, distribs, features, ld_profile, licenses, restricted_to, tags, target_compatible_with, testonly, visibility)

แสดงโปรไฟล์การเพิ่มประสิทธิภาพ Propeller ในพื้นที่ทำงาน ตัวอย่าง

propeller_optimize(
    name = "layout",
    cc_profile = "//path:cc_profile.txt",
    ld_profile = "//path:ld_profile.txt"
)

propeller_optimize(
    name = "layout_absolute",
    absolute_cc_profile = "/absolute/cc_profile.txt",
    absolute_ld_profile = "/absolute/ld_profile.txt"
)

อาร์กิวเมนต์

Attributes
name

Name; required

ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้

ld_profile

Label; optional

ป้ายกำกับของโปรไฟล์ที่ส่งไปยังการทำงานของลิงก์ ไฟล์นี้มีนามสกุล .txt

cc_test

cc_test(name, deps, srcs, data, additional_linker_inputs, args, compatible_with, copts, defines, deprecation, distribs, env, env_inherit, exec_compatible_with, exec_properties, features, flaky, includes, licenses, linkopts, linkstatic, local, local_defines, malloc, nocopts, restricted_to, shard_count, size, stamp, tags, target_compatible_with, testonly, timeout, toolchains, visibility, win_def_file)

อาร์กิวเมนต์

Attributes
name

Name; required

ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้

deps

List of labels; optional

รายการไลบรารีอื่นๆ ที่จะลิงก์กับเป้าหมายไบนารี

ซึ่งอาจเป็นเป้าหมาย cc_library หรือ objc_library ก็ได้

srcs

List of labels; optional

รายการไฟล์ C และ C++ ที่ประมวลผลเพื่อสร้างเป้าหมาย ไฟล์เหล่านี้เป็นไฟล์ต้นฉบับและส่วนหัว C/C++ ซึ่งอาจไม่ได้สร้างขึ้น (ซอร์สโค้ดปกติ) หรือสร้างขึ้น

ระบบจะคอมไพล์ไฟล์ .cc, .c และ .cpp ทั้งหมด ไฟล์เหล่านี้อาจสร้างขึ้น หากไฟล์ที่ตั้งชื่ออยู่ใน outs ของกฎอื่น กฎนี้จะขึ้นอยู่กับกฎอื่นนั้นโดยอัตโนมัติ

ระบบจะไม่คอมไพล์ไฟล์ .h แต่จะรวมตามแหล่งที่มาในกฎนี้ได้ ทั้งไฟล์ .cc และ .h จะมีส่วนหัวที่ระบุไว้ใน srcs เหล่านี้หรือใน hdrs ของกฎใดก็ได้ที่แสดงอยู่ในอาร์กิวเมนต์ deps

ต้องพูดถึงไฟล์ทั้งหมด #included ไฟล์ในแอตทริบิวต์ srcs ของกฎนี้ หรือในแอตทริบิวต์ hdrs ของ cc_library() ที่อ้างอิง รูปแบบที่แนะนำคือสำหรับส่วนหัวที่เชื่อมโยงกับไลบรารีที่จะแสดงในแอตทริบิวต์ hdrs ของไลบรารีนั้น และส่วนหัวที่เหลือทั้งหมดที่เชื่อมโยงกับแหล่งที่มาของกฎนี้จะแสดงใน srcs ดูรายละเอียดเพิ่มเติมได้ใน "การตรวจสอบการรวมส่วนหัว"

หากชื่อของกฎอยู่ใน srcs กฎนี้จะอิงตามกฎดังกล่าวโดยอัตโนมัติ หาก outs ของกฎที่มีชื่อเป็นไฟล์ต้นฉบับ C หรือ C++ ระบบจะรวบรวมไฟล์เหล่านั้นไว้ในกฎนี้ หากเป็นไฟล์ไลบรารี ไฟล์ก็จะลิงก์กันเข้ามา

ไฟล์ที่อนุญาต srcs ประเภท:

  • ไฟล์ต้นฉบับ C และ C++: .c, .cc, .cpp, .cxx, .c++, .C
  • ไฟล์ส่วนหัว C และ C++: .h, .hh, .hpp, .hxx, .inc, .inl, .H
  • Assembler with C Preprocessor: .S
  • ที่เก็บถาวร: .a, .pic.a
  • ไลบรารี "ลิงก์เสมอ": .lo, .pic.lo
  • ไลบรารีที่ใช้ร่วมกัน มีเวอร์ชันหรือไม่กำหนดเวอร์ชัน: .so, .so.version
  • ไฟล์ออบเจ็กต์: .o, .pic.o

...และกฎต่างๆ ที่สร้างไฟล์เหล่านี้ ส่วนขยายที่ต่างกันจะบ่งชี้ภาษาโปรแกรมที่ต่างกันตามธรรมเนียมของ GCC

additional_linker_inputs

List of labels; optional

ส่งผ่านไฟล์เหล่านี้ไปยังคำสั่ง Linker C++

เช่น ไฟล์ .res ของ Windows ที่คอมไพล์อาจจะมีให้ที่นี่เพื่อฝังลงในเป้าหมายไบนารี

copts

List of strings; optional

เพิ่มตัวเลือกเหล่านี้ในคำสั่งการคอมไพล์ C++ ขึ้นอยู่กับการแทนที่ "สร้างตัวแปร" และการแปลงข้อมูลเป็นโทเค็นของ Bourne shell

ระบบจะเพิ่มสตริงแต่ละรายการในแอตทริบิวต์นี้ตามลำดับที่กำหนดไปยัง COPTS ก่อนคอมไพล์เป้าหมายไบนารี แฟล็กจะมีผลกับการคอมไพล์เป้าหมายนี้เท่านั้น ไม่ใช่ทรัพยากร Dependency ของ URL นั้นๆ ดังนั้นโปรดระมัดระวังเกี่ยวกับไฟล์ส่วนหัวที่รวมอยู่ที่อื่นด้วย เส้นทางทั้งหมดควรสัมพัทธ์กับพื้นที่ทำงาน ไม่ใช่แพ็กเกจปัจจุบัน

หากแพ็กเกจประกาศฟีเจอร์ no_copts_tokenization การแปลงเป็นโทเค็นของ Bourne shell จะมีผลกับสตริงที่มีตัวแปร "Make" เพียงรายการเดียวเท่านั้น

defines

List of strings; optional

รายการกำหนดที่จะเพิ่มในบรรทัดคอมไพล์ ขึ้นอยู่กับการแทนที่ ตัวแปร"Make" และการแปลงข้อมูลเป็นโทเค็นของ Bourne shell แต่ละสตริงต้องประกอบด้วยโทเค็น Bourne Shell รายการเดียว ระบบจะใส่ -D ไว้หน้าและเพิ่มลงในบรรทัดคำสั่งคอมไพล์ให้กับเป้าหมายนี้ รวมถึงกฎทั้งหมดที่ต้องใช้โทเค็นดังกล่าว โปรดใช้ความระมัดระวังให้มาก เนื่องจากอาจส่งผลกระทบในวงกว้าง หากไม่แน่ใจ ให้เพิ่มการกําหนดค่าลงใน local_defines แทน
includes

List of strings; optional

รายการรวมไดเรกทอรีที่จะเพิ่มลงในบรรทัดคอมไพล์

ขึ้นอยู่กับการแทนที่ "สร้างตัวแปร" แต่ละสตริงจะใส่ -isystem ไว้หน้าและเพิ่มลงใน COPTS ระบบจะเพิ่มแฟล็กเหล่านี้สำหรับกฎนี้และทุกกฎที่ขึ้นอยู่กับ COPTS (หมายเหตุ: ไม่ใช่กฎเกณฑ์จะขึ้นอยู่กับ) โปรดใช้ความระมัดระวังให้มาก เนื่องจากอาจส่งผลกระทบในวงกว้าง หากไม่แน่ใจ ให้เพิ่มแฟล็ก "-I" ใน COPTS แทน

ต้องเพิ่มส่วนหัวลงใน srcs หรือ hdrs ไม่เช่นนั้นจะใช้ไม่ได้กับกฎที่เกี่ยวข้องเมื่อการคอมไพล์เป็นแซนด์บ็อกซ์ (ค่าเริ่มต้น)

linkopts

List of strings; optional

เพิ่มแฟล็กเหล่านี้ไปยังคำสั่ง Linker C++ ขึ้นอยู่กับการแทนที่ ตัวแปร"Make" การแปลงข้อมูลเป็นโทเค็นของ Bourne shell และ การขยายป้ายกำกับ ระบบจะเพิ่มสตริงแต่ละรายการในแอตทริบิวต์นี้ลงใน LINKOPTS ก่อนลิงก์เป้าหมายไบนารี

ระบบจะถือว่าแต่ละองค์ประกอบในรายการนี้ที่ไม่ได้ขึ้นต้นด้วย $ หรือ - เป็นป้ายกำกับของเป้าหมายใน deps รายการไฟล์ที่เป้าหมายนั้นสร้างขึ้นจะต่อท้ายตัวเลือก Linker ระบบจะรายงานข้อผิดพลาดหากป้ายกำกับไม่ถูกต้องหรือไม่ได้ประกาศไว้ใน deps

linkstatic

Boolean; optional; default is False

สำหรับ cc_binary และ cc_test: ลิงก์ไบนารีในโหมดคงที่ สำหรับ cc_library.linkstatic: โปรดดูด้านล่าง

ตามค่าเริ่มต้น ตัวเลือกนี้จะเปิดอยู่สำหรับ cc_binary และปิดสำหรับเวอร์ชันที่เหลือ

หากเปิดใช้และนี่เป็นไบนารีหรือการทดสอบ ตัวเลือกนี้จะบอกให้เครื่องมือสร้างลิงก์ใน .a แทน .so สำหรับไลบรารีผู้ใช้ทุกครั้งที่ทำได้ ไลบรารีระบบบางรายการอาจยังคงลิงก์แบบไดนามิกอยู่ เช่น ไลบรารีที่ไม่มีไลบรารีแบบคงที่ ดังนั้นไฟล์สั่งการที่ได้จะยังคงลิงก์แบบไดนามิก จึงมีแต่ไฟล์ส่วนใหญ่แบบคงที่

การลิงก์ไฟล์ปฏิบัติการทำได้ 3 วิธีดังนี้

  • สถิติที่มีฟีเจอร์full_static_link ซึ่งทุกอย่างลิงก์แบบคงที่ เช่น "gcc -static foo.o libbar.a libbaz.a -lm"
    โหมดนี้เปิดใช้ได้โดยระบุ fully_static_link ในแอตทริบิวต์ features
  • สถิติ ซึ่งไลบรารีผู้ใช้ทั้งหมดจะลิงก์แบบคงที่ (หากมีเวอร์ชันคงที่) แต่มีการลิงก์ไลบรารีระบบ (ยกเว้นไลบรารีรันไทม์ C/C++) แบบไดนามิก เช่น "gcc foo.o libfoo.a libbaz.a -lm"
    โหมดนี้จะเปิดใช้โดยระบุ linkstatic=True
  • ไดนามิก ซึ่งไลบรารีทั้งหมดลิงก์แบบไดนามิก (หากมีเวอร์ชันแบบไดนามิก) เช่น "gcc foo.o libfoo.so libbaz.so -lm"
    โหมดนี้เปิดใช้งานได้โดยการระบุ linkstatic=False

แอตทริบิวต์ linkstatic มีความหมายต่างกันหากใช้กับกฎ cc_library() สำหรับไลบรารี C++ แล้ว linkstatic=True จะระบุว่าอนุญาต การลิงก์แบบคงที่เท่านั้น ดังนั้นจึงจะไม่มีการสร้าง .so linkstatic=False ไม่ได้ป้องกันการสร้างไลบรารีแบบคงที่ แอตทริบิวต์นี้มีไว้เพื่อควบคุมการสร้างไลบรารีแบบไดนามิก

หากตั้งค่าเป็น linkstatic=False เครื่องมือสร้างจะสร้างลิงก์สัญลักษณ์ไปยังไลบรารีที่ใช้ร่วมกันซึ่งอ้างอิงในพื้นที่ *.runfiles

local_defines

List of strings; optional

รายการกำหนดที่จะเพิ่มในบรรทัดคอมไพล์ ขึ้นอยู่กับการแทนที่ ตัวแปร"Make" และการแปลงข้อมูลเป็นโทเค็นของ Bourne shell แต่ละสตริงซึ่งต้องประกอบด้วยโทเค็น Bourne Shell เดี่ยว จะถูกเพิ่มต่อท้ายด้วย -D และเพิ่มในบรรทัดคำสั่งของคอมไพล์สำหรับเป้าหมายนี้ แต่ไม่เพิ่มลงในทรัพยากร Dependency
malloc

Label; optional; default is @bazel_tools//tools/cpp:malloc

ลบล้างทรัพยากร Dependency เริ่มต้นบน Malloc

โดยค่าเริ่มต้น ไบนารี C++ จะลิงก์กับ //tools/cpp:malloc ซึ่งเป็นไลบรารีว่าง ไบนารีจึงใช้ libc Malloc แทน ป้ายกำกับนี้ต้องอ้างอิงถึง cc_library หากการคอมไพล์เป็นกฎที่ไม่ใช่ C++ ตัวเลือกนี้จะไม่มีผล ระบบจะละเว้นค่าของแอตทริบิวต์นี้หากระบุ linkshared=True

nocopts

String; optional

นำรูปแบบการทำงานออกจากคำสั่งการคอมไพล์ C++ ขึ้นอยู่กับการแทนที่ตัวแปร"ผู้ผลิต" ระบบจะตีความค่าของแอตทริบิวต์นี้เป็นนิพจน์ทั่วไป ระบบจะนำ COPTS ที่มีอยู่แล้วก่อนหน้าที่ตรงกับนิพจน์ทั่วไปนี้ (รวมถึงค่าที่ระบุอย่างชัดแจ้งในแอตทริบิวต์ copts ของกฎ) ออกจาก COPTS เพื่อจุดประสงค์ในการคอมไพล์กฎนี้ แอตทริบิวต์นี้ไม่จำเป็นต้องใช้บ่อยนัก
stamp

Integer; optional; default is 0

จะเข้ารหัสข้อมูลของบิลด์ลงในไบนารีหรือไม่ ค่าที่เป็นไปได้มีดังนี้
  • stamp = 1: ประทับข้อมูลบิลด์ลงในไบนารีเสมอ แม้กระทั่งในบิลด์ --nostamp ควรหลีกเลี่ยงการตั้งค่านี้ เนื่องจากอาจกำจัดการแคชระยะไกลสำหรับไบนารีและการดำเนินการดาวน์สตรีมที่ต้องใช้การตั้งค่าดังกล่าว
  • stamp = 0: แทนที่ข้อมูลของบิลด์ด้วยค่าคงที่เสมอ ซึ่งทำให้มีการแคชผลลัพธ์ของบิลด์ที่ดี
  • stamp = -1: การฝังข้อมูลของบิลด์จะควบคุมโดยแฟล็ก --[no]stamp

ระบบจะไม่สร้างไบนารีที่ประทับตราขึ้นมาใหม่เว้นแต่มีการเปลี่ยนแปลงทรัพยากร Dependency

win_def_file

Label; optional

ไฟล์ Windows DEF ที่จะส่งไปยัง Linker

ควรใช้แอตทริบิวต์นี้เมื่อ Windows เป็นแพลตฟอร์มเป้าหมายเท่านั้น คุณใช้เพื่อ ส่งออกสัญลักษณ์ระหว่างการลิงก์ไลบรารีที่ใช้ร่วมกันได้

cc_toolchain

cc_toolchain(name, all_files, ar_files, as_files, compatible_with, compiler, compiler_files, compiler_files_without_includes, coverage_files, cpu, deprecation, distribs, dwp_files, dynamic_runtime_lib, exec_transition_for_inputs, features, libc_top, licenses, linker_files, module_map, objcopy_files, restricted_to, static_runtime_lib, strip_files, supports_header_parsing, supports_param_files, tags, target_compatible_with, testonly, toolchain_config, toolchain_identifier, visibility)

แสดงเชนเครื่องมือ C++

กฎข้อนี้เป็นผู้รับผิดชอบต่อสิ่งต่อไปนี้

  • กำลังรวบรวมอาร์ติแฟกต์ทั้งหมดที่ต้องใช้เพื่อเรียกใช้การดำเนินการ C++ ซึ่งทำโดยแอตทริบิวต์ต่างๆ เช่น all_files, compiler_files, linker_files หรือแอตทริบิวต์อื่นๆ ที่ลงท้ายด้วย _files) ซึ่งเป็นกลุ่มไฟล์ที่โดยทั่วไปแล้วมีไฟล์ที่จำเป็นทั้งหมด
  • สร้างบรรทัดคำสั่งที่ถูกต้องสำหรับการทำงาน C++ โดยใช้ผู้ให้บริการ CcToolchainConfigInfo (รายละเอียดด้านล่าง)

ใช้แอตทริบิวต์ toolchain_config เพื่อกำหนดค่าเชนเครื่องมือ C++ นอกจากนี้ โปรดดูเอกสารประกอบเกี่ยวกับการกำหนดค่าเชนเครื่องมือของ C++ และการเลือกเครื่องมืออย่างละเอียดใน หน้านี้

ใช้ tags = ["manual"] เพื่อป้องกันไม่ให้ระบบสร้างและกำหนดค่า Toolchain ไม่จำเป็นเมื่อเรียกใช้ bazel build //...

อาร์กิวเมนต์

Attributes
name

Name; required

ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้

all_files

Label; required

คอลเล็กชันของอาร์ติแฟกต์ cc_toolchain ทั้งหมด ระบบจะเพิ่มอาร์ติแฟกต์เหล่านี้เป็นอินพุตสำหรับการดำเนินการที่เกี่ยวข้องกับ rules_cc ทั้งหมด (ยกเว้นการดำเนินการที่ใช้ชุดอาร์ติแฟกต์ที่แม่นยำยิ่งขึ้นจากแอตทริบิวต์ด้านล่าง) Bazel ถือว่า all_files เป็นชุด Supers ของแอตทริบิวต์ที่มีอาร์ติแฟกต์อื่นๆ ทั้งหมด (เช่น การคอมไพล์ linktamp ต้องใช้ทั้งไฟล์คอมไพล์และลิงก์ ดังนั้นต้องใช้ all_files)

เงื่อนไขนี้คือสิ่งที่ cc_toolchain.files ประกอบด้วย และกฎต่างๆ ของ Starlark ทั้งหมดที่ใช้เครื่องมือ C++ ใช้อยู่

ar_files

Label; optional

คอลเล็กชันของอาร์ติแฟกต์ cc_toolchain ทั้งหมดที่ต้องใช้ในการเก็บถาวร

as_files

Label; optional

คอลเล็กชันของอาร์ติแฟกต์ cc_toolchain ทั้งหมดที่จำเป็นสำหรับการทำงานเพื่อประกอบ

compiler

String; optional; nonconfigurable

เลิกใช้งานแล้ว ให้ใช้แอตทริบิวต์ toolchain_identifier แทน ซึ่งจะเป็นโหนดหลังจากมีการ ย้ายข้อมูล CROSSTOOL ไปยัง Starlark และจะถูกนำออกภายในวันที่ #7075

เมื่อตั้งค่าแล้วจะใช้เพื่อทำการเลือก Crosstool_config.toolchain ซึ่งจะมีลำดับความสำคัญเหนือตัวเลือก --cpu Bazel

compiler_files

Label; required

คอลเล็กชันของอาร์ติแฟกต์ cc_toolchain ทั้งหมดที่จำเป็นสำหรับการดำเนินการคอมไพล์
compiler_files_without_includes

Label; optional

การรวบรวมอาร์ติแฟกต์ cc_toolchain ทั้งหมดที่จำเป็นสำหรับการดำเนินการคอมไพล์ในกรณีที่รองรับการค้นพบอินพุต (ปัจจุบันใช้งานได้เฉพาะ Google เท่านั้น)
coverage_files

Label; optional

การรวบรวมอาร์ติแฟกต์ cc_toolchain ทั้งหมดที่จำเป็นสำหรับการดำเนินการเกี่ยวกับการครอบคลุม หากไม่ได้ระบุไว้ ระบบจะใช้ all_files
cpu

String; optional; nonconfigurable

เลิกใช้งานแล้ว ให้ใช้แอตทริบิวต์ Toolchain_identifier แทน โดยจะเป็นช่องโหว่หลังจากการย้ายข้อมูล CROSSTOOL ไปยัง Starlark และจะถูกนำออกภายในวันที่ #7075

เมื่อตั้งค่าแล้วจะใช้เพื่อทำการเลือก Crosstool_config.toolchain ซึ่งจะมีลำดับความสำคัญเหนือตัวเลือก --cpu Bazel

dwp_files

Label; required

คอลเล็กชันของอาร์ติแฟกต์ cc_toolchain ทั้งหมดที่จำเป็นสำหรับการดำเนินการ dwp
dynamic_runtime_lib

Label; optional

อาร์ติแฟกต์ไลบรารีแบบไดนามิกสำหรับไลบรารีรันไทม์ C++ (เช่น libstdc++.so)

ระบบจะใช้ข้อมูลนี้เมื่อเปิดใช้ฟีเจอร์ "static_link_cpp_runtimes" และเรากำลังลิงก์ทรัพยากร Dependency แบบไดนามิก

exec_transition_for_inputs

Boolean; optional; default is True

ตั้งค่าเป็น "จริง" เพื่อสร้างอินพุตไฟล์ทั้งหมดไปยัง cc_toolchain สำหรับแพลตฟอร์ม exec แทนที่จะไม่มีการเปลี่ยน (เช่น แพลตฟอร์มเป้าหมายโดยค่าเริ่มต้น)
libc_top

Label; optional

คอลเล็กชันอาร์ติแฟกต์สำหรับ libc ที่ส่งผ่านเป็นอินพุตไปยังการดำเนินการคอมไพล์/ลิงก์
linker_files

Label; required

คอลเล็กชันของอาร์ติแฟกต์ cc_toolchain ทั้งหมดที่จำเป็นสำหรับการลิงก์การดำเนินการ
module_map

Label; optional

อาร์ติแฟกต์แมปโมดูลที่จะใช้สำหรับบิลด์แบบโมดูลาร์
objcopy_files

Label; required

คอลเล็กชันของอาร์ติแฟกต์ cc_toolchain ทั้งหมดที่จำเป็นสำหรับการดำเนินการ objcopy
static_runtime_lib

Label; optional

อาร์ติแฟกต์ไลบรารีแบบคงที่สำหรับไลบรารีรันไทม์ C++ (เช่น libstdc++.a)

ระบบจะใช้ข้อมูลนี้เมื่อเปิดใช้ฟีเจอร์ "static_link_cpp_runtimes" และเรากำลังลิงก์ทรัพยากร Dependency แบบคงที่

strip_files

Label; required

คอลเล็กชันของอาร์ติแฟกต์ cc_toolchain ทั้งหมดที่จำเป็นสำหรับการดำเนินการ Strip
supports_header_parsing

Boolean; optional; default is False

ตั้งค่าเป็น "จริง" เมื่อ cc_toolchain รองรับการดำเนินการแยกวิเคราะห์ส่วนหัว
supports_param_files

Boolean; optional; default is True

ตั้งค่าเป็น "จริง" เมื่อ cc_toolchain รองรับการใช้ไฟล์พารามิเตอร์สำหรับการลิงก์การดำเนินการ
toolchain_config

Label; required

ป้ายกำกับของกฎที่ระบุ cc_toolchain_config_info
toolchain_identifier

String; optional; nonconfigurable

ตัวระบุที่ใช้จับคู่ cc_toolchain นี้กับ Crosstool_config.toolchain ที่เกี่ยวข้อง

นี่คือวิธีที่แนะนำในการเชื่อมโยง cc_toolchain กับ CROSSTOOL.toolchain จนกว่าปัญหา #5380 จะได้รับการแก้ไข จะแทนที่ด้วยแอตทริบิวต์ toolchain_config (#5380)

cc_toolchain_suite

cc_toolchain_suite(name, compatible_with, deprecation, distribs, features, licenses, restricted_to, tags, target_compatible_with, testonly, toolchains, visibility)

แสดงคอลเล็กชันของเชนเครื่องมือ C++

กฎข้อนี้เป็นผู้รับผิดชอบต่อสิ่งต่อไปนี้

  • รวบรวมชุดเครื่องมือ C++ ที่เกี่ยวข้องทั้งหมด
  • เลือกเชนเครื่องมือ 1 รายการตามตัวเลือก --cpu และ --compiler ที่ส่งไปยัง Bazel

นอกจากนี้ โปรดดูเอกสารประกอบเกี่ยวกับการกำหนดค่าเชนเครื่องมือของ C++ และการเลือกเครื่องมืออย่างละเอียดใน หน้านี้

อาร์กิวเมนต์

Attributes
name

Name; required

ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้

toolchains

Dictionary mapping strings to labels; required; nonconfigurable

แผนที่จากสตริง "<cpu>" หรือ "<cpu>|<คอมไพเลอร์>" ไปยังป้ายกำกับ cc_toolchain จะใช้ "<cpu>" ก็ต่อเมื่อส่งผ่าน --cpu ไปยัง Bazel เท่านั้น และจะใช้ "<cpu>|< Compu>" เมื่อมีการส่งทั้ง --cpu และ --compiler ไปยัง Bazel ตัวอย่าง

          cc_toolchain_suite(
            name = "toolchain",
            toolchains = {
              "piii|gcc": ":my_cc_toolchain_for_piii_using_gcc",
              "piii": ":my_cc_toolchain_for_piii_using_default_compiler",
            },
          )