กฎ C / C++

รายงานปัญหา ดูแหล่งที่มา

กฎ

สําเนาคู่

ดูแหล่งที่มาของกฎ
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 อยู่ ไฟล์แพ็กเกจข้อมูลการแก้ไขข้อบกพร่องเหมาะสําหรับการแก้ไขข้อบกพร่องไบนารีที่ทําให้ใช้งานได้จากระยะไกล หากเป็นไฟล์อื่นๆ

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

แอตทริบิวต์
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 ได้โดยตรง

ต้องระบุไฟล์ทั้งหมด #include วันในแอตทริบิวต์ 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
  • ตัวประกอบที่มีตัวประมวลผลล่วงหน้า C: .S
  • ฐานข้อมูล: .a, .pic.a
  • ไลบรารี "ลิงก์เสมอ": .lo, .pic.lo
  • คลังภาพที่แชร์ พร้อมเวอร์ชันหรือไม่มีเวอร์ชัน: .so, .so.version
  • ไฟล์ออบเจ็กต์: .o, .pic.o

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

additional_linker_inputs

List of labels; optional

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

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

copts

List of strings; optional

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

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

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

defines

List of strings; optional

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

List of strings; optional

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

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

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

linkopts

List of strings; optional

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

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

linkshared

Boolean; optional; nonconfigurable; default is False

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

การตั้งค่าสถานะนี้หมายความว่าการลิงก์มีการตั้งค่าสถานะ -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 สําหรับไลบรารีผู้ใช้ทุกครั้งที่ทําได้ ไลบรารีระบบบางระบบอาจยังลิงก์แบบไดนามิก เช่น ไลบรารีที่ไม่มีไลบรารีแบบคงที่ ดังนั้นไฟล์ปฏิบัติการที่ได้จะยังคงลิงก์แบบไดนามิกอยู่ ดังนั้นจึงเป็นแบบส่วนใหญ่แบบคงที่

มีสามวิธีในการเชื่อมโยงไฟล์ปฏิบัติการ:

  • STATIC พร้อมฟีเจอร์ 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" และการทําให้โทเค็น Shell เป็น Bourne แต่ละสตริงซึ่งต้องประกอบด้วยโทเค็นเชลล์ Bourne เดี่ยวจะมี -D นําหน้าและเพิ่มไปยังบรรทัดคําสั่งคอมไพล์สําหรับเป้าหมายนี้ แต่จะไม่เพิ่มลงในทรัพยากรที่เชื่อมโยงกัน
malloc

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

ลบล้างการพึ่งพาเริ่มต้นใน Malloc

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

nocopts

String; optional

นํารูปแบบการทํางานของคีย์เวิร์ดออกจากคําสั่งคอมไพล์ C++ ขึ้นอยู่กับการแทน "ตัวแปร" ระบบจะตีความว่าแอตทริบิวต์นี้เป็นนิพจน์ทั่วไป ระบบจะนํา COPTS ที่มีอยู่ก่อนแล้วที่ตรงกับนิพจน์ทั่วไปนี้ (รวมถึงค่าที่ระบุอย่างชัดเจนในแอตทริบิวต์ opts ของกฎ) ออกจาก 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(name, deps, 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 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",
)
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,
)
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",
)

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

แอตทริบิวต์
name

Name; required

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

deps

List of labels; optional

รายชื่อไลบรารีอื่นๆ ที่เป้าหมายใช้ ดูความคิดเห็นทั่วไปเกี่ยวกับ deps ได้ที่แอตทริบิวต์ทั่วไปที่กําหนดโดยกฎบิวด์ส่วนใหญ่
hdrs

List of labels; optional

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

Boolean; optional; default is False

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

หาก "ลิงก์ตลอดเวลา" ใช้งานไม่ได้กับ 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(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 ขึ้นอยู่กับการสนับสนุนของเครื่องมือเชนเพื่อบังคับใช้กฎการตรวจสอบการรวม เครื่องมือ layering_check ต้องรองรับฟีเจอร์ นี้และขอเครื่องมืออย่างชัดแจ้ง เช่น ผ่านทางแฟล็กบรรทัดคําสั่ง --features=layering_check หรือพารามิเตอร์ features ของฟังก์ชัน package Badchain ที่ให้บริการโดย Bazel รองรับเฉพาะฟีเจอร์นี้โดยใช้ clang ใน Unix และ macOS

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

แอตทริบิวต์
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 ได้โดยตรง

ต้องระบุไฟล์ทั้งหมด #include วันในแอตทริบิวต์ 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
  • ตัวประกอบที่มีตัวประมวลผลล่วงหน้า C: .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 แม้ว่าบางส่วนจะไม่มีสัญลักษณ์ที่ไบนารีอ้างอิงก็ตาม วิธีนี้มีประโยชน์หากโค้ดไม่ได้ถูกเรียกใช้อย่างชัดแจ้งโดยโค้ดในไบนารี เช่น หากโค้ดของคุณลงทะเบียนเพื่อเรียกโค้ดติดต่อกลับจากบริการบางอย่าง

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

copts

List of strings; optional

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

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

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

defines

List of strings; optional

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

List of labels; optional

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

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

include_prefix

String; optional

คํานําหน้าที่จะเพิ่มในเส้นทางของส่วนหัวของกฎนี้

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

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

includes

List of strings; optional

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

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

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

linkopts

List of strings; optional

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

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

linkstamp

Label; optional

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

Boolean; optional; default is False

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

โดยค่าเริ่มต้น ตัวเลือกนี้จะเปิดใช้สําหรับ cc_binary และปิดสําหรับส่วนที่เหลือของบริการ

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

มีสามวิธีในการเชื่อมโยงไฟล์ปฏิบัติการ:

  • STATIC พร้อมฟีเจอร์ 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" และการทําให้โทเค็น Shell เป็น Bourne แต่ละสตริงซึ่งต้องประกอบด้วยโทเค็นเชลล์ Bourne เดี่ยวจะมี -D นําหน้าและเพิ่มไปยังบรรทัดคําสั่งคอมไพล์สําหรับเป้าหมายนี้ แต่จะไม่เพิ่มลงในทรัพยากรที่เชื่อมโยงกัน
nocopts

String; optional

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

String; optional

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

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

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

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

textual_hdrs

List of labels; optional

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

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

win_def_file

Label; optional

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

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

สําเนา_โปรโตไลบรารี

ดูแหล่งที่มาของกฎ
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",
)

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

แอตทริบิวต์
name

Name; required

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

deps

List of labels; optional

รายการกฎ proto_library ที่จะสร้างโค้ด C++

สําเนา_คลังภาพที่แชร์

ดูแหล่งที่มาของกฎ
cc_shared_library(name, deps, additional_linker_inputs, dynamic_deps, exports_filter, shared_lib_name, tags, user_link_flags, 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 แบบคงที่ เนื้อหาหลังต้องเป็นทรัพยากร Dependency แบบสับเปลี่ยน แต่ไม่ลิงก์กับ bar เนื่องจากdynamic_dep bar_shared ให้การแบบไดนามิกอยู่แล้ว

foo_shared ใช้ไฟล์ตัวลิงก์ *.lds เพื่อควบคุมสัญลักษณ์ที่ควรส่งออก ตรรกะของกฎ cc_shared_library ไม่ได้ควบคุมสัญลักษณ์ที่จะส่งออก แต่จะใช้เพียงกฎที่อนุมานว่าส่งออกเพื่อแสดงข้อผิดพลาดในช่วงการวิเคราะห์หากไลบรารีที่ใช้ร่วมกัน 2 รายการส่งออกเป้าหมายเดียวกัน

ระบบจะถือว่าการใช้ cc_shared_library โดยตรงทั้งหมดเป็นการส่งออก ดังนั้น Bazel จะถือว่าในระหว่างการวิเคราะห์ที่ foo_shared ส่งออก foo ระบบจะไม่ถือว่า baz ส่งออกโดย foo_shared เป้าหมายทั้งหมดที่ตรงกันโดย exports_filter จะถือว่าส่งออกด้วย

ทุกๆ cc_library ในตัวอย่างควรปรากฏมากที่สุดใน cc_shared_library หากต้องการลิงก์ 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.

กรณีนี้จะเกิดขึ้นทุกครั้งที่คุณสร้างเป้าหมายที่มีทรัพยากร Dependency ของ cc_shared_library 2 รายการที่แตกต่างกัน ซึ่งจะส่งออกเป้าหมายเดียวกัน หากต้องการแก้ไขปัญหานี้ คุณต้องหยุดส่งออกไลบรารีในทรัพยากร Dependency ของ cc_shared_library

ซึ่งจะเกิดขึ้นทุกครั้งที่คุณสร้าง cc_shared_library ใหม่ที่มีการอ้างอิง cc_shared_library ที่แตกต่างกัน 2 รายการ ซึ่งเชื่อมโยงกับเป้าหมายเดียวกันแบบคงที่ คล้ายกับข้อผิดพลาดในการส่งออก

วิธีหนึ่งที่แก้ปัญหานี้ได้คือการหยุดลิงก์ไลบรารีกับทรัพยากร Dependency ของ cc_shared_library ในขณะเดียวกัน ลิงก์ที่ยังใช้ได้จําเป็นต้องส่งออกไลบรารีเพื่อไม่ให้ลิงก์ยังคงสามารถมองเห็นสัญลักษณ์ได้ อีกวิธีหนึ่งคือการดึงข้อมูลไลบรารีที่สามซึ่งส่งออกเป้าหมาย วิธีที่ 3 คือการติดแท็กผู้ต้องหา cc_library ด้วย LINKABLE_MORE_THAN_ONCE ซึ่งวิธีนี้ไม่น่าจะเกิดขึ้นบ่อย และคุณควรตรวจสอบว่า cc_library ปลอดภัยสําหรับการลิงก์มากกว่า 1 ครั้งจริงๆ

'//foo:foo' is already linked statically in '//bar:bar' but not exported`

ซึ่งหมายความว่าสามารถเข้าถึงไลบรารีในบทสรุปของ deps ได้แบบเข้าถึงได้ โดยไม่ผ่านการอ้างอิงรายการใดรายการหนึ่งของ cc_shared_library แต่มีการลิงก์กับ cc_shared_library ตัวอื่นใน dynamic_deps แล้วและไม่มีการส่งออก

วิธีส่งออกคือการส่งออกจากทรัพยากร Dependency cc_shared_library หรือดึง cc_shared_library ตัวที่ 3 ออกมา

Do not place libraries which only contain a precompiled dynamic library in deps.

หากคุณมีไลบรารีแบบไดนามิกที่คอมไพล์ไว้ล่วงหน้า ก็ไม่จําเป็นต้องลิงก์แบบคงที่และลิงก์กับเป้าหมาย cc_shared_library ปัจจุบันที่คุณกําลังสร้างแบบคงที่ ดังนั้น หมวดหมู่นี้จึงไม่ได้อยู่ใน deps ของ cc_shared_library หากไลบรารีแบบไดนามิกที่คอมไพล์ล่วงหน้านี้ขึ้นอยู่กับ cc_libraries ของคุณ cc_library จะต้องใช้บริการไลบรารีดังกล่าวโดยตรง

Trying to export a library already exported by a different shared library

คุณจะเห็นข้อผิดพลาดนี้หากกฎปัจจุบันที่คุณอ้างว่าส่งออกเป้าหมายที่กําลังได้รับการส่งออกโดยทรัพยากร Dependency แบบไดนามิกรายการใดรายการหนึ่งอยู่แล้ว

ในการแก้ไขปัญหานี้ ให้นําเป้าหมายออกจาก deps แล้วใช้เพียงการขึ้นต่อกันแบบไดนามิกเท่านั้นหรือexports_filter ไม่ให้ตรวจจับเป้าหมายนี้

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

แอตทริบิวต์
name

Name; required

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

deps

List of labels; optional

ไลบรารีระดับบนสุดที่จะลิงก์กับไลบรารีที่ใช้ร่วมกันโดยไม่มีเงื่อนไขหลังจากที่เก็บถาวรทั้งหมด

ทรัพยากร Dependency ของไลบรารีทางอ้อมสําหรับ Deep Direct เหล่านี้จะลิงก์กับไลบรารีที่ใช้ร่วมกันนี้ ตราบใดที่ยังไม่มีการลิงก์โดย cc_shared_library ใน dynamic_deps

ในระหว่างการวิเคราะห์ การใช้งานกฎจะถือว่าเป้าหมายใดก็ตามที่แสดงใน deps เป็นไลบรารีที่ส่งออกซึ่งส่งออกแล้ว เพื่อมอบข้อผิดพลาดเมื่อ cc_shared_libraries หลายรายการส่งออกเป้าหมายเดียวกัน การใช้กฎจะไม่แจ้งให้ Linker ทราบว่าควรแชร์สัญลักษณ์ใดกับออบเจ็กต์ที่แชร์ ผู้ใช้ควรจัดการปัญหานี้ผ่านสคริปต์ Linker หรือการประกาศระดับการเข้าถึงในซอร์สโค้ด

การทําให้ใช้งานได้นี้ยังจะแสดงข้อผิดพลาดเมื่อใดก็ตามที่มีการเชื่อมโยงไลบรารีเดียวกันแบบคงที่ใน cc_shared_library มากกว่า 1 รายการ ปัญหานี้หลีกเลี่ยงได้โดยเพิ่ม "LINKABLE_MORE_THAN_ONCE" ใน cc_library.tags หรือระบุ "cc_library" เป็นการส่งออกไลบรารีที่ใช้ร่วมกัน 1 รายการเพื่อให้สร้าง dynamic_dep ในไลบรารีอื่น 1 รายการได้

additional_linker_inputs

List of labels; optional

ไฟล์อื่นๆ ที่คุณอาจต้องการส่งต่อไปยัง Linker เช่น สคริปต์ Linker คุณต้องแยกแฟล็ก Linker แต่ละรายการที่ Linker ต้องใช้เพื่อทําความเข้าใจไฟล์นี้ ซึ่งทําได้ผ่านแอตทริบิวต์ user_link_flags
dynamic_deps

List of labels; optional

นี่คือทรัพยากร Dependency อื่นๆ ของ cc_shared_library ที่เป้าหมายปัจจุบันใช้อยู่

การนํา cc_shared_library ไปใช้จะใช้รายการของ dynamic_deps (กล่าวคือ dynamic_deps ของ dynamic_deps ของเป้าหมายปัจจุบัน) ด้วย เพื่อตัดสินใจว่า cc_libraries ใดใน deps ที่เป็นการเปลี่ยนเส้นทางไม่ควรลิงก์ไป เนื่องจากมี cc_shared_library อื่นระบุอยู่แล้ว

exports_filter

List of strings; optional

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

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

โปรดทราบว่าจริงๆ แล้วแอตทริบิวต์นี้ไม่ได้เพิ่ม Edge Dependency ให้กับเป้าหมายเหล่านั้น แต่ deps ควรสร้าง Edge Dependency แทน รายการในแอตทริบิวต์นี้เป็นเพียงสตริง โปรดทราบว่าเมื่อวางเป้าหมายในแอตทริบิวต์นี้ จะถือว่าเป็นการอ้างสิทธิ์ว่าไลบรารีที่ใช้ร่วมกันจะส่งออกสัญลักษณ์จากเป้าหมายนั้น ตรรกะ cc_shared_library ไม่ได้จัดการให้ Linker รู้ว่าควรส่งออกสัญลักษณ์ใด

อนุญาตให้ใช้ไวยากรณ์ต่อไปนี้

//foo:__package__ เพื่อชดเชยเป้าหมายใดๆ ใน foo/BUILD

//foo:__subpackages__ เพื่อรวมเป้าหมายใดๆ ใน foo/BUILD หรือแพ็กเกจอื่นๆ ด้านล่าง foo/ เช่น foo/bar/BUILD

shared_lib_name

String; optional

โดยค่าเริ่มต้น cc_shared_library จะใช้ชื่อไฟล์เอาต์พุตไลบรารีที่แชร์ตามชื่อของเป้าหมายและแพลตฟอร์ม ซึ่งรวมถึงส่วนขยายและบางครั้งก็มีคํานําหน้า บางครั้งคุณอาจไม่ต้องการชื่อเริ่มต้น เช่น เมื่อโหลดไลบรารีที่ใช้ร่วมกัน C++ สําหรับ Python ระบบมักจะไม่ต้องใส่คํานําหน้าเริ่มต้น lib* ซึ่งคุณอาจใช้แอตทริบิวต์นี้เพื่อเลือกชื่อที่กําหนดเองได้

List of strings; optional

แฟล็กเพิ่มเติมที่คุณอาจต้องการส่งต่อไปยัง Linker เช่น หากต้องการทําให้ผู้ลิงก์เข้าใจสคริปต์ของ Linker ที่ส่งผ่าน additional_linker_inputs คุณอาจใช้รายการต่อไปนี้
         cc_shared_library(
            name = "foo_shared",
            additional_linker_inputs = select({
              "//src/conditions:linux": [
                ":foo.lds",
                ":additional_script.txt",
              ],
              "//conditions:default": []}),
            user_link_flags = select({
              "//src/conditions:linux": [
                "-Wl,-rpath,kittens",
                "-Wl,--version-script=$(location :foo.lds)",
                "-Wl,--script=$(location :additional_script.txt)",
              ],
              "//conditions:default": []}),
              ...
         )
        
win_def_file

Label; optional

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

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

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",
)

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

แอตทริบิวต์
name

Name; required

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

profile

Label; optional

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

โปรไฟล์ fdo

ดูแหล่งที่มาของกฎ
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",
)

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

แอตทริบิวต์
name

Name; required

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

absolute_path_profile

String; optional

เส้นทางสัมบูรณ์ไปยังโปรไฟล์ FDO ไฟล์ FDO สามารถมีนามสกุล .afdo เท่านั้น
profile

Label; optional

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

Label; optional

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

ผู้เพิ่มประสิทธิภาพ

ดูแหล่งที่มาของกฎ
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"
)

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

แอตทริบิวต์
name

Name; required

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

ld_profile

Label; optional

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

สําเนาถึง

ดูแหล่งที่มาของกฎ
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)

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

แอตทริบิวต์
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 ได้โดยตรง

ต้องระบุไฟล์ทั้งหมด #include วันในแอตทริบิวต์ 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
  • ตัวประกอบที่มีตัวประมวลผลล่วงหน้า C: .S
  • ฐานข้อมูล: .a, .pic.a
  • ไลบรารี "ลิงก์เสมอ": .lo, .pic.lo
  • คลังภาพที่แชร์ พร้อมเวอร์ชันหรือไม่มีเวอร์ชัน: .so, .so.version
  • ไฟล์ออบเจ็กต์: .o, .pic.o

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

additional_linker_inputs

List of labels; optional

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

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

copts

List of strings; optional

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

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

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

defines

List of strings; optional

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

List of strings; optional

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

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

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

linkopts

List of strings; optional

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

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

linkstatic

Boolean; optional; default is False

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

โดยค่าเริ่มต้น ตัวเลือกนี้จะเปิดใช้สําหรับ cc_binary และปิดสําหรับส่วนที่เหลือของบริการ

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

มีสามวิธีในการเชื่อมโยงไฟล์ปฏิบัติการ:

  • STATIC พร้อมฟีเจอร์ 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" และการทําให้โทเค็น Shell เป็น Bourne แต่ละสตริงซึ่งต้องประกอบด้วยโทเค็นเชลล์ Bourne เดี่ยวจะมี -D นําหน้าและเพิ่มไปยังบรรทัดคําสั่งคอมไพล์สําหรับเป้าหมายนี้ แต่จะไม่เพิ่มลงในทรัพยากรที่เชื่อมโยงกัน
malloc

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

ลบล้างการพึ่งพาเริ่มต้นใน Malloc

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

nocopts

String; optional

นํารูปแบบการทํางานของคีย์เวิร์ดออกจากคําสั่งคอมไพล์ C++ ขึ้นอยู่กับการแทน "ตัวแปร" ระบบจะตีความว่าแอตทริบิวต์นี้เป็นนิพจน์ทั่วไป ระบบจะนํา COPTS ที่มีอยู่ก่อนแล้วที่ตรงกับนิพจน์ทั่วไปนี้ (รวมถึงค่าที่ระบุอย่างชัดเจนในแอตทริบิวต์ opts ของกฎ) ออกจาก 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"] เพื่อป้องกันไม่ให้มีการสร้างและกําหนดค่าเชนเครื่องมือโดยไม่จําเป็นเมื่อเรียกใช้ bazel build //...

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

แอตทริบิวต์
name

Name; required

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

all_files

Label; required

คอลเล็กชันของอาร์ติแฟกต์ cc_toolchain ทั้งหมด ระบบจะเพิ่มอาร์ติแฟกต์เหล่านี้เป็นอินพุตสําหรับการดําเนินการที่เกี่ยวข้องกับ rules_cc ทั้งหมด (ยกเว้นการดําเนินการที่ใช้ชุดอาร์ติแฟกต์ที่แม่นยํามากขึ้นจากแอตทริบิวต์ด้านล่าง) Bazel จะถือว่า all_files เป็นซูเปอร์แอตทริบิวต์ของแอตทริบิวต์อื่นๆ ทั้งหมด (เช่น การคอมไพล์ 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 แทน ชื่อนี้จะเป็น Noop หลัง การย้ายข้อมูล 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 แทน ชื่อนี้จะเป็น Noop หลังการย้ายข้อมูล 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 ทั้งหมดที่จําเป็นสําหรับการดําเนินการคัดลอก
static_runtime_lib

Label; optional

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

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

strip_files

Label; required

คอลเล็กชันของอาร์ติแฟกต์ cc_toolchain ทั้งหมดที่จําเป็นสําหรับการดําเนินการกับแถบ
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

ดูแหล่งที่มาของกฎ
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++ และเอกสารการเลือกเชนเครื่องมือต่างๆ อย่างละเอียด

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

แอตทริบิวต์
name

Name; required

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

toolchains

Dictionary mapping strings to labels; required; nonconfigurable

แผนที่จากสตริง "<cpu>" หรือ "<cpu>|<คอมไพเลอร์>" ไปยังป้ายกํากับ cc_toolchain ระบบจะใช้ "<cpu>" เมื่อส่งต่อเฉพาะ --cpu ไปยัง Bazel และจะใช้ "<cpu>|<คอมไพเลอร์>" เมื่อทั้ง --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",
            },
          )