กฎ C / C++

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

กฎ

cc_binary

ดูแหล่งที่มาของกฎ
cc_binary(name, deps, srcs, data, additional_linker_inputs, args, compatible_with, copts, defines, deprecation, distribs, env, exec_compatible_with, exec_properties, features, includes, licenses, link_extra_lib, linkopts, linkshared, linkstatic, local_defines, malloc, nocopts, output_licenses, restricted_to, stamp, tags, target_compatible_with, testonly, toolchains, visibility, win_def_file)

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

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

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

Attributes
name

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

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

deps

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

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

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

srcs

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

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

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

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

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

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

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

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

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

additional_linker_inputs

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

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

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

copts

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

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

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

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

defines

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

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

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

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

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

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

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

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

โดยค่าเริ่มต้น ระบบจะลิงก์ไบนารี C++ กับ //tools/cpp:link_extra_lib ซึ่งโดยค่าเริ่มต้นจะขึ้นอยู่กับ Flag ป้ายกำกับ //tools/cpp:link_extra_libs หากไม่ได้ตั้งค่าสถานะ ไลบรารีนี้จะว่างเปล่าโดยค่าเริ่มต้น การตั้งค่า 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 วิธีที่แตกต่างกันดังนี้

  • 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"

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

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

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

Attributes
name

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

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

deps

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

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

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

srcs

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

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

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

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

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

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

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

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

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

hdrs

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

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

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

additional_compiler_inputs

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

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

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

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

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

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

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

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

copts

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

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

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

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

defines

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

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

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

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

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

include_prefix

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

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

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

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

includes

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

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

ขึ้นอยู่กับการแทนที่ "Makeตัวแปร" สตริงแต่ละรายการจะมี -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
  • ไดนามิก (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 แบบคงที่ ซึ่งรายการหลังเป็นทรัพยากร Dependency แบบทรานซิทีฟ ไม่ได้ลิงก์ bar เนื่องจาก dynamic_dep bar_shared สร้างแบบไดนามิกให้อยู่แล้ว

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

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

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

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

ข้อผิดพลาด

Two shared libraries in dependencies export the same symbols.

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

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

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

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

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

วิธีแก้ไขคือให้ส่งออกข้อมูลจากทรัพยากร Dependency cc_shared_library หรือดึง cc_shared_library ที่ 3 ที่ส่งออกออกไป

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

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

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

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

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

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

Attributes
name

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

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

deps

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

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

ทรัพยากร Dependency ของไลบรารีแบบทรานซิทีฟของ Dep โดยตรงเหล่านี้จะลิงก์เข้ากับไลบรารีที่แชร์นี้ ตราบใดที่คุณยังไม่ได้ลิงก์โดย 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

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

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

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

additional_linker_inputs

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

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

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

copts

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

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

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

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

defines

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

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

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

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

ขึ้นอยู่กับการแทนที่ "Make variable" แต่ละสตริงจะเพิ่ม -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 ป้ายกำกับจะอนุญาตให้ลิงก์ไลบรารี 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 วิธีดังนี้

  • สถิติที่มีฟีเจอร์ลิงก์_สถิติแบบเต็ม ซึ่งลิงก์ทุกอย่างในแบบคงที่ เช่น "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 นำหน้าและเพิ่มลงในบรรทัดคำสั่งคอมไพล์สำหรับเป้าหมายนี้ แต่จะไม่เพิ่มลงในรายการที่เกี่ยวข้อง
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"] เพื่อป้องกันไม่ให้มีการสร้างและกำหนดค่า Toolchain โดยไม่จำเป็นเมื่อเรียกใช้ bazel build //...

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

Attributes
name

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

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

all_files

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

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

exec_transition_for_inputs

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

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

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

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

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

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

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

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

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

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

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

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

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

strip_files

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

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

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

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

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

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

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

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

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

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

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

cc_toolchain_suite

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

แสดงถึงคอลเล็กชันเครื่องมือทางเทคนิค C++

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

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

โปรดดูที่ หน้า นี้เพื่อดูการกำหนดค่า Toolchain ของ C++ อย่างละเอียดและเอกสารการเลือก Toolchain

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

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