กฎ C / C++

รายงานปัญหา ดูแหล่งที่มา ตอนกลางคืน · 7.4 ที่ใช้เวลาเพียง 2 นาที 7.3 · 7.2 · 7.1 · 7.0 · 6.5

กฎ

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, link_extra_lib, 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

ชื่อ ต้องระบุ

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

deps

รายการป้ายกำกับ ค่าเริ่มต้นคือ []

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

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

srcs

รายการป้ายกำกับ ค่าเริ่มต้นคือ []

รายการไฟล์ 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
  • เครื่องมือประกอบที่มีโปรเซสเซอร์ล่วงหน้าแบบ C: .S
  • ที่เก็บถาวร: .a, .pic.a
  • คลัง "ลิงก์เสมอ": .lo, .pic.lo
  • ไลบรารีที่ใช้ร่วมกันซึ่งมีเวอร์ชันหรือไม่มีเวอร์ชัน: .so, .so.version
  • ไฟล์ออบเจ็กต์: .o, .pic.o

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

additional_linker_inputs

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

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

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

copts

รายการสตริง ค่าเริ่มต้นคือ []

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

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

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

defines

รายการสตริง ค่าเริ่มต้นคือ []

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

รายการสตริง ค่าเริ่มต้นคือ []

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

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

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

ป้ายกํากับ ค่าเริ่มต้นคือ "@bazel_tools//tools/cpp:link_extra_lib"

ควบคุมการลิงก์ไลบรารีเพิ่มเติม

โดยค่าเริ่มต้น ระบบจะลิงก์ไบนารี C++ กับ //tools/cpp:link_extra_lib ซึ่งโดยค่าเริ่มต้นจะขึ้นอยู่กับ Flag ป้ายกำกับ //tools/cpp:link_extra_libs หากไม่ได้ตั้งค่า Flag ห้องสมุดนี้จะว่างเปล่าโดยค่าเริ่มต้น การตั้งค่าสถานะป้ายกำกับ อนุญาตให้ลิงก์ทรัพยากร Dependency ที่ไม่บังคับ เช่น การลบล้างสัญลักษณ์ที่ไม่รัดกุม ตัวดักจับสัญญาณ สำหรับฟังก์ชันไลบรารีที่ใช้ร่วมกัน หรือไลบรารีรันไทม์พิเศษ (สำหรับการแทนที่ Malloc ต้องการ malloc หรือ --custom_malloc) ตั้งค่าแอตทริบิวต์นี้เป็น None ปิดใช้ลักษณะการทำงานนี้

linkopts

รายการสตริง ค่าเริ่มต้นคือ []

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

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

linkshared

บูลีน ไม่สามารถกําหนดค่าได้ ค่าเริ่มต้นคือ False

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

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

หากคุณระบุทั้ง linkopts=['-static'] และ linkshared=True คุณก็จะได้ชุดเครื่องมือสำเร็จรูปเพียงหน่วยเดียว หากคุณระบุทั้ง 2 อย่าง linkstatic=True และ linkshared=True คุณได้รับสิทธิ์ใช้บริการเดียว แบบครบวงจร

linkstatic

บูลีน ค่าเริ่มต้นคือ True

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

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

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

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

  • STATIC ที่มีฟีเจอร์ fully_static_link ซึ่งทุกอย่างจะลิงก์แบบคงที่ เช่น "gcc -static foo.o libbar.a libbaz.a -lm"
    เปิดใช้โหมดนี้โดยระบุ fully_static_link ในแอตทริบิวต์ features
  • STATIC ซึ่งจะลิงก์ไลบรารีผู้ใช้ทั้งหมดแบบคงที่ (หากมีเวอร์ชันแบบคงที่) แต่ลิงก์ไลบรารีระบบ (ยกเว้นไลบรารีรันไทม์ 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

รายการสตริง ค่าเริ่มต้นคือ []

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

ป้ายกํากับ ค่าเริ่มต้นคือ "@bazel_tools//tools/cpp:malloc"

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

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

nocopts

String; ค่าเริ่มต้นคือ ""

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

จํานวนเต็ม ค่าเริ่มต้นคือ -1

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

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

win_def_file

ป้ายกำกับ ค่าเริ่มต้นคือ None

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

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

cc_import

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

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

Attributes
name

ชื่อ ต้องระบุ

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

deps

รายการป้ายกำกับ ค่าเริ่มต้นคือ []

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

รายการป้ายกำกับ ค่าเริ่มต้นคือ []

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

บูลีน ค่าเริ่มต้นคือ False

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

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

interface_library

ป้ายกํากับ ค่าเริ่มต้นคือ None

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

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

shared_library

ป้ายกำกับ ค่าเริ่มต้นคือ None

ไลบรารีที่ใช้ร่วมกันล่วงหน้ารายการเดียว Bazel ดูแลให้ ที่ต้องใช้ในระหว่างรันไทม์

ประเภทไฟล์ที่อนุญาตมีดังนี้ .so .dll หรือ .dylib

static_library

ป้ายกำกับ ค่าเริ่มต้นคือ None

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

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

system_provided

บูลีน ค่าเริ่มต้นคือ False

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

cc_library

ดูแหล่งที่มาของกฎ
cc_library(name, deps, srcs, data, hdrs, additional_compiler_inputs, additional_linker_inputs, 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 อาศัยการรองรับ Toolchain เพื่อบังคับใช้กฎการตรวจสอบการรวม เครื่องมือควรรองรับฟีเจอร์ layering_check และมีการขออย่างชัดแจ้ง เช่น ผ่าน Flag บรรทัดคำสั่ง --features=layering_check หรือพารามิเตอร์ features ของฟังก์ชัน package เครื่องมือทางเทคนิคที่ Bazel มีให้รองรับฟีเจอร์นี้กับ clang ใน Unix และ macOS เท่านั้น

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

Attributes
name

ชื่อ ต้องระบุ

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

deps

รายการป้ายกำกับ ค่าเริ่มต้นคือ []

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

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

srcs

รายการป้ายกำกับ ค่าเริ่มต้นคือ []

รายการไฟล์ 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
  • เครื่องมือประกอบที่มีโปรเซสเซอร์ล่วงหน้าแบบ C: .S
  • ที่เก็บถาวร: .a, .pic.a
  • คลัง "ลิงก์เสมอ": .lo, .pic.lo
  • ไลบรารีที่ใช้ร่วมกันซึ่งมีเวอร์ชันหรือไม่มีเวอร์ชัน: .so, .so.version
  • ไฟล์ออบเจ็กต์: .o, .pic.o

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

hdrs

รายการป้ายกำกับ ค่าเริ่มต้นคือ []

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

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

additional_compiler_inputs

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

ไฟล์เพิ่มเติมที่คุณอาจต้องการส่งไปยังบรรทัดคำสั่งของคอมไพเลอร์ เช่น Sanitizer รายการละเว้น เป็นต้น ไฟล์ที่ระบุไว้ที่นี่จะสามารถใช้ในสำเนาที่มี $(location)
additional_linker_inputs

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

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

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

บูลีน ค่าเริ่มต้นคือ False

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

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

copts

รายการสตริง ค่าเริ่มต้นคือ []

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

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

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

defines

รายการสตริง ค่าเริ่มต้นคือ []

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

รายการป้ายกำกับ ค่าเริ่มต้นคือ []

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

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

include_prefix

String; ค่าเริ่มต้นคือ ""

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

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

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

includes

รายการสตริง ค่าเริ่มต้นคือ []

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

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

ต้องเพิ่มส่วนหัวไปยัง src หรือ hdr ไม่เช่นนั้น ส่วนหัวจะไม่สามารถใช้ได้ เมื่อคอมไพล์เป็นแซนด์บ็อกซ์ (ค่าเริ่มต้น)

linkopts

รายการสตริง ค่าเริ่มต้นคือ []

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

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

linkstamp

ป้ายกำกับ ค่าเริ่มต้นคือ None

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

บูลีน ค่าเริ่มต้นคือ False

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

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

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

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

  • STATIC ที่มีคุณลักษณะต่างๆ แบบเต็ม_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

รายการสตริง ค่าเริ่มต้นคือ []

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

String; ค่าเริ่มต้นคือ ""

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

String; ค่าเริ่มต้นคือ ""

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

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

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

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

textual_hdrs

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

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

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

win_def_file

ป้ายกํากับ ค่าเริ่มต้นคือ None

ไฟล์ DEF ของ Windows ที่จะส่งไปยัง 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

ชื่อ ต้องระบุ

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

deps

รายการป้ายกำกับ ค่าเริ่มต้นคือ []

รายการ proto_library กฎในการสร้างโค้ด C++

cc_shared_library

ดูแหล่งที่มาของกฎ
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 ลิงก์กับ foo แบบทรานซิทีฟ ไม่ได้ผล ลิงก์ bar เนื่องจากให้บริการแบบไดนามิกโดย dynamic_dep bar_shared

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

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

cc_library แต่ละรายการในตัวอย่างควรปรากฏไม่เกิน 1 ครั้งใน 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 ที่ส่งออกเป้าหมายเดียวกัน หากต้องการแก้ไขปัญหานี้ คุณจะต้องหยุดการส่งออกไลบรารีในcc_shared_library Dependency รายการใดรายการหนึ่ง

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

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

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

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

วิธีแก้ไขคือให้ส่งออกข้อมูลจากทรัพยากร Dependency ของ 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 และอาศัยเป้าหมายจากไดนามิก ทรัพยากร Dependency หรือตรวจสอบว่า exports_filter ตรวจไม่พบเป้าหมายนี้

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

Attributes
name

ชื่อ ต้องระบุ

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

deps

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

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

ระบบจะลิงก์ไลบรารีที่ขึ้นต่อกันแบบทรานซิทีฟของไลบรารีที่ขึ้นต่อกันโดยตรงเหล่านี้ไปยังคลังที่ใช้ร่วมกันนี้ ตราบใดที่ยังไม่ได้ลิงก์โดย cc_shared_library ใน dynamic_deps

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

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

additional_linker_inputs

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

ไฟล์เพิ่มเติมที่คุณอาจต้องการส่งไปยัง linker เช่น สคริปต์ linker คุณต้องส่ง Flager ของ Linker แต่ละรายการแยกกันเพื่อให้รับรู้ ของไฟล์นี้ โดยใช้แอตทริบิวต์ user_link_flags
dynamic_deps

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

รายการเหล่านี้คือ cc_shared_library อื่นๆ ที่เป้าหมายปัจจุบันพึ่งพา

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

exports_filter

รายการสตริง ค่าเริ่มต้นคือ []

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

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

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

ไวยากรณ์ที่อนุญาตมีดังนี้

//foo:__package__ เพื่อพิจารณาเป้าหมายใน foo/BUILD

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

shared_lib_name

String; ค่าเริ่มต้นคือ ""

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

รายการสตริง ค่าเริ่มต้นคือ []

แฟล็กเพิ่มเติมที่คุณต้องการส่งไปยังโปรแกรมลิงก์ ตัวอย่างเช่น หากต้องการให้ 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

ป้ายกํากับ ค่าเริ่มต้นคือ None

ไฟล์ DEF ของ Windows ที่ส่งไปยัง 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 ซึ่งอยู่ในพื้นที่ทำงานหรือในตำแหน่งที่ระบุ Absolute Path ตัวอย่าง

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

ชื่อ ต้องระบุ

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

profile

ป้ายกำกับ ค่าเริ่มต้นคือ None

ป้ายกำกับของโปรไฟล์คำแนะนำ ไฟล์คำแนะนำมีนามสกุล .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

ชื่อ ต้องระบุ

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

absolute_path_profile

String; ค่าเริ่มต้นคือ ""

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

ป้ายกำกับ ค่าเริ่มต้นคือ None

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

ป้ายกำกับ ค่าเริ่มต้นคือ None

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

memprof_profile

ดูแหล่งที่มาของกฎ
memprof_profile(name, absolute_path_profile, compatible_with, deprecation, distribs, features, licenses, profile, restricted_to, tags, target_compatible_with, testonly, visibility)

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

memprof_profile(
    name = "memprof",
    profile = "//path/to/memprof:profile.afdo",
)

memprof_profile(
  name = "memprof_abs",
  absolute_path_profile = "/absolute/path/profile.afdo",
)

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

Attributes
name

ชื่อ ต้องระบุ

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

absolute_path_profile

String; ค่าเริ่มต้นคือ ""

เส้นทางสัมบูรณ์ไปยังโปรไฟล์ MEMPROF ไฟล์อาจมีเพียง .profdata หรือ นามสกุล .zip (ซึ่งไฟล์ zip ต้องมีไฟล์ memprof.profdata)
profile

ป้ายกำกับ ค่าเริ่มต้นคือ None

ป้ายกำกับของโปรไฟล์ MEMPROF โปรไฟล์ควรมี นามสกุล .profdata (สำหรับ Memprof ที่มีการจัดทำดัชนี/เป็นสัญลักษณ์ ) หรือนามสกุล .zip สำหรับไฟล์ ZIP ที่มี memprof.profdata ป้ายกำกับยังสามารถชี้ไปยังกฎ fdo_absolute_path_profile ได้ด้วย

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

ชื่อ ต้องระบุ

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

ld_profile

ป้ายกำกับ ค่าเริ่มต้นคือ None

ป้ายกำกับของโปรไฟล์ที่ส่งไปยังการทำงานของลิงก์ ไฟล์นี้มี นามสกุล .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, link_extra_lib, 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

ชื่อ ต้องระบุ

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

deps

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

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

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

srcs

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

รายการไฟล์ 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
  • เครื่องมือประกอบที่มีโปรเซสเซอร์ล่วงหน้าแบบ C: .S
  • ที่เก็บถาวร: .a, .pic.a
  • คลัง "ลิงก์เสมอ": .lo, .pic.lo
  • ไลบรารีที่ใช้ร่วมกันซึ่งมีเวอร์ชันหรือไม่มีเวอร์ชัน: .so, .so.version
  • ไฟล์ออบเจ็กต์: .o, .pic.o

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

additional_linker_inputs

รายการป้ายกำกับ ค่าเริ่มต้นคือ []

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

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

copts

รายการสตริง ค่าเริ่มต้นคือ []

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

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

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

defines

รายการสตริง ค่าเริ่มต้นคือ []

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

รายการสตริง ค่าเริ่มต้นคือ []

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

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

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

ป้ายกำกับ ค่าเริ่มต้นคือ "@bazel_tools//tools/cpp:link_extra_lib"

ควบคุมการลิงก์ไลบรารีเพิ่มเติม

โดยค่าเริ่มต้น ระบบจะลิงก์ไบนารี C++ กับ //tools/cpp:link_extra_lib ซึ่งโดยค่าเริ่มต้นจะขึ้นอยู่กับ Flag ป้ายกำกับ //tools/cpp:link_extra_libs หากไม่ได้ตั้งค่า Flag ห้องสมุดนี้จะว่างเปล่าโดยค่าเริ่มต้น การตั้งค่าสถานะป้ายกำกับ อนุญาตให้ลิงก์ทรัพยากร Dependency ที่ไม่บังคับ เช่น การลบล้างสัญลักษณ์ที่ไม่รัดกุม ตัวดักจับสัญญาณ สำหรับฟังก์ชันไลบรารีที่ใช้ร่วมกัน หรือไลบรารีรันไทม์พิเศษ (สำหรับการแทนที่ Malloc ต้องการ malloc หรือ --custom_malloc) ตั้งค่าแอตทริบิวต์นี้เป็น None ปิดใช้ลักษณะการทำงานนี้

linkopts

รายการสตริง ค่าเริ่มต้นคือ []

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

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

linkstatic

บูลีน ค่าเริ่มต้นคือ False

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

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

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

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

  • STATIC ที่มีคุณลักษณะต่างๆ แบบเต็ม_static_link ซึ่งทุกอย่างมีการเชื่อมโยงแบบคงที่ เช่น "gcc -static foo.o libbar.a libbaz.a -lm"
    โหมดนี้เปิดใช้งานด้วยการระบุ fully_static_link ใน features
  • STATIC ซึ่งจะลิงก์ไลบรารีผู้ใช้ทั้งหมดแบบคงที่ (หากมีเวอร์ชันแบบคงที่) แต่ลิงก์ไลบรารีระบบ (ยกเว้นไลบรารีรันไทม์ 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

รายการสตริง ค่าเริ่มต้นคือ []

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

ป้ายกำกับ ค่าเริ่มต้นคือ "@bazel_tools//tools/cpp:malloc"

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

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

nocopts

String; ค่าเริ่มต้นคือ ""

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

จํานวนเต็ม ค่าเริ่มต้นคือ 0

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

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

win_def_file

ป้ายกำกับ ค่าเริ่มต้นคือ None

ไฟล์ DEF ของ Windows ที่ส่งไปยัง linker

แอตทริบิวต์นี้ควรใช้เมื่อ 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_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++ ดูเพิ่มเติม เพจ สำหรับการกำหนดค่า Toolchain ของ C++ อย่างละเอียดและเอกสารการเลือก Toolchain

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

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

Attributes
name

ชื่อ ต้องระบุ

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

all_files

ป้ายกำกับ (ต้องระบุ)

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

นี่คือข้อมูลที่ cc_toolchain.files มี และ Starlark ทุกคนใช้ โดยใช้ Toolchain ของ C++

ar_files

ป้ายกํากับ ค่าเริ่มต้นคือ None

การเก็บรวบรวมอาร์ติแฟกต์ cc_toolchain ทั้งหมดที่จําเป็นสําหรับการดําเนินการของการเก็บถาวร

as_files

ป้ายกำกับ ค่าเริ่มต้นคือ None

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

compiler_files

ป้ายกำกับ ต้องระบุ

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

ป้ายกำกับ ค่าเริ่มต้นคือ None

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

ป้ายกํากับ ค่าเริ่มต้นคือ None

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

ป้ายกำกับ (ต้องระบุ)

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

ป้ายกำกับ ค่าเริ่มต้นคือ None

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

ตัวเลือกนี้จะใช้งานได้เมื่อเปิดใช้ฟีเจอร์ "static_link_cpp_runtimes" และเรากำลังลิงก์ข้อกําหนดอย่างไดนามิก

exec_transition_for_inputs

บูลีน ค่าเริ่มต้นคือ True

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

ป้ายกำกับ ค่าเริ่มต้นคือ None

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

ป้ายกำกับ ต้องระบุ

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

ป้ายกํากับ ค่าเริ่มต้นคือ None

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

ป้ายกำกับ ต้องระบุ

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

ป้ายกำกับ ค่าเริ่มต้นคือ None

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

ตัวเลือกนี้จะใช้ได้เมื่อเปิดใช้ฟีเจอร์ "static_link_cpp_runtimes" และเราลิงก์ข้อกําหนดแบบคงที่

strip_files

ป้ายกำกับ ต้องระบุ

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

บูลีน ค่าเริ่มต้นคือ False

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

บูลีน ค่าเริ่มต้นคือ True

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

ป้ายกำกับ (ต้องระบุ)

ป้ายกำกับของกฎที่ให้ cc_toolchain_config_info
toolchain_identifier

String; nonconfigurable; ค่าเริ่มต้นคือ ""

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

ในระหว่างที่รอแก้ไขปัญหา #5380 เราขอแนะนําให้ใช้วิธีนี้ในการเชื่อมโยง cc_toolchain กับ CROSSTOOL.toolchain ระบบจะแทนที่ด้วยแอตทริบิวต์ 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)

แสดงคอลเล็กชันของ Toolchain ของ C++

กฎนี้มีหน้าที่ดังต่อไปนี้

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

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

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

Attributes
name

ชื่อ ต้องระบุ

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

toolchains

พจนานุกรมที่แมปสตริงกับป้ายกํากับ ไม่สามารถกําหนดค่าได้ ต้องระบุ

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