กฎ C / C++

รายงานปัญหา ดูแหล่งที่มา Nightly · 8.4 · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

กฎ

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 ได้โดยตรง

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

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

srcs ประเภทไฟล์ที่อนุญาตมีดังนี้

  • ไฟล์ต้นฉบับ C และ C++: .c, .cc, .cpp, .cxx, .c++, .C
  • ไฟล์ส่วนหัว C และ C++: .h, .hh, .hpp, .hxx, .inc, .inl, .H
  • Assembler ที่มีตัวประมวลผล 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 ก่อน คอมไพล์เป้าหมายไบนารี โดยแฟล็กจะมีผลเฉพาะกับการคอมไพล์เป้าหมายนี้เท่านั้น ไม่รวมถึง การขึ้นต่อกัน ดังนั้นโปรดระมัดระวังเกี่ยวกับไฟล์ส่วนหัวที่รวมไว้ที่อื่น เส้นทางทั้งหมดควร เป็นเส้นทางสัมพัทธ์กับพื้นที่ทำงาน ไม่ใช่แพ็กเกจปัจจุบัน

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

defines

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

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

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

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

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

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

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

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

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

linkopts

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

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

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

linkshared

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

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

การมีแฟล็กนี้หมายความว่าการลิงก์เกิดขึ้นพร้อมกับแฟล็ก -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 วิธีหลักๆ ดังนี้

  • 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 ซึ่งเป็นไลบรารีที่ว่างเปล่า ดังนั้นไบนารีจึงใช้ malloc ของ libc ป้ายกำกับนี้ต้องอ้างอิงถึง cc_library หากการคอมไพล์เป็นกฎที่ไม่ใช่ C++ ตัวเลือกนี้จะไม่มีผล ระบบจะไม่สนใจค่าของแอตทริบิวต์นี้หากระบุ linkshared=True

nocopts

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

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

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

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

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

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

srcs ประเภทไฟล์ที่อนุญาตมีดังนี้

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

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

hdrs

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

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

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

additional_compiler_inputs

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

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

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

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

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

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

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

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

copts

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

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

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

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

defines

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

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

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

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

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

include_prefix

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

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

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

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

includes

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

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

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

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

linkopts

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

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

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

linkstamp

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

คอมไพล์และลิงก์ไฟล์ต้นฉบับ C++ ที่ระบุลงในไบนารีสุดท้ายพร้อมกัน เราต้องใช้เทคนิคนี้เพื่อใส่ข้อมูลการประทับเวลา ลงในไบนารี หากคอมไพล์ไฟล์ต้นฉบับเป็น ออบเจ็กต์ไฟล์ด้วยวิธีปกติ การประทับเวลาจะผิดพลาด การรวบรวม Linkstamp อาจไม่มีชุดแฟล็กคอมไพเลอร์ใดๆ โดยเฉพาะ จึงไม่ควรขึ้นอยู่กับส่วนหัว ตัวเลือกคอมไพเลอร์ หรือตัวแปรการสร้างอื่นๆ ใดๆ โดยเฉพาะ ตัวเลือกนี้ควรมีเฉพาะใน 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
  • 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 และเพิ่มลงในบรรทัดคำสั่งคอมไพล์สำหรับเป้าหมายนี้ แต่จะไม่เพิ่มลงในเป้าหมายที่ขึ้นอยู่กับเป้าหมายนี้
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 โดย baz เป็นการขึ้นต่อกันแบบทรานซิทีฟ ไม่ลิงก์ bar เนื่องจาก dynamic_dep bar_shared มีการระบุแบบไดนามิกอยู่แล้ว

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

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

cc_library ทุกรายการในตัวอย่างควรปรากฏใน cc_shared_library ไม่เกิน 1 รายการ หากต้องการลิงก์ baz เข้ากับ bar_shared ด้วย เราจะต้องเพิ่ม tags = ["LINKABLE_MORE_THAN_ONCE"] ไปยัง baz

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

ข้อผิดพลาด

Two shared libraries in dependencies export the same symbols.

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

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

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

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

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

วิธีแก้คือส่งออกจากcc_shared_libraryการขึ้นต่อกันหรือดึงcc_shared_libraryบุคคลที่สามที่ส่งออก

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

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

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

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

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

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

Attributes
name

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

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

deps

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

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

ระบบจะลิงก์การขึ้นต่อกันแบบทรานซิทีฟของไลบรารีของ 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 คุณต้องส่งแฟล็กของ Linker ที่ 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

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

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

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

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

shared_lib_name

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

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

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

แฟล็กเพิ่มเติมที่คุณอาจต้องการส่งไปยัง Linker เช่น หากต้องการให้ 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)
สร้างไลบรารีแบบคงที่จากรายการเป้าหมายและการขึ้นต่อกันแบบทรานซิทีฟ

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

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

linkdeps

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

linkopts

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

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

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

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

การรองรับ Toolchain สำหรับ symbol_check

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

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

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

Attributes
name

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

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

deps

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

รายการเป้าหมายที่จะรวมเป็นไลบรารีแบบคงที่ รวมถึงการอ้างอิงแบบทรานซิทีฟทั้งหมด

Dependency ที่ไม่ได้ระบุไฟล์ออบเจ็กต์จะไม่รวมอยู่ในไลบรารีแบบคงที่ แต่ระบบจะรวบรวมป้ายกำกับของ Dependency เหล่านั้นไว้ในไฟล์ที่จัดทำโดย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 ได้โดยตรง

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

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

srcs ประเภทไฟล์ที่อนุญาตมีดังนี้

  • ไฟล์ต้นฉบับ C และ C++: .c, .cc, .cpp, .cxx, .c++, .C
  • ไฟล์ส่วนหัว C และ C++: .h, .hh, .hpp, .hxx, .inc, .inl, .H
  • Assembler ที่มีตัวประมวลผล 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 ก่อน คอมไพล์เป้าหมายไบนารี โดยแฟล็กจะมีผลเฉพาะกับการคอมไพล์เป้าหมายนี้เท่านั้น ไม่รวมถึง การขึ้นต่อกัน ดังนั้นโปรดระมัดระวังเกี่ยวกับไฟล์ส่วนหัวที่รวมไว้ที่อื่น เส้นทางทั้งหมดควร เป็นเส้นทางสัมพัทธ์กับพื้นที่ทำงาน ไม่ใช่แพ็กเกจปัจจุบัน

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

defines

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

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

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

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

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

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

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

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

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

linkopts

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

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

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

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

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

Attributes
name

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

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

all_files

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

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

ซึ่งเป็นสิ่งที่ 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

ตั้งค่าเป็น 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 ทั้งหมดที่จำเป็นสำหรับการดำเนินการ strip
supports_header_parsing

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

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

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

ตั้งค่าเป็น 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++

กฎนี้มีหน้าที่ดังนี้

  • รวบรวม Toolchain C++ ที่เกี่ยวข้องทั้งหมด
  • การเลือก Toolchain อย่างใดอย่างหนึ่งขึ้นอยู่กับตัวเลือก --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",
            },
          )