กฎ C / C++

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

กฎ

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

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

additional_linker_inputs

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

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

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

copts

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

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

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

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

defines

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

รายการคําจํากัดความที่จะเพิ่มลงในบรรทัดการคอมไพล์ ขึ้นอยู่กับการแทนที่ตัวแปร "Make" และการแยกสตริงคำสั่ง Bourne Shell สตริงแต่ละรายการ ซึ่งต้องประกอบด้วยโทเค็น Bourne Shell รายการเดียว จะมี -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 ห้องสมุดนี้จะว่างเปล่าโดยค่าเริ่มต้น การตั้งค่า Flag ป้ายกำกับจะอนุญาตให้ลิงก์ไลบรารี 3rd party ที่ไม่บังคับ เช่น การลบล้างสำหรับสัญลักษณ์ที่ลบล้างได้ อินเตอร์เซปเตอร์สำหรับฟังก์ชันในคลังที่ใช้ร่วมกัน หรือไลบรารีรันไทม์พิเศษ (สำหรับรายการที่แทนที่ malloc โปรดใช้ malloc หรือ --custom_malloc) การตั้งค่าแอตทริบิวต์นี้เป็น None จะปิดใช้ลักษณะการทำงานนี้

linkopts

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

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

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

linkshared

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

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

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

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

linkstatic

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

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

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

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

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

  • สถิติที่มีฟีเจอร์ลิงก์_สถิติแบบเต็ม ซึ่งลิงก์ทุกอย่างในแบบคงที่ เช่น "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"

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

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

nocopts

สตริง ค่าเริ่มต้นคือ ""

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

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

hdrs

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

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

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

additional_compiler_inputs

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

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

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

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

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

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

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

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

copts

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

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

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

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

defines

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

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

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

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

ขณะนี้การใช้งานจะจํากัดอยู่ที่ cc_libraries และได้รับการปกป้องโดย Flag --experimental_cc_implementation_deps

include_prefix

สตริง ค่าเริ่มต้นคือ ""

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

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

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

includes

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

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

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

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

linkopts

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

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

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

linkstamp

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

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

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

สำหรับ 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
  • สถิติซึ่งไลบรารีผู้ใช้ทั้งหมดลิงก์แบบคงที่ (หากมีเวอร์ชันคงที่) แต่ไลบรารีของระบบ (ไม่รวมไลบรารีรันไทม์ 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 นำหน้าและเพิ่มลงในบรรทัดคำสั่งคอมไพล์สำหรับเป้าหมายนี้ แต่จะไม่เพิ่มลงในรายการที่เกี่ยวข้อง
nocopts

สตริง ค่าเริ่มต้นคือ ""

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

สตริง ค่าเริ่มต้นคือ ""

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

เมื่อตั้งค่าแล้ว คุณจะเข้าถึงส่วนหัวในแอตทริบิวต์ 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 ในตัวอย่างควรปรากฏใน cc_shared_library ไม่เกิน 1 รายการ หากต้องการลิงก์ baz กับ bar_shared ด้วย เราจะต้องเพิ่ม tags = ["LINKABLE_MORE_THAN_ONCE"] ลงใน baz

เนื่องจากแอตทริบิวต์ shared_lib_name ไฟล์ที่สร้างขึ้นโดย bar_shared จะมีชื่อเป็น bar.so แทนที่จะเป็นชื่อ libbar.so ที่จะตั้งค่าเริ่มต้นใน Linux

ข้อผิดพลาด

Two shared libraries in dependencies export the same symbols.

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

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

วิธีแก้ปัญหาคือส่งออกจากcc_shared_library Dependency หรือดึง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

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

หากต้องการแก้ไขปัญหานี้ ให้นำเป้าหมายออกจาก deps แล้วอิงตามการขึ้นต่อกันแบบไดนามิกหรือตรวจสอบว่า 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 คุณต้องส่ง Flag ของ linker แยกต่างหากเพื่อให้ linker รับรู้ถึงไฟล์นี้ โดยใช้แอตทริบิวต์ user_link_flags
dynamic_deps

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

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

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

exports_filter

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

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

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

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

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

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

//foo:__subpackages__ เพื่อพิจารณาเป้าหมายใน foo/BUILD หรือแพ็กเกจอื่นๆ ใต้ foo/ เช่น foo/bar/BUILD

shared_lib_name

สตริง ค่าเริ่มต้นคือ ""

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

cc_static_library

ดูแหล่งที่มาของกฎ
cc_static_library(name, deps, tags)
สร้างไลบรารีแบบคงที่จากรายการเป้าหมายและทรัพยากร Dependency แบบทรานซิทีฟ

ไลบรารีแบบคงที่ที่ได้จะมีไฟล์ออบเจ็กต์ของเป้าหมายที่แสดงใน deps รวมถึง Dependency แบบเปลี่ยนผ่าน โดยให้ความสำคัญกับออบเจ็กต์ PIC

กลุ่มเอาต์พุต

linkdeps

ไฟล์ข้อความที่มีป้ายกำกับของทรัพยากร Dependency แบบทรานซิทีฟของเป้าหมายที่แสดงใน deps ซึ่งไม่ได้มีส่วนร่วมในการสร้างไฟล์ออบเจ็กต์สำหรับไลบรารีแบบคงที่ แต่มีไลบรารีแบบคงที่ แบบไดนามิก หรือแบบอินเทอร์เฟซอย่างน้อย 1 รายการ ไลบรารีแบบคงที่ที่ได้อาจกำหนดให้ต้องลิงก์ไลบรารีเหล่านี้

linkopts

ไฟล์ข้อความที่มี linkopts ที่ผู้ใช้ระบุของข้อกำหนดเชิงการเปลี่ยนผันทั้งหมดของเป้าหมายที่แสดงใน deps

สัญลักษณ์ซ้ำ

โดยค่าเริ่มต้น กฎ cc_static_library จะตรวจสอบว่าไลบรารีแบบคงที่ที่ได้ไม่มีสัญลักษณ์ที่ซ้ำกัน หากมี การสร้างจะล้มเหลวพร้อมข้อความแสดงข้อผิดพลาดที่แสดงรายการสัญลักษณ์ที่ซ้ำกันและไฟล์ออบเจ็กต์ที่มีสัญลักษณ์ดังกล่าว

คุณปิดใช้การตรวจสอบนี้ต่อเป้าหมายหรือต่อแพ็กเกจได้โดยการตั้งค่า features = ["-symbol_check"] หรือทั่วโลกผ่าน --features=-symbol_check

การรองรับชุดเครื่องมือสำหรับ symbol_check

เครื่องมือ C++ ที่กำหนดค่าอัตโนมัติซึ่งจัดส่งโดย Bazel รองรับฟีเจอร์ symbol_check ในทุกแพลตฟอร์ม เครื่องมือทางเทคนิคที่กําหนดเองสามารถเพิ่มการรองรับได้ 2 วิธีดังนี้

  • การใช้การดําเนินการ ACTION_NAMES.validate_static_library และเปิดใช้ด้วยฟีเจอร์ symbol_check ชุดเครื่องมือในการทำงานจะเรียกใช้โดยมีอาร์กิวเมนต์ 2 รายการ ได้แก่ ไลบรารีแบบคงที่เพื่อตรวจหาสัญลักษณ์ที่ซ้ำกันและเส้นทางของไฟล์ที่ต้องสร้างหากผ่านการตรวจสอบ
  • การมีฟีเจอร์ symbol_check จะเพิ่ม Flag ของโปรแกรมเก็บไฟล์ที่ทำให้การดำเนินการสร้างไลบรารีแบบคงที่ล้มเหลวเมื่อพบสัญลักษณ์ที่ซ้ำกัน

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

Attributes
name

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

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

deps

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

รายการเป้าหมายที่จะรวมกันเป็นไลบรารีแบบคงที่ รวมถึงข้อกําหนดทั้งหมดที่ส่งผลต่อเป้าหมาย

Dependency ที่ไม่ได้ระบุไฟล์ออบเจ็กต์ใดๆ จะไม่รวมอยู่ในไลบรารีแบบคงที่ แต่ระบบจะรวบรวมป้ายกำกับของ Dependency เหล่านั้นไว้ในไฟล์ที่linkdepsกลุ่มเอาต์พุตระบุ

fdo_prefetch_hints

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

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

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

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

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

Attributes
name

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

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

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

สตริง ค่าเริ่มต้นคือ ""

เส้นทางสัมบูรณ์ไปยังโปรไฟล์ FDO ไฟล์ FDO อาจมีเฉพาะนามสกุล .afdo
profile

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

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

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

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

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

สตริง ค่าเริ่มต้นคือ ""

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

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

additional_linker_inputs

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

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

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

copts

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

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

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

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

defines

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

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

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

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

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

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

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

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

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

linkopts

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

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

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

linkstatic

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

สำหรับ 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
  • ไดนามิก (DYNAMIC) ซึ่งมีการลิงก์ไลบรารีทั้งหมดแบบไดนามิก (หากมีเวอร์ชันไดนามิกให้ใช้งาน) เช่น "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

สตริง ค่าเริ่มต้นคือ ""

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

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

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

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" และเราจะลิงก์ทรัพยากร Dependency แบบคงที่

strip_files

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

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

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

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

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

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

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

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

สตริง ไม่สามารถกําหนดค่าได้ ค่าเริ่มต้นคือ ""

ตัวระบุที่ใช้จับคู่ 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)

แสดงถึงคอลเล็กชันเครื่องมือทางเทคนิค 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",
            },
          )